Skip to content

Commit b39926f

Browse files
committed
fix(spec): keep object enable.trash/mru dead, not experimental (CI: author-lint)
The author-side liveness lint (lintLivenessProperties, #1966) auto-warns on every `experimental` prop. enable.trash / enable.mru default to `true`, and the lint cannot distinguish an authored `true` from the schema default — so tagging them experimental warned on the default value of every object, tripping the "does NOT warn on a default-on flag left alone (enable.trash)" contract test in Test Core. Revert those two to `dead` (their audit classification) with a ledger note explaining why; drop the [EXPERIMENTAL] marker from their spec .describe(). Their #1893 disposition (prune-or-build) stays tracked in the sub-issue. All other #1893 experimental markers are on ungoverned types the lint never loads, so they are unaffected. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01LddW4NaQBdf5FTEnBPpnUJ
1 parent 372428b commit b39926f

3 files changed

Lines changed: 8 additions & 8 deletions

File tree

content/docs/references/data/object.mdx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -164,8 +164,8 @@ const result = ApiMethod.parse(data);
164164
| **files** | `boolean` || Generic record Attachments panel (sys_attachment). Opt-in: true surfaces the panel and permits attachments targeting this object; otherwise creation is rejected. Field.file/Field.image are independent |
165165
| **feeds** | `boolean` || Record comments/collaboration feed. Default on; explicit false hides the feed UI and rejects new comments for this object |
166166
| **activities** | `boolean` || Record activity timeline (sys_activity mirror of CRUD). Default on; explicit false stops mirroring and hides the timeline |
167-
| **trash** | `boolean` || Enable soft-delete with restore capability. [EXPERIMENTAL — not enforced] No runtime consumer reads this flag yet; a Recycle Bin / restore surface is planned but not wired (liveness audit #1878/#1893). |
168-
| **mru** | `boolean` || Track Most Recently Used (MRU) list for users. [EXPERIMENTAL — not enforced] No runtime consumer reads this flag yet (liveness audit #1878/#1893). |
167+
| **trash** | `boolean` || Enable soft-delete with restore capability |
168+
| **mru** | `boolean` || Track Most Recently Used (MRU) list for users |
169169
| **clone** | `boolean` || Allow record deep cloning |
170170

171171

packages/spec/liveness/object.json

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -178,14 +178,14 @@
178178
"evidence": "packages/plugins/plugin-audit/src/audit-writers.ts (writeAudit: explicit activities:false skips the sys_activity timeline mirror; audit row unaffected); objectui RecordDetailView skips the timeline merge on explicit false. Opt-out — spec default true; the per-object lever for activity-row growth, ADR-0057 (#2707)."
179179
},
180180
"trash": {
181-
"status": "experimental",
181+
"status": "dead",
182182
"evidence": "no behavior-changing reader",
183-
"note": "Declared, intentionally not enforced yet: no Recycle Bin / restore surface consumes enable.trash. Marked experimental (not dead) per ADR-0049 — the flag names a planned capability; spec .describe() carries the [EXPERIMENTAL — not enforced] marker (#1878/#1893)."
183+
"note": "Kept `dead` (not experimental): enable.trash defaults to true, and the author-side liveness lint auto-warns on experimental props — for a default-true boolean it cannot distinguish an authored value from the schema default, so tagging it experimental would warn on every object (noise). Disposition for #1893 is prune-or-build, tracked in the sub-issue; no authorWarn so it stays silent."
184184
},
185185
"mru": {
186-
"status": "experimental",
186+
"status": "dead",
187187
"evidence": "no behavior-changing reader",
188-
"note": "Declared, intentionally not enforced yet: no Most-Recently-Used tracker consumes enable.mru. Marked experimental per ADR-0049; spec .describe() carries the marker (#1878/#1893)."
188+
"note": "Kept `dead` (not experimental) for the same default-true-boolean reason as enable.trash; disposition tracked in #1893. No authorWarn so it stays silent."
189189
},
190190
"clone": {
191191
"status": "live",

packages/spec/src/data/object.zod.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -107,10 +107,10 @@ export const ObjectCapabilities = z.object({
107107
activities: z.boolean().default(true).describe('Record activity timeline (sys_activity mirror of CRUD). Default on; explicit false stops mirroring and hides the timeline'),
108108

109109
/** Enable Recycle Bin / Soft Delete */
110-
trash: z.boolean().default(true).describe('Enable soft-delete with restore capability. [EXPERIMENTAL — not enforced] No runtime consumer reads this flag yet; a Recycle Bin / restore surface is planned but not wired (liveness audit #1878/#1893).'),
110+
trash: z.boolean().default(true).describe('Enable soft-delete with restore capability'),
111111

112112
/** Enable "Recently Viewed" tracking */
113-
mru: z.boolean().default(true).describe('Track Most Recently Used (MRU) list for users. [EXPERIMENTAL — not enforced] No runtime consumer reads this flag yet (liveness audit #1878/#1893).'),
113+
mru: z.boolean().default(true).describe('Track Most Recently Used (MRU) list for users'),
114114

115115
/** Allow cloning records */
116116
clone: z.boolean().default(true).describe('Allow record deep cloning'),

0 commit comments

Comments
 (0)