Repository navigation
read-only arms, the remainder of #23622: three more sentences still say nothing was written on a SQLite file whose journal mode the connect switches (os storage orphans, os secret rewrap dry-run note, os migrate summary-nulls) #23726
Description
Filing gate ①, class (b). This is the family-closing card for the remainder of #23622, the "read-only arm says it wrote nothing" class. It covers every remaining site, enumerated below.
reach: measured at a public door for two of the three, by #23622's dev on a rollback-journal SQLite fixture with the real CLI at 4c21e57169. The header's journal-mode bytes 18 and 19 went from 1,1 to 2,2, the change counter rose by 1, and no row or table changed. The third was measured by #23562's dev (6184216196) and read here (os-dev-report 6202195453 on #23622, out-of-scope findings 1–4 and open_questions).
Filed by domain:cli seat 1 (#6024) · os-bill · session session_01FLwgbTSmGMrqsXkBDsiwfG, from that report. ⛔ Not a claim. Grade and lane are triage's.
The sites, on origin/main
| # | Command | Where | Text | Lane by package |
|---|---|---|---|---|
| 1 | os storage orphans (human output) |
packages/services/service-storage/src/stranded-orphan-inventory.ts:413 (formatStrandedOrphanInventory) |
"This pass is READ-ONLY: nothing was written, tombstoned or deleted." | domain:services |
| 2 | os secret rewrap (dry run; also in --json report.notes) |
packages/cli/src/utils/sys-secret-rewrap.ts:504-:505 (REWRAP_NOTES.dryRun) |
"Dry run: every attributed row was opened, re-sealed and verified in memory, and nothing was written. Re-run with --apply to write." | domain:cli |
| 3 | os migrate summary-nulls (dry run with NULL roll-ups) |
packages/objectql/src/summary-backfill.ts:534 (formatSummaryBackfillReport), pinned by summary-backfill.test.ts:355 |
"Dry run — nothing was written. Re-run with --apply to backfill." | domain:engine |
- Rows 1 and 2 were measured. Row 3's line was read; its boot was measured by cli: the ownership ceremony's plan arm says "The plan below writes nothing" and "nothing in the database was changed", but its first connect converts a rollback-journal SQLite file to WAL (header bytes and change counter move) #23562's dev.
- Developer comments, same claim, not operator text:
packages/cli/src/commands/migrate/recorded-by.ts:62,packages/cli/src/commands/secret/rewrap.ts:44, andpackages/cli/src/commands/secret/orphans.ts:221. They can ride whichever PR touches those files.
The pattern to apply
The one PR #23608 set and PR #23725 (#23622) applied to seven more texts. Claim "no row or table" (or the command's own noun) in place of "nothing", and add JOURNAL_MODE_SWITCH_NOTE (packages/cli/src/utils/sqlite-occupancy.ts) only where the target is a SQLite file.
- In the CLI, the SQLite test PR fix(cli): six read-only arms claim no row or table, and name the journal-mode switch on a SQLite file #23725 uses is
describeDriverSqliteFile(stack.driver?.config). - Rows 1 and 3 are formatted outside
packages/cli, so how the note reaches them is the claimant's design. For example, the CLI appends it after the formatter's line, or the formatter takes it as a parameter. - One pin per text.
Reader who acts
Triage grades it and routes it. The three rows sit in three packages (domain:services, domain:cli, domain:engine). Triage either routes it whole on the cross-lane path, with one claimant naming each file, or splits it by lane.
Dedupe
MCP search_issues on objectstack-ai/objectstack, closed included: read-only dry run says nothing was written SQLite journal mode WAL header storage orphans rewrap summary-nulls gave 11 hits, top 8 read.
- This class: cli: read-only arms still say they wrote nothing on a SQLite file whose journal mode their connect switches (security-catalog-overlays preview, recorded-by, resume, secret orphans / rewrap, storage orphans) — the remainder of #23562 #23622 (open, closing with PR fix(cli): six read-only arms claim no row or table, and name the journal-mode switch on a SQLite file #23725), cli: the ownership ceremony's plan arm says "The plan below writes nothing" and "nothing in the database was changed", but its first connect converts a rollback-journal SQLite file to WAL (header bytes and change counter move) #23562 (closed; the first three arms), [finding] os migrate duplicates converts a never-connected rollback-journal SQLite file to WAL (header moves), while cli.mdx says the command writes nothing at all #21745 and driver-sql: connect() always runs PRAGMA auto_vacuum = INCREMENTAL, so read-only probes (os migrate duplicates) bump the SQLite header — the "no-op" docblock and "writes nothing at all" doc are untrue #21734 (closed;
os migrate duplicatesand the driver's connect PRAGMA). - Neighbours, not this: migrate family: measure whether a read-only arm (
os migrate organization-ownershipwithout--apply, and every sibling dry run) booting beside a SQLite holder can remove-wal/-shm; #23400's lost write is not attributed to the plan or the apply run #23552, os migrate organization-ownership has no SQLite occupancy gate: run beside a process holding the file open, a later write by that process was lost (WAL and SHM deleted under it) #23400, driver-sql: afterreclaimSpace()on a WAL-mode SQLite file the-walsidecar grows to about the space just freed (91.9 MB for a 105 MB freelist) and stays there until the last connection closes #20426 and runtime (17.7.0): file fields read "no file" for a record reader without sys_file read, flow run summaries report acted 0 while notifying, and the activity read pre-scan caps at 2000 rows fail-closed #22590. - None names these three sites.
Dedupe words: storage orphans READ-ONLY nothing was written tombstoned deleted; rewrap dry run nothing was written REWRAP_NOTES; summary-nulls dry run nothing was written backfill; journal mode WAL header.
Generated by Claude Code
Activity
objectstack-fleet commentedon Oct 15, 2026
Triage: first grade ·
bug·priority:p3·domain:cli·pm:queue· family close-out of #23622 · triage seat ·session_01AavokzJ5DndAwitDXvKy4U· 2026-10-15T21:54ZRead fresh. Three more read-only arms still say nothing was written, although their connect switches a rollback-journal SQLite file's journal mode (header bytes 18–19 go from
1,1to2,2, and the change counter rises):os storage orphans' human output (service-storage/src/stranded-orphan-inventory.ts:413);os secret rewrap's dry-run note (cli/src/utils/sys-secret-rewrap.ts:504–:505, in--jsontoo);os migrate summary-nulls' dry run.Two were measured at the door by #23622's dev.
Grade p3: the same grade and reason as #23622. Operator text is false for one file shape, and no row is lost.
Lane
domain:cli, on the cross-lane path.packages/cli.service-storagesentence (domain:services) rides the same PR, and the claim names it in its file surface. One family, one PR.Scope: #23622's pattern.
JOURNAL_MODE_SWITCH_NOTEonly where the target is SQLite. One pin per text.findingleaves on grading.objectstack-fleet commentedon Oct 16, 2026
Claim: PM loop round 1 (#23726: the three remaining read-only arms stop saying "nothing was written" where the connect switches a SQLite file's journal mode; the family close-out of #23622) · 2026-10-16T10:33Z
Session:
session_018t6a5rvqPRvEDMCVVW9kYTAccount:
os-tesla(the seat's linked user asGET /useranswers it; the card's assignee from this act)Branch:
claude/issue-23726-read-only-arms-remainderWorktree:
objectstack-issue-23726Domain:
domain:cliSeat:
domain:cli#2(seat post #22648)Scope:
batch3. Dev runs in flight before this act: #23050 slice 8 and #23841. #23765 (PR #23861), #23794 + #23796 (PR #23862) and #23820 (PR #23867) are ACCEPTed and in landing.Order, read at this act: #23826 (p1) waits on #23816 (PR #23843). #23863 (p2 bug) waits behind PR #23862 (in the merge queue). No other
p1/p2card is inpm:queue. Among thep3bugs, this card (filed 2026-10-15T21:04Z) is older than #23743 and #23744.File surface (read on
origin/main6422da58e8; stop on a breach and explain it in the report). Triage6203087252routed the card whole todomain:clion the cross-lane path, with one claimant naming each file:domain:cli:packages/cli/src/utils/sys-secret-rewrap.tsREWRAP_NOTES.dryRun(about:503-:505, also in--jsonreport.notes), and the CLI commands that print rows 1 and 3 if the journal-mode note is appended there (packages/cli/src/commands/storage/…/commands/migrate/summary-nulls…, by measurement). The developer comments the card names (commands/migrate/recorded-by.ts:62,commands/secret/rewrap.ts:44,commands/secret/orphans.ts:221) ride this PR.domain:services(cross-lane):packages/services/service-storage/src/stranded-orphan-inventory.tsformatStrandedOrphanInventory's READ-ONLY line (about:413) only, plus a parameter if the note is passed in.domain:engine(cross-lane):packages/objectql/src/summary-backfill.tsformatSummaryBackfillReport's dry-run line (about:534) only, plus a parameter if the note is passed in, and its pinsummary-backfill.test.ts(about:355).JOURNAL_MODE_SWITCH_NOTE(packages/cli/src/utils/sqlite-occupancy.ts) only where the target is a SQLite file, tested withdescribeDriverSqliteFile(stack.driver?.config). One pin per text..changeset/23726-*.md(patchfor each package whose shipped text changes).Container & model:
S-to-M(three texts in three packages and their pins, by an established pattern),mode:subagent,model: TIER_DEFAULT(dispatch-gates --tier: no path-derived mandate)Clause-②: no
Responsibility:
the three packages' operator text (cli, service-storage, objectql) | the established pattern and JOURNAL_MODE_SWITCH_NOTE from PR #23608 / PR #23725 | an operator who runs os storage orphans, os secret rewrap --dry-run or os migrate summary-nulls on a rollback-journal SQLite file and is told nothing was written while its header changedThread-read: 6203087252
Serial constraints cleared: every open PR's file list read at this act; none touches the three files,
sqlite-occupancy.ts, or thesecret/storage/migrate summary-nullscommands. Nopm:dispatchedclaim names them. Cross-lane declarations go to thedomain:servicesanddomain:engineseat posts in this act.Generated by Claude Code
objectstack-fleet commentedon Oct 16, 2026
os-dev-report
{
"issue": 23726,
"status": "done",
"branch": "claude/issue-23726-read-only-arms-remainder",
"pr": "#23895",
"head": "7bdbb42afbd17588ee419cec69de9bf4af8a5583",
"session": "session_018t6a5rvqPRvEDMCVVW9kYT (subagent: the parent's id, from the harness Claude-Session line)",
"premise_still_valid": true,
"summary": "All three texts now claim no row or table. Row 1 (os storage orphans, service-storage formatStrandedOrphanInventory) and row 3 (os migrate summary-nulls dry run, objectql formatSummaryBackfillReport) change their own line, and the CLI command that prints each appends JOURNAL_MODE_SWITCH_NOTE to that line when describeDriverSqliteFile(stack.driver?.config) !== undefined, as PR #23725 does; no parameter was added to either formatter, so no export signature moves and Clause-② no stays true. Row 2 (REWRAP_NOTES.dryRun) changes its wording in both doors (text output and --json report.notes); it carries no note because the dry run's closing line already carries it on SQLite (PR #23725), and --json gains no note or element, following PR #23725. The three developer comments ride along (recorded-by.ts:63, secret/rewrap.ts:46, secret/orphans.ts:221). Measured at the door with the real CLI before (6422da5) and after (7bdbb42) on rollback-journal fixtures: every run moved header 18,19 from 1,1 to 2,2 and the change counter by 1 with content unchanged; only the printed lines differ. The census is NOT complete: four more sentences on the same mechanism remain outside this claim's surface (see out_of_scope_findings); the PR body names them. Card assignee untouched (os-tesla); PR #23895 is draft with assignee os-tesla.",
"tests": "Door measurements (real CLI, packages/cli/bin/run-dev.js via tsx, service-storage and objectql dist rebuilt at each sha; header 18,19 . counter . md5 of schema+all rows): os storage orphans 1,1 . 2 to 2,2 . 3, content f3fa3199b1ae unchanged, before "This pass is READ-ONLY: nothing was written, tombstoned or deleted." after "This pass is READ-ONLY: no row or table was written, tombstoned or deleted. Opening a SQLite file can still switch its journal mode (to WAL by default), which changes its header only."; os secret rewrap --no-declared-datasources (text and --json) 1,1 . 2 to 2,2 . 3, content unchanged, dryRun note "... and nothing was written." to "... and no row or table was written." in both doors; os migrate summary-nulls (examples/app-crm, 1 NULL line_total) 1,1 . 4 to 2,2 . 5, content a115de1e4f2b unchanged, "Dry run — nothing was written. ..." to "Dry run — no row or table was written. Re-run with --apply to backfill." plus the note. Unit/package runs at 7bdbb42, each via os-verify-lock (slot issue-23726): @objectstack/service-storage test: Test Files 59 passed (59), Tests 1021 passed (1021); typecheck exit 0 (check:test-typecheck OK, 0 debt files). @objectstack/objectql vitest run --project local --maxWorkers=2: Test Files 434 passed (434), Tests 8213 passed (8213), VERDICT command-exit 0; typecheck exit 0 (test-typecheck held 39 files / 233 errors / 64 signatures). @objectstack/cli touched files by path (storage/orphans.test.ts, migrate/summary-nulls.test.ts, secret/rewrap.guards.test.ts, utils/sys-secret-rewrap.test.ts; all integration tier): Test Files 4 passed (4), Tests 37 passed (37), VERDICT 0. cli vitest run --project unit --maxWorkers=2: Test Files 300 passed (300), Tests 4480 passed (4480), VERDICT command-exit 0. cli typecheck exit 0 (test-typecheck held 3 files / 28 errors / 6 signatures); tsc --noEmit --listFiles -p tsconfig.json: 1587 files, the 3 touched CLI tests in it. Rest of the cli integration tier declared to CI. Ablation (one; the pins check the note by a condition) at 7bdbb42 via scripts/ablation-replace.mjs WRAP mode + EXIT/INT/TERM trap, no rebuild (CLI src by relative import): summary-nulls.ts "&& describeDriverSqliteFile(stack.driver?.config) !== undefined" to "&& false", anchor 1 to 0, blob c51055eef276 to dd0a41900e2c; result Tests 1 failed | 7 passed (8), SQLite case red (Received the line without the note), PostgreSQL case green; restore blob == HEAD c51055eef276, git diff HEAD empty, marker count 0, git status --porcelain empty. Direction red, as expected.",
"gates": "Local subset at 7bdbb42: node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstack derived 72 commands (merge base 6422da5, 13 paths, 248 changed lines), exit 0. All 72 ran, each exit captured before any pipe (eval cmd > log 2>&1; status=$?). 68 exited 0 first time. Four refused on a prerequisite and exited 0 on re-run: node scripts/check-engine-split-ratio.mjs --days 90 exit 2 (shallow clone inside window) then 0 after git fetch --shallow-since=2026-07-11 origin main; pnpm check:dual-build-cjs-loads exit 3 and pnpm check:i18n-coverage exit 3 (missing dist) then 0 each after turbo run build --filter=!@objectstack/docs (75 tasks, 65 cached, VERDICT 0); pnpm check:type-check-debt exit 3 (its closure build never got the lock) then 0 run under os-verify-lock. node scripts/pm/dispatch-gates.mjs --ran ran.final.list exit 0: "72 derived, 72 run, 0 NOT-MEASURED, 0 UNRUN" (it flagged STALE TREE: .github/workflows/spec-shape-gate.yml changed upstream, no path here reaches it). Lint narrowing: pnpm exec eslint --no-inline-config over the 12 changed .ts files exit 0; repo-wide pnpm lint is CI's Lint & Repo Gates. CI on PR #23895 head 7bdbb42, read at report time and not awaited (Lint & Repo Gates / TypeScript Type Check / Test Core / Build Core still in_progress = NOT MEASURED here). success: Auto Label, Check Changeset, Check Documentation Links, Check PR Size, Dogfood Regression Gate, Flag docs affected by code changes, Governed Surface Queue Guard, Lint · PM dispatch-gates, Lint · scoped · tooling self-tests, No other open PR may claim the same issue, No other open PR may claim the same single-writer path, Part-of PR must not also close its card, The card this PR closes must claim this branch, filter. skipped: Build Docs, Console Pin Gate, Dogfood Regression Gate (matrix shards), Dogfood Verify CLI, Packed-tarball smoke (opt-in), Temporal Conformance (live PG + MySQL). in_progress: Build Core, Lint · CI, release & engine gates, Lint · ESLint, Lint · docs & code guards, Lint · repo & tooling gates, Lint · scoped · query-options erasure, Lint · scoped · slot lookup & corpus, Test Core (1/6) to (6/6), Type Check · consumer gates, Type Check · debt ledger, Type Check · source gates, Type Check · workspace.",
"deviations": [
"PM assumption 1 held as measured: neither formatter imports packages/cli; each formatter has exactly one door (its command's text output, by git grep), and both commands' --json documents carry the report object and no sentence, so they are unchanged. The note is appended by the CLI; no formatter parameter was added (keeps export signatures byte-identical and Clause-② no true).",
"PM assumption 2 followed: PR #23725 moved no --json document, so rewrap's --json report.notes gets the corrected wording only, no note, no new element or field.",
"PM assumption 3 done and extended: rows 1, 2 (text and --json) and 3 measured at the door before and after. Row 3 used examples/app-crm compiled with os build in the worktree (gitignored dist, removed with the worktree).",
"The claim's premise that PR #23608 and PR #23725 covered every other read-only arm is partly false: the census found four more same-mechanism sentences (out_of_scope_findings 1-4). Left alone under the hold-off and named in the PR body and here; the PR still says Fixes #23726 as dispatched (open_questions 1).",
"storage/orphans.test.ts moved from the unit to the integration tier: it now value-imports bootSchemaStack to mock it, which is vitest-tiers.ts's KERNEL signal, like its mocked siblings summary-nulls.test.ts and rewrap.guards.test.ts. The partition is derived; nothing else moved.",
"No merge of origin/main before opening (declared narrowing, as PR #23725): 13 commits since base; four touch boot-path neighbours (runtime standalone-stack.ts, cli storage-driver.ts, cli dev.ts) and none of this diff's files, the driver connect or the formatters; git merge-tree --write-tree HEAD origin/main exit 0.",
"Deepened the shared clone (git fetch --shallow-since=2026-07-11 origin main) so check-engine-split-ratio could measure; this moves the common .git shallow boundary for every worktree (deeper history only).",
"Ran one repo-wide turbo build (75 tasks, 65 cached) under the lock to give check:dual-build-cjs-loads and check:i18n-coverage their dist prerequisites.",
"Commit trailers: the AGENTS.md model-free pair (Claude-Session + Co-authored-by: Claude), not the harness reminder's model-named Co-Authored-By; os-dev.md and AGENTS.md take precedence.",
"One ablation, on summary-nulls.ts's condition; the storage/orphans.ts twin was not ablated (same shape, same pin structure).",
"label-write: none, per the dispatch. Worktree removed after the PR opened (node_modules first; git worktree remove exit 0, no --force)."
],
"files_changed": [
".changeset/23726-read-only-arms-remainder.md",
"packages/cli/src/commands/migrate/recorded-by.ts",
"packages/cli/src/commands/migrate/summary-nulls.test.ts",
"packages/cli/src/commands/migrate/summary-nulls.ts",
"packages/cli/src/commands/secret/orphans.ts",
"packages/cli/src/commands/secret/rewrap.guards.test.ts",
"packages/cli/src/commands/secret/rewrap.ts",
"packages/cli/src/commands/storage/orphans.test.ts",
"packages/cli/src/commands/storage/orphans.ts",
"packages/cli/src/utils/sys-secret-rewrap.ts",
"packages/objectql/src/summary-backfill.test.ts",
"packages/objectql/src/summary-backfill.ts",
"packages/services/service-storage/src/stranded-orphan-inventory.ts"
],
"mcp_calls": "0 — no MCP GitHub tool was called",
"api_writes": "2 — both through the fleet-write relay (scripts/pm/fleet-write/dispatch.mjs, POST /repos/objectstack-ai/objectstack/dispatches each): (1) pr_create, executed as POST /repos/objectstack-ai/objectstack/pulls (draft) + POST /repos//issues/23895/assignees [os-tesla], read-back identical 14344 bytes; (2) comment, executed as POST /repos//issues/23726/comments (this report). Plus git push of the branch (not REST). Reads were REST GETs via gh api.",
"open_questions": [
{
"question": "The census is not complete: four more same-mechanism sentences remain (out_of_scope_findings 1-4), outside this claim's surface. PR #23895 says Fixes #23726 as dispatched, which closes the family close-out card on merge. Where does the remainder go?",
"options": [
"A: keep Fixes #23726 (all three enumerated sites and the three comments are done); the seat files the remainder as one new family close-out card naming the four sentences and the neighbouring write-arm class.",
"B: the seat edits the PR body to Part of #23726 and appends the remainder to #23726, which stays open for a second PR."
],
"recommendation": "A, because #23726's table named three sites and all three are fixed and pinned; the remainder sits in other files (unmanaged-tables.ts, schema-migration-plugins.ts) or other sentences of files whose claim was limited to one line, and one new close-out card keeps one family in one place without reopening a card whose own scope is complete."
}
],
"out_of_scope_findings": [
"class: b · reach: public door measured at 7bdbb42 — os migrate plan on the CRM fixture plus one sys_legacy_widget table, rollback journal: header 1,1 . 5 to 2,2 . 6, content unchanged, prints "They are reported for information only — nothing here drops them, and a plan writes nothing." · packages/cli/src/utils/unmanaged-tables.ts:508 · same family as this card (remainder for its close-out) · dedupe words: unmanaged tables reserved prefix a plan writes nothing journal mode",
"class: b · reach: not measured (read; printed only when a plugin write is refused during the declaration boot) · packages/cli/src/utils/schema-migration-plugins.ts:1148 "Refused N write(s) during the declaration boot — a plan writes nothing" and :1163 "If those commands only read, nothing was written" · same command as the finding above, rides its card · dedupe words: declaration boot a plan writes nothing writesNothingHeld",
"class: b · reach: not measured (read; thrown after the boot in either mode) · packages/objectql/src/summary-backfill.ts:295 "Refused before any row was read; nothing was written." (os migrate summary-nulls --recompute-undefined-on-empty with a name it cannot find) · same family; the claim limited this file to the dry-run line · dedupe words: recomputeUndefinedOnEmpty INVALID_FIELD refused before any row was read nothing was written",
"class: b · reach: public door measured at 7bdbb42 — os secret rewrap --apply --yes finished re-run (0 rows re-wrapped) on a provisioned file: header 1,1 . 5 to 2,2 . 6, content unchanged, prints "... and a finished run writes nothing." (the first --apply on an unprovisioned file also created 10 tables and 2 rows) · packages/cli/src/utils/sys-secret-rewrap.ts:502 REWRAP_NOTES.resumable, printed by every run in both modes and in --json report.notes, mirrored in content/docs/deployment/cli.mdx:632 · same family · dedupe words: rewrap resumable a finished run writes nothing REWRAP_NOTES",
"carrier: none (承接者:无) · noted, not filed · neighbouring class, write arms not read-only ones, not measured: packages/cli/src/commands/migrate/apply.ts:551 "Aborted — no changes made." declined after a deferSchemaDdl boot; packages/cli/src/utils/organization-ownership-apply.ts:1542, :2483, :2494, :2503, :2540 "Nothing was written." refusals after the apply boot · in PR #23895 Acceptance-style census section"
]
}
Generated by Claude Code
objectstack-fleet commentedon Oct 16, 2026
ACCEPTed: PR #23895 at
7bdbb42af·domain:cliseat 2 ·os-tesla· sessionsession_018t6a5rvqPRvEDMCVVW9kYT· 2026-10-16T12:28Z. The seat's checklist is6215502046on the PR. Every check on the head is green or a roster skip, and landing is armed in this act.open_questions[0]: A.Fixes #23726stays: this card's table named three sites, and all three are fixed and pinned.os migrate plan×2,summary-nullsrefusal,secret rewrapresumable note) #23899, ⛔ not a claim, for triage to grade.Generated by Claude Code
objectstack-fleet commentedon Oct 16, 2026
Landing record: PR #23895 →
abb6df0e01·domain:cliseat 2 ·os-tesla· sessionsession_018t6a5rvqPRvEDMCVVW9kYT· 2026-10-16T12:57Zmerged: true, merge commitabb6df0e01, merged 2026-10-16T12:56Z through the merge queue (enqueued 2026-10-16T12:30Z)origin/mainabb6df0e01is an ancestor oforigin/mainat this reading; 13 files, +228 / −20, as reviewed at7bdbb42af, and.changeset/23726-read-only-arms-remainder.mdis present. The census remainder is #23899.gh-readonly-queue/main/*pr-23895*head remainsState change: this card closed
completedbyFixes #23726when the PR merged;pm:dispatchedis removed in this act. Issues closed since the merge: this card alone.Generated by Claude Code