Skip to content

[finding] Two major-18 D3 entries print CurrencyConfigSchema.precision … unchanged through os migrate meta, which PR #20251 makes false in the same major #20379

Description

@objectstack-fleet

Filing gate: ① a defect with a named landing site, finding class (b). The reach: exception is release text: os migrate meta prints these entries to authors, and protocol 18 is unreleased, so this is fixable before any release.

Found by the base-merge round on #19992 (PR #20251; report on this seat's session, out_of_scope_findings[0]). Filed by the domain:spec execution seat 1 (session_01Rjy9MeetSfq34PKn81CRiN, seat post #6017). ⛔ Filed bare: routing and grading belong to triage. ⛔ Not a claim.

What is false

PR #20251 retires CurrencyConfigSchema.precision in major 18 (conversion currency-config-precision-removed, D3 currency-config-precision-retired). The maintainer approved it at 33f53b5e, and it is armed. Once it lands, two sibling D3 entries of the same major still say the key is unchanged:

  • packages/spec/src/migrations/entries/semantic/18.field-scale-precision-integer-refused.ts (about :24–25): 「CurrencyConfigSchema.precision (under currencyConfig) is a different surface with its own bounds and alias table and is unchanged.」
  • packages/spec/src/migrations/entries/semantic/18.ui-form-field-precision-scale-integer-refused.ts (about :29–30): 「⚠️ CurrencyConfigSchema.precision and the gantt scale enum are different surfaces and are unchanged.」

What the fix is (for the dispatch to confirm)

  • Reword only the CurrencyConfigSchema.precision clause in each entry: it is removed in this same major by currency-config-precision-removed. Put no tracker number in the field text.
  • Keep the gantt scale clause, which is still true.
  • Run gen:migration-registry, then check:migration-registry, retired-key-migrate-sentence.test.ts and migrations.test.ts. The fix is text only.
  • Serial after PR feat(spec)!: retire currencyConfig.precision — a currency's decimal places are its currency's (ADR-0049) #20251 lands. It was not folded into that PR because the maintainer approved and armed its exact head.

Dedupe

The two sentences were measured by the #19992 round against origin/main; git grep "CurrencyConfigSchema.precision" packages/spec/src/migrations/entries/semantic/ gives exactly these 2 hits. No open card carries them: this is a sibling-text consequence of PR #20251, found in its round.

Dedupe words: CurrencyConfigSchema.precision unchanged D3 entry · stale sibling retirement prose migrate meta

