You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
[Decision] 「作废内存驱动的测试」 — retire ALL remaining driver-memory test use (26 files + decorative-field-sweep) (A), or only the legs 18.0.0-next.0 refuses, already done in PR #2091 (B)? #2092
Filing gate ②: a decision only the maintainer can make, on the scope of a ruling already given. Filed by the repo:hotcrm seat (session_01BCDqr1DqnQjEh5jA9gGkUG). ⛔ Not a claim.
Reader: the maintainer (the decision box). On A, this seat dispatches the conversion after #2031 lands. On B, this card closes not_planned.
Dedupe: the seat's full hotcrm issue index (796 issues, all states, read 2026-10-13) matched on titles: driver-memory → 0; memory driver → 1 (#695, closed, a sharing-rule compile defect on the memory driver, not this question).
Ruling: A, the maintainer, in the repo:hotcrm seat's chat (session_01P8mZuzuyZAHSrgQKmv6ASv), verbatim: 「2092 什么问题,你负责处理完」, then 「2092 内存测试全部换 sql」.
The decision: every remaining driver-memory use in this repo's tests moves to the SQL driver. That covers the 26 test files that import @objectstack/driver-memory and the kernels booted with driver: 'memory'. A case that exists only for a memory-driver-specific shape is deleted and named in the PR. This executes ruling 6144864473 (#2031, 「就应该在 sql 上测试,作废内存驱动的测试」) in full; B (stop at the legs PR #2091 converted) is not chosen.
Re-measured in this act (origin/mainc0f3485b):git grep -l "@objectstack/driver-memory" -- test/ scripts/ src/ → 26 files, all under test/. driver: 'memory' → test/decorative-field-sweep.test.ts:217 and test/undeclared-key-probe.test.ts:240. package.json still lists @objectstack/driver-memory beside driver-sql and driver-sqlite-wasm.
State:needs-user-decision → pm:dispatched in this act (the claim follows). The maintainer's 「暂时只派 p1 p2 的任务」 posture does not hold this p3 card back, because the maintainer named it directly.
Claim: PM loop round R85 (maintainer direct dispatch)
Session: session_01P8mZuzuyZAHSrgQKmv6ASv
Account: sunhaolin (the seat's linked user as GET /user answers it; always the card's assignee)
Branch: claude/issue-2092-tests-on-sql
Worktree: hotcrm-issue-2092
Domain: repo:hotcrm (single-lane repo, no domain:* taxonomy)
Seat: repo:hotcrm#1
Ruling-ref: 6166370777 (A, the maintainer's words quoted there)
File surface: the 26 test/*.test.ts files that import @objectstack/driver-memory (listed by git grep -l "@objectstack/driver-memory" -- test/ on c0f3485b), test/decorative-field-sweep.test.ts and test/undeclared-key-probe.test.ts (driver: 'memory'), shared helpers under test/helpers/ only where the conversion needs one; package.json + pnpm-lock.yaml only to drop @objectstack/driver-memory once nothing imports it (lockfile regenerated by pnpm, never by hand); .changeset/2092-*.md (empty frontmatter: tests only). ⛔ No src/** change: a test that only passes on memory semantics is reported, not "fixed" in the app (stop on breach; explain in the report)
Container & model: M (mechanical per file, judgment per memory-specific case), mode:subagent, model: default (dispatch-gates --tier --repo objectstack-ai/hotcrm over test/**: "no path-derived mandate"; the tier stays the PM's per-card call)
Clause-②: no
Responsibility: n/a — not a defect card
Thread-read: 6166370777
Serial constraints cleared: PR #2103 (#2014 F9, in the merge queue at this claim) edits test/case-assignment.test.ts and test/ownership-model.test.ts. The dev starts from main after it lands. PR #2102 (#2016, draft, waiting on the maintainer's A/B) edits test/flow-variable-conditions.test.ts (2 lines registering its callee): the later lander merges main. package.json / pnpm-lock.yaml: dependabot #2063 and #2064 are open on them; the later lander regenerates.
os-dev-report
{
"issue": 2092,
"status": "done",
"branch": "claude/issue-2092-tests-on-sql",
"pr": "#2104",
"session": "session_01P8mZuzuyZAHSrgQKmv6ASv",
"premise_still_valid": true,
"summary": "Draft PR #2104 executes ruling A: all 26 files that imported @objectstack/driver-memory and the 2 kernels booted with driver: 'memory' now run on driver-sqlite-wasm. Hand-built ObjectQL engines get new SqliteWasmDriver({ filename: ':memory:' }) plus the engine's own ql.syncSchemas(), which is the boot's per-object syncSchema loop. The two kernels use DefaultDatasourcePlugin 'sqlite-wasm', and the two dual-driver loops keep only their SQL leg. 23 runs whose only subject was the memory driver's stored shape are deleted and named in the PR. Five cases are re-expressed on SQL, and no case went red because the app is wrong on SQL. driver-memory is dropped from package.json dependencies, with the lockfile regenerated by pnpm (3-line importer change).",
"hypotheses": {
"H1": "held: git grep on 6400397 gives the same 26 files under test/ plus decorative-field-sweep.test.ts:217 and undeclared-key-probe.test.ts:240; nothing in scripts/ or src/.",
"H2": "held, refined: the house SQL path is @objectstack/verify bootStack (databaseDriver defaults to 'sqlite-wasm', reached through test/helpers/verify-stack.ts hotcrmStack) for booted stacks, and an inline SqliteWasmDriver for hand-built ObjectQL engines (dashboard-date-range-window, hook-org-inheritance, account-name-tenant-scope). There is no helper for the hand-built shape, so none was invented. Driver: @objectstack/driver-sqlite-wasm.",
"H3": "two cases went red on SQL, neither an app defect: (1) audit-stamp-readonly x2, DuplicateRecordError on crm_account, because the fixture reused one account name while crm_account.name is unique: true and SQL enforces it; re-expressed with one account per deal. (2) sharing-seeding's $nor case: driver-sql refuses with INVALID_FILTER/400 but keeps the key out of the message; re-expressed as an envelope assertion. Every other memory-shape case was found by reading, deleted or re-expressed, and listed in the PR.",
"H4": "held: 0 imports and 0 memory boots remain; removed from package.json (it was under dependencies, not devDependencies); pnpm install regenerated pnpm-lock.yaml (only the importer entry, 3 lines). @objectstack/cli and @objectstack/runtime still depend on it themselves.",
"H5": "not borne out. Full pnpm test under the lock: before 6400397 lock 482s / vitest 478.89s (3676 passed, 1 skipped); after 2987e6c lock 529s / vitest 528.09s (3653 passed, 1 skipped), a shared box. The same 28 files run alternating base vs branch: 64.12s / 58.17s on memory against 60.24s / 58.58s on SQL. The conversion costs nothing measurable; the +10% whole-suite delta is box contention (import time 512s to 559s across all 179 files)."
},
"tests": "Converted 28 files on SQL, under the lock: first pass 27/28 files, 760/762 tests (audit-stamp-readonly x2 DuplicateRecordError, fixed as H3); audit-stamp-readonly rerun 12/12; alternating 28-file pair 762 passed twice. Full suite after (2987e6c): 'Test Files 179 passed (179)', 'Tests 3653 passed | 1 skipped (3654)', 'VERDICT command-exit 0 · held the lock 529s'. Final sha 2b74e9f (one comment-only commit later): pnpm test:coverage 'Test Files 179 passed (179)', 'Tests 3653 passed | 1 skipped (3654)', coverage 'All files | 95.18 | 86.74 | 96.61 | 99.22' against floors 92/78/92/95, 'VERDICT command-exit 0 · held the lock 611s'. Probes (one-off, not committed): the SQL operator matrix answers all 9 rows like memory; SQL $nor refusal = {code INVALID_FILTER, status 400}; the shared-driver legacy-row re-open works; flow-condition-totality, with case_escalation_on_create's condition unguarded: 0 condition aborts via the trigger on memory and sqlite-wasm, control (sparse record handed directly) aborts 'No such key: escalated_date' on both. No ablation applies (no new guard).",
"gates": [
"pnpm validate @2b74e9f3: exit 0, '✓ Validation passed'",
"pnpm typecheck @2b74e9f3: exit 0, tsc --noEmit with 0 'error TS' lines; --listFiles lists all 28 converted files",
"pnpm lint @2b74e9f3: exit 0, '18 suggestion(s)'",
"pnpm lint:i18n-gate @2b74e9f3: exit 0, '✓ i18n lint gate: 0 i18n/missing-* issues'",
"pnpm hygiene @2b74e9f3: exit 0, '✓ source hygiene clean'",
"pnpm hygiene:tokens @2b74e9f3: exit 0, '✓ source token ratchet clean'",
"pnpm build @2b74e9f3: exit 0, '✓ Build complete'",
"pnpm test:coverage @2b74e9f3 (includes pnpm test): exit 0, 179 files, 3653 passed | 1 skipped, coverage above all four floors",
"CI on PR #2104 at report time: Build and Test, Quality Checks, Check Changeset, Playwright, CodeQL in_progress; Label Pull Request, link-check, Vercel Preview Comments success",
"Playwright e2e: CI's"
],
"line_budget": "31 files, +543 -585 (net -42) from 6400397 to 2b74e9f; tests, package.json, lockfile and changeset only, so no src/** token ratchet moved (hygiene:tokens clean) and no skills/** budget applies. knowledge-deflection and sla-compliance-gauge are mostly re-indentation from removing the driver loop (git diff -w shows the real change).",
"files_changed": [
".changeset/2092-tests-on-sql.md +4 -0",
"package.json +0 -1",
"pnpm-lock.yaml +0 -3",
"test/activity-seed-coverage.test.ts +12 -4",
"test/attendee-type-resolution.test.ts +3 -2",
"test/audit-stamp-readonly.test.ts +11 -4",
"test/campaign-member-cascade.test.ts +7 -8",
"test/case-assignment.test.ts +5 -3",
"test/churn-health-score-block.test.ts +7 -4",
"test/decorative-field-sweep.test.ts +1 -1",
"test/event-attendee-cascade.test.ts +6 -6",
"test/flow-condition-totality.test.ts +23 -33",
"test/flow-filter-today-token.test.ts +7 -18",
"test/flow-variable-conditions.test.ts +6 -14",
"test/forecast-current-quarter-view.test.ts +9 -19",
"test/forecast-period-scope.test.ts +7 -4",
"test/knowledge-article-share-links.test.ts +3 -2",
"test/knowledge-deflection.test.ts +122 -133",
"test/lead-duplicate-management.test.ts +17 -12",
"test/line-item-cascade.test.ts +3 -2",
"test/line-item-line-number.test.ts +3 -2",
"test/object-validation-predicates.test.ts +22 -28",
"test/opportunity-line-item-add-picker.test.ts +3 -2",
"test/ownership-model.test.ts +3 -2",
"test/quote-contact-required-when.test.ts +18 -24",
"test/quote-discount-ceiling.test.ts +35 -37",
"test/readonly-write-semantics.test.ts +4 -3",
"test/sharing-seeding.test.ts +31 -18",
"test/sla-compliance-gauge.test.ts +137 -146",
"test/undeclared-key-probe.test.ts +10 -19",
"test/win-loss-capture.test.ts +24 -31"
],
"mcp_calls": "0 — no MCP GitHub tool used",
"api_writes": "2 relay strokes, each POST /repos/objectstack-ai/objectstack/dispatches, executed by fleet-write as objectstack-fleet[bot]: (1) pr_create, i.e. POST /repos/objectstack-ai/hotcrm/pulls (draft) + POST /repos//issues/2104/assignees; (2) this report, i.e. POST /repos//issues/2092/comments. git push is not REST. 0 label writes.",
"deviations": [
"Dispatch said driver-memory was a devDependency; it was under dependencies. Removed from there.",
"H2 wording asked for one house harness. Measured: two shapes exist and no helper covers hand-built engines. Each file kept its shape; hand-built engines use the engine's public ql.syncSchemas() for DDL instead of the applySystemFields + driver.initObjects idiom the 5 pre-existing SQL legs hand-write (those legs left untouched). Same per-object syncSchema loop as the boot, one line per engine.",
"H5 timing pair: the full-suite after-run is on 2987e6c; the final sha 2b74e9f adds one comment-only commit, and its full suite ran as pnpm test:coverage. An extra alternating 28-file pair ran on a throwaway detached worktree /home/user/hotcrm-issue-2092-base (created, measured, removed) to split conversion cost from box noise.",
"Four short node/tsx probes ran outside the verify lock (seconds each; measurements, not build or test runs).",
"Coverage delta against main: NOT MEASURED (would need a second 10-minute full run). Thresholds held on the final sha.",
"Commits carry the model-free trailer pair (Co-Authored-By: Claude, Claude-Session); the harness reminder's model-named line was not used, per the agent definition.",
"Scratch files are under the dispatch-named path /tmp/claude-0/0632c8d7-7bf9-5f21-bbf2-036a098d9e4f/scratchpad/issue-2092/.",
"PR #2104 carries labels ci/cd and dependencies applied by the repo labeler (not by this run; zero label writes)."
],
"open_questions": [],
"out_of_scope_findings": [
"carrier: 承接者:无 · noted, not filed: comments in eight src/** files (five flows, lead_detail.page.ts, case.view.ts, case.sharing.ts) name driver-memory as a sparse driver or as where a defect was measured. They are dated history and stay true of sparse drivers; no src/** change was allowed here. Recorded in the PR's Acceptance notes.",
"carrier: PR #2104 · noted, not filed: flow-condition-totality's end-to-end block had already stopped reaching the absent-key shape on 18.0.0-next.0 on both drivers (the trigger record is materialised over every declared field, per #2091). This PR's docstring now says so, and the evaluator sweeps hold that class."
],
"cleanup": "worktree /home/user/hotcrm-issue-2092 had node_modules removed and was removed after the PR opened (status clean, all 4 commits pushed, origin at 2b74e9f); throwaway base worktree removed; no background process left running; no dev server started."
}
Review of PR #2104 (head 2b74e9f3) against the os-dev report on this card (R85, seat repo:hotcrm, session_01P8mZuzuyZAHSrgQKmv6ASv): ACCEPT. It executes ruling A (6166370777).
Form: draft, base main (64003979, an ancestor of the head); the body opens Fixes #2092, then Clause-②: no, with no other closing keyword. Not a governed path; 31 files, +543 −585 (net −42). Tests, package.json, the lockfile and an empty-frontmatter changeset only; no src/** change.
Scope, read on the PR:
All 26 files that imported @objectstack/driver-memory, plus the two driver: 'memory' kernels (decorative-field-sweep, undeclared-key-probe), now run on driver-sqlite-wasm, on the two shapes the repo already had: bootStack / hotcrmStack for booted stacks, and an inline SqliteWasmDriver plus the engine's own ql.syncSchemas() for hand-built engines.
The dual-driver loops (knowledge-deflection, sla-compliance-gauge) keep their SQL leg.
Deleted runs, listed one by one in the PR body (23; 3,676 → 3,653 passed): each asserted only the memory driver's stored shape ('x' in stored === false, the absent key) or was its memory leg. Where a business half existed, it is still pinned on SQL.
Re-expressed (5):
audit-stamp-readonly's fixture now gives each deal its own account, because crm_account.name is unique: true and SQL enforces it.
sharing-seeding's $nor refusal now asserts the envelope (INVALID_FILTER / 400) instead of the memory driver's wording.
Three cases drop a sparse-key assertion and keep their business half.
The PR states that no case went red because the app is wrong on SQL.
Dependency:@objectstack/driver-memory leaves package.jsondependencies and the lockfile importer (3 lines, regenerated by pnpm). Read on main: nothing outside test/ imports it (only CHANGELOG.md prose names it); @objectstack/cli and runtime keep their own dependency on it.
Readings:
Every gate is green on 2b74e9f3, the PR head. pnpm test:coverage: 179 files, 3,653 passed; coverage 95.18 / 86.74 / 96.61 / 99.22 against floors 92 / 78 / 92 / 95.
Timing: the same 28 files run alternately take 58–64 s on either driver. The +10 % whole-suite delta is box contention, not the conversion.
CI on the head: every check green except Build and Test (22.x), still running at this review; landing waits for it.
Carried, not filed: eight src/** comments name driver-memory as a sparse driver or as where a defect was measured. They are dated history and stay true of sparse drivers (PR Acceptance notes).
Activity
objectstack-fleet commentedon Oct 14, 2026
Ruling: A, the maintainer, in the
repo:hotcrmseat's chat (session_01P8mZuzuyZAHSrgQKmv6ASv), verbatim: 「2092 什么问题,你负责处理完」, then 「2092 内存测试全部换 sql」.The decision: every remaining
driver-memoryuse in this repo's tests moves to the SQL driver. That covers the 26 test files that import@objectstack/driver-memoryand the kernels booted withdriver: 'memory'. A case that exists only for a memory-driver-specific shape is deleted and named in the PR. This executes ruling6144864473(#2031, 「就应该在 sql 上测试,作废内存驱动的测试」) in full; B (stop at the legs PR #2091 converted) is not chosen.Re-measured in this act (
origin/mainc0f3485b):git grep -l "@objectstack/driver-memory" -- test/ scripts/ src/→ 26 files, all undertest/.driver: 'memory'→test/decorative-field-sweep.test.ts:217andtest/undeclared-key-probe.test.ts:240.package.jsonstill lists@objectstack/driver-memorybesidedriver-sqlanddriver-sqlite-wasm.State:
needs-user-decision→pm:dispatchedin this act (the claim follows). The maintainer's 「暂时只派 p1 p2 的任务」 posture does not hold this p3 card back, because the maintainer named it directly.Generated by Claude Code
objectstack-fleet commentedon Oct 14, 2026
Claim: PM loop round R85 (maintainer direct dispatch)
Session:
session_01P8mZuzuyZAHSrgQKmv6ASvAccount:
sunhaolin(the seat's linked user asGET /useranswers it; always the card's assignee)Branch:
claude/issue-2092-tests-on-sqlWorktree:
hotcrm-issue-2092Domain:
repo:hotcrm(single-lane repo, nodomain:*taxonomy)Seat:
repo:hotcrm#1Ruling-ref: 6166370777 (A, the maintainer's words quoted there)
File surface: the 26
test/*.test.tsfiles that import@objectstack/driver-memory(listed bygit grep -l "@objectstack/driver-memory" -- test/onc0f3485b),test/decorative-field-sweep.test.tsandtest/undeclared-key-probe.test.ts(driver: 'memory'), shared helpers undertest/helpers/only where the conversion needs one;package.json+pnpm-lock.yamlonly to drop@objectstack/driver-memoryonce nothing imports it (lockfile regenerated bypnpm, never by hand);.changeset/2092-*.md(empty frontmatter: tests only). ⛔ Nosrc/**change: a test that only passes on memory semantics is reported, not "fixed" in the app (stop on breach; explain in the report)Container & model:
M(mechanical per file, judgment per memory-specific case),mode:subagent,model: default(dispatch-gates --tier --repo objectstack-ai/hotcrmovertest/**: "no path-derived mandate"; the tier stays the PM's per-card call)Clause-②: no
Responsibility:
n/a — not a defect cardThread-read: 6166370777
Serial constraints cleared: PR #2103 (#2014 F9, in the merge queue at this claim) edits
test/case-assignment.test.tsandtest/ownership-model.test.ts. The dev starts frommainafter it lands. PR #2102 (#2016, draft, waiting on the maintainer's A/B) editstest/flow-variable-conditions.test.ts(2 lines registering its callee): the later lander mergesmain.package.json/pnpm-lock.yaml: dependabot #2063 and #2064 are open on them; the later lander regenerates.Generated by Claude Code
test: run the hand-built engines and the sweep kernel on SQL
test: move the memory-shape suites to SQL, deleting what pinned only …
objectstack-fleet commentedon Oct 14, 2026
os-dev-report
{
"issue": 2092,
"status": "done",
"branch": "claude/issue-2092-tests-on-sql",
"pr": "#2104",
"session": "session_01P8mZuzuyZAHSrgQKmv6ASv",
"premise_still_valid": true,
"summary": "Draft PR #2104 executes ruling A: all 26 files that imported @objectstack/driver-memory and the 2 kernels booted with driver: 'memory' now run on driver-sqlite-wasm. Hand-built ObjectQL engines get new SqliteWasmDriver({ filename: ':memory:' }) plus the engine's own ql.syncSchemas(), which is the boot's per-object syncSchema loop. The two kernels use DefaultDatasourcePlugin 'sqlite-wasm', and the two dual-driver loops keep only their SQL leg. 23 runs whose only subject was the memory driver's stored shape are deleted and named in the PR. Five cases are re-expressed on SQL, and no case went red because the app is wrong on SQL. driver-memory is dropped from package.json dependencies, with the lockfile regenerated by pnpm (3-line importer change).",
"hypotheses": {
"H1": "held: git grep on 6400397 gives the same 26 files under test/ plus decorative-field-sweep.test.ts:217 and undeclared-key-probe.test.ts:240; nothing in scripts/ or src/.",
"H2": "held, refined: the house SQL path is @objectstack/verify bootStack (databaseDriver defaults to 'sqlite-wasm', reached through test/helpers/verify-stack.ts hotcrmStack) for booted stacks, and an inline SqliteWasmDriver for hand-built ObjectQL engines (dashboard-date-range-window, hook-org-inheritance, account-name-tenant-scope). There is no helper for the hand-built shape, so none was invented. Driver: @objectstack/driver-sqlite-wasm.",
"H3": "two cases went red on SQL, neither an app defect: (1) audit-stamp-readonly x2, DuplicateRecordError on crm_account, because the fixture reused one account name while crm_account.name is unique: true and SQL enforces it; re-expressed with one account per deal. (2) sharing-seeding's $nor case: driver-sql refuses with INVALID_FILTER/400 but keeps the key out of the message; re-expressed as an envelope assertion. Every other memory-shape case was found by reading, deleted or re-expressed, and listed in the PR.",
"H4": "held: 0 imports and 0 memory boots remain; removed from package.json (it was under dependencies, not devDependencies); pnpm install regenerated pnpm-lock.yaml (only the importer entry, 3 lines). @objectstack/cli and @objectstack/runtime still depend on it themselves.",
"H5": "not borne out. Full pnpm test under the lock: before 6400397 lock 482s / vitest 478.89s (3676 passed, 1 skipped); after 2987e6c lock 529s / vitest 528.09s (3653 passed, 1 skipped), a shared box. The same 28 files run alternating base vs branch: 64.12s / 58.17s on memory against 60.24s / 58.58s on SQL. The conversion costs nothing measurable; the +10% whole-suite delta is box contention (import time 512s to 559s across all 179 files)."
},
"tests": "Converted 28 files on SQL, under the lock: first pass 27/28 files, 760/762 tests (audit-stamp-readonly x2 DuplicateRecordError, fixed as H3); audit-stamp-readonly rerun 12/12; alternating 28-file pair 762 passed twice. Full suite after (2987e6c): 'Test Files 179 passed (179)', 'Tests 3653 passed | 1 skipped (3654)', 'VERDICT command-exit 0 · held the lock 529s'. Final sha 2b74e9f (one comment-only commit later): pnpm test:coverage 'Test Files 179 passed (179)', 'Tests 3653 passed | 1 skipped (3654)', coverage 'All files | 95.18 | 86.74 | 96.61 | 99.22' against floors 92/78/92/95, 'VERDICT command-exit 0 · held the lock 611s'. Probes (one-off, not committed): the SQL operator matrix answers all 9 rows like memory; SQL $nor refusal = {code INVALID_FILTER, status 400}; the shared-driver legacy-row re-open works; flow-condition-totality, with case_escalation_on_create's condition unguarded: 0 condition aborts via the trigger on memory and sqlite-wasm, control (sparse record handed directly) aborts 'No such key: escalated_date' on both. No ablation applies (no new guard).",
"gates": [
"pnpm validate @2b74e9f3: exit 0, '✓ Validation passed'",
"pnpm typecheck @2b74e9f3: exit 0, tsc --noEmit with 0 'error TS' lines; --listFiles lists all 28 converted files",
"pnpm lint @2b74e9f3: exit 0, '18 suggestion(s)'",
"pnpm lint:i18n-gate @2b74e9f3: exit 0, '✓ i18n lint gate: 0 i18n/missing-* issues'",
"pnpm hygiene @2b74e9f3: exit 0, '✓ source hygiene clean'",
"pnpm hygiene:tokens @2b74e9f3: exit 0, '✓ source token ratchet clean'",
"pnpm build @2b74e9f3: exit 0, '✓ Build complete'",
"pnpm test:coverage @2b74e9f3 (includes pnpm test): exit 0, 179 files, 3653 passed | 1 skipped, coverage above all four floors",
"CI on PR #2104 at report time: Build and Test, Quality Checks, Check Changeset, Playwright, CodeQL in_progress; Label Pull Request, link-check, Vercel Preview Comments success",
"Playwright e2e: CI's"
],
"line_budget": "31 files, +543 -585 (net -42) from 6400397 to 2b74e9f; tests, package.json, lockfile and changeset only, so no src/** token ratchet moved (hygiene:tokens clean) and no skills/** budget applies. knowledge-deflection and sla-compliance-gauge are mostly re-indentation from removing the driver loop (git diff -w shows the real change).",
"files_changed": [
".changeset/2092-tests-on-sql.md +4 -0",
"package.json +0 -1",
"pnpm-lock.yaml +0 -3",
"test/activity-seed-coverage.test.ts +12 -4",
"test/attendee-type-resolution.test.ts +3 -2",
"test/audit-stamp-readonly.test.ts +11 -4",
"test/campaign-member-cascade.test.ts +7 -8",
"test/case-assignment.test.ts +5 -3",
"test/churn-health-score-block.test.ts +7 -4",
"test/decorative-field-sweep.test.ts +1 -1",
"test/event-attendee-cascade.test.ts +6 -6",
"test/flow-condition-totality.test.ts +23 -33",
"test/flow-filter-today-token.test.ts +7 -18",
"test/flow-variable-conditions.test.ts +6 -14",
"test/forecast-current-quarter-view.test.ts +9 -19",
"test/forecast-period-scope.test.ts +7 -4",
"test/knowledge-article-share-links.test.ts +3 -2",
"test/knowledge-deflection.test.ts +122 -133",
"test/lead-duplicate-management.test.ts +17 -12",
"test/line-item-cascade.test.ts +3 -2",
"test/line-item-line-number.test.ts +3 -2",
"test/object-validation-predicates.test.ts +22 -28",
"test/opportunity-line-item-add-picker.test.ts +3 -2",
"test/ownership-model.test.ts +3 -2",
"test/quote-contact-required-when.test.ts +18 -24",
"test/quote-discount-ceiling.test.ts +35 -37",
"test/readonly-write-semantics.test.ts +4 -3",
"test/sharing-seeding.test.ts +31 -18",
"test/sla-compliance-gauge.test.ts +137 -146",
"test/undeclared-key-probe.test.ts +10 -19",
"test/win-loss-capture.test.ts +24 -31"
],
"mcp_calls": "0 — no MCP GitHub tool used",
"api_writes": "2 relay strokes, each POST /repos/objectstack-ai/objectstack/dispatches, executed by fleet-write as objectstack-fleet[bot]: (1) pr_create, i.e. POST /repos/objectstack-ai/hotcrm/pulls (draft) + POST /repos//issues/2104/assignees; (2) this report, i.e. POST /repos//issues/2092/comments. git push is not REST. 0 label writes.",
"deviations": [
"Dispatch said driver-memory was a devDependency; it was under dependencies. Removed from there.",
"H2 wording asked for one house harness. Measured: two shapes exist and no helper covers hand-built engines. Each file kept its shape; hand-built engines use the engine's public ql.syncSchemas() for DDL instead of the applySystemFields + driver.initObjects idiom the 5 pre-existing SQL legs hand-write (those legs left untouched). Same per-object syncSchema loop as the boot, one line per engine.",
"H5 timing pair: the full-suite after-run is on 2987e6c; the final sha 2b74e9f adds one comment-only commit, and its full suite ran as pnpm test:coverage. An extra alternating 28-file pair ran on a throwaway detached worktree /home/user/hotcrm-issue-2092-base (created, measured, removed) to split conversion cost from box noise.",
"Four short node/tsx probes ran outside the verify lock (seconds each; measurements, not build or test runs).",
"Coverage delta against main: NOT MEASURED (would need a second 10-minute full run). Thresholds held on the final sha.",
"Commits carry the model-free trailer pair (Co-Authored-By: Claude, Claude-Session); the harness reminder's model-named line was not used, per the agent definition.",
"Scratch files are under the dispatch-named path /tmp/claude-0/0632c8d7-7bf9-5f21-bbf2-036a098d9e4f/scratchpad/issue-2092/.",
"PR #2104 carries labels ci/cd and dependencies applied by the repo labeler (not by this run; zero label writes)."
],
"open_questions": [],
"out_of_scope_findings": [
"carrier: 承接者:无 · noted, not filed: comments in eight src/** files (five flows, lead_detail.page.ts, case.view.ts, case.sharing.ts) name driver-memory as a sparse driver or as where a defect was measured. They are dated history and stay true of sparse drivers; no src/** change was allowed here. Recorded in the PR's Acceptance notes.",
"carrier: PR #2104 · noted, not filed: flow-condition-totality's end-to-end block had already stopped reaching the absent-key shape on 18.0.0-next.0 on both drivers (the trigger record is materialised over every declared field, per #2091). This PR's docstring now says so, and the evaluator sweeps hold that class."
],
"cleanup": "worktree /home/user/hotcrm-issue-2092 had node_modules removed and was removed after the PR opened (status clean, all 4 commits pushed, origin at 2b74e9f); throwaway base worktree removed; no background process left running; no dev server started."
}
objectstack-fleet commentedon Oct 14, 2026
Review of PR #2104 (head
2b74e9f3) against the os-dev report on this card (R85, seatrepo:hotcrm,session_01P8mZuzuyZAHSrgQKmv6ASv): ACCEPT. It executes ruling A (6166370777).main(64003979, an ancestor of the head); the body opensFixes #2092, thenClause-②: no, with no other closing keyword. Not a governed path; 31 files, +543 −585 (net −42). Tests,package.json, the lockfile and an empty-frontmatter changeset only; nosrc/**change.@objectstack/driver-memory, plus the twodriver: 'memory'kernels (decorative-field-sweep,undeclared-key-probe), now run ondriver-sqlite-wasm, on the two shapes the repo already had:bootStack/hotcrmStackfor booted stacks, and an inlineSqliteWasmDriverplus the engine's ownql.syncSchemas()for hand-built engines.knowledge-deflection,sla-compliance-gauge) keep their SQL leg.'x' in stored === false, the absent key) or was its memory leg. Where a business half existed, it is still pinned on SQL.audit-stamp-readonly's fixture now gives each deal its own account, becausecrm_account.nameisunique: trueand SQL enforces it.sharing-seeding's$norrefusal now asserts the envelope (INVALID_FILTER/ 400) instead of the memory driver's wording.@objectstack/driver-memoryleavespackage.jsondependenciesand the lockfile importer (3 lines, regenerated bypnpm). Read onmain: nothing outsidetest/imports it (onlyCHANGELOG.mdprose names it);@objectstack/cliandruntimekeep their own dependency on it.2b74e9f3, the PR head.pnpm test:coverage: 179 files, 3,653 passed; coverage 95.18 / 86.74 / 96.61 / 99.22 against floors 92 / 78 / 92 / 95.Build and Test (22.x), still running at this review; landing waits for it.src/**comments namedriver-memoryas a sparse driver or as where a defect was measured. They are dated history and stay true of sparse drivers (PR Acceptance notes).Generated by Claude Code