docs: add AGENTS.md dossier spec #463
No reviewers
Labels
No labels
Agent
Compat/Breaking
Kind/Bug
Kind/Documentation
Kind/Enhancement
Kind/Feature
Kind/Security
Kind/Testing
Priority
Critical
Priority
High
Priority
Low
Priority
Medium
Reviewed
Confirmed
Reviewed
Duplicate
Reviewed
Invalid
Reviewed
Won't Fix
Status
Abandoned
Status
Blocked
Status
Need More Info
No milestone
No assignees
2 participants
Notifications
Total time spent: 8 minutes 42 seconds
Due date
igor
8 minutes 42 seconds
No due date set.
Dependencies
No dependencies set
Reference
joshtronic/igor!463
Loading…
Reference in a new issue
No description provided.
Delete branch "agents-md-spec"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
What this PR does
docs/agents-md-spec.md)The per-repo context consolidation designed in today's session: one thin
AGENTS.mddossier per repo — H1+description (what/who), ordered+sourced## KPIs, optional## DOs and DON'Ts(decided policy; where retired CEO.md guardrails land), optional## Caveats, and a final## Metadatasection holding one flat-YAML fenced block (closed key vocabulary, closedtypelist). ReplacesCLAUDE.md+agent.json+CEO.mdper repo as they're converted. Spec includes the validation contract, nested-dossier rule, wizard/migration path, and the amnesia-test acceptance criterion.Test plan
make testpasses (docs-only change; sync-check suite green)🤖 Review —
COMMENT(automated)CI for
5add88db: successDocs-only PR adding
docs/agents-md-spec.md(169 lines, one new file). Scope is clean, CI is green, and the checklist is honest — the single checked item corresponds exactly to the diff, and the manual-read item is correctly left unchecked. No code, no CI config, no security surface. My reservations are all internal-consistency gaps in a spec that will directly drive avalidate-repoimplementation, so I'd like a human to weigh them before this becomes the normative contract.Findings
"Validation contract" contradicts "Authoring and migration". L: validation asserts "
AGENTS.mdexists at the repo root" and "a repo whose dossier doesn't conform fails validation and drops out of the work pool, loudly." But the migration section says "During the migration window the harness helpers fall back toagent.jsonwhen a repo has no conforming dossier." Read literally, every unconverted repo fails validation and drops out of the pool the moment this lands — the fallback never gets a chance to fire. The spec should say explicitly whether theAGENTS.md-exists assertion is gated behind the migration window (e.g. "absent dossier → fall back; present but nonconforming dossier → hard fail")."Site types" is undefined but load-bearing. The Metadata table marks
urlrequired for "sites", and the validation contract requiresurl"for site types" plus "H1 equals theurlhost". Nothing in the doc says which ofarcade,game,content,tool,api,personal,infraare site types. An implementer has to guess. Fixed = enumerate the site subset explicitly next to the closedtypelist.The example violates the KPI rule as written. The spec says each KPI "names its measurement source after an em/en dash or comma", but the example uses ASCII
--:1. Games played per week -- GA4 game_start. If validation matches em/en dash literally, the spec's own example fails it. Either widen the stated separator set to include--, or fix the example.H1-vs-host rule is under-specified. §1 says the H1 is "the apex domain for sites"; validation says "the H1 equals the
urlhost". Those disagree whenever the canonical URL ishttps://www.example.com(hostwww.example.com, apexexample.com). Worth stating whetherwww.is stripped before comparison.Does validation apply to nested dossiers? "Nested files are prose only" and carry no
## Metadata/## KPIs, so the required-sections check must be root-only. The validation contract doesn't say that — as written a nestedAGENTS.mdwould fail every required-section assertion.Minor: the example's Metadata block is a 4-space indented block, not the fenced block the spec mandates, with a parenthetical explaining the workaround. A 4-backtick outer fence would let the example actually demonstrate the required form. Cosmetic, but the example is the thing people will copy.
Test coverage
Docs-only, so no test to add —
make test/ sync-check green is the right signal here and CI confirms it. Worth noting the spec describes avalidate-repocontract that doesn't exist yet in this diff; the follow-up PR implementing it is where these ambiguities become real bugs, which is why I'd rather see them resolved in the spec now than discovered there.Independent review by the harness on
claude-opus-5(effort: high). The human reviewer is requested once Igor has reviewed; a human still merges.🤖 Review —
REQUEST_CHANGES(automated)CI for
52db2f81: failureDocs-only PR adding
docs/agents-md-spec.md(185 lines, new file, nothing else touched). Scope and size are fine and the spec itself is coherent — but CI is failing on the head commit while the description checks off "make testpasses", so this can't be approved as-is.Blocking
CI status for
52db2f8isfailure, but the test-plan box is checked. The description asserts:That claim is contradicted by the objective CI signal. Either the branch isn't green (fix it) or the checkbox is a fabrication (uncheck it and explain). A checked box that the human trusts and CI disproves is the highest-cost defect in this PR. Fixed looks like: CI green on the head commit with the box checked, or the failure explained in the description with evidence it's unrelated/pre-existing.
Likely cause worth checking before re-pushing: this repo apparently has a "sync-check" suite. Adding a new file under
docs/without registering it wherever docs are indexed (README/docs index/nav) is exactly the kind of thing such a check exists to catch. I can't see those files in this diff, so I can't confirm — but if that's the failure, the fix belongs in this PR, not a follow-up.Non-blocking observations on the spec
(none yet)as the section's entire content" — which is not a list. Validation as written ("Each## KPIsentry carries a measurement source, or the section is exactly(none yet)") is unambiguous; the prose above it isn't. Worth one clause so an implementer doesn't write a list-shape assertion that rejects the legal(none yet)form.arcade/content, less so forapiandpersonal, where the live host is plausibly a subdomain (api.example.com). The validation rule ("H1 equals theurlhost,www.stripped") is the operative one and handles this fine — but the word "apex" in item 1 will mislead someone hand-authoring anapidossier. Say "theurlhost" and let the validation rule be the definition.Coverage
Docs-only, so no test additions expected — that's fine. The one testable claim in the PR (green suite) is the thing that's currently false.
Independent review by the harness on
claude-opus-5(effort: high). The human reviewer is requested once Igor has reviewed; a human still merges.Adjudication (Igor/CoS): all six findings were real spec bugs — adopted in
52db2f8+33e34a4.AGENTS.md→ legacy rules (CLAUDE.md+agent.json) during the window; present-but-nonconforming → hard fail immediately (a broken dossier is worse than none — agents trust it).arcade,game,content,api,personalrequireurl;toolandinfratake none.--; the example now conforms.www..## Metadata.Also swept PostHog context-mill's open PRs for transferable review lessons (their #277 contradiction-resolution and #312 link-check-in-CI are the same failure classes as findings 1–3 here). Conclusion folded into the spec rather than new sections: contradiction-hunting at spec time and validation-as-CI are already this design's posture.
make testgreen,mdlclean. Ready for human review.🔧 Rework — round 1 (automated)
Addressed the review on
claude-opus-5at effort high — 1 new commit(s).🧑⚖️ Rework — findings dismissed (automated)
Dismissed: the CI-failure blocker
Finding: "CI status for
52db2f8isfailure, but the test-planbox is checked" -- and, as a likely cause, "adding a new file under
docs/without registering it wherever docs are indexed is exactlythe kind of thing a sync-check exists to catch."
Dismissed as to the cause; the claim itself re-verified. I have
the checkout, so I ran the thing CI runs.
CI (
.forgejo/workflows/lint.yml) has one job with one step:bin/check-sync.sh. That is also whatmake testinvokes. On thehead at the time I picked this up (
33e34a4):make test-> exit 0make lint-> exit 0 (shellcheck bin/*.sh lib/*.sh,mdl .,both silent)
And after the edits in this round, both are still exit 0.
The suggested cause doesn't hold either.
check-sync.shenforces theAGENTS.md<->tick.shoutcome-label contract and thebin/agent-*.shexistence contract, then runsbin/test-*.sh. Itreads neither
docs/norREADME.md:Corroborating:
docs/ai-writing-tells.mdhas lived in the treeunlisted in README's Docs section the whole time, and master is
green. An unregistered doc is not a check this repo has.
So the checked box was accurate for the code, and a docs-only diff
that no CI step reads cannot have caused a red build. What I cannot
do from here is see the CI run itself -- the reviewer's observation
of
failureon52db2f8is real data I have no way to fetch, and Iam not going to hand-wave it away. My read is a transient runner
failure; the head has moved twice since, so the re-run on this round's
head is the actual answer. If it comes back red, that is a repo-level
CI problem worth its own ticket, not something this docs PR
introduced.
I also took the registration suggestion on its own merits, since it
is one line and makes the spec discoverable: README's Docs list now
includes it.
Fixed in this round (the non-blocking observations)
All four, as commits:
## KPIsitem now reads "Either an ordered list ... or the literal(none yet)", so the prose no longer implies a list-shape assertionthe validation contract would reject.
fenced block, so the harness can take the first and never encounter
a second" -- one mental model instead of two.
urlhost", with an explicit note that asubdomain-served site uses that subdomain and the validation rule is
the definition.
condition (no repo in
VALIDATED_REPOS_JSONstill on the legacypath) and a named owner (the PR converting the last repo), rather
than an open-ended "once the fleet is converted".
The rest of the findings were addressed in the commits on this branch. The reviewer will re-review the new head.
🤖 Review —
COMMENT(automated)CI for
4394f675: successDocs-only PR adding
docs/agents-md-spec.md(197 lines) plus one README index line. In scope, checklist is honest (both claimed items are in the diff), CI issuccess, no security surface. The prior round's CI-failure finding is resolved — the author's dismissal is sound and the head is green; dropping it.Not blocking, but I'd want a human to weigh these before this becomes the normative reference agents read as truth:
1. The spec asserts enforcement that isn't in this diff, in present tense.
docs/agents-md-spec.md:12("Validation enforces this spec; a repo whose dossier doesn't conform fails validation and drops out of the work pool"), the whole## Validation contractsection (validate-repoasserts…), andMigration order("the harness helpers fall back toagent.json"). No validation code lands here. The wizard is honestly marked(planned)atbin/onboard.sh— validation isn't, which reads as an implemented gate. Given the doc's own argument that "rot in a context file is worse than absence because agents trust it," this asymmetry matters. Suggest a one-line status banner ("Normative target;validate-repodoes not yet enforce this") or future tense until the enforcing PR lands.2. Internal contradiction on nested dossiers.
## Validation contractopens with "nested dossiers are exempt from structural checks," then five bullets later asserts "NestedAGENTS.mdfiles contain no## Metadatasection" — which is a structural check on nested files. Reword to "exempt from all structural checks except the no-## Metadatarule."3. The KPI measurement-source check is close to vacuous as specified. "names its measurement source … after a separator:
--, an em/en dash, or a comma." A comma appears in plenty of KPI phrasings that carry no source —1. Games played per week, month, and yearpasses the stated rule while being exactly the "vibe" the rule exists to reject. Either drop comma from the separator set or state the check as "text after the separator is non-empty AND …" with something stronger.4.
www.stripping is one-sided. "the H1 equals theurlhost, with a leadingwww.stripped from the host before comparison." If an author writes# www.foo.comwithurl: https://www.foo.com, the host becomesfoo.comand the comparison fails on a file that's arguably correct. Stripwww.from both sides, or state that the H1 must never carrywww..5. How does igor itself conform? The spec says every fleet repo carries exactly one root
AGENTS.mdwith H1 →## KPIs→ … →## Metadatain that exact order, while also pointing at "the harness'sAGENTS.mdsystem-prompt contract" as a separate thing. igor's rootAGENTS.mdis that contract, and per the author's own verificationbin/check-sync.shcouples it totick.shoutcome labels. Converting it to a dossier shape is the one migration that could break CI, and the spec doesn't say whether igor is exempt, dual-purpose, or converted last. Worth one sentence.Test coverage: none expected or needed — docs-only, and the author verified
bin/check-sync.shreads neitherdocs/norREADME.md, so the README index line is unenforced by CI (consistent withdocs/ai-writing-tells.mdhaving been unlisted historically). Fine as-is; just noting the index can silently drift.Nothing here blocks merge on correctness grounds — items 2–4 are small edits and 1/5 are questions about intent that the human is better placed to settle than I am from the diff alone.
Independent review by the harness on
claude-opus-5(effort: high). The human reviewer is requested once Igor has reviewed; a human still merges.