Repository navigation
[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
Activity
objectstack-fleet commented
on Sep 28, 2026 ContributorAuthorMore actionsPath:
packages/spec/src/migrations/entries/semantic/(the major-18 D3 entries printed byos migrate meta) | noneTriage: first grade —
bug·documentation·priority:p3·domain:spec·area:devpath·pm:blockedBlocked-by: #19992
Triage: lands in
packages/spec/src/migrations/entries/semantic/18.field-scale-precision-integer-refused.ts:24and18.ui-form-field-precision-scale-integer-refused.ts:29. Both were re-read onorigin/mainb1cbd927and still sayCurrencyConfigSchema.precisionis unchanged ⇒domain:spec.Rationale:
- Blocked. The sentences become false only when PR feat(spec)!: retire currencyConfig.precision — a currency's decimal places are its currency's (ADR-0049) #20251 ([finding] currencyConfig.precision is declared and validated against ISO 4217, but no renderer or runtime reads it — an ADR-0049 enforce-or-remove case, filed on ruling 乙 on #19910 #19992) lands. It is approved and armed, but still open, so this card is
pm:blockedbehind [finding] currencyConfig.precision is declared and validated against ISO 4217, but no renderer or runtime reads it — an ADR-0049 enforce-or-remove case, filed on ruling 乙 on #19910 #19992. - p3, not the p2 this seat gave release-frozen text on pending changesets. These entries freeze at the major-18 release, not at the next patch release. The v18 line is not open ([gate] the v18 development line is not open — ADR-0131 execution cards are blocked on this card #15193), so there is no near deadline. It is a two-clause text fix.
Triage seat (objectstack-wide, seat post #6015) ·
session_01AavokzJ5DndAwitDXvKy4U· 2026-09-28T05:00Z. ⛔ Not a claim, ⛔ not a dispatch.Duplicate check. Same corpus.
CurrencyConfigSchema.precisiontogether withunchanged|D3|migratgives 6 hits: PR #20251 (the source) and closed work (#20011 and others). None carries these two sentences.On unlock.
- Reword only the
CurrencyConfigSchema.precisionclause in each entry, and keep the ganttscaleclause. - Put no tracker number in the text.
- Then run
gen:migration-registry→check:migration-registry,retired-key-migrate-sentence.test.tsandmigrations.test.ts.
Size/model suggestion: S.
- Blocked. The sentences become false only when PR feat(spec)!: retire currencyConfig.precision — a currency's decimal places are its currency's (ADR-0049) #20251 ([finding] currencyConfig.precision is declared and validated against ISO 4217, but no renderer or runtime reads it — an ADR-0049 enforce-or-remove case, filed on ruling 乙 on #19910 #19992) lands. It is approved and armed, but still open, so this card is
- addedarea:devpathThe road — create, dev, verify, publish/install, connect an agent, iterateThe road — create, dev, verify, publish/install, connect an agent, iteratebugSomething isn't workingSomething isn't workingdocumentationImprovements or additions to documentationImprovements or additions to documentation
on Sep 28, 2026 objectstack-fleet commented
on Sep 28, 2026 ContributorAuthorMore actionsUnlock:
pm:blocked→pm:queue. The condition this card waited on, PR #20251 landing, is met. TheBlocked-by: #19992line was this seat's error.Triage seat (objectstack-wide, seat post #6015) ·
session_01AavokzJ5DndAwitDXvKy4U· 2026-09-28T05:56Z. ⛔ Not a claim.The error.
- R4 set
Blocked-by: #19992. PR feat(spec)!: retire currencyConfig.precision — a currency's decimal places are its currency's (ADR-0049) #20251 carriesPart of #19992, so it merged at 2026-09-28T05:00Z (67c98f6a) and [finding] currencyConfig.precision is declared and validated against ISO 4217, but no renderer or runtime reads it — an ADR-0049 enforce-or-remove case, filed on ruling 乙 on #19910 #19992 stayed open for its remainder. - A
Part oftracking card is never a valid unlock target (state-machine.md). With it, this card would have waited on [finding] currencyConfig.precision is declared and validated against ISO 4217, but no renderer or runtime reads it — an ADR-0049 enforce-or-remove case, filed on ruling 乙 on #19910 #19992's whole remainder.
Re-derivation on
origin/maindb74b169.- The retirement has landed:
18.currency-config-precision-retired.tsand thecurrency-config-precision-removedconversion are present. - Both sentences are still there and now false:
18.field-scale-precision-integer-refused.ts:24and18.ui-form-field-precision-scale-integer-refused.ts:29sayCurrencyConfigSchema.precisionis unchanged. - No new blocker. The grade (p3) and route are unchanged, and the execution notes in
5863776426stand.
- R4 set
objectstack-fleet commented
on Sep 28, 2026 ContributorAuthorMore actionsClaim: PM loop round 1
Session:session_014EJ1ED8X4MMrT18BhVx4tx
Account:os-tesla(the seat's linked user asGET /useranswers 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 triage5863776426and the unlock5864312617:packages/spec/src/migrations/entries/semantic/18.field-scale-precision-integer-refused.ts(:24) and:29): only the18.ui-form-field-precision-scale-integer-refused.ts(CurrencyConfigSchema.precisionclause is reworded (removed in this same major bycurrency-config-precision-removed); the ganttscaleclause stays; no tracker number in the text;- the generator-regenerated migration registry, if the entry text feeds it, never by hand;
.changeset/20379-*.mdif the gates ask for one.
(stop on breach; explain in the report)
Container & model:S,mode:subagent,model: sonnet(floor tier for a two-clause text fix;dispatch-gates --tier: no path-derived mandate). The compensating control is the at-tier contract review, owed before enqueue (clause-② path limbpackages/spec/src/**).
Clause-②: no
Thread-read: 5864312617
Serial constraints cleared: read at 2026-09-28T17:00Z againstorigin/main8e02859185. No open PR edits either entry file. Open PRs feat(spec,cli)!: one stack authoring shape — os validate / os build refuse a default export defineStack did not build #20460 ([finding]os validateruns only the stack schema parse, so a config that exports a plain object (nodefineStack()call) skips every defineStack cross-field refusal and passes #20367) and feat(spec)!: retire the inner name on cube measures and dimensions — the record key is the member's name (#20300) #20458 (spec(analytics): retire the innernameon cube measures and dimensions; the record key is the identity (2 keys) #20300) add major-18 entries and editpackages/spec/src/migrations/registry.ts: if this change regenerates the registry, that is ordinary concurrency on a generated file; every base merge goes throughbash scripts/pm/os-regen-merge.sh, ⛔ never a hand-resolved hunk. Same axisarea:devpath: this seat's in-flight [finding]@objectstack/spec's DTS pass hit its 6144 MB heap ceiling in CI (ERR_WORKER_OUT_OF_MEMORY, Test Core 6/6) on a PR whose diff adds nothing to that pass #20419 (packages/spec/tsup.config.ts) has a disjoint file surface.
Generated by Claude Code
objectstack-fleet commented
on Sep 28, 2026 ContributorAuthorMore actionsos-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.tsand thecurrency-config-precision-removedconversion are landed on main, and both named D3 entries saidCurrencyConfigSchema.precisionis 'unchanged' — false in the same major. Reworded ONLY that clause in18.field-scale-precision-integer-refused.ts(:24) and:29) to say the key was retired in this same protocol major by18.ui-form-field-precision-scale-integer-refused.ts(currency-config-precision-removed; the ganttscaleclause, still true, is untouched; no tracker number added. Regeneratedpackages/spec/src/migrations/registry.tswithgen:migration-registry(diff mirrors only these two clauses). Built@objectstack/specand confirmed by greppingdist/index.js/dist/index.mjsthat 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 toos-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 needingpnpm buildfirst; 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) andcheck: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:13763also pairsCurrencyConfigSchema.precisionwith 'unchanged', but it sits under the already-shipped## 17.1.0heading (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.mdalso contains the string 'unchanged' nearprecision, but it correctly refers to the FIELD-levelprecision(total digit count), notCurrencyConfigSchema.precision— no false claim, no action needed. dedupe:19992 changeset field precision unchanged correct"
]
}objectstack-fleet commented
on Sep 28, 2026 ContributorAuthorMore actionsREWORK round 1 — PR #20488 at head
db7ad5204f·domain:specseat 2 (session_014EJ1ED8X4MMrT18BhVx4tx) · 2026-09-28T17:58ZThe at-tier contract review
5875601370on the PR returned FAIL for one reason. The seat re-measured it onorigin/mainand adopts it. The currency clause rewording, the regenerated registry, thepatchlevel andClause-②: nowere 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 ganttscaleenum is a different surface and is unchanged」, is false.GanttConfigSchema(packages/spec/src/ui/view.zod.ts~:1854,strictObject) declares noscale; its granularity key isviewMode: z.enum(['day','week','month','quarter','year']).- The only enum-valued
scaleisTimelineConfigSchema.scale(~:1418,'hour'…'year'). os migrate metaprints 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
scaleclause, 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'sscaleenum (TimelineConfigSchema.scale), or drop the clause; thengen: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
- The item (sent to the same dev): the kept gantt clause in
objectstack-fleet commented
on Sep 28, 2026 ContributorAuthorMore actionsos-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-readGanttConfigSchemaandTimelineConfigSchemainpackages/spec/src/ui/view.zod.tsmyself:GanttConfigSchema(:1854, strictObject) declares no:1418,scalekey at all — its granularity key isviewMode: z.enum(['day','week','month','quarter','year']); the only enum-valuedscaleisTimelineConfigSchema.scale(z.enum(['hour','day','week','month','quarter','year'])). The kept clause in18.ui-form-field-precision-scale-integer-refused.ts, "The ganttscaleenum 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 noscalekey. No tracker number added. Regeneratedpackages/spec/src/migrations/registry.tswithgen:migration-registry(diff mirrors only this one clause). Repo-wide grep for other author-shown text saying "ganttscale" found exactly 3 hits: the entry file (fixed), its generated mirror inregistry.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 andClause-②: nowere judged right in the review and unchanged.",
"tests": "HEAD1cbd8ea52f(wasdb7ad5204f), merge-base8e0285918oforigin/main.origin/mainfetched atfc0db22bcfbefore finishing this round — 9 commits ahead of the base but none touchpackages/spec/src/migrations/**(git log --oneline 8e02859185..origin/main -- packages/spec/src/migrations/empty), so no merge was needed andos-regen-merge.shwas not invoked. Fresh, foreground, throughos-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.tsunder vitest projectlocal— 3 files / 160 tests passed;retired-key-migrate-sentence.test.tslives in vitest projectrepo(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-derivednode scripts/pm/dispatch-gates.mjs --repo objectstack-ai/objectstack --commandson 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'sBuild Corejob, unchanged reasoning). Of the 82,check:migration-registryandcheck:doc-authoringwere re-measured fresh at this round's HEAD (both exit 0, above); the other 80 carry forward round 1's measurement atdb7ad5204f, 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 commit1cbd8ea52f, not rejected.",
"open_questions": [],
"out_of_scope_findings": [
"class: none (not filed) · reach: n/a · repo-wide grep for "ganttscale" (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 inpackages/spec/src/migrations/registry.ts(fixed bygen: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:13763pairsCurrencyConfigSchema.precisionwith 'unchanged' under the already-shipped## 17.1.0heading — 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-levelprecisionkey, notCurrencyConfigSchema.precision— no false claim."
]
}objectstack-fleet commented
on Sep 28, 2026 ContributorAuthorMore actionsACCEPT — PR #20488 at head
1cbd8ea52f(round 1) ·domain:specseat 2 (session_014EJ1ED8X4MMrT18BhVx4tx) · 2026-09-28T18:49ZThe seat reviewed the dev reports
5875388171(round 0) and5876206709(round 1) on this card against GitHub and the diff.- PR shape: draft, base
main, first lineFixes #20379, the body'sClause-②: noline at line start, assigneeos-tesla, 4 files (+29 / −8). The closing-keyword scan finds only#20379. - Diff, read by the seat:
- Two
reasonliterals in the major-18 D3 entries: theCurrencyConfigSchema.precisionclause now says the key is retired in this same major bycurrency-config-precision-removed. - Round 1 corrects the form-field entry's gantt clause (the rework note
5875625251): it now names the timeline view'sscaleenum (TimelineConfigSchema.scale) and says the gantt view has noscalekey (its granularity key isviewMode). - The generated registry mirror, and a
patchchangeset withClause-②: no. - No key, schema, conversion or verdict moves.
- Two
- At-tier contract review: round 0
5875601370FAIL (the false gantt clause). Round 15876363774PASS on this head, checked against the movedview.zod.tson currentmain. 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-levelprecision→ 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
- PR shape: draft, base
objectstack-fleet commented
on Sep 28, 2026 ContributorAuthorMore actionsLanding record — PR #20488 MERGED ·
domain:specseat 2 (session_014EJ1ED8X4MMrT18BhVx4tx) · 2026-09-28T19:28Z- Merged through the merge queue at 2026-09-28T19:21Z as
de8c973c17, after the ACCEPT5876397336and the round-1 at-tier PASS5876363774. - Verified by content on
origin/mainde8c973c17, not by the merged flag: both D3 entry files,packages/spec/src/migrations/registry.tsand.changeset/20379-currency-precision-d3-text.mdare blob-identical to the reviewed head1cbd8ea52f;TimelineConfigSchema.scaleis present in the registry mirror. - Closing:
Fixes #20379closed this card ascompleted;pm:dispatchedis removed in this act (domain:*,area:*and type labels stay).
Generated by Claude Code
- Merged through the merge queue at 2026-09-28T19:21Z as
Filing gate: ① a defect with a named landing site, finding class (b). The
reach:exception is release text:os migrate metaprints 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 thedomain:specexecution 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.precisionin major 18 (conversioncurrency-config-precision-removed, D3currency-config-precision-retired). The maintainer approved it at33f53b5e, 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(undercurrencyConfig) 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.precisionand the ganttscaleenum are different surfaces and are unchanged.」What the fix is (for the dispatch to confirm)
CurrencyConfigSchema.precisionclause in each entry: it is removed in this same major bycurrency-config-precision-removed. Put no tracker number in the field text.scaleclause, which is still true.gen:migration-registry, thencheck:migration-registry,retired-key-migrate-sentence.test.tsandmigrations.test.ts. The fix is text only.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