You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
[11.0][A2] Remove dead author-facing metadata properties (ADR-0049 enforce-or-remove) #2377
Part of 11.0 breaking-change batch (#2364), ADR-0049 enforce-or-remove.
Remove author-facing metadata properties that pass schema validation but have no runtime consumer (verified against packages/spec/liveness/*.json + grep of plugins/services/objectql/runtime). Authoring them is a false affordance — especially dangerous for AI-authored metadata.
Verified-dead set (remove)
field (spec/src/data/field.zod.ts): vectorConfig, fileAttachmentConfig, dependencies, caseSensitive
zod schemas are strict — if any example sets one of these, removing the field breaks the example build. Each property: grep examples first (e.g. showcase may set dataset.measures.certified: true).
Per-property checklist
Remove zod property (+ its dedicated sub-schema export + inferred type if only used here)
Flip the packages/spec/liveness/<type>.json entry to removed
De-risking complete — scope split (safe vs risky) + execution plan
Verified across framework + objectui + cloud + hotcrm + templates (BSD-grep caveat: must use [[:space:]], not \s; control label: = 9887 confirms the grep works):
Every dead candidate is set 0× and read 0× in configs/UI across all repos. So removal breaks no config. The real risk is spec's own tests + TS read-access — and that splits the set cleanly:
✅ Safe to remove (unique names, findable test footprint)
field: vectorConfig (+VectorConfigSchema+types), fileAttachmentConfig (+FileAttachmentConfigSchema+types), maxRating, caseSensitive, referenceFilters — test footprint only in field.test.ts/widget.test.ts (vectorConfig + fileAttachmentConfig have whole describe blocks to delete; maxRating/caseSensitive trivial; referenceFilters = 2 fixture lines).
object: partitioning, softDelete, recordName, keyPrefix, defaultDetailForm (+ their sub-schemas) — 0–1 spec test files.
dataset: measures.certified.
agent: tenantId — findable in agent.zod but the NAME is overloaded in tests (see risky).
⚠️ Risky — DO NOT bulk-remove (names overloaded; can't separate spec-prop test usage from noise)
dependencies 18 test files, versioning 8, tenantId 21, tags 26, active 21, search 9, index 5 — almost all unrelated (package deps, storage versioning, tenant context, array index, full-text search). Removing risks breaking tests that can't be reliably located.
These are unenforced but harmless; recommend either leaving them or handling each with per-occurrence inspection in a dedicated pass — NOT worth the blast radius in a batch.
Recommended execution
Per-area PRs for the safe set only (field → object → dataset), each: remove zod prop + sub-schema + type exports → update packages/spec/liveness/<type>.json → delete the matching test cases → gen:api-surface → full vitest run in spec (not just the file). Leave the overloaded-name props.
First batch landed → #2402 (merged). Removed the truly-trivial, zero-non-spec-footprint dead props: fieldcaseSensitive, maxRating; objectpartitioning (+PartitioningConfigSchema), defaultDetailForm. Ledgers + api-surface updated; spec 6595 + Test Core + liveness all green.
Lesson / scope refinement:softDelete and measures.certified were in my 'safe' list but turned out to be set in non-spec test fixtures (mcp; analytics ×7) → Test Core went red; both deferred (need fixture migration). So the remaining #2377 work = those two + the overloaded-name set (tags/active/versioning/dependencies/index/columnName/enable.*/agent.tenantId/action.timeout). Reconfirms: for spec-prop removal, grep ALL package tests (not just spec) for set-usage before removing.
Re-audited the remaining dead set against the current liveness ledgers on main. Findings that update the earlier triage:
The "overloaded-name / hard to grep" blocker is gone: every dead prop now carries a status: dead + evidence entry in packages/spec/liveness/*.json, so removal no longer depends on grepping ambiguous names.
The real remaining gate is the Studio metadata-authoring forms (*.form.ts) + their generated i18n bundles. Many dead props are surfaced in the authoring form, so removing them cascades into i18n regeneration — those are deferred as a coordinated follow-up.
Removed in #3176 (dead and not surfaced in any authoring form → self-contained)
action.type:'form' — has a dedicated build-time lint (lint-view-refs.ts) + a first-party app-showcase action; removing it needs a UX decision (what the "Log Time" action becomes), not a mechanical strip.
field.columnName — additionally referenced by the ADR-0062 D7 external-object lint (whose comment frames it as the "managed-object mechanism", contradicting the ledger's dead), so it needs an owner call, not a sweep.
All deferred entries stay dead + authorWarn so authors still get the build-time warning. Note: several items in the original issue body are already LIVE and must not be removed — enable.trackHistory/files/feeds/activities (plugin-audit enforced) and agent.planning.maxIterations.
Reclassified LIVE — kept (2026-06 audit misses, correctness fixes to this issue's original list)
object.isSystem (plugin-sharing effectiveSharingModel default), enable.searchable (global-search opt-out), enable.trackHistory/files/feeds/activities (plugin-audit enforced), action.type:'form' (objectui ActionRunner.executeForm — enforce won over remove; also fixed "Log Time does nothing"), agent.planning.maxIterations, field.currencyConfig, object.apiEnabled, action.disabled/shortcut/bulkEnabled, agent.access/permissions, skill.triggerPhrases/permissions.
Result
packages/spec/liveness/object.json (and field/action/agent/dataset) now carry 0 dead entries in this issue's scope. Remaining aspirational-config work for other types (theme, translation, webhook, portal, …) stays tracked in #1893.
Bonus from #3414's .strict(): two latent unknown-key bugs surfaced immediately — sys_secret and sys_setting_audit had been authoring a never-existent enable.audit flag, silently stripped until now.
Activity
os-zhuang commentedon Jun 27, 2026
De-risking complete — scope split (safe vs risky) + execution plan
Verified across framework + objectui + cloud + hotcrm + templates (BSD-grep caveat: must use
[[:space:]], not\s; controllabel:= 9887 confirms the grep works):Every dead candidate is set 0× and read 0× in configs/UI across all repos. So removal breaks no config. The real risk is spec's own tests + TS read-access — and that splits the set cleanly:
✅ Safe to remove (unique names, findable test footprint)
vectorConfig(+VectorConfigSchema+types),fileAttachmentConfig(+FileAttachmentConfigSchema+types),maxRating,caseSensitive,referenceFilters— test footprint only infield.test.ts/widget.test.ts(vectorConfig + fileAttachmentConfig have wholedescribeblocks to delete; maxRating/caseSensitive trivial; referenceFilters = 2 fixture lines).partitioning,softDelete,recordName,keyPrefix,defaultDetailForm(+ their sub-schemas) — 0–1 spec test files.measures.certified.tenantId— findable in agent.zod but the NAME is overloaded in tests (see risky).field.index,field.columnName,field.dependencies,object.versioning,object.tags,object.active,object.abstract,object.isSystem,object.search,object.enable.*(trackHistory/searchable/files/feeds/activities/trash/mru),agent.tenantId,action.timeout.dependencies18 test files,versioning8,tenantId21,tags26,active21,search9,index5 — almost all unrelated (package deps, storage versioning, tenant context, array index, full-text search). Removing risks breaking tests that can't be reliably located.Recommended execution
Per-area PRs for the safe set only (field → object → dataset), each: remove zod prop + sub-schema + type exports → update
packages/spec/liveness/<type>.json→ delete the matching test cases →gen:api-surface→ fullvitest runin spec (not just the file). Leave the overloaded-name props.feat(spec): remove first batch of dead metadata props (#2377, A2)
feat(spec): remove first batch of dead metadata props (#2377, A2) (#2402
os-zhuang commentedon Jun 27, 2026
First batch landed → #2402 (merged). Removed the truly-trivial, zero-non-spec-footprint dead props: field
caseSensitive,maxRating; objectpartitioning(+PartitioningConfigSchema),defaultDetailForm. Ledgers + api-surface updated; spec 6595 + Test Core + liveness all green.Lesson / scope refinement:
softDeleteandmeasures.certifiedwere in my 'safe' list but turned out to be set in non-spec test fixtures (mcp; analytics ×7) → Test Core went red; both deferred (need fixture migration). So the remaining #2377 work = those two + the overloaded-name set (tags/active/versioning/dependencies/index/columnName/enable.*/agent.tenantId/action.timeout). Reconfirms: for spec-prop removal, grep ALL package tests (not just spec) for set-usage before removing.os-zhuang commentedon Jul 18, 2026
Re-evaluation + next slice → #3176 (draft).
Re-audited the remaining dead set against the current liveness ledgers on
main. Findings that update the earlier triage:status: dead+ evidence entry inpackages/spec/liveness/*.json, so removal no longer depends on grepping ambiguous names.*.form.ts) + their generated i18n bundles. Many dead props are surfaced in the authoring form, so removing them cascades into i18n regeneration — those are deferred as a coordinated follow-up.Removed in #3176 (dead and not surfaced in any authoring form → self-contained)
vectorConfig,fileAttachmentConfig,dependenciesversioning,softDelete,search,recordName,keyPrefix(+ sub-schemas; each now a rejecting tombstone inUNKNOWN_KEY_GUIDANCE)timeoutplanning.strategy,planning.allowReplan(keepplanning.maxIterations)measures.certifiedLedgers + README table +
api-surface.json+json-schema.manifest.jsonupdated; fixtures migrated (analytics/rest/lint/cli). Spec 6875 green, liveness gate ✓, api-surface ✓. Cuts 16.0.0 (major changeset).Deferred (dead, but entangled — need a follow-up)
index/columnName/referenceFilters; objecttags/active/isSystem/abstract/enable.searchable/enable.trash/enable.mru; agenttenantId.action.type:'form'— has a dedicated build-time lint (lint-view-refs.ts) + a first-partyapp-showcaseaction; removing it needs a UX decision (what the "Log Time" action becomes), not a mechanical strip.field.columnName— additionally referenced by the ADR-0062 D7 external-object lint (whose comment frames it as the "managed-object mechanism", contradicting the ledger'sdead), so it needs an owner call, not a sweep.All deferred entries stay
dead+authorWarnso authors still get the build-time warning. Note: several items in the original issue body are already LIVE and must not be removed —enable.trackHistory/files/feeds/activities(plugin-audit enforced) andagent.planning.maxIterations.Generated by Claude Code
docs(spec): regenerate reference docs after dead-prop removal (#2377)
chore: version dead-prop removal as minor per launch-window policy (#…
feat(spec)!: remove dead author-facing metadata properties (#2377, A2) (
feat(spec)!: remove form-surfaced dead metadata props + correct 3 mis…
feat(spec)!: remove form-surfaced dead metadata props + correct 3 mis…
refactor(spec): remove unenforced agent `visibility` field (ADR-0056 …
docs: sync more hand-written docs with implementation (#1880 Wave 1, …
docs: sync data-modeling / deployment / getting-started docs with imp…
skills(data): purge pre-16 schema surface; teach the shapes create() …
os-zhuang commentedon Jul 22, 2026
Final slice → #3414 (draft). This closes out the A2 removal scope; the issue auto-closes on merge.
Full disposition of the original set across the three waves (#2402 → #3176 → #3414):
Removed
caseSensitive,maxRating(feat(spec): remove first batch of dead metadata props (#2377, A2) #2402);vectorConfig,fileAttachmentConfig,dependencies(feat(spec)!: remove dead author-facing metadata properties (#2377, A2) #3176);index,columnName,referenceFilters(follow-up slice — the ADR-0062 D7columnNamelint conflict resolved by removing lint + field together; external column mapping isexternal.columnMap)partitioning,defaultDetailForm(feat(spec): remove first batch of dead metadata props (#2377, A2) #2402);versioning,softDelete,search,recordName,keyPrefix(feat(spec)!: remove dead author-facing metadata properties (#2377, A2) #3176, tombstoned inUNKNOWN_KEY_GUIDANCE);tags,active,abstract(follow-up slice);enable.trash,enable.mru(feat(spec)!: remove dead enable.trash/mru capability flags (#2377 close-out, ADR-0049) #3414 —ObjectCapabilitiesnow.strict()with retired-key tombstones; ~46 first-party setters cleaned; docs/skills stop advertising a recycle bin)timeout(feat(spec)!: remove dead author-facing metadata properties (#2377, A2) #3176)tenantId(follow-up slice);planning.strategy,planning.allowReplan(feat(spec)!: remove dead author-facing metadata properties (#2377, A2) #3176)measures.certified(feat(spec)!: remove dead author-facing metadata properties (#2377, A2) #3176)Reclassified LIVE — kept (2026-06 audit misses, correctness fixes to this issue's original list)
object.isSystem(plugin-sharingeffectiveSharingModeldefault),enable.searchable(global-search opt-out),enable.trackHistory/files/feeds/activities(plugin-audit enforced),action.type:'form'(objectuiActionRunner.executeForm— enforce won over remove; also fixed "Log Time does nothing"),agent.planning.maxIterations,field.currencyConfig,object.apiEnabled,action.disabled/shortcut/bulkEnabled,agent.access/permissions,skill.triggerPhrases/permissions.Result
packages/spec/liveness/object.json(and field/action/agent/dataset) now carry 0 dead entries in this issue's scope. Remaining aspirational-config work for other types (theme, translation, webhook, portal, …) stays tracked in #1893.Bonus from #3414's
.strict(): two latent unknown-key bugs surfaced immediately —sys_secretandsys_setting_audithad been authoring a never-existentenable.auditflag, silently stripped until now.Generated with Claude Code
Generated by Claude Code
feat(spec)!: remove dead enable.trash/mru capability flags (#2377 clo…
feat(spec)!: remove the dead PortalSchema — never-enforced no-op proj…
feat(spec)!: prune still-dead aspirational config from Theme / Transl…
fix: launch-window changeset level + regenerate skill references (Gra…
feat(spec)!: 移除从未实现的 GraphQL 面 — 不在产品计划 (#2462 后续) (#3562)
fix(i18n): clear the accumulated drift in the generated translation b…
feat(cli): gate generated translation bundles with `os i18n extract -…
feat(spec): verifiedAt re-verification clock; re-verify action.undoab…
fix(objectql,runtime): stop platform stamps failing spec validation (o…
fix(spec): author-visible refusals and prescriptions state each decis…
fix(spec): the protocol 16 → 17 conversion summaries and three descri…
test(spec): the first data/ file group's test titles state each cited…