Found while implementing #10170 (registering both capability gates on beforeUpdate). Filed rather than fixed: packages/spec is outside that card's declared surface.
What is there
In packages/spec/src/data/object.zod.ts, each flag states its contract twice, and after #10170 the two halves no longer agree in scope.
files (~:269-281) — the block-level docblock states the state property:
true surfaces the record Attachments panel … and permits sys_attachment rows to target this object
…while the .describe() string one line down states a verb:
Opt-in: true surfaces the panel and permits attachments targeting this object; otherwise creation is rejected
feeds (~:283-290) has the same shape — docblock "rejects new sys_comment rows targeting this object", describe "explicit false hides the feed UI and rejects new comments for this object".
Why it is worth recording
The docblock half was always the accurate one, and #10170 is the card that makes the difference observable: the gates now also refuse an update that re-points a row onto a walled object (403 FILES_DISABLED / FEEDS_DISABLED, both dispatch shapes). So the describe strings now understate what the flag does — and they are not inert prose:
.describe() text is what reaches generated schema output and the authoring surfaces built on it, so an app author (or an LLM authoring metadata) reading "otherwise creation is rejected" would reasonably conclude a re-point is outside the flag's reach. It is not.- The same wording is what made the update-verb gap look intentional rather than missing in the first place.
Nothing is broken and no behaviour depends on this — it is a declared-surface accuracy item, which is why it is finding and not queued.
Suggested shape
Bring the two describe strings up to the docblocks they sit under: the flag governs whether rows may target the object, on any verb — not only creation. activities (the third flag in the block) is unaffected; it genuinely is a mirror-on-write switch.
Backlinks: #10170 (where found; it registers the update-verb enforcement), #2727 / #2707 (the flags' own cards).
Generated by Claude Code
Found while implementing #10170 (registering both capability gates on
beforeUpdate). Filed rather than fixed:packages/specis outside that card's declared surface.What is there
In
packages/spec/src/data/object.zod.ts, each flag states its contract twice, and after #10170 the two halves no longer agree in scope.files(~:269-281) — the block-level docblock states the state property:…while the
.describe()string one line down states a verb:feeds(~:283-290) has the same shape — docblock "rejects newsys_commentrows targeting this object", describe "explicit false hides the feed UI and rejects new comments for this object".Why it is worth recording
The docblock half was always the accurate one, and #10170 is the card that makes the difference observable: the gates now also refuse an update that re-points a row onto a walled object (403
FILES_DISABLED/FEEDS_DISABLED, both dispatch shapes). So thedescribestrings now understate what the flag does — and they are not inert prose:.describe()text is what reaches generated schema output and the authoring surfaces built on it, so an app author (or an LLM authoring metadata) reading "otherwise creation is rejected" would reasonably conclude a re-point is outside the flag's reach. It is not.Nothing is broken and no behaviour depends on this — it is a declared-surface accuracy item, which is why it is
findingand not queued.Suggested shape
Bring the two
describestrings up to the docblocks they sit under: the flag governs whether rows may target the object, on any verb — not only creation.activities(the third flag in the block) is unaffected; it genuinely is a mirror-on-write switch.Backlinks: #10170 (where found; it registers the update-verb enforcement), #2727 / #2707 (the flags' own cards).
Generated by Claude Code