Skip to content

[Decision] nine cron- and template-typed keys in packages/spec are published, documented and read by nothing — retire them under ADR-0049 (the #14477 / #15513 shape), mark them experimental, or leave them? #15954

Description

@claude

Filed by the domain:spec execution seat (session_01M59rPZZFzqhfMUPFqqZTkf, 2026-09-05T16:00Z) from the census on #15035 / #15028 (report 5552934813, readings on origin/main f1e91595f; seat position 5552964624 on #15035). Labels: needs-user-decision; domain:* routing is the triage seat's (every option lands in packages/spec). ⛔ Not dispatchable: the decision is the maintainer's — retiring published authorable keys is an ADR-0049 enforce-or-remove ruling, as #14477 and #15513 were. Sequencing: AFTER the narrowing PR for #15028 / #15035 (which touches only the two union definitions in shared/expression.zod.ts and leaves every site alone); nothing here blocks that PR.

The question

Eight of the twelve cron- and template-typed positions in packages/spec are declared on the published authorable surface, documented on the generated reference pages, carried by the D7 conformance ledger — and read by nothing: no scheduler, no service, no lint rule, no renderer. Their entire author corpus is spec's own tests and docblocks (zero example-app authors, zero objectui authors, zero customer-facing authors outside generated pages). Do they retire under ADR-0049 (RETIRED_KEYS_BY_MAJOR, the #14477 / PR #15514 shape), or do they stay as [EXPERIMENTAL — not enforced] declarations?

# file:Schema.field dialect reachable from a stack manifest? D7 row reader
3 api/export.zod.ts:576 ScheduledExport.schedule.cronExpression cron no — API contract cron-declared-unwired none
4 api/export.zod.ts:706 ScheduleExportRequest.schedule.cronExpression cron no — API request cron-declared-unwired none
5 automation/execution.zod.ts:454 ScheduleState.cronExpression cron no — runtime state cron-declared-unwired none
6 integration/connector.zod.ts:257 DataSyncConfig.schedule cron YESConnector.syncConfig, defineStack({ connectors }) cron-declared-unwired none
7 system/cache.zod.ts:156 CacheWarmup.schedule cron no cron-declared-unwired none
8 system/disaster-recovery.zod.ts:57 BackupConfig.schedule cron no cron-declared-unwired none
9 system/disaster-recovery.zod.ts:238 DisasterRecoveryPlan.testing.schedule cron no cron-declared-unwired none
10 ai/model-registry.zod.ts:121 PromptTemplate.system template no template-prompt (experimental) none
11 ai/model-registry.zod.ts:122 PromptTemplate.user template no template-prompt (experimental) none

Not in the question (the four positions that are read or marked): system/job.zod.ts:15 CronSchedule.expression (read by croner at schedule time — the one wired cron slot); ai/knowledge-source.zod.ts:45 KnowledgeRefreshPolicy.cron (D7 cron-knowledge-refresh, experimental-marked; its describe attribution is #15867); data/object.zod.ts:2083 Object.titleFormat (read by objectui — with a dialect mismatch, #15947).

Options × real cost

option what real cost
A — retire the nine positions (eight keys; rows 3 and 4 share one key name on two schemas) via RETIRED_KEYS_BY_MAJOR[18] + retiredKey() tombstones, D3 semantic entries per family, regenerated shards / reference pages, refusal pins the #14477 / PR #15514 shape, S–M; @objectstack/spec minor with a BREAKING banner; row 6 is a stack collection member (connectors[].syncConfig.schedule) — measured zero example authors, out-of-repo stacks NOT MEASURED; the two api/ rows retire from an API contract, not a manifest
B — [EXPERIMENTAL — not enforced] on all nine + ledger enrolment prose only the human-only signal ruled out on #15513 for the same shape: an AI generating from the schema still writes schedule: '0 0 * * *' on a connector and believes a sync is scheduled
C — leave them nothing the declared ≠ enforced surface stays on nine published keys; the narrowing PR makes their envelope arm honest but cannot make a scheduler appear
D — wire them (a scheduler for connector sync, cache warmup, backups, DR testing; a prompt runtime) product work, several cards, no ruling today speculative capability with zero measured pull

四维分析(从业务角度)

一句话问题:九个已发布、有文档、进了 D7 台账、却被任何代码都不读的 cron/模板类型键,是按 ADR-0049 退役,还是打 [EXPERIMENTAL] 留着,还是留着不动?

推荐:A(整体退役),按家族逐一答「是否在路线图上且有日期」 —— 与 #15513 的裁法同形:有日期的家族走 B,其余走 A。四轴同向;唯一需要维护者回答的是路线图问题(代码里没有答案)。裁 A ⇒ 一张 domain:spec 卡,spec-property-retirement 剧本,PR #15514 先例,条款② 复审;裁 B ⇒ 一张 spec 文档卡(标注 + 台账登记);裁 C ⇒ 关 not planned 并在 D7 行上记「accepted declared-unwired」。

置信缺口:仓外 stack 是否写过 connectors[].syncConfig.scheduleBackupConfig.schedule 未测(本仓与 objectui pin 零命中);api/ 两行是 REST 请求/契约面,是否有外部客户端发送 schedule.cronExpression 未测(路由侧读者为零是实测的)。


Generated by Claude Code

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions