Skip to content

AGENTS.md Β§πŸ”’ Schema Validation Requirements: all seven items prescribe an XSchema.parse() call the repo makes nowhere β€” item 1 names the wrong method, and the section's premise sentence is false as writtenΒ #1573

Description

@os-musk

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

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    documentationImprovements or additions to documentationpm:queueReady for the PM dispatch loop

    Type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions