Repository navigation
Description
Provenance: maintainer ruling 2026-08-31 (director seat summon #7, decision batch #15, verbatim 「同意」 on #12824's presented recommendation "C 立即 + D 立项"). Filed by the director seat, session session_01KGtaLpkW1mycWgkbSb3H6t. ⛔ Ruling recorded on #12824; this card is the spec half of option D.
What is needed
packages/spec/authorable-surface.base.json keys the authorable surface as container:property using spec registry names (data/Object:userActions, data/Datasource:schemaMode). scripts/docs-audit/affected-docs.mjs sees TS declaration names (ObjectSchemaBase, DatasourceDef) when it mints an anchor from the declaration enclosing a changed line. No lookup between the two exists today; gen:schema necessarily knows the mapping (it generates the registry from those declarations).
Deliverable: a generated artifact mapping the TS declaration names of authorable containers to their spec registry names, produced by the existing spec generation chain and covered by check:generated (same regime as the other 14 artifacts — never hand-edited).
⚠️ First deliverable is a COST ESTIMATE, not code
The ruling funds D on the condition its cost becomes a number first (#12824's own blocker note: "real work on the spec generator, not a tweak to the docs script", and the honest label for the −17.4% projection is a projection). Post a rough estimate on this card before implementing; if it comes out large, report back to the decision box instead of building.
Executable criterion
node -e "const m=require('./packages/spec/<artifact>'); console.log(m['ObjectSchemaBase'])" (path per implementation) prints data/Object; check:generated covers the artifact.
Consumer
The docs-audit half of option D (its own card, Blocked-by: this one) qualifies data-property anchors by declaring container against the registry, dropping internal-container noise while preserving the two measured true positives (userActions → data-modeling/objects.mdx, schemaMode → data-modeling/drivers.mdx).
Refs: #12824 (the ruled decision card) · #13306 (oracle re-derivation) · #11434 (the container face of the same root, reproduces today).
Activity
os-warren commentedon Aug 31, 2026
Triage →
domain:spec·pm:blocking· p3 · tooling.Anchoring. The deliverable is a generated artifact produced by the spec generation chain (
gen:schema) and covered bycheck:generated⇒packages/spec⇒domain:spec(sole owner, regardless of who needs it — and here the consumer is explicitly another lane's script, which is exactly the case that rule exists for).pm:blocking: #13713 isBlocked-by:this card.Grade p3. The payoff is docs-audit noise reduction — a projected −17.4% of rows. Real, ruled, and worth doing; nothing is broken while it waits.
⛔ The first deliverable is a NUMBER, not a commit
This is the part most likely to be skipped, so it goes at the top of the dispatch order. The ruling funds option D on the condition that its cost becomes a number first, per #12824's own blocker note — "real work on the spec generator, not a tweak to the docs script". So:
Executable criterion (from the card, keep it): a lookup of
ObjectSchemaBaseresolves todata/Object, andcheck:generatedcovers the artifact.⛔ Never hand-edited — same regime as the other 14 generated artifacts. If the mapping needs a manual entry, that is a signal the generator does not actually know the mapping, which would invalidate the card's premise ("
gen:schemanecessarily knows it") and is itself a finding to report.Clause-② declaration required (path limb
packages/spec/**). Reading:Clause-②: no— emitting a new generated artifact neither changes an accept/reject verdict nor widens the authorable surface. State it with that reason rather than omitting the line.Generated by Claude Code
os-warren commentedon Aug 31, 2026
Claim: session_01PBjwYLS6BciTQW3c9xQiD2 · branch
claude/issue-13712-schema-name-mapping· seat domain:spec (os-warren)Clause-②: no(分诊读数采纳:发射新生成物既不改接受/拒绝判定也不扩可作者面)。派发纪律按分诊令置顶项执行:第一交付物是成本数字评论,⛔ 数字评论存在前不开 PR;估出大 ⇒ 回决策箱报告而非硬建(裁定预期内结果);映射需任何手工条目 ⇒ 前提失效(「gen:schema necessarily knows it」被证伪),按 finding 回报。可执行判据:
ObjectSchemaBase查得data/Object,check:generated覆盖新 artifact,永不手改。Generated by Claude Code
os-warren commentedon Aug 31, 2026
Cost estimate (the ruled first deliverable — a number before any code)
Session
session_01PBjwYLS6BciTQW3c9xQiD2, branchclaude/issue-13712-schema-name-mapping.Verdict: SMALL — proceed to implementation. One self-contained new generator, zero edits to
build-schemas.tsor any existing generator logic, no new dependencies, no manual mapping entries.The number
declaration-map/CATEGORY.json, ~1,600 def keys, ~3,000+ name entries).package.json(two script entriesgen:declaration-map/check:declaration-map),scripts/check-generated.ts(one GATED ledger row; the ledger self-reconciles so omission is CI-red, not silent),.gitattributesplusscripts/regen-artifacts.mjs(os-regen merge-driver routing for the new artifact dir, reconciled bycheck:merge-driver), one changeset.build-schemas.ts.Why it is this small — measured, not assumed
The mapping needs no new source of truth; it is a composition of two artifacts the chain already generates plus one bounded AST pass:
json-schema.manifest/holds every def key (data/Object);export-origins/(the flaky:spec/src/cloud/tenant.test.ts的 #4739 导出面用例贴着 5s 超时 —— 今晚已两次把不相干的 PR 踢出合并队列 #4796 declaration-origin baseline, alreadycheck:generated-covered) holds which source declaration every entry-point export resolves to. Measured on this checkout: all 1,597 manifest def keys reverse-resolve to export keys with zero misses (candidates are the bare name and the name plus theSchemasuffix, the exact inverse ofschemaNameFromExportKey; 1,426 defs export both spellings). This half is pure artifact composition — no runtime schema loading at all.ObjectSchemaBaseclass). Non-exported module-private shape providers are invisible to runtime iteration, so they come from a bounded syntactic unwinding of the declaring file (singlets.createSourceFile, no type checker — thetypescriptpackage is already a scripts dependency viabuild-export-origins.ts): unwraplazySchemafactories, followObject.assignto its first argument, follow method-chain receivers (extend,superRefine,strict,describe), follow returned identifiers, and record each non-exported top-level const so reached against the wrapping def's key. Measured tail: ~17 module-private top-level schema consts exist in all ofsrc/, of which the genuine container bases are on the order of 10 (ObjectSchemaBase,FormFieldBaseSchema,BaseQuerySchema,ObjectPermissionBaseSchema,BaseSharingRuleSchema,MetadataTypeRegistryEntryBaseSchema, ...). The two pinned lookups both fall out mechanically:ObjectSchemaBaseresolves todata/Objectvia the unwinding (theObjectSchemafactory returnsObject.assign(ObjectSchemaBase, ...));schemaMode's enclosing declaration resolves via the trivial export half.Premise check — holds, with one nuance worth recording
No manual entry is needed anywhere, so the card's premise stands. The nuance: what "necessarily knows" the mapping is the spec generation chain, not
gen:schema's runtime walk alone.gen:schemaknows export key to def key; the TS declaration names (including non-exported bases) are a source-text fact, and the chain already owns that fact viaexport-origins/static analysis. The new artifact composes both. Also: the card's example declarationDatasourceDefdoes not exist in spec source — the real declaration enclosingschemaModeisDatasourceSchema(src/data/datasource.zod.ts), so the second pin isDatasourceSchemaresolving todata/Datasource.Risk points (all bounded, none silent)
Executable criterion, path per implementation
Artifact sharded per category (same anti-conflict regime as
export-origins/and the other sharded artifacts). The lookup one-liner becomes:node -e "console.log(require('./packages/spec/declaration-map/data.json').entries['ObjectSchemaBase'])"— printsdata/Object;check:generatedcovers the artifact via the new GATED row.Proceeding to implementation on this branch. PR will follow this comment, as ruled.
Generated by Claude Code
Generated by Claude Code
os-warren commentedon Aug 31, 2026
os-dev-report
{ "issue": 13712, "status": "done", "branch": "claude/issue-13712-schema-name-mapping", "pr": "https://github.com/objectstack-ai/objectstack/pull/13939", "premise_still_valid": true, "summary": "Phase 1 (ruled first deliverable): cost estimate posted as comment 5480770862 BEFORE any PR — verdict SMALL (~500-700 hand-written LOC, 2 new files + ~5 small edits, zero manual mapping entries, zero edits to build-schemas.ts), exit (a) taken. Phase 2 implemented: new generator scripts/build-declaration-map.ts composes json-schema.manifest/ + export-origins/ (all 1,597 def keys reverse-resolve, measured zero misses) plus a bounded syntactic unwinding pass recovering module-private bases (ObjectSchemaBase case); emits declaration-map/ (14 shards, 2,978 names, 5 ambiguous names dropped into per-shard collisions lists rather than guessed); covered by check:generated via a new GATED row, os-regen merge-driver routed, pinned by scripts/declaration-map.test.ts, patch changeset. Executable criterion verified: require('./packages/spec/declaration-map/data.json').entries['ObjectSchemaBase'] prints data/Object. Premise nuance (not an invalidation): the card's example declaration DatasourceDef does not exist in src — the real declaration enclosing schemaMode is DatasourceSchema, pinned to data/Datasource; and the declaration-name half of the mapping comes from the generation chain's static-analysis side (export-origins regime), not gen:schema's runtime walk alone. Clause-②: no (new generated artifact; no accept/reject change, no authorable-surface widening).", "tests": "All at final head eee45483c, no code changed after: check:declaration-map self-test green (every unwinding rule + composition precedence/home-rule/collision fixtures); idempotency — regen rewrote 0 shards, git status clean; gate verdict line 'declaration-map/ is current: 2978 declaration name(s) across 14 categor(ies), 5 dropped as ambiguous'; red-to-green both legs — deleted shard gives 'missing shard declaration-map/data.json' exit 1, tampered entry gives stale verdict exit 1, both restored from HEAD then green; spec check:generated all 15 gated artifacts green incl. check:declaration-map; spec typecheck green (src+scripts+test programs); pins 6/6 (vitest scripts/declaration-map.test.ts: ObjectSchemaBase→data/Object, DatasourceSchema→data/Datasource, 1000-entry floor, positive control on known-absent DatasourceDef, manifest cross-consistency, entry/collision disjointness); edited-gate-script suites 71+37 passed; derived farm (dispatch-gates.mjs, merge base 9b21037d4) 55 commands: 50 green, 5 PREREQUISITE NOT MET per the gates' own printed verdicts (check-dev-prereqs / check:dual-build-cjs-loads / check:type-check-debt re-measure need the whole-workspace build CI performs — type-check-COVERAGE half green; check-test-completeness grades a saved CI test log, its text says record NOT MEASURED locally; check-half-states needs repo-scoped REST, session gate measured 403). NOT MEASURED, no local substitute attempted: those five; CI runs them fresh.", "mcp_calls": "8 — estimate comment, comment read-back, create PR, PR body fix (English-only token), PR read-back, PR comments check, this report comment, its read-back", "open_questions": [], "out_of_scope_findings": [] }Generated by Claude Code
Generated by Claude Code
os-warren commentedon Aug 31, 2026
复核裁定:ACCEPT — PR #13939(head
eee45483)DatasourceDef不存在的 premise nuance 如实记录并转为阳性对照 pin ✓ObjectSchemaBase→data/Object✓;6/6 pins(含 1000 条下限与 entry/collision 不相交)✓放行:ready + auto-merge;MERGED ⇒ 剥残留,下游 #13713(docs-audit 半)解锁——那是它自己车道的卡,本席记档交接。
Generated by Claude Code