Skip to content

migrate: adding a homeAmount field to an existing object is the normal add-column path; backfill = recompute — one proving test (multi-currency M2-4, epic #8345) #27194

Closed

Description

@objectstack-fleet

Blocked-by: #27193

Filing gate ③ (maintainer-directed). Ruling 6465431966 on #27119 (batch #421 item 2, Q1 = 乙-现在, maintainer 「同意立专题卡」 2026-10-28): the multi-currency epic resumes on #8345 in shape C′. Part of #8345. Filed by the director seat (session_01QSeKYo7qYsX6HsAneHBMP2, ledger objectstack#12708). ⛔ Not a claim. Workload row and precedents: 6464936321; design: 6464438764.

Ruling-ref: 6465431966

维护者速读

  • 改了什么: 给存量对象加影子列走既有 add-column;回填用 M2-3;本卡只证明这条路通。
  • 为什么改: 客户在 R1 期间用老办法的对象升级到 R2 只需加一行指针。
  • 风险与回滚: 测试卡。
  • 先看: os migrate 加列路径。
  • 两分钟验证: 一个有存量行的对象加影子列后 recompute 填满。
  • 需要您做的: 无。

Task

  • Integration test: existing rows + new home field + recompute.

Lane: server · Size: S · Review: default. Clause-②: no · Metadata-protocol: none.

Epic: #8345 (parent; the epic PM dispatches pm:epic children; domain:spec children go to the spec seat's queue). Dedupe: #8345 thread, #27119 (ruled), the workload list 6464936321; no open card carries this slice.

Activity

  1. objectstack-fleet commented on Nov 5, 2026

    @objectstack-fleet
    ContributorAuthor

    epic:#8345#1 · os-bill · session_01Utp6CZWjnSeed8H4dMjt9d

    Claim: PM loop round 1 · 2026-11-05T00:16Z
    Session: session_01Utp6CZWjnSeed8H4dMjt9d (epic PM, epic:#8345)
    Account: os-bill
    Branch: claude/project-thread-ublbgc (card thread session_01Utp6CaGBD59SYKhNDMRa8h; the platform assigns the thread's one push branch — the recorded platform exception)
    Worktree: objectstack-issue-27194
    Domain: domain:server
    Seat: epic:#8345
    File surface: tests only — packages/objectql/src/**/*.test.ts, packages/cli/src/**/*.test.ts, packages/qa/dogfood/test and their fixtures (product code change = stop and report)
    Container & model: S, mode:thread, model: opus (TIER_DEFAULT; dispatch-gates --tier: no path-derived mandate), effort: medium
    Clause-②: no
    Metadata-protocol: none
    Responsibility: n/a — not a defect card
    Thread-read: none
    Premise: holds — Blocked-by #27193 cleared (PR #30183 merged, 31fe289f).
    Serial constraints cleared: yes — no in-flight claim in the epic territory touches this surface.
    Release pairing: R3 — ships alone.
    Maintainer authority: Bill, project thread, 「重开史诗 PM 席位」 (2026-11-04T13:36Z); dispatch order /mnt/project-files/epic-8345/dispatch-27194.md.

  2. objectstack-fleet commented on Nov 5, 2026

    @objectstack-fleet
    ContributorAuthor

    epic:#8345#1 · os-bill · session_01Utp6CZWjnSeed8H4dMjt9d
    os-dev-report

    {
      "issue": 27194,
      "status": "done",
      "branch": "claude/project-thread-ublbgc",
      "pr": "https://github.com/objectstack-ai/objectstack/pull/30186",
      "head": "cf2a4d5f3f79ae97fedc4d519eab4e6ade2c00c4",
      "session": "session_01Utp6CaGBD59SYKhNDMRa8h (card thread; seat session_01Utp6CZWjnSeed8H4dMjt9d)",
      "premise_still_valid": true,
      "summary": "One new test file, packages/qa/dogfood/test/home-amount-added-to-existing-object.test.ts; no product code, no fixture outside it. Cells: better-sqlite3 (file), sqlite-wasm (file), PostgreSQL (schema). Two boots = two engines and two drivers over one database. Boot 1: a record-mode amount with no homeAmount, four rows written through the engine (USD 2026-03-15, USD 2026-04-15, CNY, SEK with no rate row). Boot 2, as os migrate apply runs it: the amount gains currencyConfig.homeAmount and its two declared readonly fields; driver.setDeferredDdl(true); previewDeferredSchemaWork for the object is exactly one add_columns [amount_home, amount_rate] and nothing for any other table; detectManagedDrift has no entry for it; flushDeferredSchemaDdl performs it; every row is unchanged with a blank home field and rate. recomputeHomeAmounts: dry run 4 amounts / 3 changed / 1 skipped / 0 written; apply fills 71994.24 @0.1389, 10000 @0.15, 12.35 @1, each equal to a fresh write of the same row; SEK listed rate_missing (SEK, 2026-03-15) and skipped, blank kept, homeAmountRecomputeComplete false, fresh SEK write refused ERR_EXCHANGE_RATE_MISSING; re-run changes nothing. Finding: the add-column path is ordinary (no refusal, no flag, no data loss). The in-memory driver is schemaless, so it has no add-column path: no cell. Declarations confirmed against the tree: Clause-②: no, Metadata-protocol: none.",
      "tests": "The file 6/6 on all three cells (PostgreSQL 16 local). Ablations via scripts/ablation-replace.mjs, each landed (anchor 1 -> 0) and restored: (1) recompute skipped (apply forced false): 3/6 red, one per cell, on the column read back (expected home 71994.24 rate 0.1389, received null/null); (2) home field declared without the column migration (flush replaced by a preview, deferral disarmed): 6/6 red; the recompute's apply then reports one failures entry per row, 'no such column: amount_home', written 0. tsc --noEmit -p packages/qa/dogfood: 0 errors. eslint on the file: exit 0.",
      "gates": "dispatch-gates --commands on cf2a4d5f: 51 families, exits captured before any pipe: 50 exit 0 (check-plugin-teardown-shape --self-test exited 3 on the shallow clone, 0 after fetching its pinned fixture commit 621a4876); pnpm check:dual-build-cjs-loads exit 3 NOT MEASURED (reads every package's dist/; only the test closure was built), left to CI. dispatch-gates --ran: 51 accounted, 50 run, 1 NOT-MEASURED. Records: /mnt/project-files/epic-8345/gates-27194-ran.txt and gates-27194-ran-verdict.txt. No changeset: a test in a private package; skip-changeset rides the create. CI on the PR: not yet read at report time.",
      "dogfood_battery": "n/a — no ! in the PR title and no (narrowing) arm",
      "mcp_calls": "3 — GitHub MCP reads only: issue_read x2 (#27194 get, get_comments); subscribe_pr_activity on #30186 (session subscription, not a GitHub write). No write tool.",
      "api_writes": "2 — fleet-write relay pr_create (objectstack#30186 draft, label skip-changeset, no assignee, no review request; run 41942945374; body read back byte-identical 6254/6254); post-stamped os-dev-report comment on #27194 (this report). Plus git pushes to claude/project-thread-ublbgc.",
      "open_questions": [],
      "out_of_scope_findings": [
        "carrier: none · noted, not filed — without the column the recompute's apply ends with the run's failures list ('no such column') rather than a refusal before any write; the dry run reads the absent column as blank and reports 3 changed. Behaviour as designed for a per-row failure, recorded so the seat can judge whether a pre-check belongs in a later card (not this test card)."
      ]
    }

    Report taken 2026-11-05T00:42Z.

  3. objectstack-fleet commented on Nov 5, 2026

    @objectstack-fleet
    ContributorAuthor

    epic:#8345#1 · os-bill · session_01Utp6CZWjnSeed8H4dMjt9d

    Landed · 2026-11-05T01:36Z

    Reading Value
    PR #30186 merged, merge commit bedb96e0, reviewed head a098315d (seat ACCEPT 6646903271)
    #27194 closed by Fixes #27194

    State change: pm:dispatched removed; pm:epic stays (subtree record). Test-only (@objectstack/dogfood, private), nothing to release. Finding recorded: the add-column path is ordinary for a newly declared home field.

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

Metadata

Metadata

Assignees

Labels

area:recordsBusiness objects, records, the views that show data, usable forms, searchdomain:serverDomain lane — seat card indexed by label:pm:seatpm:epicpriority:p3tests

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions