Context
Follow-up to the 2026-06-15 system/integration liveness audit (docs/audits/2026-06-system-integration-property-liveness.md), which flagged a cluster of aspirational metadata props — parsed by the spec, read by no runtime, so authoring them is a silent no-op. The earlier aspirational-config issue #1893 (umbrella #1878) is closed, but for most of these rows the only action taken was adding an [EXPERIMENTAL — not enforced] describe comment — an honesty label, not a disposition. Portal (the worst offender) was actually pruned in #3464 following the same enforce-or-remove treatment as #2377.
This issue tracks the permanent disposition (reconcile / build / prune) of the props from that audit that are still dead on main. Re-verified against origin/main @ 189854cbc (2026-07); each item carries file:line evidence.
Excluded — already fixed (do not re-litigate)
- EmailTemplateSchema "worst drift case" — the audit's headline finding (a live
email_template type bound to a spec shape that didn't match the sys_email_template row) is resolved, and the fix predates the audit. email_template now binds the shape-aligned EmailTemplateDefinitionSchema (packages/spec/src/kernel/metadata-type-schemas.ts:101; new file packages/spec/src/system/email-template.zod.ts), consumed by the runtime email plugin (packages/plugins/plugin-email/src/auth-templates.ts:3), with sys_email_template rows mapping field-for-field. Fix: commit 47a92f427 (2026-05-29). The audit row appears to have read a stale (EmailTemplateSchema) comment.
- Optional low-pri cleanup only (not part of this issue's scope): the orphan legacy
EmailTemplateSchema (packages/spec/src/system/notification.zod.ts:30, body/bodyType) and the stale (EmailTemplateSchema) comment at metadata-plugin.zod.ts:110.
Still dead — needs disposition
For each, pick A — prune (remove the dead props/exports; minor + changeset migration note, per the #3464 precedent) or B — build (wire a real consumer).
1. Theme — 7 dead props (+ 1 regressed)
spacing, breakpoints, logo, density, rtl, touchTarget, keyboardNavigation are merged by mergeThemes but never emitted as CSS vars. wcagContrast was PARTIAL in the audit (via a meetsContrastLevel helper) — that helper no longer exists (0 hits), so it is now fully dead.
- Evidence:
packages/spec/src/ui/theme.zod.ts:226 ("generateThemeVars does not emit spacing tokens yet"), :235 (breakpoints), plus similar self-admissions for density/rtl/touchTarget.
- Cross-repo caveat: the real theme engine lives in the external
objectui repo (this monorepo has no ThemeEngine / mergeThemes / generateThemeVars implementation — 0 hits, only a .objectui-sha pointer). Liveness here is inferred from (a) no local consumer and (b) the spec's own describe text admitting "not emitted yet". Before pruning, confirm with objectui that no external renderer reads these — this one is not the clean local-only kill Portal was.
- Current state:
spacing/breakpoints/density/rtl/touchTarget carry the experimental note; logo/keyboardNavigation/wcagContrast do not.
- Disposition: A prune (if objectui confirms no consumer) / B emit them as CSS vars in
generateThemeVars.
2. Translation — 4 dead knobs (audit's 5th is not actually dead)
messageFormat — no ICU engine exists anywhere; messageFormat:'icu' is accepted but interpolation falls back to simple substitution. Self-admitted at packages/spec/src/system/translation.zod.ts:451. This is the "unkept promise" the audit called out.
fileOrganization, lazyLoad, cache — no runtime reader (translation.zod.ts:455: "No runtime consumer reads this cache flag yet").
- Correction to the audit:
supportedLocales is not fully dead — packages/cli/src/commands/serve.ts:743 reads it to toggle pinyin-search (any zh-* → on). It still doesn't drive locale resolution, so if scoped here the wording must be "doesn't drive i18n locale set", not "no consumer". Leave it.
- Related (not a prune target): the kernel memory-fallback path uses a heuristic
resolveLocale() (packages/core/src/fallbacks/memory-i18n.ts:45) rather than the configured fallbackLocale; the real I18nServicePlugin path does receive fallbackLocale, so this is a memory-fallback-only nuance.
- Disposition:
messageFormat:'icu' — A drop the enum value (keep 'simple') / B wire an ICU engine. fileOrganization/lazyLoad/cache — A prune.
3. Job — retryPolicy / timeout
The cron adapter's execute() (packages/services/service-job/src/cron-job-adapter.ts:147-158) only try { handler } catch { log } — no retry, backoff, or timeout — despite the fully-specced RetryPolicySchema (packages/spec/src/system/job.zod.ts:55). git grep -E "retryPolicy|timeout" -- packages/services/service-job/src = 0 hits. Self-admitted at job.zod.ts:90-91. (The only retry/backoff in the repo is in service-queue, a different subsystem.)
- Disposition: B build (have the cron adapter honor
retryPolicy/timeout — these are semantics authors reasonably expect) is arguably preferable to pruning a genuinely useful feature; A prune if job-level retry is not planned.
4. Webhook — dead props + a fully-dead sub-schema + naming drift
Outbound delivery runs entirely off the sys_webhook row + auto-enqueuer.ts; git grep -E "payloadFields|includeSession|retryPolicy|\.body" -- packages/plugins/plugin-webhooks = 0 hits.
- Dead outbound props:
body, payloadFields, includeSession, authentication non-HMAC branches (bearer/basic/api-key — only secret→HMAC is applied, webhook.zod.ts:102, auto-enqueuer.ts:276/334), retryPolicy (owned by the outbox/queue), description, tags.
WebhookReceiverSchema (inbound) — entirely dead: defined packages/spec/src/automation/webhook.zod.ts:141, type export :161, no other reference repo-wide. This is a Portal-class fully-dead schema and the cleanest prune candidate here.
- Naming drift (latent bug): schema
object → row object_name (auto-enqueuer.ts:267), schema isActive → row active (auto-enqueuer.ts:176); everything else (headers/auth/retry/payload) only lives inside definition_json and the UI can only toggle active (sys-webhook.object.ts:41-43).
- Disposition:
WebhookReceiverSchema — A prune (fully dead). Non-HMAC auth / payloadFields — B build (real webhook features) or A prune. Naming drift — reconcile the field names or document the mapping.
Suggested per-item disposition
| Item |
Still dead? |
Suggested |
Theme 7 props (spacing/breakpoints/logo/density/rtl/touchTarget/keyboardNavigation) + wcagContrast |
Yes (locally) |
Confirm with objectui → prune if unconsumed |
Translation messageFormat:'icu' |
Yes |
prune enum value (or build ICU) |
Translation fileOrganization/lazyLoad/cache |
Yes |
prune |
Translation supportedLocales |
No — has a reader |
keep; fix audit wording |
Job retryPolicy/timeout |
Yes |
build (or prune if not planned) |
Webhook WebhookReceiverSchema |
Yes (fully) |
prune |
Webhook body/payloadFields/includeSession/non-HMAC auth/retryPolicy/description/tags |
Yes |
prune (build the ones deemed valuable) |
Webhook object/isActive naming drift |
Yes |
reconcile or document |
| EmailTemplate drift |
No — fixed (47a92f427) |
excluded |
Refs: umbrella #1878, closed #1893 (aspirational config), precedent #3464 (Portal prune), audit docs/audits/2026-06-system-integration-property-liveness.md.
Context
Follow-up to the 2026-06-15 system/integration liveness audit (
docs/audits/2026-06-system-integration-property-liveness.md), which flagged a cluster of aspirational metadata props — parsed by the spec, read by no runtime, so authoring them is a silent no-op. The earlier aspirational-config issue #1893 (umbrella #1878) is closed, but for most of these rows the only action taken was adding an[EXPERIMENTAL — not enforced]describe comment — an honesty label, not a disposition. Portal (the worst offender) was actually pruned in #3464 following the same enforce-or-remove treatment as #2377.This issue tracks the permanent disposition (reconcile / build / prune) of the props from that audit that are still dead on
main. Re-verified againstorigin/main@189854cbc(2026-07); each item carriesfile:lineevidence.Excluded — already fixed (do not re-litigate)
email_templatetype bound to a spec shape that didn't match thesys_email_templaterow) is resolved, and the fix predates the audit.email_templatenow binds the shape-alignedEmailTemplateDefinitionSchema(packages/spec/src/kernel/metadata-type-schemas.ts:101; new filepackages/spec/src/system/email-template.zod.ts), consumed by the runtime email plugin (packages/plugins/plugin-email/src/auth-templates.ts:3), withsys_email_templaterows mapping field-for-field. Fix: commit47a92f427(2026-05-29). The audit row appears to have read a stale(EmailTemplateSchema)comment.EmailTemplateSchema(packages/spec/src/system/notification.zod.ts:30,body/bodyType) and the stale(EmailTemplateSchema)comment atmetadata-plugin.zod.ts:110.Still dead — needs disposition
For each, pick A — prune (remove the dead props/exports; minor + changeset migration note, per the #3464 precedent) or B — build (wire a real consumer).
1. Theme — 7 dead props (+ 1 regressed)
spacing,breakpoints,logo,density,rtl,touchTarget,keyboardNavigationare merged bymergeThemesbut never emitted as CSS vars.wcagContrastwas PARTIAL in the audit (via ameetsContrastLevelhelper) — that helper no longer exists (0 hits), so it is now fully dead.packages/spec/src/ui/theme.zod.ts:226("generateThemeVars does not emit spacing tokens yet"),:235(breakpoints), plus similar self-admissions for density/rtl/touchTarget.objectuirepo (this monorepo has noThemeEngine/mergeThemes/generateThemeVarsimplementation — 0 hits, only a.objectui-shapointer). Liveness here is inferred from (a) no local consumer and (b) the spec's own describe text admitting "not emitted yet". Before pruning, confirm with objectui that no external renderer reads these — this one is not the clean local-only kill Portal was.spacing/breakpoints/density/rtl/touchTargetcarry the experimental note;logo/keyboardNavigation/wcagContrastdo not.generateThemeVars.2. Translation — 4 dead knobs (audit's 5th is not actually dead)
messageFormat— no ICU engine exists anywhere;messageFormat:'icu'is accepted but interpolation falls back to simple substitution. Self-admitted atpackages/spec/src/system/translation.zod.ts:451. This is the "unkept promise" the audit called out.fileOrganization,lazyLoad,cache— no runtime reader (translation.zod.ts:455: "No runtime consumer reads this cache flag yet").supportedLocalesis not fully dead —packages/cli/src/commands/serve.ts:743reads it to toggle pinyin-search (anyzh-*→ on). It still doesn't drive locale resolution, so if scoped here the wording must be "doesn't drive i18n locale set", not "no consumer". Leave it.resolveLocale()(packages/core/src/fallbacks/memory-i18n.ts:45) rather than the configuredfallbackLocale; the realI18nServicePluginpath does receivefallbackLocale, so this is a memory-fallback-only nuance.messageFormat:'icu'— A drop the enum value (keep'simple') / B wire an ICU engine.fileOrganization/lazyLoad/cache— A prune.3. Job —
retryPolicy/timeoutThe cron adapter's
execute()(packages/services/service-job/src/cron-job-adapter.ts:147-158) onlytry { handler } catch { log }— no retry, backoff, or timeout — despite the fully-speccedRetryPolicySchema(packages/spec/src/system/job.zod.ts:55).git grep -E "retryPolicy|timeout" -- packages/services/service-job/src= 0 hits. Self-admitted atjob.zod.ts:90-91. (The only retry/backoff in the repo is inservice-queue, a different subsystem.)retryPolicy/timeout— these are semantics authors reasonably expect) is arguably preferable to pruning a genuinely useful feature; A prune if job-level retry is not planned.4. Webhook — dead props + a fully-dead sub-schema + naming drift
Outbound delivery runs entirely off the
sys_webhookrow +auto-enqueuer.ts;git grep -E "payloadFields|includeSession|retryPolicy|\.body" -- packages/plugins/plugin-webhooks= 0 hits.body,payloadFields,includeSession,authenticationnon-HMAC branches (bearer/basic/api-key — onlysecret→HMAC is applied,webhook.zod.ts:102,auto-enqueuer.ts:276/334),retryPolicy(owned by the outbox/queue),description,tags.WebhookReceiverSchema(inbound) — entirely dead: definedpackages/spec/src/automation/webhook.zod.ts:141, type export:161, no other reference repo-wide. This is a Portal-class fully-dead schema and the cleanest prune candidate here.object→ rowobject_name(auto-enqueuer.ts:267), schemaisActive→ rowactive(auto-enqueuer.ts:176); everything else (headers/auth/retry/payload) only lives insidedefinition_jsonand the UI can only toggleactive(sys-webhook.object.ts:41-43).WebhookReceiverSchema— A prune (fully dead). Non-HMAC auth /payloadFields— B build (real webhook features) or A prune. Naming drift — reconcile the field names or document the mapping.Suggested per-item disposition
spacing/breakpoints/logo/density/rtl/touchTarget/keyboardNavigation) +wcagContrastmessageFormat:'icu'fileOrganization/lazyLoad/cachesupportedLocalesretryPolicy/timeoutWebhookReceiverSchemabody/payloadFields/includeSession/non-HMAC auth/retryPolicy/description/tagsobject/isActivenaming drift47a92f427)Refs: umbrella #1878, closed #1893 (aspirational config), precedent #3464 (Portal prune), audit
docs/audits/2026-06-system-integration-property-liveness.md.