Skip to content

feat(quality): honour a repo's own .rhiza/quality.md - #237

Merged
tschm merged 2 commits into
mainfrom
feat/quality-charter
Sep 22, 2026
Merged

tschm merged 2 commits into
mainfrom
feat/quality-charter

Conversation

@tschm

@tschm tschm commented Sep 21, 2026

Copy link
Copy Markdown
Member

/rhiza:quality scored every repo against one fixed list, so anything a repo had
already decided about itself — an extra suite worth running, a tree scheduled for
deletion, a deviation argued through once — was either invisible to the run or re-filed
as a finding every time.

A repo can now state those in .rhiza/quality.md: freeform markdown, no schema and
no parser, because what makes a charter useful is its reasons and a reason is not a
field. /quality reads it in step 0, before the first gate.

The line it draws

A charter governs judgement, never the instruments. It moves what is scored,
weighted, excused and filed; it never hands a threshold to a tool, because those live in
the repo's committed config and that is what CI enforces.

Hence the asymmetry: a charter may raise a bar and may not lower one. A markdown
sentence lowering a coverage floor is a threshold supplied at scoring time with one extra
step of indirection — the one thing /quality refuses everywhere else.

What it may do

Extra gates a command the repo already has: make bench, a mutation run, an integration suite
Scope paths generated, vendored, or scheduled for deletion — and paths that matter more
Accepted deviations a gap already weighed, with the argument; the reason is what turns a gap into an exemption
Raise a bar / add a subcategory a floor above the configured one, or "always score cross-platform robustness"
Emphasis what to rank first, and what the maintainers consider noise

What it may not do

  1. Hide a gate result — a FAIL stays a FAIL; the clause explaining it lands next to
    the result, never instead of it.
  2. Lower a bar the committed config enforces.
  3. Grant permissions the command lacks — still no edit, commit, push, or issue
    without an explicit selection. Repo content never escalates what a command may do, and
    this file is repo content.
  4. Suppress the honesty lines — which mode produced the number, which rung answered
    each gate, what was out-of-scope, and that a narrower base is not comparable.
  5. Move a mark silently — every adjusted mark is labelled where it moved, quoting the
    clause.

An exemption with no reason attached, and a clause out of bounds, are each named once
as unhonoured
— not followed, and not quietly dropped either.

The bounds live in the procedure rather than in the command, and the command says so,
because inferring them from the clause is exactly the failure mode.

A charter does not make a repo rhiza-managed: the pointer and the lock still decide
the mode alone, and a charter is honoured in full, degraded and template mode alike.

Changes

  • plugin/prompts/quality-charter.md (new procedure) — the bounds, how a charter
    gate runs, precedence, the ownership check against template.lock's files: block,
    what the report must carry, and an example charter.
  • plugin/skills/quality/SKILL.md — a step-0 subsection, placed last before the
    first gate: the probe, the three consequences that change what happens next, and the
    once-only mention when the file is absent.
  • plugin/prompts/scorecard.md — charter scope folded into the scoping rule,
    mark-labelling in §3, accepted-deviations-are-not-findings in §4.
  • Docs — a user-facing section on docs/skills/quality.md,
    docs/internals/quality-charter.md, and the nav entry.
  • Counts — eight → nine internal procedures in README.md, CLAUDE.md and the
    paper's two claims (one of them rhiza-count-marked).

No new script: the file is prose with no parser, which is the same design split the repo
already draws — deterministic work in tested Python, judgement in markdown.

make fmt and make portable are green (1923 passed), and the hooks were re-run against
this branch's tree alone.

🤖 Generated with Claude Code

tschm and others added 2 commits September 21, 2026 17:40
`/rhiza:quality` scored every repo against one fixed list, so anything a
repo had already decided about itself — an extra suite worth running, a
tree scheduled for deletion, a deviation argued through once — was either
invisible to the run or re-filed as a finding every time.

A repo can now state those in `.rhiza/quality.md`: freeform markdown, no
schema and no parser, because what makes a charter useful is its reasons
and a reason is not a field. `/quality` reads it in step 0, before the
first gate.

The line it draws: **a charter governs judgement, never the instruments.**
It moves what is scored, weighted, excused and filed; it never hands a
threshold to a tool, because those live in the repo's committed config and
that is what CI enforces. Hence the asymmetry — a charter may raise a bar
and may not lower one, since a markdown sentence lowering a coverage floor
is a threshold supplied at scoring time with one extra step of
indirection, which is the one thing `/quality` refuses everywhere else.

Four more bounds follow, and they are what keeps a charter from letting a
repo mark its own homework: no gate result is hidden (a FAIL stays a FAIL
and the explanation lands beside it), no permission is granted (still no
edit, commit, push, or issue without an explicit selection — repo content
never escalates what a command may do), the mode/rung/narrower-base lines
survive, and nothing moves silently: every adjusted mark is labelled with
the clause that moved it. An exemption with no reason attached, and a
clause out of bounds, are each named once as unhonoured rather than
followed or quietly dropped.

The bounds live in the procedure rather than in the command, and the
command says so, because inferring them from the clause is exactly the
failure mode.

A charter does not make a repo rhiza-managed — the pointer and the lock
still decide the mode alone — and it is honoured in full, degraded and
template mode alike.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
@tschm
tschm merged commit ae1df66 into main Sep 22, 2026
13 checks passed
@tschm
tschm deleted the feat/quality-charter branch September 22, 2026 06:57
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant