Adopt hi: record what let should be, as 156 criteria - #9
Conversation
156 criteria across 10 families, captured with the hi CLI rather than written by hand, saying what let should be for the people who use it. Criteria are directions, not a status report. A criterion that is false today means the code has not arrived yet, not that the criterion is wrong, so nothing here records whether anything is built. Every criterion was scored for accuracy against this repository's own evidence. Anything a second independent auditor confirmed below 85 was rewritten or retired before this commit. CI gains a `hi check` gate. It fails only on structural problems in hi/*.md and never on unfinished intent, so it cannot go red because somebody wrote down a want that is not built yet. hi is pinned to 0.3.3 --locked. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01UcDK2AAqo8w9vjvwA2yitV
0.4.0 closes four ways hi could break its only promise, that an id is permanent and never reused. Three were silent, with `hi check` reporting no problem: a retire that landed the criterion outside every section hi reads and freed its id for reuse, a retire reason that could forge a criterion and burn an id nobody wrote, and a criterion inside a fence that was invisible to all six checks. The fourth lost concurrent captures to a shared temp path. This gate exists to protect id integrity, so it should not run on the version that could not. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01UcDK2AAqo8w9vjvwA2yitV
0.5.0 changes what `hi check` reads: a file in hi/ whose name is not lowercase is hi's own rather than criteria, and a criterion-shaped line inside one is reported as stray-criterion rather than parsed. Pinning an older version checks these files with rules the tool no longer has. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
corvid-agent
left a comment
There was a problem hiding this comment.
Verdict: REQUEST_CHANGES
Head: c2487d7fa7975e09b57f31ceaa99973c64fd3566 · author 0xLeif
#788 anti-pattern: ~156 criteria reverse-engineered from existing code (“Adopt hi: record what let should be, as 156 criteria”). Permanent ids on unconfirmed sentences; missing wants stay invisible.
Required path: draft → confirm-with-humans → capture only confirmed lines. Prefer the paired seed habit PR (let#10). Please close or rewrite without bulk reverse-engineered criteria.
corvid-agent
left a comment
There was a problem hiding this comment.
CoS APPROVE as first-pass draft for human migrate (Leif 2026-09-17).
hi check exit 0 on tip c2487d7 (156 criteria).
Expect human rewrite/retire/replace ids; not treating reverse-engineered AC as final product truth.
No merge by CoS.
Summary
Adopts hi to record what let should be, as plain sentences with
permanent ids, so tickets and specs can be generated from them instead of written alongside them.
hiCLI rather than hand-written.INTENT.mdcarries the product prose and a generated feature index; eachhi/*.mdopens with its own## Intent.hi checkgate, pinned to--version 0.3.3 --locked.intent.htmlis gitignored.These are directions, not a status report. A criterion that is false today means the code has
not arrived yet, not that the criterion is wrong. Nothing here records whether anything is built;
that layer belongs to spec-sync.
hi checkfails only on the six structural problems, so this gatecannot go red because somebody wrote down a want that is not built yet.
Accuracy audit
Every criterion in this repo was scored against its own evidence (README, docs, CLI surface, tests,
specs), and every line scoring below 95 was re-examined by a second independent auditor.
Full triage across all 11 repos: https://claude.ai/artifact/G6TzEz3HHgGsHFH5r2DRHn
Corrected before this PR
GUARD-1— rewritten. Was: Chat transcripts are never read out, whatever I ask for.Now: Finding, showing or opening a chat transcript gives me its size and age, never its contents.
WIRE-2— rewritten. Was: Run by a person at a terminal, the same answers read plainly without a JSON parser.Now: A person reading the terminal gets the answer without piping it through a JSON parser.
Deliberately left out
I left out the development and release machinery, which is about building
letrather than using it: the fledge lanes and tasks, spec-sync module contracts, augur risk scoring, attest provenance, the Trust CI workflow, biome/tsconfig/bun lockfile conventions, and the "do not use em-dashes" style rules. I left out the internal architecture as architecture — adapter registries, ScanContext, card factories, id-hash formulas, merge overlay field priority, the path-prefix attribution table — keeping only the person-visible consequences (one entry per checkout, stable identity, credited to the right agent). I left out the design document's unbuilt roadmap (loops, handoffs, learnings, draft-skill generation, SQLite memory schema and migrations, a tools registry, MCP write tools, the index cache, a watcher daemon) because criteria should describe wants for this product, and these are speculative enough that I could not tell which are still wanted. I also skipped the.worktrees/fleet-webcheckout, which is a duplicate working copy of the repository rather than product surface, and the npm/GitHub publish gating, which is a release decision rather than a behaviour anyone experiences.Could not work out the intent for
Superskills are unclear:
let supercan list, read and generate an example recipe of shell commands, but nothing runs one, and the design hints at step graphs with skill references and validation — I could not tell whether the intent is an executable runtime or deliberately just a readable card, so I wrote it as "write down a recipe and list it later". Thecorvidhost appears in the host list, the attribution table and the worktree bases, but no adapter surfaces anything for it, so I could not tell whether corvid-agent is meant to be a first-class host or a placeholder. Project-scope notes require a git repository, which reads more like an implementation constraint than a want, so I did not encode it. The Fleet dashboard's local process probe is the least settled part: it inspects a bounded descendant process tree and infers operation labels from command lines, and I could not tell how far that inference is supposed to go before it becomes guessing. Finally,let historyandlet weboverlap in purpose (both answer "what has been happening across my machine") and I kept them as separate feature areas, but they may be intended as one idea with two faces.Test Plan
hi checkpasses locally (verified:156 criteria · 10 families · 10 files)hi checkstep passes on a fresh runner🤖 Generated with Claude Code
https://claude.ai/code/session_01UcDK2AAqo8w9vjvwA2yitV