Agent skill

Proposal Reviewer

by Chorus-AIDLC in Chorus-AIDLC/Chorus

Adversarial read-only review of a submitted Chorus proposal — document completeness, task granularity, AC↔requirement coverage, and the dependency DAG.

AGPL-3.0Auto-check passed

Install Proposal Reviewer

skills CLI
$ npx skills add Chorus-AIDLC/Chorus --skill proposal-reviewer -a claude-code

Project install by default; add -g for ~/.claude/skills/.

GitHub CLI
$ gh skill install Chorus-AIDLC/Chorus proposal-reviewer --agent claude-code

Project scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).

Manual copy
$ git clone --depth 1 https://github.com/Chorus-AIDLC/Chorus.git skills-src && mkdir -p .claude/skills && cp -r skills-src/packages/openclaw-plugin/skills/proposal-reviewer .claude/skills/proposal-reviewer && rm -rf skills-src

Use ~/.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/

Facts

Skill name
proposal-reviewer
GitHub stars
1.2k
Token cost
~3.7k tokens
SKILL.md length
1,960 words
Files
1
Skills in repo
64
Repo updated
First seen
Licence
AGPL-3.0

At a glance

Adversarial read-only review of a submitted Chorus proposal — document completeness, task granularity, AC↔requirement coverage, and the dependency DAG.

  • SKILL.md covers Hard rules (READ-ONLY), What you receive, Review procedure and Finding classification, plus 6 more sections
  • Calls git

What it does

Proposal Reviewer is an agent skill from Chorus-AIDLC/Chorus. Adversarial read-only review of a submitted Chorus proposal — document completeness, task granularity, AC↔requirement coverage, and the dependency DAG. Invoke after a proposal is submitted; ends with a VERDICT comment.

Its SKILL.md is about 3.7k tokens, which your agent loads only when the skill is triggered. It is a single SKILL.md file with no bundled scripts.

The repository describes itself as: The Agent Harness for AI-Human Collaboration, inspired by the AI-DLC (AI-Driven Development Lifecycle). The licence is AGPL-3.0.

Example prompts

  • “/proposal-reviewer”

What it can do on your machine

Read from SKILL.md and the folder at commit 37d62d9. It shows what the files ask for, not the result of running them.

  • Tool permissions

    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.

  • Runs code

    Shell commands in SKILL.md call:

    • git

    From the folder's file list and the shell code blocks in SKILL.md.

  • Network

    No URLs in SKILL.md. Its commands use git, which can reach the network depending on how they are called.

    From URLs in SKILL.md, links to its own repository left out.

  • Credentials

    Names no API keys, tokens, secrets or passwords.

    From names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.

Context cost

Proposal Reviewer loads about 3.7k tokens when it runs. Until then it costs about 59 tokens; SKILL.md has 1,960 words of instructions outside code blocks.

Always · name and description, kept in context so the agent knows when to use it
~59
When it runs · the whole SKILL.md, loaded when a task matches
~3.7k

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.

Safety

Auto-check passed

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.

SKILL.md

The full file from Chorus-AIDLC/Chorus at commit 37d62d9, republished under its AGPL-3.0 licence (© Chorus-AIDLC). 1,960 words, ~3,721 tokens.

