Repository navigation
v0.2.0-rc.28
Why this release. The rc.27 pull-back and the simulated-trigger drills turned up real defects. npx @danceiny/gotry doctor reported an hbcli without credentials as "credentials valid" on every machine with hbcli installed (#623); on the ground-transfer path a provider's raw error text could reach tool results unredacted, and a route provider that contradicted its own mode or resolved origin/destination was still bound as the airport transfer (#429); a solver crash could reach a traveller as "your trip is infeasible" (#620); and the tenant ledger leaked raw SQLite contention errors to callers (#619). All of them are fixed here. The release also lands the session dual-zone memory (default off) and the M3 capture and persona-simulation harness (synthetic only). The version stays paired with the extension manifest (0.2.0.28, enforced by extension-tests); the extension itself is unchanged.
What's New (since rc.27)
Fixes
gotry doctorstops reporting an hbcli without credentials as "credentials valid" (#623) — the CLI judged by the exit code ofhbcli auth whoami, which is 0 even when nothing is configured, so every machine with hbcli installed saw a false "valid" (14 of 14 runs on the published rc.27). It now parses the three-tierwhoamiJSON exactly as the tool-layer doctor does, settles its probes onclose, and a parity test feeds the same fake hbcli to both implementations so they cannot drift apart again.doctorno longer intermittently reports an hbcli without credentials asok— the credential probe settled on the child'sexitevent, which can fire before its stdout has been read; an empty read then fell into the "unparseable output counts as valid" branch. It now settles onclose, and a deterministic regression test injects a child that exits before its data arrives. This also removes an intermittent red on the Node 22 CI job.- Provider fault detail is scrubbed before it reaches tool results (#429) — a ground-transfer provider's error text (markup, credential-shaped strings) no longer flows verbatim into
transfer_evidence; the fixedGROUND_TRANSFER_*messages pass through byte-identical. - A route provider that contradicts its own request is refused instead of bound (#429 GAP-429-1/2) — a declared mode other than driving, or a resolved origin/destination more than about 11 m from the requested pair (or one that cannot be parsed), falls back to the static transfer estimate with its original price label and writes nothing to the cache; the wired driving tool declares neither, so its behaviour is unchanged.
- A solver crash is no longer reported as an infeasible trip (#620) —
solveUnifiedvalidates every integer before it reaches Z3 and returns an explicitsolver_error(solver_input_not_integer/solver_runtime_error) instead of a fakeunsat_core: ['wasm_runtime_error'], and the traveller-facing text says the solver failed rather than that the trip is impossible. The root cause on the Yunnan pack is a data gap (legyn0has no buffer or transfer minutes), not a threading race, so that pack reportssolver_erroruntil its minutes are calibrated (#635). - The tenant ledger no longer leaks raw SQLite contention errors (#619) —
openDbinstallsbusy_timeoutbefore the WAL switch and creates or migrates the schema underBEGIN IMMEDIATE, every read-then-write ledger transaction takes the write lock up front, and an exhausted budget surfaces as the typedLedgerBusyErrorinstead of a bareSQLITE_BUSY/SQLITE_BUSY_SNAPSHOT(the D-15 drill defects D15-1 and D15-2). Stored data, schema, idempotency keys, event shapes and single-writer behaviour are unchanged. The kernel manifest was re-pinned forstate-ledger.tsandunified.tswith founder approval. - A stalled LLM provider no longer hangs real-LLM runs (#618) —
chat()ends any request that has not fully answered withinGOTRY_LLM_TIMEOUT_MS(default 300 s), or whose callerAbortSignalfires, as a typedLlmRequestError(timeout/aborted) instead of waiting forever; usage accounting and the missing-usage fail-closed rule are unchanged. - Offline switch for the realtime
hbclichannel (#617) —GOTRY_HBCLI_LIVE=0(alsofalse/off) makesanythingSearchspawn nohbcliand degrade with[实时API:hbcli-anything@offline@…]; unset or any other value is unchanged (live whenhbcliis available).nightly-evidence.ts --dry-run,persona-sim.ts,replay.ts,replay-async.tsandtime-eval-tests.tsnow default it to0(an explicit value is respected), so mock and dry-run paths no longer reach a live backend with the developer's stored credentials. - Release script creates the GitHub Release with
--verify-tag—scripts/publish-npm.shpassed the tag name asgh release create --target, which GitHub rejects (HTTP 422,target_commitish is invalid): the rc.27 publish succeeded on npm but its Release step failed and had to be created by hand.--verify-tagaborts if the tag is missing from the remote instead of silently creating one onmain. - Test hardening — the warmer-proof gate marker is published atomically (intermittent Node 24 failure) and the boot-budget proof allows a 50 ms early-fire tolerance on its 10 s handshake deadline (a Node 22 run measured 9999 ms).
New, default-off or synthetic-only
- Session dual-zone memory mechanism (#255, default off) — six log-type event kinds on the existing
eventstable (zero new tables; the kernel-pinnedstate-ledger.tsis untouched), a capture seam, a scope-keyed read-back variablesession_zone_brief, owner-confirmed promotion routed through the existing motivation/timeline/companion gates,state-cli exportviewshot-context.jsonlandnotebook.json, and an opt-in observation face with three metrics whose thresholds are frozen before any data. ThesessionZonesswitch defaults tooffand is inert when off; the value claim stays closed (no real usage yet), and the shipped persona does not reference the new variable until the founder decides. - M3 cohort capture CLI and LLM persona simulation harness (#22, synthetic only) — an operator-driven capture path for invited, consented seed participants that writes the scorer's
gotry_m3_cohort_record_v1(the first producer of those records), and a persona-simulation harness that rehearses the funnel offline or with a real LLM under a budget gate. Simulated runs are labeledsynthetic_fixture, enrolled astest_or_staff, and can never contribute to M3/M4 evidence; the M3 gate is unchanged (an admitted real 50–200 seed-user set is still required). - Simulated-trigger drills for the dormant trigger-gated trackers (#82, #275, #422, #340, #339, #429; fixture level; the trackers have since been closed as deferred) — default-off, zero-caller contract mechanisms for transaction-outcome-versus-estimate projection (#340), city×scenario tiering with an empty registry (#339) and a route-provider conformance gate (#429); drill suites for the inert W2A sensor path (#82), concurrent writers, crash/reopen and online backup on the tenant ledger (#275) and the dsh SDK descendant-cleanup re-baseline on
0.2.0-rc.2(#422, gap confirmed); and an opt-in, read-only measurement probe for the external Anything path (#276/#345). Every result is labeledsimulated_trigger_drillorfixture_contractand none satisfies a trigger.
Housekeeping
- Eight dormant trigger-watch issues closed as deferred (#82, #275, #422, #340, #339, #429, #276, #345) — none of their triggers has fired, and the simulated-trigger drills satisfy none of them; leaving them open as a standing backlog was unhealthy. Closed as not planned, not completed: each trigger condition now lives in its authority document (architecture D-15 / §10 / D-39,
decisions-needed,memory-design§2,data-sources), and a new issue opens when a real trigger appears.
Installation
Run npx @danceiny/gotry@0.2.0-rc.28 web (Node ≥ 22.15). Once latest points to this version, npx @danceiny/gotry web is equivalent; pin the exact version if your registry mirror lags.
Added
- cohort capture CLI + synthetic-only LLM persona simulation harness (#22)… (#614)
- session dual-zone memory P4-2..P4-4… (#613)
Fixed
- cross-process contention must not reach the caller as a raw SQLITE_BUSY… (#634)
- a solver crash is reported as solver_error, not as an infeasible trip — Z3 integer-input gate… (#633)
- GOTRY_HBCLI_LIVE=0 switches the realtime hbcli channel off… (#632)
- dsh-llm chat() gets a request-level timeout and honours a caller AbortSignal… (#631)
- refuse a provider answer that contradicts its own mode or resolved origin/destination instead of binding it (#429 GAP-42… (#630)
- the boot-budget proof needs an early-fire tolerance on the 10 s handshake deadline (Node 22 CI measured 9999 ms)… (#629)
- exempt CHANGELOG.md from the G5 guard's naming surfaces… (#628)
- the CLI judges hbcli credentials from the whoami JSON, not its exit code… (#626)
- create the GitHub Release with --verify-tag… (#625)
- publish the warmer-proof gate marker atomically; the proof JSON.parses each marker as soon as the directory lists it, so… (#616)
- settle the hbcli stdout probe on 'close', not 'exit'… (#622)
Documentation
- eight dormant trigger-watch issues are closed as deferred… (#627)
- rc.27 is published and pulled back… (#624)