Repository navigation
Description
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_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.- 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 atmetadata-plugin.zod.ts:110.
- Optional low-pri cleanup only (not part of this issue's scope): the orphan legacy
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
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. - Current state:
spacing/breakpoints/density/rtl/touchTargetcarry the experimental note;logo/keyboardNavigation/wcagContrastdo 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 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").- Correction to the audit:
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. - 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 configuredfallbackLocale; the realI18nServicePluginpath does receivefallbackLocale, 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,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.- Naming drift (latent bug): schema
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). - 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.
Activity
feat(spec)!: prune still-dead aspirational config from Theme / Transl…
feat(job): honor authored retryPolicy/timeout in the job scheduler (#…
Merge origin/main into fix/3490-webhook-liveness-flip
feat(job): honor the authored retryPolicy / timeout in the job schedu…
os-zhuang commentedon Jul 27, 2026
Close-out — both PRs merged
Every still-dead row now has its permanent disposition. Verified per-item outcome:
spacing/breakpoints/logo/density/wcagContrast/rtl/touchTarget/keyboardNavigation(+ dedicated sub-schemas & types)generateThemeVars(objectuipackages/core/src/theme/ThemeEngine.ts) consumes colors/typography/borderRadius/shadows/animation/zIndex/customVars onlyfileOrganization/messageFormat/lazyLoad/cache(+MessageFormatSchema,TranslationFileOrganizationSchema){variable}substitution. File layout stays documented as a pure authoring conventionsupportedLocalesserve.ts:743); the audit's "no consumer" wording was stalebody/payloadFields/includeSession/authentication(non-HMAC)/retryPolicy/tags+ entire inboundWebhookReceiverSchemasecretstays, outbox owns its own retry schedule; the #3489 materializer reads none of the removed fields. Ledger entries for removed props dropped; the dead→live flip for the materialized props remains #3490's scopeobject→object_name/isActive→activenaming driftmapWebhookToRowremaps); documenting it in the refreshed ledger is part of #3490retryPolicy/timeoutIJobService.schedulegains an optionaloptionsarg;runWithPolicyenforces exponential-backoff retries and a per-attempt timeout (execution status'timeout') across Cron/Interval/Db adapters; AppPlugin forwards the authored values. Tests verified red-then-green;[EXPERIMENTAL]markers removed from the schema47a92f427before the audit was writtenVersioning: both PRs ride the
minorline withfeat(spec)!:titles + migration notes, per the #2377/#3464 enforce-or-remove precedent.chore(changeset): record the ADR-0105 spec removals as `minor`, not `…
feat(spec,cli): govern the 9 remaining metadata types — liveness cove…
feat(spec)!: translation 两个门都关上,objectstack-ai#3778 的十键守卫退役进错误信息(obje…
feat(spec)!: 退役主题引擎发出但零消费方的 9 组 token (objectstack-ai#5021) (objectst…
docs(protocol): widget-contract 的 Theme 段停止教 objectstack-ai#3494 已删除的…
docs(spec): fix the L3 `Connector` example in SYNC_ARCHITECTURE.md an…
docs: retire stale schema claims in ui/index and capabilities/analytics
docs: retire stale schema claims in ui/index and capabilities/analyti…