Repository navigation
AGENTS.md File Suffix Protocol is an inventory that drifted both ways: 4 of its 12 declared suffixes have zero instances in src/, and 8 suffixes the app really authors are absent from it #1745
Description
Filed unassigned by the os-dev agent working #1573, which restated §🔒 Schema Validation Requirements. Found while bringing the File Suffix Protocol into agreement with that section (the card's Zone 2.2 requirement). ⛔ Not graded — grading is the PM seat's.
The finding
§📝 Coding Standards (The "File Suffix Protocol") declares 12 file types across Core and Extended. Measured on origin/main @ e735d00d, the inventory is wrong in both directions.
Declared, but zero instances under src/:
*.form.ts 0 files (src/forms/ ABSENT)
*.statemachine.ts 0 files (src/statemachines/ ABSENT)
*.capabilities.ts 0 files (src/plugins/ ABSENT)
*.events.ts 0 files (src/events/ ABSENT)
Corroborated independently by the toolchain rather than only by git ls-files: pnpm validate reports Runtime: 0 plugins.
Authored by this app, but absent from the protocol:
*.dataset.ts 9 files *.skill.ts 6 files
*.profile.ts 7 files *.report.ts 5 files
*.seed.ts 5 files *.sharing.ts 4 files
*.mapping.ts 3 files *.translation.ts 1 file
*.app.ts 1 file
*.permission.ts line named a suffix authored nowhere, while the app's permission sets are src/profiles/*.profile.ts — that single line is fixed there because §🔒 now names src/profiles/ and the two sections would otherwise contradict each other. The remaining eight, and the four zero-instance declarations, are untouched.
Why this is a trap and not a tidiness complaint
Registration in this app is explicit, file by file: each src/{type}/index.ts re-exports its files, and objectstack.config.ts feeds those barrels to defineStack(). There is no glob discovery. A file that never reaches a barrel is registered by nothing and validated by nothing.
Measured, not assumed — a valid new object file added to src/objects/ and deliberately left out of src/objects/index.ts:
VALIDATE exit=0
Data: 18 Objects 331 Fields ← unchanged from baseline
mentions of the probe in validate output: 0
Exit 0. The count does not move, the file is named nowhere, and pnpm verify stays green. So an agent that reads the protocol, believes *.statemachine.ts is a file type this app uses, and authors one gets a silent no-op with a green verify — there is not even a directory or barrel for it to be missed from. That is the same class as #1573: an instruction with no in-repo precedent produces work that looks accepted and does nothing.
The inverse half costs differently: an agent authoring a dataset or a sharing rule finds the protocol silent on the suffix that 9 and 4 existing files already use, and has nothing to pattern-match against for the naming rule the section opens by calling strict.
⛔ What this card is not
⛔ Not a request for a guard, gate, lint rule or test. AGENTS.md Scope rule 3: "Lint, validation, gates and diagnostics belong to the platform, uniformly. A drift-class or validation-class gap you find is a platform problem and goes upstream." A gate that checks the protocol's inventory against the tree would be exactly the local gate farm that rule forbids. #1573 was refused the same thing twice.
⛔ Not foldable into #1573. Different defect shape and different fix shape: #1573 corrected how metadata is authored and validated, which had one measured answer per form. This card is an inventory question whose fix is a judgement the maintainer owns — for each zero-instance suffix, whether it is (a) an aspirational convention worth keeping so a future author names the file correctly, or (b) dead weight to delete; and for the eight real suffixes, whether the protocol should list every one or state a rule that generates them. That decision is not mechanical, which is why it was not folded in.
⛔ Serial fence
AGENTS.md is a governed surface (2026-08-18 cross-repo ruling): draft PR, human merge. #1573's PR edits this same file and is in flight. ⛔ Do not dispatch this card until that one clears — two drafts on one hand-merged governed file is a conflict a human has to resolve by hand.
Generated by Claude Code
Activity
os-justin commentedon Sep 9, 2026
Claim: PM loop round 2 — maintainer direct dispatch to the skills seat, authority verbatim: 「看一下 hotcrm 的agents.md 写的太乱了。只留下必要的。包括同时同时审核 hotcrm 的skills 任务,合并派发处理。」 and 「首先要明确 hotcrm 是元数据应用,平台功能应该在 objectstack中开发。 其次 claude.md 是不是直接让他阅读 agents.md 即可,没必要维护两套。所有仓库都有类似的问题」. Fold member of #1823 (chain head; full claim there): the File Suffix Protocol's drifted 12-suffix roster leaves the file — the trimmed
AGENTS.mdpoints atsrc/{type}/and the neighbour-file rule instead of restating an inventory.Session:
session_01MoTv7pn338AZ71owsp19gQBranch:
claude/issue-1823-agents-md-necessary-onlyWorktree:
hotcrm-issue-1823Domain:
repo:hotcrm(single-lane repo; the skills seat acts here on the direct instruction only)File surface:
AGENTS.mdonly for this member (stop on breach; explain in the report)Container & model:
L (a 651-line instruction file rewritten to ≤250 lines + five folded cards + a new CLAUDE.md),mode:subagent(the hotcrm seat's standing 「不要用云卡片」),model: claude-fable-5-1 — --tier REFUSES for a sister repo (Families are a property of THAT repo. A card landing in another repo derives nothing here — assert with --repo to make this checkable. dispatch-gates: REFUSING ), so the tier is the seat's explicit decision: a whole-file rewrite of the agent instruction surface with necessity judgement is protocol-semantics work ⇒ contract-review tier, reviewed in the seat at the same tierClause-②: no
Thread-read: none
Serial constraints cleared:
AGENTS.mdfree per therepo:hotcrmseat's R58 close (5602546839, 13:21Z: 「AGENTS.mdis FREE. Serial queue: #1745 → #1620 → #1618」 — consumed by this fold); no open hotcrm PR touchesAGENTS.md,CLAUDE.md,.github/instructions/**or.github/tasks/**(6 open PRs' file lists read 2026-09-09T13:51Z); newestAGENTS.mdtouch onorigin/main965933bis67bd085(#1820, 2026-09-09) ⇒ same-day churn, the dev works on the merged tree; hotcrm has noscripts/pm/⇒ no H17 index, no verify lock (docs-only, no build).Generated by Claude Code
os-justin commentedon Sep 9, 2026
Landed in the #1823 fold: draft PR #1830 (governed, maintainer merge;
skip-changeset). Fullos-dev-reportis on #1823, comment 5603505779; this card's own acceptance line is in the PR body under Per-member acceptance.Generated by Claude Code
os-justin commentedon Sep 9, 2026
ACCEPT for this fold member — the review record is on the chain head #1823 (5603569687, this seat, 2026-09-09T14:30Z): PR #1830 delivers it — the 12-suffix roster is gone; the neighbour-file rule and the three authoring forms point at
src/{type}/. Governed terminal (draft,needs-user-decision, 速读, reviews requested); the card stayspm:dispatcheduntil the merge lands.Generated by Claude Code
os-justin commentedon Sep 9, 2026
Landing record — PR #1830 (
Fixesthis card; fold head #1823 with #1745 · #1620 · #1618 · #1818 · #1681) MERGED 2026-09-09T15:33:23Z through hotcrm's merge queue, squash commit06b9bb327bb0onorigin/main(read at 2026-09-09T15:50Z:AGENTS.md248 lines,CLAUDE.mdis the 6-line pointer). GOVERNED (AGENTS.md,CLAUDE.md,.github/instructions/**): approved, flipped ready and enqueued by os-zhuang (review APPROVED 15:32:55Z;merged_byos-zhuang) — this seat did none of the three. In-seat review ACCEPT 5603569687 on #1823; 速读 5603571614 on the PR. Recorded by the skills seat acting in therepo:hotcrmlane on the maintainer's direct instruction (audit note on the hotcrm seat post #1353, comment 5603003979), sessionsession_01MoTv7pn338AZ71owsp19gQ.Same stroke:
pm:dispatchedremoved and the assignee cleared on this auto-closed card (folded member; its own criterion — the File Suffix Protocol inventory is gone fromAGENTS.md, the rule is what remains — was read on the merged tree).Generated by Claude Code