Filed unassigned by the os-dev agent working #1436, which fixed item 3 only (PR #1572, draft). The standing instruction on that card was: fix item 3, then stop and report the section-wide problem as its own card. This is that card. β Not graded β grading is the PM seat's.
The finding
AGENTS.md:168-175 (Β§π Schema Validation Requirements) opens with:
All metadata files MUST be validated against their corresponding @objectstack/spec schemas:
and then lists seven items, each prescribing the same XSchema.parse() shape. No metadata file in src/ makes any such call. Measured on origin/main @ 18444c8:
.parse( in src/ β 0 β none of the seven, and nothing else either
ObjectSchema.parse( in src/ β 0
PageSchema.parse( in src/ β 0
ViewSchema.parse( in src/ β 0
DashboardSchema.parse( in src/ β 0
FormViewSchema.parse( in src/ β 0
StateMachineSchema.parse( in src/ β 0
PluginSchema.parse( in src/ β 0
PermissionSetSchema.parse( in src/ β 0
AgentSchema.parse( in src/ β 0
So the premise sentence is false as written, and every item under it is unfollowable by copying an in-repo example β there is no example.
The two items are wrong in different ways, which is why this is not "delete the section"
Item 1 (Objects) names the wrong method on the right symbol. Objects really do use a runtime builder β just not the prescribed one:
src/objects/account.object.ts:3 import { ObjectSchema, Field } from '@objectstack/spec/data';
src/objects/account.object.ts:8 export const Account = ObjectSchema.create({
ObjectSchema.create() appears in 18 files in src/ β that is all 18 src/objects/*.object.ts files, i.e. every object. (Repo-wide the count is 19; the 19th is test/collaboration-capabilities.test.ts, not a metadata file.) ObjectSchema.parse(): zero. Item 1 is a one-word correction, parse to create.
Items 2-7 name a call the repo makes at all. For flows, #1436 established what the honest replacement is: authors write a typed object literal, and validation is performed by objectstack validate plus the platform's own parse at registration β confirmed there by ablation, not assumed. Items 2, 4, 5, 6 and 7 look like the same class, but β οΈ each needs its own measurement before its wording is chosen β the authoring forms are visibly not uniform:
src/pages 9 files 2 with a type-only import
src/views 15 files 0 with a type-only import
src/dashboards 7 files 6 with a type-only import
β Whatever replaces items 2-7 cannot be one find-and-replace. Three different declaration styles are in use across these directories, and #1436's rule applies to each: check the replacement against a real file, not the type signature.
Why it is worth fixing rather than tolerating
Same argument as #1436, which is worth restating because it is the reason this is not cosmetic: AGENTS.md is the instruction surface for the agents that author this app. An instruction naming a call with no in-repo precedent means an agent either invents an import or silently diverges from every existing file β and confidently wrong instruction gets copied forward into dispatch briefs verbatim. That has already happened twice on this surface (#1229 filter vs where; #1436 flows).
Evidence the section has been patched around rather than corrected: AGENTS.md:183 already carries a hand-written caveat reconciling item 1 against item 4, and the File Suffix Protocol at :150-155 describes some of these same file types with different and more accurate wording than the list does β :153 had flows right while :171 had them wrong. The two sections disagree with each other.
β 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." If the answer here is "a gate should keep agent-facing prose honest about the code", that is an upstream platform card, not local enforcement.
β οΈ This may want a ruling rather than an edit. AGENTS.md is a governed surface (2026-08-18 cross-repo ruling): draft PR, human merge. A seven-item rewrite is a substantially bigger governed change than #1436's one line, and the right shape may be to restate the section around where validation actually happens (author declaratively, pnpm validate and the platform enforce) rather than to repair seven prescriptions one at a time.
Correction to the measurement this was spun out of
Recorded because the sweep was load-bearing and it had a hole: the dispatch brief for #1436 stated that XSchema.parse( matches only inside AGENTS.md, nowhere in src/, test/ or scripts/. That is not quite true β
scripts/analytics-reconcile/run.ts:91: const parsed = DatasetSchema.parse(ds) as Dataset;
A real Schema.parse() call does exist in scripts/. It does not weaken the finding: DatasetSchema is not one of the seven symbols, and all seven remain at zero. But the stated measurement was wider than the truth, so it is corrected here rather than inherited.
Refs #1436 Β· #1229
Generated by Claude Code
Filed unassigned by the
os-devagent working #1436, which fixed item 3 only (PR #1572, draft). The standing instruction on that card was: fix item 3, then stop and report the section-wide problem as its own card. This is that card. β Not graded β grading is the PM seat's.The finding
AGENTS.md:168-175(Β§π Schema Validation Requirements) opens with:and then lists seven items, each prescribing the same
XSchema.parse()shape. No metadata file insrc/makes any such call. Measured onorigin/main@18444c8:So the premise sentence is false as written, and every item under it is unfollowable by copying an in-repo example β there is no example.
The two items are wrong in different ways, which is why this is not "delete the section"
Item 1 (Objects) names the wrong method on the right symbol. Objects really do use a runtime builder β just not the prescribed one:
ObjectSchema.create()appears in 18 files insrc/β that is all 18src/objects/*.object.tsfiles, i.e. every object. (Repo-wide the count is 19; the 19th istest/collaboration-capabilities.test.ts, not a metadata file.)ObjectSchema.parse(): zero. Item 1 is a one-word correction,parsetocreate.Items 2-7 name a call the repo makes at all. For flows, #1436 established what the honest replacement is: authors write a typed object literal, and validation is performed byβ οΈ each needs its own measurement before its wording is chosen β the authoring forms are visibly not uniform:
objectstack validateplus the platform's own parse at registration β confirmed there by ablation, not assumed. Items 2, 4, 5, 6 and 7 look like the same class, butβ Whatever replaces items 2-7 cannot be one find-and-replace. Three different declaration styles are in use across these directories, and #1436's rule applies to each: check the replacement against a real file, not the type signature.
Why it is worth fixing rather than tolerating
Same argument as #1436, which is worth restating because it is the reason this is not cosmetic:
AGENTS.mdis the instruction surface for the agents that author this app. An instruction naming a call with no in-repo precedent means an agent either invents an import or silently diverges from every existing file β and confidently wrong instruction gets copied forward into dispatch briefs verbatim. That has already happened twice on this surface (#1229filtervswhere; #1436 flows).Evidence the section has been patched around rather than corrected:
AGENTS.md:183already carries a hand-written caveat reconciling item 1 against item 4, and the File Suffix Protocol at:150-155describes some of these same file types with different and more accurate wording than the list does β:153had flows right while:171had them wrong. The two sections disagree with each other.β What this card is not
β Not a request for a guard, gate, lint rule or test.
AGENTS.mdScope 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." If the answer here is "a gate should keep agent-facing prose honest about the code", that is an upstream platform card, not local enforcement.AGENTS.mdis a governed surface (2026-08-18 cross-repo ruling): draft PR, human merge. A seven-item rewrite is a substantially bigger governed change than #1436's one line, and the right shape may be to restate the section around where validation actually happens (author declaratively,pnpm validateand the platform enforce) rather than to repair seven prescriptions one at a time.Correction to the measurement this was spun out of
Recorded because the sweep was load-bearing and it had a hole: the dispatch brief for #1436 stated that
XSchema.parse(matches only insideAGENTS.md, nowhere insrc/,test/orscripts/. That is not quite true βA real
Schema.parse()call does exist inscripts/. It does not weaken the finding:DatasetSchemais not one of the seven symbols, and all seven remain at zero. But the stated measurement was wider than the truth, so it is corrected here rather than inherited.Refs #1436 Β· #1229
Generated by Claude Code