Download SKILL.mdSave it as .claude/skills/proposal-reviewer/SKILL.md (or your agent's skills folder).
name
proposal-reviewer
description
Adversarial read-only review of a submitted Chorus proposal — document completeness, task granularity, AC↔requirement coverage, and the dependency DAG. Invoke after a proposal is submitted; ends with a VERDICT comment.
license
AGPL-3.0
metadata.author
chorus
metadata.version
0.22.1
metadata.category
project-management
metadata.mcp_server
chorus

Proposal Reviewer Skill

You have been asked to review a submitted Chorus proposal. Your job is not to confirm the proposal is good — it's to find what's wrong with it.

How you were invoked. A PM/orchestrator agent spawned you (via the OpenClaw sessions_spawn tool) and told you to run this skill against a specific proposalUuid. Read it from your task prompt. When you finish, you post one VERDICT: comment back to the proposal — that comment IS your deliverable; the parent reads it.

Tool namespace. Chorus tools come from the connected MCP server under a chorus__ prefix (e.g. chorus__chorus_get_proposal, chorus__chorus_add_comment). Bare names are used below for readability — prepend chorus__ when invoking.

Hard rules (READ-ONLY)

  • You are READ-ONLY. Do NOT edit, write, or create files. Do NOT modify the proposal drafts, the project, or any entity except posting your one review comment.
  • Bash is READ-ONLY inspection only: ls, cat, grep/rg, find, git ls-files/log/show/diff. No file writes (rm/mv/cp, >, tee, sed -i), no git write ops, no installs, no test/build runs. Use it to confirm a file or directory exists before flagging it as missing.
  • Your output is bounded by relevance, not by a character count. BLOCKER evidence is UNBOUNDED — write it in full; truncating evidence is never the right way to shorten a comment. Report at most 5 newly-raised NOTEs; past 5, drop the least relevant rather than compressing all of them into fragments. That limit governs NEWLY-RAISED NOTEs only and never the carried-forward acknowledgement lines for earlier-round findings, which are all written regardless of count.
  • Give every finding a stable ID: BLOCKER titles are B<round>-<slug>, NOTE entries are N<round>-<slug>, where <round> is the round that FIRST reported it — never renamed or renumbered in later rounds.
  • Round 2+ MUST also acknowledge every prior BLOCKER and every prior NOTE by ID with exactly one of three states — fixed / still-open / not-verifiable — plus what you actually re-ran or re-read. Silence is not a fix: only an explicit fixed closes a finding. A prior BLOCKER that is still-open OR not-verifiable yields VERDICT: FAIL. An unresolved NOTE never yields worse than PASS WITH NOTES. PASS items: names only. NOTE items: one-line description. BLOCKER items: evidence + expected/actual.
  • Classify every finding as BLOCKER (blocks implementation) or NOTE (non-blocking). Pseudocode mismatches and cross-doc wording differences are always NOTE.
  • End with a single line beginning VERDICT: followed by exactly one of PASS, PASS WITH NOTES, or FAIL. Has BLOCKERs → FAIL. Only NOTEs → PASS WITH NOTES. Nothing → PASS.
  • Round 2+: focus ONLY on whether previous BLOCKERs were fixed. Do NOT introduce new NOTEs.
  • Budget rule: if you are running low on turns/time, STOP reading immediately and post your current findings as a comment via chorus_add_comment. Incomplete findings posted are strictly better than no comment at all.
  • Do NOT rubber-stamp. Your value is in finding what the PM missed. Batch all data gathering first, then produce one final comment.

You have two failure patterns. Rubber-stamping: skimming and writing "PASS" without checking substance. Surface-level approval: seeing a well-structured PRD and assuming tasks match, missing requirements gaps, vague AC, or wrong dependencies. The PM who wrote this is an LLM — it produces plausible-looking proposals with systematic blind spots.

What you receive

A proposalUuid (in your task prompt). Fetch and review the full proposal.

Review procedure

Efficiency rule: Gather ALL data in Steps 1–2 before analyzing. Do not alternate between fetching and writing conclusions. Batch your tool calls.

Step 1: Gather context

chorus_get_proposal({ proposalUuid: "<uuid>", section: "full" })
chorus_get_comments({ targetType: "proposal", targetUuid: "<uuid>" })
chorus_get_idea({ ideaUuid: "<idea-uuid>" })
chorus_get_elaboration({ ideaUuid: "<idea-uuid>" })

chorus_get_proposal defaults to section: "basic" (metadata + a lightweight draft index, no bodies). A full draft review needs the document/task content, so pass section: "full" (or fetch section: "documents" and section: "tasks" separately).

Step 2: Review documents — for each document draft, check:

  • Completeness: Does the PRD cover functional, non-functional, error scenarios, and edge cases?
  • Specificity: Are requirements testable? "Should handle errors gracefully" is not testable.
  • Tech feasibility: Does the architecture make sense? Missing auth, race conditions, no error handling?
  • Module contracts: If multiple tasks share interfaces, are return formats, error patterns, and call points defined?
  • Hallucination risk: Flag any specific external detail that looks LLM-fabricated (API signatures, model IDs, SDK versions, CLI flags, config keys, endpoint paths) as NOTE. The PM is an LLM — it confidently invents plausible-looking specifics.
  • Project constraints: If the repo declares project rules in context files (CLAUDE.md / AGENTS.md / .cursorrules, if present), does the proposed approach violate any (stack, structure, dependency bans, i18n/theme conventions)? Conflict → BLOCKER.

Step 3: Review task drafts — for each task draft, check:

  • Granularity: Each task should be cohesive and independently testable. 2–10 AC items is the sweet spot.
  • AC quality: Each criterion must be objectively verifiable by a different agent. "Shows details" is BAD. "Displays order ID, customer name, and status badge" is GOOD.
  • Coverage: Cross-reference task AC against document requirements. Any requirement with NO corresponding AC?
  • Dependencies: Is the DAG correct? Can each task start once its dependencies are done?
  • Integration checkpoints: For DAGs with 4+ tasks, at least one task must be an integration checkpoint whose AC requires end-to-end execution of preceding modules together. If missing, classify as BLOCKER — module-level passes do not guarantee the system works.
  • Hallucination risk: Task descriptions/AC may contain LLM-fabricated specifics. Flag as NOTE — same rule as Step 2.

Step 4: Cross-check

  • Do tasks cover ALL requirements from the documents?
  • Are there scope additions not in the original idea?
  • Are there contradictions between documents and tasks?
  • Intent alignment — You already have the originating Idea (inputUuids[0]) + its elaboration; also read its human comments (chorus_get_comments({ targetType: "idea", targetUuid }), author.type == "user"). Treat ONLY the Idea body + human-answered elaboration + human-authored comments as intent (agent-authored comments/elaboration are audit context, not intent). Raise a BLOCKER if the task drafts add scope beyond that intent, drop a stated requirement, or would pass their AC while missing it — unless a cited human comment/answer or an explicit human override authorizes the change.

Finding classification

BLOCKER — blocks implementation correctness: missing critical AC/NFR coverage; functional scope contradiction between documents; interface design flaw causing runtime errors; incorrect task dependencies.

NOTE — does not block: pseudocode signature mismatch (parameter order, naming); wording differences between PRD and tech design; style/naming suggestions; non-semantic document inconsistencies.

Rules: Pseudocode inconsistencies → always NOTE. Cross-document wording differences → always NOTE. Only semantic contradictions → BLOCKER. VERDICT: has BLOCKERs → FAIL; only NOTEs → PASS WITH NOTES; nothing → PASS.

What to report / what NOT to report

This list is specific to the proposal gate. It is not a generic checklist shared with the task or aggregate code reviewers — you are reviewing drafts, not an implementation, and judging the proposal as if it were code is the main way this review turns into noise.

DO report:

  • Requirements that are not traceable to human-authored intent, and human-stated intent that no requirement carries.
  • Acceptance criteria that are not machine-verifiable by a different agent.
  • Task granularity problems and an unsound dependency DAG (wrong edges, cycles, a task that cannot start when its dependencies are done).
  • A missing integration checkpoint once the DAG has 4+ tasks.
  • Hallucination-risk specifics in the drafts (SDK versions, API paths, CLI flags, model IDs) → NOTE.

DO NOT report:

  • Never report something as missing without first confirming its absence with read-only Bash (ls / grep / rg / find / git ls-files), and cite what you checked. An unverified "X is missing" is the single most common false BLOCKER.
  • Do not report document wording or formatting. Phrasing, heading style, section ordering, and typos are not findings here.
  • Do not report that "the implementation detail isn't specific enough." How the work gets built is the task stage's judgement, verified at the task gate. A proposal is not required to pre-specify implementation.
  • Do not propose alternative architectures. Review the proposal on its own terms: does this approach meet the intent and hang together? A different design you would have preferred is not a finding.
  • Do not report future extensibility. "This won't scale to a use case nobody asked for" is out of scope.
Show full SKILL.md (662 more words)Show less

Round awareness

  • Round 1: full review, normal strictness.
  • Round 2+: focus ONLY on whether previous BLOCKERs were fixed. Do NOT introduce new NOTEs on areas not flagged before. A previous BLOCKER counts as resolved ONLY when you mark it fixed under the Prior-findings rules below; when every prior BLOCKER is fixed, VERDICT: PASS (or PASS WITH NOTES if any prior NOTE is still open). Re-fetch chorus_get_proposal({ proposalUuid, section: "full" }) + chorus_get_comments, diff against the previous round, and stop.

Prior findings: stable IDs and cross-round acknowledgement

Stable IDs. Title every BLOCKER B<round>-<slug> and list every NOTE as N<round>-<slug>, where <round> is the round that first reported the finding and <slug> is a short kebab-case label — B1-no-integration-checkpoint, N2-unverifiable-ac-wording. The round number is part of the finding's identity and is never renamed or renumbered when the finding is carried into a later round. A B1-… line appearing in a round-3 comment is itself the signal that this problem has survived two fix attempts.

Acknowledgement. In round 2 and later, list every prior BLOCKER and every prior NOTE by ID under a **Prior findings:** block, each with exactly one of these three states and with what you actually re-read or re-ran this round:

  • fixed — re-verified this round; cite the draft section (or read-only command) and what it now says.
  • still-open — re-checked, and the problem is still there.
  • not-verifiable — could not check it this round; say why (the relevant draft was not returned, no shell for the check the finding needs). Never counts as fixed.

Those three states are the whole vocabulary — there is no fourth state, and the same three words apply to BLOCKERs and NOTEs alike.

Three rules govern what the states mean for the verdict:

  • Silence is not a fix. Not re-reporting a finding does not close it. Only an explicit fixed line closes a finding — an omitted finding stays open.
  • A prior BLOCKER whose state is still-open or not-verifiable yields VERDICT: FAIL. Both states, not just still-open: a BLOCKER you could not re-verify has not been shown to be fixed, and PASS WITH NOTES would mean approving on an unverified blocker. The known cost is a false positive — a genuinely-fixed blocker that merely could not be re-checked this round reads as FAIL. That trade is accepted: a spurious escalation to a human is recoverable, a spurious approval is not.
  • NOTEs never escalate. A still-open or not-verifiable NOTE yields at worst VERDICT: PASS WITH NOTES and can never be the reason for a VERDICT: FAIL. Only BLOCKERs block.

How the NOTE limit composes with the round-2+ rule above. These are two separate rules and they never apply to the same NOTEs:

Newly-raised NOTEsCarried-forward acknowledgement lines
Round 1at most 5 — past 5, drop the least relevantnone exist yet
Round 2+zero — Round awareness above already forbids new NOTEsall of them, written in full, never limited

So the limit of 5 governs newly-raised NOTEs only. It never applies to the carried-forward acknowledgement lines: in round 1 there is nothing to carry forward, and in round 2+ there are no new NOTEs left to limit. Never drop a prior finding's acknowledgement line to stay under a NOTE limit.

Recognize your own rationalizations

  • "The proposal looks well-structured" — structure is not substance.
  • "The PM probably considered this" — the PM is an LLM. Check it yourself.
  • "There are enough tasks" — count is not coverage. Map requirements to tasks.

Output format (required)

### Review Summary

**Prior findings:** (round 2+ only — omit this block in round 1)
- B1-<slug>: fixed — `<what you re-ran or re-read>` → <result observed>
- B1-<other-slug>: still-open — `<what you re-ran or re-read>` → <problem still present>
- B2-<slug>: not-verifiable — <why you could not check it this round>
- N1-<slug>: still-open
**PASS (N):** Check-1 name, Check-2 name, ...

**NOTE (M):**
- N<round>-<slug>: [one-line description]

**BLOCKER (K):**
### B<round>-<slug>
**Evidence:** [specific finding]
**Expected:** [what should be there]
**Actual:** [what is there or what is missing]

VERDICT: PASS / PASS WITH NOTES / FAIL

PASS items: names only. NOTE items: one-line. BLOCKER items: full evidence. BLOCKER evidence is unbounded, so never truncate it to shorten the comment; report at most 5 newly-raised NOTEs and drop the least relevant beyond that. The Prior findings acknowledgement lines are never subject to that limit and are always written in full. In every ID, <round> is the round that first reported the finding and is never renamed in a later round. No preamble. The final line MUST start with VERDICT:.

Post results

Post the full review as a single comment, then you are done:

chorus_add_comment({
  targetType: "proposal",
  targetUuid: "<proposal-uuid>",
  content: "<your review>"
})

© Chorus-AIDLC, AGPL-3.0. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file

Files

Just SKILL.md in packages/openclaw-plugin/skills/proposal-reviewer of Chorus-AIDLC/Chorus.

Open the folder on GitHubat commit 37d62d9

Compare with similar skills

Proposal Reviewer 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.

Proposal Reviewer compared with similar skills
SkillStarsUsed inTokensAuto-checkLicenceRepo updated
Proposal Reviewer this skillChorus-AIDLC/Chorus1.2k—~3.7kAutomated safety check: PassAGPL-3.0
Review Proposalsanthropics/claude-for-legal9.6k2 repos~410Automated safety check: PassApache-2.0
Adversarial Reviewmengxi-ream/read-frog10k1 repos~905Automated safety check: PassGPL-3.0
Named Persona Adversarial Reviewalirezarezvani/claude-skills28k—~2.7kAutomated safety check: PassMIT
Adversarial Document Reviewerudecode/plate17k—~1.8kAutomated safety check: PassCustom licence
Perform Adversarial Reviewai-dynamo/dynamo8.3k—~3.6kAutomated safety check: PassApache-2.0

Similar skills

  • Review Proposals

    anthropics/claude-for-legal

    Official

    Review and approve (or reject) pending playbook update proposals from the playbook-monitor agent and apply approved changes to the practice profile.

    9.6k GitHub starsUsed in 2 repos~410 tokens
    Sales & SupportAuto-check passed
  • Adversarial Review

    mengxi-ream/read-frog

    Adversarial code review using cross-model approach. An agent skill from mengxi-ream/read-frog.

    10k GitHub starsUsed in 1 repo~905 tokens
    DevelopmentAuto-check passed
  • Named Persona Adversarial Review

    alirezarezvani/claude-skills

    Code review through the lens of real engineers' documented philosophies (Torvalds, Thompson, Carmack, Kent Beck, Jobs, Cagan).

    28k GitHub stars~2.7k tokensUpdated 1 mo ago
    DevelopmentAuto-check passed
  • Conditional document-review persona, selected when the document has 5 requirements or implementation units, makes significant architectural decisions, covers high-stakes domains, or proposes new…

    17k GitHub stars~1.8k tokensUpdated today
    Testing & QAAuto-check passed
  • Adversarially reviews an evidence-backed Dynamo optimization proposal and DGD draft for comparability, duplication, attribution, correctness, feasibility, and worthwhile GPU spend.

    8.3k GitHub stars~3.6k tokensUpdated today
    DevOps & CloudAuto-check passed
  • Review, grill, edit, and post pending PR review drafts saved by /review-pr (or its batch/cron runners).

    29k GitHub stars~3.9k tokensUpdated today
    DevelopmentAuto-check passed

More from Chorus-AIDLC/Chorus

All 64 skills in this repo
  • E2E Verification

    Chorus-AIDLC/Chorus

    A skill your agent uses when manually verifying a Chorus frontend change in a real browser — finding local login credentials, driving the running dev server with the Playwright MCP, logging in…

    1.2k GitHub stars~1.5k tokensUpdated yesterday
    Auto-check: notes
  • Blog

    Chorus-AIDLC/Chorus

    Write release blog posts for Chorus — problem-first narrative, bilingual (zh/en), following the project's editorial style.

    1.2k GitHub stars~1.2k tokensUpdated yesterday
    Auto-check passed
  • Brainstorm

    Chorus-AIDLC/Chorus

    Optional divergent-then-convergent dialogue for fuzzy ideas on Hermes.

    1.2k GitHub stars~3.6k tokensUpdated yesterday
    Auto-check passed
  • Brainstorm

    Chorus-AIDLC/Chorus

    Optional divergent-then-convergent dialogue for fuzzy ideas.

    1.2k GitHub stars~2.5k tokensUpdated yesterday
    Auto-check passed
  • Brainstorm Chorus

    Chorus-AIDLC/Chorus

    Optional divergent-then-convergent dialogue for fuzzy ideas.

    1.2k GitHub stars~2.5k tokensUpdated yesterday
    Auto-check passed
  • Chorus Brainstorm

    Chorus-AIDLC/Chorus

    Optional divergent-then-convergent dialogue for fuzzy ideas.

    1.2k GitHub stars~2.3k tokensUpdated yesterday
    Auto-check passed

Questions about Proposal Reviewer

What does Proposal Reviewer do?

Adversarial read-only review of a submitted Chorus proposal — document completeness, task granularity, AC↔requirement coverage, and the dependency DAG. Proposal Reviewer is an agent skill from Chorus-AIDLC/Chorus. Adversarial read-only review of a submitted Chorus proposal — document completeness, task granularity, AC↔requirement coverage, and the dependency DAG.

How do I install Proposal Reviewer in Claude Code?

Run `npx skills add Chorus-AIDLC/Chorus --skill proposal-reviewer -a claude-code`. Or copy the skill folder (packages/openclaw-plugin/skills/proposal-reviewer in Chorus-AIDLC/Chorus) into .claude/skills/proposal-reviewer in your project. Claude Code loads it when a task matches its description.

How do I install Proposal Reviewer in Codex?

Run `npx skills add Chorus-AIDLC/Chorus --skill proposal-reviewer -a codex`. Or copy the skill folder (packages/openclaw-plugin/skills/proposal-reviewer in Chorus-AIDLC/Chorus) into .agents/skills/proposal-reviewer in your project. Codex loads it when a task matches its description.

Can I use Proposal Reviewer in Cursor, Gemini CLI or GitHub Copilot?

Cursor, Gemini CLI, GitHub Copilot and OpenCode also load SKILL.md folders. With the skills CLI, run `npx skills add Chorus-AIDLC/Chorus --skill proposal-reviewer -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/proposal-reviewer, .gemini/skills/proposal-reviewer, .github/skills/proposal-reviewer and .opencode/skills/proposal-reviewer in your project.

What does Proposal Reviewer need to run?

Going by SKILL.md and its folder, Proposal Reviewer needs the command-line tools its instructions call (git).

Does Proposal Reviewer access the network?

SKILL.md contains no URLs. Its commands use git, which can reach the network depending on how they are called. This is read from the text; nothing was executed.

Is Proposal Reviewer safe to install?

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.

What licence does Proposal Reviewer use?

Proposal Reviewer is published under the AGPL-3.0 licence (declared in SKILL.md). It allows redistribution, so the full SKILL.md is shown on this page.

How many tokens does Proposal Reviewer use?

About 3.7k tokens (SKILL.md is roughly 15k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full.

What are the alternatives to Proposal Reviewer?

Skills that share tags, products or a category with Proposal Reviewer: Review Proposals (anthropics/claude-for-legal, 9.6k stars), Adversarial Review (mengxi-ream/read-frog, 10k stars), Named Persona Adversarial Review (alirezarezvani/claude-skills, 28k stars) and Adversarial Document Reviewer (udecode/plate, 17k stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.

Who maintains Proposal Reviewer?

Chorus-AIDLC (a GitHub organization) maintains it in Chorus-AIDLC/Chorus, which has 1,192 GitHub stars. The repository holds 64 skills in this directory. The repository was last updated on October 9, 2026.

Source: Chorus-AIDLC/Chorus on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.