Read round-6 UX regression verification report; identified UX5-R as
the sole unresolved finding (select before init emits raw SQLite
error)
Added store.check_initialized()? guard to 7
store-dependent command arms in src/main.rs: select,
calibrate, ingest, graph, explain, validate, metrics
Verified by reproduction in a scratch repo — all commands now emit
friendly "Store has not been initialized. Run
testaruda init first" error
Ran Rule of 5 universal review on the change — converged at Stage 2
with EXCELLENT shape and correctness
Updated beads issue testaruda-3n2 notes to reflect
completed work
Committed as 23dd334, bumped version to
0.2.2, tagged and pushed v0.2.2
Next: None — this closes the UX5-R regression
Log
Session 21:37
(testaruda — via parent context)
Evaluated Testimonial.jl's integration status with testaruda for
smart test selection
Discovered the adapter already works end-to-end for discover,
select, handshake, fingerprint, run-args — the gap is much smaller than
first analysis suggested
Identified the real gap: handle_ingest in Protocol.jl
expects params.selected (node IDs) but testaruda's
ingest --raw sends params.run_output (raw test
output)
Verified adapter binary exists, symlinked, and responds correctly to
handshake, discover, fingerprint, static-deps
Verified testaruda discover and
testaruda select work on the Testimonial.jl repo itself (36
@testitems found, select falls back to all 43 tests because no coverage
ingested)
Created beads issue testimonial-yczs on Testimonial.jl
tracking the fix: modify handle_ingest to accept
params.run_output, parse test output, re-use existing
per-item coverage recording, return standard
DepEdge/TestRunResult format
Next: Implement testimonial-yczs — fix
the ingest handler to accept testaruda's ingest --raw
format, then test end-to-end smart selection
Tasks created
Decisions
The ingest handler fix belongs in Testimonial.jl's Protocol.jl, not
testaruda — the adapter protocol spec (TIA-ADAPT-008) says the adapter
owns parsing run output into language-specific results
Sessions 21:37 (reply.jl — 5
sessions)
Step B2: Decomposed eval_responses god-function — extracted
run_with_timeout and annotate_terminal!
Step B4: Added EvalOutcome discriminated union
(Completed/Interrupted/TimedOut/Errored/Cancelled) with stable error
codes
Step B5: Documented NamedSession lock ownership; created StdinFeeder
value type
Classified file-read errors into stable codes (file-not-found,
path-not-allowed, io-error) — stripped leaked paths from error
messages
Replaced bare catch in safe_render and _update_history!
with typed handling + @debug logging + atomic error counter
Added @error logging to internal_error_response with correlation_id
for server-side trace correlation
Split 667-line mcp_adapter.jl into
mcp/{tools,requests,results,server}.jl — pure reorganization, zero
behavior change
Added REPLy.Client with
connect/send/receive/collect_until_done/disconnect — re-pointed replyc
and MCP transport dispatch
Fixed _update_history! to also catch ErrorException (const ans
redefinition)
Added missing using JSON3 / using Logging
to 4 test files for standalone run compatibility
Fixed 7 issues across 5 OpenSpecs (tidy-error-handling,
fix-stacktrace-disclosure, refactor-mcp-adapter,
add-first-class-client)
All 2550 tests pass
Arc: From small error-handling wins to major
structural refactors — the session chain moved through the
tidy-error-handling OpenSpec tasks, then split the MCP god-file, then
eliminated the 4× wire-protocol duplication with REPLy.Client
Next: Step 13b (REPLy_jl-jys) — Drop MCP loopback
hop, or harden-cli-installer tasks (waiting on ⚖️ decision)