docs: FAMILY.md v2 — member classes, and clause 7 stated per class - #83
Merged
Merged
Conversation
v1 opened by claiming it "describes the contract the family already
implements". That was false of clause 7: two of four D&D members shipped no
--pipe and one shipped no MCP server. v2 fixes the claim rather than quietly
restating it.
The substantive change is member classes. Clause 7 bound every member to the
same six surfaces, which is wrong in a specific way: --pipe is
one-query-in/one-verdict-out, and table-kit is transport plus a session
ledger, so that shape has no honest meaning there. Same for an MCP server.
Requiring them anyway produces surfaces that exist to satisfy a table.
verdict (srdcheck, charactercheck, dmcheck) every clause
transport (table-kit) clauses 1 and 3 only where
it emits a verdict; clause 7
minus --pipe and MCP
adjacent (inkcheck, loudcheck) clauses 2-6; different
domains, outside the D&D
choreography and the honest
lane
That last class replaces v1's recorded exit-2 divergence. Those two tools were
not breaking a rule; they were never in its scope.
Also in v2:
- Clause 1's honest lane now includes "cannot answer from the evidence
available" (incomplete coverage), which is what the reference implementation
already does via refusal contract 1.1. v1's definition was narrower than its
own reference.
- Clause 1 states explicitly that usage errors must not share the honest
lane's exit code, with srdcheck's exit 3 as the precedent.
- Clause 7 adds the SKILL.md truth obligation. Its acceptance test checks
invocability, and every member passed it while misstating its own exit
contract, so the claims must now be executable and executed by
scripts/family_conformance.py.
- The two open clause-7 gaps are named inline rather than left implied.
Closes #80
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This was referenced Aug 20, 2026
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Resolves #80. This is a contract decision, so it is a PR rather than a push — the call is reviewable before it binds anything.
The problem
FAMILY.mdv1 opened by saying it "describes the contract the family already implements." The audit found that false of clause 7: 2 of 4 D&D members ship no--pipe, and 1 ships no MCP server. The family's canonical contract overstated its own conformance — the same doc-truth defect these tools exist to catch, in the document that defines them.The decision
The obvious fixes were both wrong. Marking clause 7 aspirational gives up on surfaces that genuinely should exist. Doing all the work means building
--pipeand an MCP server for table-kit, which is transport plus a session ledger —--pipeis one-query-in / one-verdict-out, and that shape has no honest meaning for a thing that records a session. You'd get a surface built to satisfy a table.So v2 states clause 7 per member class:
SKILL.md,tool.json,llms.txt,--schemaflag--pipeThat last class replaces v1's "recorded divergence" language. inkcheck and loudcheck were never breaking a rule — they were never in its scope, and describing them as an exception was the contract being imprecise about its own boundary.
What this does to the open issues
--pipe--schemais a subcommand--pipeI have not closed anything. If you'd rather table-kit ship both surfaces anyway, reject this PR and all four stay as work.
Also corrected in v2
qc/reportexit-2 lane does too. Widened to match reality.HONEST_LANE_OVERLOADcheck.SKILL.md. Its acceptance test — "a fresh-context agent, given only this file, can produce a well-formed invocation" — checks invocability, and every member passed it while misstating its own exit contract. Claims must now be executable and executed, byscripts/family_conformance.py(feat: add a family conformance gate that executes documented exit contracts #82, merged).Per clause 7's own versioning rule, this is a heading bump (v1 → v2) with a changelog entry.
🤖 Generated with Claude Code