Claude Statusbar
leeguooooo/claude-code-usage-bar
Manage cs (claude-statusbar) — switch theme/style/density, override severity colors, preview combinations, run doctor, reset config, install, upgrade (cs upgrade — the only supported upgrade path)…
Diagnoses a recurring failure such as a stuck task, repeated CI error or frequent reverts by sending sub-agents through the logs and returning one root-cause diagnosis.
$ npx skills add yologdev/yoyo-evolve --skill analyze-trajectory -a claude-codeProject install by default; add -g for ~/.claude/skills/.
$ gh skill install yologdev/yoyo-evolve analyze-trajectory --agent claude-codeProject scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).
$ git clone --depth 1 https://github.com/yologdev/yoyo-evolve.git skills-src && mkdir -p .claude/skills && cp -r skills-src/skills/analyze-trajectory .claude/skills/analyze-trajectory && rm -rf skills-srcUse ~/.claude/skills/ instead of .claude/skills for a personal install. The folder must contain SKILL.md.
Claude Code skills documentation · loads skills from .claude/skills/
Install the "analyze-trajectory" agent skill from https://github.com/yologdev/yoyo-evolve/tree/main/skills/analyze-trajectory into .claude/skills/analyze-trajectory/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "analyze-trajectory", then confirm the skill loads.Claude Code copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$skill-installer install https://github.com/yologdev/yoyo-evolve/tree/main/skills/analyze-trajectoryType this inside Codex. $skill-installer <name> installs a curated skill from openai/skills. The installer writes to $CODEX_HOME/skills (default ~/.codex/skills). Restart Codex if the skill does not show up.
$ npx skills add yologdev/yoyo-evolve --skill analyze-trajectory -a codexProject install goes to .agents/skills/; add -g for ~/.codex/skills/.
$ gh skill install yologdev/yoyo-evolve analyze-trajectory --agent codexProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/yologdev/yoyo-evolve.git skills-src && mkdir -p .agents/skills && cp -r skills-src/skills/analyze-trajectory .agents/skills/analyze-trajectory && rm -rf skills-srcUse ~/.agents/skills/ instead of .agents/skills for a personal install.
Codex skills documentation · loads skills from .agents/skills/
Install the "analyze-trajectory" agent skill from https://github.com/yologdev/yoyo-evolve/tree/main/skills/analyze-trajectory into .agents/skills/analyze-trajectory/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "analyze-trajectory", then confirm the skill loads.Codex copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add yologdev/yoyo-evolve --skill analyze-trajectory -a cursorProject install goes to .agents/skills/; add -g for ~/.cursor/skills/.
$ gh skill install yologdev/yoyo-evolve analyze-trajectory --agent cursorProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/yologdev/yoyo-evolve.git skills-src && mkdir -p .cursor/skills && cp -r skills-src/skills/analyze-trajectory .cursor/skills/analyze-trajectory && rm -rf skills-srcUse ~/.cursor/skills/ instead of .cursor/skills for a personal install.
Cursor skills documentation · loads skills from .cursor/skills/, .agents/skills/, .claude/skills/, .codex/skills/
Install the "analyze-trajectory" agent skill from https://github.com/yologdev/yoyo-evolve/tree/main/skills/analyze-trajectory into .cursor/skills/analyze-trajectory/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "analyze-trajectory", then confirm the skill loads.Cursor copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gemini skills install https://github.com/yologdev/yoyo-evolve.git --path skills/analyze-trajectory--scope user (default) or --scope workspace; --path is the subfolder of the repo that holds the skill; --consent skips the security confirmation prompt.
$ npx skills add yologdev/yoyo-evolve --skill analyze-trajectory -a gemini-cliProject install goes to .agents/skills/; add -g for ~/.gemini/skills/.
$ gh skill install yologdev/yoyo-evolve analyze-trajectory --agent gemini-cliProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/yologdev/yoyo-evolve.git skills-src && mkdir -p .gemini/skills && cp -r skills-src/skills/analyze-trajectory .gemini/skills/analyze-trajectory && rm -rf skills-srcUse ~/.gemini/skills/ instead of .gemini/skills for a personal install, then run /skills reload.
Gemini CLI skills documentation · loads skills from .gemini/skills/, .agents/skills/
Install the "analyze-trajectory" agent skill from https://github.com/yologdev/yoyo-evolve/tree/main/skills/analyze-trajectory into .gemini/skills/analyze-trajectory/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "analyze-trajectory", then confirm the skill loads.Gemini CLI copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gh skill install yologdev/yoyo-evolve analyze-trajectoryInstalls for Copilot at project scope by default; add --scope user for a personal install. Preview a skill first with gh skill preview. Needs GitHub CLI 2.90.0 or later (public preview).
$ npx skills add yologdev/yoyo-evolve --skill analyze-trajectory -a github-copilotProject install goes to .agents/skills/; add -g for ~/.copilot/skills/.
$ git clone --depth 1 https://github.com/yologdev/yoyo-evolve.git skills-src && mkdir -p .github/skills && cp -r skills-src/skills/analyze-trajectory .github/skills/analyze-trajectory && rm -rf skills-srcUse ~/.copilot/skills/ instead of .github/skills for a personal install. Commit .github/skills so cloud agent and code review can use it.
GitHub Copilot skills documentation · loads skills from .github/skills/, .claude/skills/, .agents/skills/
Install the "analyze-trajectory" agent skill from https://github.com/yologdev/yoyo-evolve/tree/main/skills/analyze-trajectory into .github/skills/analyze-trajectory/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "analyze-trajectory", then confirm the skill loads.GitHub Copilot copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add yologdev/yoyo-evolve --skill analyze-trajectory -a opencodeOpenCode documents no install command of its own. Project install goes to .agents/skills/; add -g for ~/.config/opencode/skills/.
$ gh skill install yologdev/yoyo-evolve analyze-trajectory --agent opencodeProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/yologdev/yoyo-evolve.git skills-src && mkdir -p .opencode/skills && cp -r skills-src/skills/analyze-trajectory .opencode/skills/analyze-trajectory && rm -rf skills-srcUse ~/.config/opencode/skills/ instead of .opencode/skills for a personal install.
OpenCode skills documentation · loads skills from .opencode/skills/, .claude/skills/, .agents/skills/
Install the "analyze-trajectory" agent skill from https://github.com/yologdev/yoyo-evolve/tree/main/skills/analyze-trajectory into .opencode/skills/analyze-trajectory/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "analyze-trajectory", then confirm the skill loads.OpenCode copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
analyze-trajectoryDiagnoses a recurring failure such as a stuck task, repeated CI error or frequent reverts by sending sub-agents through the logs and returning one root-cause diagnosis.
Built for an agent that keeps hitting the same failure, this skill produces a focused diagnosis of why. Raw GitHub Actions logs are too large and noisy for the main context window, so the agent keeps its own context small, sends a sub-agent to read the logs and gets back a summary of one to three sentences, recursing only if that summary raises a deeper question.
Triggers are a task flagged as STUCK, a CI error fingerprint that appears at least twice, repeated revert commits across sessions, or an issue mentioned in several session journals without resolution. The procedure starts by writing one specific question that names a run id, session day or error fingerprint, then fetches exactly one artifact for it, such as the failed log of a CI run through gh or the diff of a reverted commit through git. It advises against digging when the trajectory looks healthy, when the cause is already known, or when the failure is the task being implemented.
6 steps, taken from the step headings in SKILL.md.
Read from SKILL.md and the folder at commit 637e940. It shows what the files ask for, not the result of running them.
Pre-approves nothing: there is no allowed-tools line, so your agent's usual permission prompts apply.
From allowed-tools in the SKILL.md frontmatter.
Shell commands in SKILL.md call:
gitghFrom the folder's file list and the shell code blocks in SKILL.md.
Links to these hosts (documentation or services it may open):
alexzhang13.github.ioFrom URLs in SKILL.md, links to its own repository left out.
Names no API keys, tokens, secrets or passwords.
From names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.
Analyze Trajectory loads about 3.6k tokens when it runs. Until then it costs about 52 tokens; SKILL.md has 1,547 words of instructions outside code blocks.
Estimates: characters ÷ 4, the usual rule of thumb; real counts depend on the model's tokenizer. Scripts and assets cost tokens only if the agent reads them.
The automated check found no risky patterns in SKILL.md.
Automated static check — not a guarantee. Review scripts before installing. It scans the text of SKILL.md for risky patterns (piping downloads into a shell, reading credential files, hidden Unicode, destructive commands); files beside SKILL.md are not scanned.
The full file from yologdev/yoyo-evolve at commit 637e940, republished under its MIT licence (© yologdev). 1,547 words, ~3,611 tokens.
.claude/skills/analyze-trajectory/SKILL.md (or your agent's skills folder).You are doing a deep dive into a recurring failure pattern. The harness's pre-computed YOUR TRAJECTORY block surfaces that something is recurring; this skill helps you understand why and produce a focused diagnosis.
This skill exists because raw GitHub Actions logs are too large and noisy to digest in your main context window. The pattern (Recursive Language Model — see Reithan's reference in issue #226) is: keep your root context small, dispatch a sub-agent to read the raw logs, and have the sub-agent return a 1-3 sentence summary. Recurse if the summary surfaces a deeper question.
Trigger this skill when ANY of these hold:
YOUR TRAJECTORY flagged a STUCK task (≥3 attempts in window, 0 successes)≥2× in the recurring-errors section#205) has been mentioned in multiple session journals without resolutionExamples of well-framed questions:
A good question names a specific event (run id, session day, error fingerprint) and what you want to know about it. Don't ask vague questions like "what's wrong with my trajectory?"
For each question, pick exactly one artifact to fetch:
gh run view <id> --log-failed (drop --repo; gh auto-detects from the local clone's origin remote, which is the right one)git show <sha> and the next-newer commit's full diff$YOYO_AUDIT_DIR is set by the harness ONLY inside scripts/skill_evolve.sh (a different invocation than evolve.sh). When loaded inside a normal evolve session, you must fetch the audit-log branch yourself first:git fetch --depth 50 origin audit-log:audit-log
AUDIT_WT=$(mktemp -d)
git worktree add "$AUDIT_WT" audit-log
ls "$AUDIT_WT/sessions/" | tail -10
# ... read what you need ...
git worktree remove --force "$AUDIT_WT"Estimate the artifact size first:
gh run view <id> --log-failed 2>/dev/null | wc -cread_file or bash. Skip sub-agent — the cost isn't worth it.Before dispatching a sub-agent, estimate whether the artifact fits in a single sub-agent's context:
estimated_tokens = artifact_bytes / 4If estimated_tokens ≤ 30,000 (roughly half a sub-agent's context window): proceed to Step 4 as normal — single sub-agent dispatch.
If estimated_tokens > 30,000: the artifact is too large for one sub-agent to digest reliably. Split and fan out:
Split into chunks of ~20,000 tokens (~80,000 bytes) with 2,000-token (~8,000 byte) overlap between consecutive chunks. The overlap ensures error context that spans a chunk boundary isn't lost.
Store each chunk separately in shared state:
shared_state set key="trajectory.run-<id>.chunk-1" value="<first 80KB>"
shared_state set key="trajectory.run-<id>.chunk-2" value="<next 80KB, starting 8KB before the split>"
...Dispatch one sub-agent per chunk with the prompt:
You are analyzing CHUNK <N> of <M> from a CI log.
The chunk is stored in shared state under key "trajectory.run-<id>.chunk-<N>".
Read it with: shared_state get key="trajectory.run-<id>.chunk-<N>"
Question: <your single-sentence question from step 1>
Reply with ONLY a JSON object (no markdown fences, no prose):
{
"summary": "1-3 sentences on what this chunk reveals about the failure",
"key_lines": ["relevant line 1", "relevant line 2"],
"chunk_relevant": true,
"confidence": "high|medium|low"
}
If this chunk contains no information relevant to the question, set chunk_relevant to false
and keep summary/key_lines minimal.Merge chunk results — after all chunk sub-agents return, store their combined results in shared state and dispatch one final merge sub-agent:
shared_state set key="trajectory.run-<id>.chunk-results" value="<JSON array of chunk responses>"Merge sub-agent prompt:
You are merging analyses from <M> chunks of a single CI log.
The chunk analyses are stored in shared state under key "trajectory.run-<id>.chunk-results".
Read them with: shared_state get key="trajectory.run-<id>.chunk-results"
Original question: <your single-sentence question from step 1>
Synthesize the chunk analyses into a single diagnosis.
Reply with ONLY a JSON object (no markdown fences, no prose):
{
"summary": "1-3 sentences explaining the root cause",
"key_lines": ["most important line 1", "most important line 2"],
"deeper_question": null,
"confidence": "high|medium|low"
}The merge sub-agent's response is your diagnosis — validate it using the same JSON contract rules in Step 4.
Chunking counts toward the recursion cap (Step 5): each chunk sub-agent is depth 1, the merge sub-agent is depth 1. If chunking used 4 chunk agents + 1 merge agent, you've used 1 of your 3 recursion levels. You can still recurse on a deeper_question from the merge result, but be mindful of the budget.
Store the artifact in shared state first — don't paste large logs into the sub-agent prompt. Sub-agents automatically have access to the shared_state tool and share the same key-value store as their parent.
Use the namespace convention trajectory.<key> for all artifacts stored by this skill.
# 1. Fetch the artifact into a shell variable
LOG=$(gh run view <id> --log-failed 2>/dev/null)
# 2. Store it in shared state (the parent agent calls this directly)
shared_state set key="trajectory.run-<id>" value="$LOG"Then dispatch the sub-agent with a reference, not the artifact itself:
Question: <your single-sentence question from step 1>
The CI log is stored in shared state under key "trajectory.run-<id>".
Read it with: shared_state get key="trajectory.run-<id>"
Reply with ONLY a JSON object (no markdown fences, no prose) matching this schema:
{
"summary": "1-3 sentences explaining the root cause, with no surrounding quotes",
"key_lines": ["file.rs:42:11 borrow of moved value", "AnthropicError: rate_limit_exceeded"],
"deeper_question": null,
"confidence": "medium"
}
Field rules:
- summary: free string, 1-3 sentences
- key_lines: array of 1-5 short strings (max 100 chars each) that prove the cause
- deeper_question: JSON null when no follow-up is needed; otherwise a single-sentence string
- confidence: exactly one of "high", "medium", or "low"Sub-agents inherit RTK compression on bash output and directory restrictions, but they do NOT inherit skills. Keep the sub-agent prompt fully self-contained — don't reference other skills. Sub-agents share the parent's SharedState store automatically (via SharedStateTool wired by build_sub_agent_tool).
Validate the sub-agent response — after the sub-agent returns, check:
```json ... ```) that sub-agents sometimes add despite instructions.summary (string), key_lines (array of strings), deeper_question (string or null), confidence (one of "high", "medium", "low").Your previous response was not valid JSON or was missing required fields.
Please respond with ONLY a JSON object (no markdown, no explanation):
{
"summary": "1-3 sentences explaining the root cause",
"key_lines": ["key line 1", "key line 2"],
"deeper_question": null,
"confidence": "high|medium|low"
}
Required fields: summary (string), key_lines (array), deeper_question (string or null), confidence ("high"|"medium"|"low").Sub-agent failure fallback — if the sub-agent (a) errors, (b) returns non-JSON twice (initial + retry), (c) returns truncated JSON that can't be repaired, or (d) is unavailable as a tool:
memory/learnings.jsonl as a learning entry with pattern_key: trajectory.subagent_malformed_response so we can debug later.summary field. Construct a synthetic response: {"summary": "<raw text, first 500 chars>", "key_lines": [], "deeper_question": null, "confidence": "low"}.shared_state get key="trajectory.run-<id>" to retrieve the stored log, then read the last 50-100 lines in your main context.confidence: low (sub-agent unavailable) so downstream decisions know to be cautious.deeper_questionIf confidence is "low" AND deeper_question is a non-null string (JSON null returns false on this check, but if you see the literal string "null" treat it as null too — that's a sub-agent bug worth logging), run another sub-agent dispatch with the narrower question. Reuse the same artifact; the sub-agent will focus differently.
Hard cap: recursion depth = 3. That's: initial dispatch → 1st recursion → 2nd recursion. After that, accept whatever you have. The cap is informed by the recursive-LM literature (RLM blog, alexzhang13.github.io/blog/2025/rlm/) and prevents runaway agent costs.
If you hit the cap without confidence == "high", that's still a valid outcome — write the diagnosis with whatever clarity you have and flag it as "needs follow-up".
Produce a 3-5 sentence diagnosis paragraph that includes:
Write the diagnosis somewhere durable:
learnings.jsonl entry. The pattern_key field (optional in the standard schema, see skills/communicate/SKILL.md) takes a kebab-case <verb>.<object> value — for trajectory-derived diagnoses, use pattern_key: trajectory.<short-slug> (e.g., trajectory.fallback_provider_stuck, trajectory.evaluator_rate_limit). This lets skill-evolve cluster recurring trajectory findings.confidence: high. The whole point is to stop early when you have a clear answer.trajectory.<key> in shared state.A diagnosis is "good enough" when ALL of:
If the diagnosis fails any of these, recurse one more time (within the cap) or accept the partial result and document the open question in learnings.jsonl.
communicate skill in the same session — but it's a separate decision, not part of this skill's procedure.audit-log branch. The branch is read-only from this skill's perspective.© yologdev, MIT. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file
Just SKILL.md in skills/analyze-trajectory of yologdev/yoyo-evolve.
Open the folder on GitHubat commit 637e940
Analyze Trajectory next to the 5 skills that share the most tags, products or categories with it. Stars are the repository's; “used in” counts other GitHub owners with a copy.
| Skill | Stars | Used in | Tokens | Auto-check | Licence | Repo updated |
|---|---|---|---|---|---|---|
| Analyze Trajectory this skillyologdev/yoyo-evolve | 1.9k | — | ~3.6k | Automated safety check: Pass | MIT | |
| Claude Statusbarleeguooooo/claude-code-usage-bar | 377 | — | ~2.5k | Automated safety check: Pass | MIT | |
| Badstephenleo/bmad-autonomous-development | 107 | — | ~7.7k | Automated safety check: Pass | MIT | |
| Build Failure Recoveryjsmastery-pro/jsm-agent-skill | 216 | — | ~1.8k | Automated safety check: Pass | MIT | |
| Bug Hunt SwarmDimillian/Skills | 4k | — | ~1.6k | Automated safety check: Pass | MIT | |
| Bug Hunt Swarmsickn33/agentic-awesome-skills | 47k | 1 repos | ~1.9k | Automated safety check: Pass | MIT |
leeguooooo/claude-code-usage-bar
Manage cs (claude-statusbar) — switch theme/style/density, override severity colors, preview combinations, run doctor, reset config, install, upgrade (cs upgrade — the only supported upgrade path)…
stephenleo/bmad-autonomous-development
BMad Autonomous Development — orchestrates parallel story implementation pipelines.
jsmastery-pro/jsm-agent-skill
Diagnoses which of three failure modes a stalled AI-assisted build is in, then chooses a targeted fix, a hard reset or a rethink instead of more prompting.
Dimillian/Skills
Parallel read-only multi-agent root-cause investigation for bugs, regressions, crashes, flaky behavior, or unexplained failures.
sickn33/agentic-awesome-skills
Parallel read-only multi-agent root-cause investigation for bugs, regressions, crashes, flaky behavior, or unexplained failures.
Chachamaru127/claude-code-harness
Diagnoses failing CI pipelines and tests, deciding first whether the test or the implementation is at fault, and hands hard cases to a dedicated fixer subagent.
yologdev/yoyo-evolve
Runs a structured critique of code, architecture or APIs to surface what familiarity hides, such as panics, security holes and design debt.
yologdev/yoyo-evolve
Sets a warm, plain-spoken voice for an agent's journal entries and GitHub issue replies, with rules on openings, jargon, honesty and endings.
yologdev/yoyo-evolve
Builds a structural map of a large or unfamiliar codebase by dispatching sub-agents to summarize regions, keeping the main context small.
yologdev/yoyo-evolve
Decides when a Rust crate is due for a release and gates publishing to crates.io, using a short git-based cadence check run at the start of a session.
yologdev/yoyo-evolve
Sets ground rules for a coding agent that edits its own Rust source: read the code and journal first, write tests first, commit small changes and check compilation after each file.
yologdev/yoyo-evolve
Analyze your own source code and capabilities to find bugs, gaps, and improvement opportunities
Works with
Categories
Diagnoses a recurring failure such as a stuck task, repeated CI error or frequent reverts by sending sub-agents through the logs and returning one root-cause diagnosis. Built for an agent that keeps hitting the same failure, this skill produces a focused diagnosis of why. Raw GitHub Actions logs are too large and noisy for the main context window, so the agent keeps its own context small, sends a sub-agent to read the logs and gets back a summary of one to three sentences, recursing only if that summary raises a deeper question.
Analyze Trajectory fits situations like: A task has been attempted several times with no success; the same CI error fingerprint keeps appearing in recent runs; several revert commits show up across recent sessions.
Run `npx skills add yologdev/yoyo-evolve --skill analyze-trajectory -a claude-code`. Or copy the skill folder (skills/analyze-trajectory in yologdev/yoyo-evolve) into .claude/skills/analyze-trajectory in your project. Claude Code loads it when a task matches its description.
Run `npx skills add yologdev/yoyo-evolve --skill analyze-trajectory -a codex`. Or copy the skill folder (skills/analyze-trajectory in yologdev/yoyo-evolve) into .agents/skills/analyze-trajectory in your project. Codex loads it when a task matches its description.
Cursor, Gemini CLI, GitHub Copilot and OpenCode also load SKILL.md folders. With the skills CLI, run `npx skills add yologdev/yoyo-evolve --skill analyze-trajectory -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/analyze-trajectory, .gemini/skills/analyze-trajectory, .github/skills/analyze-trajectory and .opencode/skills/analyze-trajectory in your project.
Going by SKILL.md and its folder, Analyze Trajectory needs the command-line tools its instructions call (git and gh). Our summary lists: The gh CLI and git for fetching logs and diffs.
SKILL.md names 1 domain. As links in the text: alexzhang13.github.io. This is read from the text; nothing was executed.
Our automated static check of SKILL.md found no risky patterns, such as piping downloads into a shell, reading credential files or hidden Unicode. It is not a guarantee. Review the folder before installing.
Analyze Trajectory is published under the MIT licence (the repository's licence). It allows redistribution, so the full SKILL.md is shown on this page.
About 3.6k tokens (SKILL.md is roughly 14k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full.
Skills that share tags, products or a category with Analyze Trajectory: Claude Statusbar (leeguooooo/claude-code-usage-bar, 377 stars), Bad (stephenleo/bmad-autonomous-development, 107 stars), Build Failure Recovery (jsmastery-pro/jsm-agent-skill, 216 stars) and Bug Hunt Swarm (Dimillian/Skills, 4k stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.
yologdev (a GitHub user) maintains it in yologdev/yoyo-evolve, which has 1,888 GitHub stars. The repository holds 15 skills in this directory. The repository was last updated on October 7, 2026.
Source: yologdev/yoyo-evolve on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.