Activity

  1. objectstack-fleet commented on Sep 28, 2026

    @objectstack-fleet
    ContributorAuthor

    Path: packages/spec/src/migrations/entries/semantic/ (the major-18 D3 entries printed by os migrate meta) | none

    Triage: first grade — bug · documentation · priority:p3 · domain:spec · area:devpath · pm:blocked

    Blocked-by: #19992

    Triage: lands in packages/spec/src/migrations/entries/semantic/18.field-scale-precision-integer-refused.ts:24 and 18.ui-form-field-precision-scale-integer-refused.ts:29. Both were re-read on origin/main b1cbd927 and still say CurrencyConfigSchema.precision is unchanged ⇒ domain:spec.

    Rationale:

    Triage seat (objectstack-wide, seat post #6015) · session_01AavokzJ5DndAwitDXvKy4U · 2026-09-28T05:00Z. ⛔ Not a claim, ⛔ not a dispatch.

    Duplicate check. Same corpus. CurrencyConfigSchema.precision together with unchanged|D3|migrat gives 6 hits: PR #20251 (the source) and closed work (#20011 and others). None carries these two sentences.

    On unlock.

    • Reword only the CurrencyConfigSchema.precision clause in each entry, and keep the gantt scale clause.
    • Put no tracker number in the text.
    • Then run gen:migration-registry → check:migration-registry, retired-key-migrate-sentence.test.ts and migrations.test.ts.

    Size/model suggestion: S.

  2. objectstack-fleet commented on Sep 28, 2026

    @objectstack-fleet
    ContributorAuthor

    Unlock: pm:blocked → pm:queue. The condition this card waited on, PR #20251 landing, is met. The Blocked-by: #19992 line was this seat's error.

    Triage seat (objectstack-wide, seat post #6015) · session_01AavokzJ5DndAwitDXvKy4U · 2026-09-28T05:56Z. ⛔ Not a claim.

    The error.

    Re-derivation on origin/main db74b169.

    • The retirement has landed: 18.currency-config-precision-retired.ts and the currency-config-precision-removed conversion are present.
    • Both sentences are still there and now false: 18.field-scale-precision-integer-refused.ts:24 and 18.ui-form-field-precision-scale-integer-refused.ts:29 say CurrencyConfigSchema.precision is unchanged.
    • No new blocker. The grade (p3) and route are unchanged, and the execution notes in 5863776426 stand.
  3. objectstack-fleet commented on Sep 28, 2026

    @objectstack-fleet
    ContributorAuthor

    Claim: PM loop round 1
    Session: session_014EJ1ED8X4MMrT18BhVx4tx
    Account: os-tesla (the seat's linked user as GET /user answers it; the card's assignee)
    Branch: claude/issue-20379-currency-precision-d3-text
    Worktree: objectstack-issue-20379
    Domain: domain:spec
    Seat: domain:spec#2 (seat post #18549)
    File surface, per triage 5863776426 and the unlock 5864312617:


    Generated by Claude Code

  4. objectstack-fleet commented on Sep 28, 2026

    @objectstack-fleet
    ContributorAuthor

    os-dev-report
    {
    "issue": 20379,
    "status": "done",
    "branch": "claude/issue-20379-currency-precision-d3-text",
    "pr": "#20488",
    "session": "session_014EJ1ED8X4MMrT18BhVx4tx",
    "premise_still_valid": true,
    "summary": "Confirmed the premise: 18.currency-config-precision-retired.ts and the currency-config-precision-removed conversion are landed on main, and both named D3 entries said CurrencyConfigSchema.precision is 'unchanged' — false in the same major. Reworded ONLY that clause in 18.field-scale-precision-integer-refused.ts (:24) and 18.ui-form-field-precision-scale-integer-refused.ts (:29) to say the key was retired in this same protocol major by currency-config-precision-removed; the gantt scale clause, still true, is untouched; no tracker number added. Regenerated packages/spec/src/migrations/registry.ts with gen:migration-registry (diff mirrors only these two clauses). Built @objectstack/spec and confirmed by grepping dist/index.js/dist/index.mjs that the reworded sentence, not the old false one, is what ships. Added .changeset/20379-currency-precision-d3-text.md (patch, Clause-②: no, states no schema/key/verdict moves). Opened draft PR #20488 with the verification record and acceptance notes, and set its assignee to os-tesla.",
    "tests": "HEAD db7ad52, merge-base 8e02859 of origin/main (fetched 4b2d904 before opening the PR; no commit since base touches packages/spec/src/migrations/**, so no merge was needed). pnpm --filter @objectstack/spec build — clean, check-dts-emitted 36/36, check-dts-references 394/394 resolved. Positive control: grepped dist/index.js and dist/index.mjs for the new wording — 2 hits (one per entry); the old 'CurrencyConfigSchema.precision ... unchanged' sentence appears nowhere in dist. pnpm --filter @objectstack/spec test — 570 test files, 16741 tests passed, 1 todo, exit 0. pnpm --filter @objectstack/spec typecheck (tsc --noEmit + check:scripts-typecheck + check:test-typecheck) — exit 0; test-typecheck debt ledger unchanged (251 pre-existing pinned errors, shrink-only, none new). node scripts/pm/dispatch-gates.mjs --repo objectstack-ai/objectstack --commands, reconciled with --ran: 82 derived, 81 run/green, 1 NOT MEASURED (pnpm check:dual-build-cjs-loads — its own PREREQUISITE NOT MET, exit 3, names ~86 packages across the whole monorepo needing pnpm build first; this is the same population as ci.yml's 'Build Core' → 'Build packages' step, which dispatch-gates itself classifies as having no local invocation — full-tree build is CI's to run, disproportionate to this 3-file, zero-export/schema-shape diff). Two gates needed cheap, proportionate prerequisite builds before they could run for real, both then green: check:doc-formula-expressions (built @objectstack/formula + @objectstack/lint, then reran: exit 0) and check:lean-entry-closure (built @objectstack/objectql, then reran: exit 0, 'Admitted set held exactly (15 packages); 6 denied names absent'). All 82 gate exit codes captured before any pipe via a runner script writing one EXIT=N line per command.",
    "mcp_calls": "0 — no MCP tools of any kind were called at any point this round; all GitHub reads used plain curl, all GitHub writes went through scripts/pm/ (with-fleet.sh --via dispatch for pr_create and the os-dev-report comment, label-write.mjs for the PR assignee) per the card's ⛔ No MCP instruction.",
    "api_writes": "3 REST proxy writes, all via the fleet-write relay (objectstack-fleet[bot]): (1) POST /repos/objectstack-ai/objectstack/pulls (pr_create, draft forced) — opened PR #20488; (2) POST /repos//issues/20488/assignees (assign os-tesla) — read back confirmed, pre-existing labels (documentation, size/s, tooling) untouched, applied by other automation; (3) POST /repos//issues/20379/comments (this report). No labels beyond the PR assignee were written, per the card's write budget. git push (not a REST write, not counted) happened three times: the empty-branch probe, the implementation commit, and the changeset commit — none rejected.",
    "open_questions": [],
    "out_of_scope_findings": [
    "class: none (not filed) · reach: n/a · hypothesis-4 grep hit, resolved without action: packages/spec/CHANGELOG.md:13763 also pairs CurrencyConfigSchema.precision with 'unchanged', but it sits under the already-shipped ## 17.1.0 heading (the #8321 field-scale/precision entry) — release-frozen text per AGENTS.md Documentation Guardrails (never hand-edit CHANGELOG.md in a code PR), and it was true when published (major-18's retirement postdates 17.1.0). Not a defect, not touched. dedupe: CHANGELOG CurrencyConfigSchema.precision unchanged 17.1.0 stale",
    "carrier: none · noted, not filed · .changeset/19992-currency-config-precision-retired.md also contains the string 'unchanged' near precision, but it correctly refers to the FIELD-level precision (total digit count), not CurrencyConfigSchema.precision — no false claim, no action needed. dedupe: 19992 changeset field precision unchanged correct"
    ]
    }

  5. objectstack-fleet commented on Sep 28, 2026

    @objectstack-fleet
    ContributorAuthor

    REWORK round 1 — PR #20488 at head db7ad5204f · domain:spec seat 2 (session_014EJ1ED8X4MMrT18BhVx4tx) · 2026-09-28T17:58Z

    The at-tier contract review 5875601370 on the PR returned FAIL for one reason. The seat re-measured it on origin/main and adopts it. The currency clause rewording, the regenerated registry, the patch level and Clause-②: no were judged right and do not change.

    • The item (sent to the same dev): the kept gantt clause in 18.ui-form-field-precision-scale-integer-refused.ts, 「The gantt scale enum is a different surface and is unchanged」, is false.
      • GanttConfigSchema (packages/spec/src/ui/view.zod.ts ~:1854, strictObject) declares no scale; its granularity key is viewMode: z.enum(['day','week','month','quarter','year']).
      • The only enum-valued scale is TimelineConfigSchema.scale (~:1418, 'hour' … 'year').
      • os migrate meta prints the sentence to authors, pointing them at a key a strict schema refuses.
    • Scope ruling (the seat's): the fix is in scope for this card. It is the same sentence this PR re-authors, in the same entry. Triage's 「keep the gantt scale clause, which is still true」 (5863776426) rested on a reading the code falsifies, so the seat corrects that execution note here instead of opening a sibling card for one clause. Name the surface that exists, the timeline view's scale enum (TimelineConfigSchema.scale), or drop the clause; then gen:migration-registry; no tracker number.
    • The landing now waits on: the round-1 head, a fresh at-tier record on that head, and every check green.

    Generated by Claude Code

  6. objectstack-fleet commented on Sep 28, 2026

    @objectstack-fleet
    ContributorAuthor

    os-dev-report
    {
    "issue": 20379,
    "status": "done",
    "branch": "claude/issue-20379-currency-precision-d3-text",
    "pr": "#20488",
    "session": "session_014EJ1ED8X4MMrT18BhVx4tx",
    "premise_still_valid": true,
    "summary": "REWORK round 1, in response to the at-tier FAIL (5875601370) and the seat's rework note (5875625251). Re-read GanttConfigSchema and TimelineConfigSchema in packages/spec/src/ui/view.zod.ts myself: GanttConfigSchema (:1854, strictObject) declares no scale key at all — its granularity key is viewMode: z.enum(['day','week','month','quarter','year']); the only enum-valued scale is TimelineConfigSchema.scale (:1418, z.enum(['hour','day','week','month','quarter','year'])). The kept clause in 18.ui-form-field-precision-scale-integer-refused.ts, "The gantt scale enum is a different surface and is unchanged", was confirmed false — it names a key a strict schema refuses. Reworded it to name the surface that exists (TimelineConfigSchema.scale, still unchanged) and to say plainly the gantt view has no scale key. No tracker number added. Regenerated packages/spec/src/migrations/registry.ts with gen:migration-registry (diff mirrors only this one clause). Repo-wide grep for other author-shown text saying "gantt scale" found exactly 3 hits: the entry file (fixed), its generated mirror in registry.ts (fixed by regeneration), and this PR's own .changeset/20379-currency-precision-d3-text.md (updated — see below, not author-shown runtime text but corrected for accuracy). No other carrier anywhere in the repo. Added one paragraph to the changeset describing this second correction (still patch, Clause-②: no). Currency clause, patch level and Clause-②: no were judged right in the review and unchanged.",
    "tests": "HEAD 1cbd8ea52f (was db7ad5204f), merge-base 8e0285918 of origin/main. origin/main fetched at fc0db22bcf before finishing this round — 9 commits ahead of the base but none touch packages/spec/src/migrations/** (git log --oneline 8e02859185..origin/main -- packages/spec/src/migrations/ empty), so no merge was needed and os-regen-merge.sh was not invoked. Fresh, foreground, through os-verify-lock.sh: pnpm --filter @objectstack/spec run check:migration-registry — exit 0, 'src/migrations/registry.ts is current (310 semantic, 230 retired-key, 206 retired-def)'. The spec migrations tests, targeted: migrations.test.ts + spec-changes-surface-scope.test.ts + retired-tables-not-floor-scoped.test.ts under vitest project local — 3 files / 160 tests passed; retired-key-migrate-sentence.test.ts lives in vitest project repo (a toolchain trap the first run's own warning caught — 'FILTER SELECTED NOTHING'), reran correctly with --project repo — 1 file / 14 tests passed. pnpm check:doc-authoring — exit 0, 16703 customer-facing strings across 1166 spec sources clean, no internal issue-id references; sibling-package baseline unchanged (810 pinned sites, no growth). pnpm --filter @objectstack/spec typecheck (tsc --noEmit + check:scripts-typecheck + check:test-typecheck) — exit 0, same 251-error debt ledger, unchanged. Re-derived node scripts/pm/dispatch-gates.mjs --repo objectstack-ai/objectstack --commands on the new HEAD: same 82 derived families as round 1 (identical file surface, changed lines 37 (+29/-8)). Reconciled with --ran: 82 derived, 81 accounted green, 1 NOT MEASURED (pnpm check:dual-build-cjs-loads, same PREREQUISITE NOT MET as round 1 — needs a full ~86-package monorepo build, CI's Build Core job, unchanged reasoning). Of the 82, check:migration-registry and check:doc-authoring were re-measured fresh at this round's HEAD (both exit 0, above); the other 80 carry forward round 1's measurement at db7ad5204f, unchanged by this round's single-clause diff — stated plainly rather than implied.",
    "mcp_calls": "0 — no MCP tools of any kind were called at any point this round; all GitHub reads used plain curl, all GitHub writes went through scripts/pm/ (with-fleet.sh --via dispatch for the os-dev-report comment) per the card's ⛔ No MCP instruction.",
    "api_writes": "1 REST proxy write this round, via the fleet-write relay (objectstack-fleet[bot]): POST /repos//issues/20379/comments (this report). No PR body edit (⛔ dev never PATCHes a PR body — the coordinator's instructions named no body update, and the standard-clauses rule holds regardless), no label or assignee write this round (already set in round 1, coordinator named none this round). git push (not a REST write, not counted) happened once: the two-file rework commit 1cbd8ea52f, not rejected.",
    "open_questions": [],
    "out_of_scope_findings": [
    "class: none (not filed) · reach: n/a · repo-wide grep for "gantt scale" (step 2 of this round) found exactly 3 hits, all inside this card's own surface: the entry file (fixed this round), its generated mirror in packages/spec/src/migrations/registry.ts (fixed by gen:migration-registry), and this PR's .changeset/20379-currency-precision-d3-text.md (not author-shown runtime text, but updated for accuracy — see step 3). No other file in the repo, generated or hand-written, makes this claim. dedupe: gantt scale enum different surface unchanged false GanttConfigSchema viewMode",
    "class: none (not filed) · reach: n/a · carried from round 1, unchanged: packages/spec/CHANGELOG.md:13763 pairs CurrencyConfigSchema.precision with 'unchanged' under the already-shipped ## 17.1.0 heading — release-frozen text, true when published, not a defect.",
    "carrier: none · noted, not filed · carried from round 1, unchanged: .changeset/19992-currency-config-precision-retired.md's 'unchanged' correctly refers to the FIELD-level precision key, not CurrencyConfigSchema.precision — no false claim."
    ]
    }

  7. objectstack-fleet commented on Sep 28, 2026

    @objectstack-fleet
    ContributorAuthor

    ACCEPT — PR #20488 at head 1cbd8ea52f (round 1) · domain:spec seat 2 (session_014EJ1ED8X4MMrT18BhVx4tx) · 2026-09-28T18:49Z

    The seat reviewed the dev reports 5875388171 (round 0) and 5876206709 (round 1) on this card against GitHub and the diff.

    • PR shape: draft, base main, first line Fixes #20379, the body's Clause-②: no line at line start, assignee os-tesla, 4 files (+29 / −8). The closing-keyword scan finds only #20379.
    • Diff, read by the seat:
      • Two reason literals in the major-18 D3 entries: the CurrencyConfigSchema.precision clause now says the key is retired in this same major by currency-config-precision-removed.
      • Round 1 corrects the form-field entry's gantt clause (the rework note 5875625251): it now names the timeline view's scale enum (TimelineConfigSchema.scale) and says the gantt view has no scale key (its granularity key is viewMode).
      • The generated registry mirror, and a patch changeset with Clause-②: no.
      • No key, schema, conversion or verdict moves.
    • At-tier contract review: round 0 5875601370 FAIL (the false gantt clause). Round 1 5876363774 PASS on this head, checked against the moved view.zod.ts on current main. It proves the registry byte-identical to a re-render from the entry files, and finds no other carrier of either false claim. The seat checked both transcripts: served at tier, read-only, one write each (the record).
    • Findings: packages/spec/CHANGELOG.md:13763 (under ## 17.1.0) is release-frozen and was true when published → dropped. .changeset/19992-*'s 「unchanged」 is about the field-level precision → dropped.
    • PR body: it still carried round 0's 「gantt clause … still true」 sentence and head. The seat corrects those two lines in place in the next act, so the squash commit does not repeat a claim the head removed.
    • Landing: CI green on the head (35 concluded: 32 success, 3 roster skips). This seat runs the pre-landing checks, flips it ready and arms auto-merge.

    Generated by Claude Code

  8. objectstack-fleet commented on Sep 28, 2026

    @objectstack-fleet
    ContributorAuthor

    Landing record — PR #20488 MERGED · domain:spec seat 2 (session_014EJ1ED8X4MMrT18BhVx4tx) · 2026-09-28T19:28Z

    • Merged through the merge queue at 2026-09-28T19:21Z as de8c973c17, after the ACCEPT 5876397336 and the round-1 at-tier PASS 5876363774.
    • Verified by content on origin/main de8c973c17, not by the merged flag: both D3 entry files, packages/spec/src/migrations/registry.ts and .changeset/20379-currency-precision-d3-text.md are blob-identical to the reviewed head 1cbd8ea52f; TimelineConfigSchema.scale is present in the registry mirror.
    • Closing: Fixes #20379 closed this card as completed; pm:dispatched is removed in this act (domain:*, area:* and type labels stay).

    Generated by Claude Code

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

Metadata

Metadata

Assignees

Labels

area:devpathThe road — create, dev, verify, publish/install, connect an agent, iteratebugSomething isn't workingdocumentationImprovements or additions to documentationdomain:specpriority:p3

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions