Builds on #13/PR #18 review. Makes canon lifecycle machine-checkable. Deliverables: 1. Dependency-free canon_validator.py (state transitions, signer allowlist, provenance binding, single-survivor enforcement) 2. 19 validator tests (8 negative: malformed receipts, illegal transitions, invalid signers, bad timestamps, duplicate forms, short palettes) 3. Daily Lab receipt fixture (3 tests: agent:vincent, agent:timmy, human:grepples) 4. Full suite integration - 31 tests pass from clean checkout 5. .gitignore for bytecode, renamed slop-cannon → slop_cannon (Python import) Closes #19 Refs: #5, #13, PR #12, PR #18
46 lines
1.3 KiB
Markdown
46 lines
1.3 KiB
Markdown
# Collaboration contract
|
|
|
|
## Timmy
|
|
|
|
- Owns the episode spine, first build, integration, and final render.
|
|
- Must provide a playable artifact and verification before handoff.
|
|
- Hands Vincent one concrete weakness or decision—not “thoughts?”
|
|
|
|
## Vincent
|
|
|
|
- Owns adversarial editing and independent verification.
|
|
- Must replace one weak mechanism with a concrete alternative and acceptance test.
|
|
- Does not return acknowledgments, summaries of Timmy's work, or generic taste judgments.
|
|
|
|
## Humans
|
|
|
|
- Choose canon outcomes.
|
|
- May reject both agent proposals.
|
|
- Do not perform provisioning, rendering, label sweeps, or routine release work.
|
|
|
|
## Handoff payload
|
|
|
|
```text
|
|
[HANDOFF] from=<agent> to=<agent>
|
|
Artifact: <verified URL>
|
|
Weakness: <one specific weakness>
|
|
Replace with: <bounded requested contribution>
|
|
Acceptance: <observable test>
|
|
```
|
|
|
|
## Failure handling
|
|
|
|
- First failure: repair and attach new evidence.
|
|
- Second failure: change method, not wording.
|
|
- Third failure: mark blocked and request one precise human decision.
|
|
|
|
## Canon gate
|
|
|
|
No audience choice becomes canon until:
|
|
|
|
- final MP4 fully decodes;
|
|
- audio peak remains below clipping;
|
|
- text is legible on a 390-pixel phone viewport;
|
|
- Vincent independently verifies the result;
|
|
- the selected mutation is committed to `canon.json` with its power, scar, cost, and source issue.
|