Skip to content

skills(objectstack-ui): dashboards.md teaches the measure-currency chain with no currencyMode: 'fixed' condition and cites ADR-0053 — remainder (a) of #20126 #20196

Closed

Description

@objectstack-fleet

Part of #20126 (class-closure card, currency-mode family). Split from it by the triage seat (seat post #6015), session session_01W89enF2dYV7K4N2Fbfj33f, answering that card's pm:retriage ask (5853536793). ⛔ Not a claim.

Filing gate: ① a declared contract contradicted by published text, with a named landing site, class (b). reach: is the exception for release-frozen wrong text: the file ships through npx skills add. The parent card lists this as its site 2, and its note anticipated splitting the sites into lane sub-issues.

Reader: the domain:skills execution seat. skills/** is a governed surface (Tier H), so the PR waits on the maintainer's hand.

The site (re-read on objectstack origin/main 98f722a)

skills/objectstack-ui/rules/dashboards.md :304–:308 teaches a monetary measure's currency as 「resolves measure currency → the aggregated field's currencyConfig.defaultCurrency → the tenant localization.currency default (ADR-0053)」.

The contract

What to do

  1. Rewrite the comment so the chain reads the field's defaultCurrency only under currencyMode: 'fixed', and otherwise falls to the tenant localization.currency. Drop the ADR-0053 citation; cite the spec describe instead.
  2. ⛔ Do not add the family's enumerating pin here. It is spec-lane surface, and it lands on class-closure(currency-mode): every site that reads or teaches defaultCurrency without the currencyMode 'fixed' condition, or cites ADR-0053 for currency — spec describe, dashboards skill, data-api docs, analytics comments #20126 after this card closes.
  3. Sweep the rest of skills/** for the same unconditioned chain, or ADR-0053 within five lines of currenc. Record the hit count in ## Acceptance notes. The lines docs(data-modeling): currency is a bare number in both modes; defaultCurrency is the column currency only under fixed #20120 already corrected in skills/objectstack-data/rules/field-types.md state the condition across a wrapped sentence and are not hits.

Dedupe

This is a split, not a new finding: the site is listed on #20126 (site 2), and #20126 carries the family's dedupe. Local grep over every open objectstack issue: dashboards.md together with currency hits only #20126.

Activity

  1. added
    bugSomething isn't working
    documentationImprovements or additions to documentation
    area:recordsBusiness objects, records, the views that show data, usable forms, search
    and removed on Sep 27, 2026
  2. objectstack-fleet commented on Sep 27, 2026

    @objectstack-fleet
    ContributorAuthor

    Claim: PM loop round 1
    Session: session_01MjvgiFAmjHqsxy1XLiVYfH
    Account: os-steve (the seat's linked user as GET /user answers it; always the card's assignee)
    Branch: claude/issue-20196-dashboards-currency-mode
    Worktree: objectstack-issue-20196
    Domain: domain:skills
    Seat: domain:skills#1
    File surface: skills/objectstack-ui/rules/dashboards.md (one file; the skills/** sweep the card asks for is read-only, hits go to Acceptance notes); stop on breach; explain in the report
    Container & model: S in size but not mechanical (the judgment is in the wording ⇒ M treatment), mode:subagent, model: CONTRACT_REVIEW_TIER (dispatch-gates --tier at 08c8484a: MANDATORY for skills/**, clause ①; no exit taken)
    Clause-②: no
    Thread-read: none
    Serial constraints cleared: none — the file lists of all eleven open PRs (read 2026-09-27T15:34Z) touch neither this file nor skills/objectstack-data/rules/field-types.md; no issue-20196 head on origin; the H17 trigger-file index (#9857) names it nowhere. The sibling card #20173 (this round) shares the skills/objectstack-ui package and its token-ratchet table but no file — the later lander merges origin/main once. The parent #20126 stays pm:blocked in the spec lane and is not touched.

    Tier H (skills/**): the PR stays draft for the maintainer's hand after the seat's ACCEPT and in-seat contract review. Claimed 2026-09-27T15:35Z.

  3. objectstack-fleet commented on Sep 27, 2026

    @objectstack-fleet
    ContributorAuthor

    os-dev-report

    {
      "issue": 20196,
      "status": "done",
      "branch": "claude/issue-20196-dashboards-currency-mode",
      "pr": "https://github.com/objectstack-ai/objectstack/pull/20256",
      "session": "session_01MjvgiFAmjHqsxy1XLiVYfH",
      "premise_still_valid": true,
      "summary": "Rewrote the dataset comment block in skills/objectstack-ui/rules/dashboards.md (:304-:308 on base 14ae40b0) so the currency chain reads the aggregated field's currencyConfig.defaultCurrency only under currencyMode: 'fixed' and otherwise falls to the tenant localization.currency, citing CurrencyConfigSchema's currencyMode describe instead of ADR-0053; the first two lines (the currency key, ISO 4217, the example measure) are unchanged. Premise re-verified on 14ae40b0 (origin/main had advanced from the dispatch's 08c8484a; the site and the describe text are byte-identical, the describe now sits at field.zod.ts:449) and the runtime/contract half confirmed (service-analytics analytics-service.ts:1863-1875, plugin.ts:1153-1161, spec contracts/analytics-service.ts:79-89). Mechanism assumption 3 falsified: dropping '(ADR-0053)' does not pay — the tightest 5-line rewrite still exceeded the ceiling by 17 bytes and the chosen wording by 70 — so the +72 bytes / +1 line were paid by deleting the report snippet's comment '// drilldown defaults true ...' (:408 on the base, 100 bytes), a fact the same file states in prose at :378-:379 and :421-:422; no re-wrap. Sweep of skills/** per the card's two criteria: 0 hits outside the site (ADR-0053 elsewhere only at objectstack-query/rules/filters.md:251 with no currenc within five lines; defaultCurrency elsewhere only in field-types.md :55/:183/:184/:191/:192 whose :189-:193 paragraph states the condition), matching the PM pre-read; recorded in the PR's Acceptance notes. Draft PR 20256 (Tier H, skills/**) assigned os-steve with skip-changeset; the path labeler added 'documentation' and 'size/xs' (another actor, left as is). origin/main moved two commits past the base (e4621867), neither touching skills/objectstack-ui, so no merge was made. line_budget: dashboards.md 468 lines / 6252 tokens (25006 bytes) -> 468 lines / 6245 tokens (24978 bytes), ceiling 6252 unchanged, headroom 0 -> 7; package skills/objectstack-ui hand-authored (9 files) 2064 lines / 26213 tokens -> 2064 lines / 26206 tokens; token = ceil(utf8 bytes / 4) as the ratchet counts. files_changed: skills/objectstack-ui/rules/dashboards.md (+3 / -3, one commit 1e5ff84a). deviations: (1) pnpm --filter @objectstack/lint run check:doc-formula-expressions first exited 3 PREREQUISITE NOT MET (@objectstack/formula and @objectstack/lint not built; nothing measured) — built spec+formula+lint under the verify lock (VERDICT command-exit 0, all cached) and the rerun exited 0; (2) pnpm --filter @objectstack/spec check:skill-examples (run beyond the derived set because the edited block is os:check-marked) first exited 3 (client-react dist holds no .d.ts; nothing measured) — built @objectstack/client and @objectstack/client-react under the verify lock (VERDICT command-exit 0, 34 tasks) and the rerun exited 0; (3) no ablation or reverse verification: the card forbids adding any pin or test and the diff is comment text inside a type-checked snippet, so there is no assertion to turn red; (4) no scope narrowing beyond the local-verification section: repo-level scans stay with CI.",
      "tests": "Gate list: node scripts/pm/dispatch-gates.mjs --repo objectstack-ai/objectstack --commands with no paths (change set derived from merge base 14ae40b0: 1 path, +3/-3) = 23 commands; all run in the foreground with exit captured before any pipe; every one exit 0 at head 1e5ff84a. --ran reconciliation: '23 derived famil(ies) accounted for — 23 run, 0 NOT-MEASURED (a DERIVED zero — all 23 recorded an exit code and none of them is 3)'. Per command: node scripts/check-ci-filter-parity.mjs exit 0; node scripts/check-closing-keyword-parity.mjs exit 0 and --self-test exit 0 ('40 assertions, 5 mutations of the shipped parsers each driven to red'); node scripts/check-comment-mask-corpus.mjs exit 0 ('7260 files, 0 disagree, 0 unparseable'); node scripts/check-doc-route-spelling.mjs --advisory exit 0 ('population clean') and --self-test exit 0; node scripts/check-skills-token-ratchet.mjs exit 0 ('skills/objectstack-ui/rules/dashboards.md is 6245 tokens (ceiling 6252; headroom 7)', '54 authored bundle file(s) within their ceilings') and --self-test exit 0 ('65 cases pass'); pnpm --filter @objectstack/lint run check:doc-formula-expressions exit 0 after the prerequisite build ('22 record-scoped formula example(s) across 456 files / 1383 TS blocks judged clean'); pnpm check:agent-test-spelling exit 0; pnpm check:corpus-claim-drift exit 0; pnpm check:cross-package-test-inputs exit 0; pnpm check:doc-authoring exit 0 ('16350 customer-facing string(s) across 1093 spec sources clean'); pnpm check:driver-memory-census exit 0; pnpm check:gitlink-declared exit 0; pnpm check:nul-bytes exit 0 ('OK (scanned 9707 text file(s) ... no raw ASCII control bytes)'); pnpm check:pm-governed-merges exit 0; pnpm check:refd-timer-probe exit 0; pnpm check:role-word exit 0; pnpm check:skill-compatibility exit 0; pnpm check:skill-frame-sync exit 0; pnpm check:skill-identifier-liveness exit 0 ('Leg 1: 457 citation(s) over 53 published file(s)'); pnpm check:watch-hint-literal exit 0. Beyond the derived set: pnpm --filter @objectstack/spec check:skill-examples exit 0 ('259 prose examples type-check across 3 surface(s) — every marked block parsed, so tsc ran the SEMANTIC pass on all of them'; 225 blocks on the skills + docs surface). Builds under bash scripts/pm/os-verify-lock.sh: turbo run build --filter=@objectstack/spec --filter=@objectstack/formula --filter=@objectstack/lint (VERDICT command-exit 0, waited 237s, 4 cached) and turbo run build --filter=@objectstack/client --filter=@objectstack/client-react (VERDICT command-exit 0, held 225s, 34 tasks). No package test suite is owed: the diff touches no workspace package (dispatch-gates derived no package-scoped family). Ablation: none (see deviations 3). On-disk proof of the edit: grep -c 'ADR-0053' dashboards.md = 0, grep -c \"only under \\`currencyMode: 'fixed'\\`\" = 1, grep -c 'drilldown defaults true' = 0, wc = 468 lines / 24978 bytes, git diff --stat = 1 file, 3 insertions, 3 deletions. Not measured locally: the artifact-roster and wide-population families and the CI jobs the path schedules; CI runs them. CI on PR 20256: in_progress at report time (not waited on).",
      "mcp_calls": "0 — no MCP GitHub tool was called; all GitHub reads were plain REST GETs (issue 20196, its comments, the pulls list, the PR read-back) and all writes went through scripts/pm/ over the fleet-write relay.",
      "api_writes": "3 REST writes via the relay plus 2 git pushes: git push -u origin claude/issue-20196-dashboards-currency-mode (empty branch probe) and git push (commit 1e5ff84a) — git, not REST; pr_create x1 = POST /repos/objectstack-ai/objectstack/pulls (relay run 36332579113, draft, body sent once, no PATCH); label-write x1 = POST /repos/objectstack-ai/objectstack/issues/20256/labels (skip-changeset) + POST /repos/objectstack-ai/objectstack/issues/20256/assignees (os-steve) in one relay stroke (run 36332635472; read-back matched the target); comment x1 = POST /repos/objectstack-ai/objectstack/issues/20196/comments (this os-dev-report).",
      "open_questions": [],
      "out_of_scope_findings": [
        "carrier: none · noted, not filed: the runtime's own comments (service-analytics analytics-service.ts:680-694, plugin.ts:1129-1145) and packages/spec/liveness/dataset.json:115 already describe the conditioned chain, so dashboards.md was the last teaching site with the unconditioned form; observation only.",
        "carrier: none · noted, not filed: skills/objectstack-ui/references/_index.md lists CurrencyConfigSchema under field.zod.ts without describe text; a reader following the new citation lands on the schema and reads the describe there — intended navigation, not a gap.",
        "carrier: none · noted, not filed: dashboards.md states the drilldown default at :378-:379 and :421-:422 (prose) — the deleted :408 comment was the third statement; no further duplicate of that class was removed because the token budget needed only one line."
      ]
    }

    Generated by Claude Code

  4. objectstack-fleet commented on Sep 27, 2026

    @objectstack-fleet
    ContributorAuthor

    ACCEPT — PR #20256 (domain:skills seat 1, session_01MjvgiFAmjHqsxy1XLiVYfH) · 2026-09-27T16:22Z

    Verdict on the dev report 5857597486, checked against GitHub and origin/main, not against the report's own narration.

    Checklist (references/review-checklist.md): draft, base main, first line Fixes #20196, Clause-②: no at line start, #20126 spelled safely (remains open), one file inside the claimed surface (skills/objectstack-ui/rules/dashboards.md, +3 / −3, head 1e5ff84a), no content/docs/releases/ change, skip-changeset with a measured basis (no workspace files[] reaches skills/, positive control CurrencyConfigSchema present in spec's dist), PR assignee = card assignee, ## 维护者速读(草稿) present with 席位意见 blank, session-URL footer, report JSON parses, mcp_calls 0.

    Spot readings (mine, at 2026-09-27T16:22Z): the rewritten block on the branch conditions currencyConfig.defaultCurrency on currencyMode: 'fixed' and falls to the tenant localization.currency, citing the spec describe; CurrencyConfigSchema is the exported name (field.zod.ts:427); the runtime relays defaultCurrency only under currencyMode === 'fixed' (service-analytics/src/plugin.ts sourceFieldMeta) and the chain comment in analytics-service.ts states the same order — the skill now matches both. The paid-for deletion (the drilldown comment in the report snippet) leaves the fact stated at :379 and :421 on the branch. ADR-0053 in skills/** is now filters.md:251 alone (calendar-day, not currency). File reads 468 lines / 24978 bytes = 6245 tokens against the unchanged 6252 ceiling; no pin added, as the card requires. Sweep hit count outside the site: 0 for both criteria, equal to the seat's pre-read.

    Deviations accepted: the two PREREQUISITE NOT MET exit-3 first runs (check:doc-formula-expressions, check:skill-examples) were builds, not measurements, and both re-ran green; the dispatch's token assumption (dropping the ADR citation pays) was falsified and the payment moved to a duplicated comment — legitimate content deletion, no re-wrap. Gates: 23 derived commands, 23 exit 0, --ran reconciled (a DERIVED zero). CI on 1e5ff84a at this write: six jobs still in_progress, none red — an honest reading, converged before landing per landing-operations.md.

    Out-of-scope items: three observations, each carrier: none — Acceptance notes on the PR, no card filed.

    Landing: check-governed-merges.mjs --pr 20256 → GOVERNED, Tier H (skills/**), 6 changed lines. Four-piece terminal: the in-seat ## Contract review record (PASS) and the 席位 终稿 速读 are posted on the PR, needs-user-decision is hung on the PR, review is requested from os-zhuang and hotlong. The PR stays draft; on an authorized APPROVED review this seat clears the label and lands through the relay (pr_ready + automerge_enable).


    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

No one assigned

    Labels

    area:recordsBusiness objects, records, the views that show data, usable forms, searchbugSomething isn't workingdocumentationImprovements or additions to documentationdomain:skillspriority:p2Medium: important, M3

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions