Skip to content

v0.2.0-rc.28

Choose a tag to compare

@Danceiny Danceiny released this 05 Oct 19:35
· 24 commits to main since this release
a745be9

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 doctor stops reporting an hbcli without credentials as "credentials valid" (#623) — the CLI judged by the exit code of hbcli 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-tier whoami JSON exactly as the tool-layer doctor does, settles its probes on close, and a parity test feeds the same fake hbcli to both implementations so they cannot drift apart again.
  • doctor no longer intermittently reports an hbcli without credentials as ok — the credential probe settled on the child's exit event, 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 on close, 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 fixed GROUND_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) — solveUnified validates every integer before it reaches Z3 and returns an explicit solver_error (solver_input_not_integer / solver_runtime_error) instead of a fake unsat_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 (leg yn0 has no buffer or transfer minutes), not a threading race, so that pack reports solver_error until its minutes are calibrated (#635).
  • The tenant ledger no longer leaks raw SQLite contention errors (#619) — openDb installs busy_timeout before the WAL switch and creates or migrates the schema under BEGIN IMMEDIATE, every read-then-write ledger transaction takes the write lock up front, and an exhausted budget surfaces as the typed LedgerBusyError instead of a bare SQLITE_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 for state-ledger.ts and unified.ts with founder approval.
  • A stalled LLM provider no longer hangs real-LLM runs (#618) — chat() ends any request that has not fully answered within GOTRY_LLM_TIMEOUT_MS (default 300 s), or whose caller AbortSignal fires, as a typed LlmRequestError (timeout / aborted) instead of waiting forever; usage accounting and the missing-usage fail-closed rule are unchanged.
  • Offline switch for the realtime hbcli channel (#617) — GOTRY_HBCLI_LIVE=0 (also false / off) makes anythingSearch spawn no hbcli and degrade with [实时API:hbcli-anything@offline@…]; unset or any other value is unchanged (live when hbcli is available). nightly-evidence.ts --dry-run, persona-sim.ts, replay.ts, replay-async.ts and time-eval-tests.ts now default it to 0 (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.sh passed the tag name as gh 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-tag aborts if the tag is missing from the remote instead of silently creating one on main.
  • 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 events table (zero new tables; the kernel-pinned state-ledger.ts is untouched), a capture seam, a scope-keyed read-back variable session_zone_brief, owner-confirmed promotion routed through the existing motivation/timeline/companion gates, state-cli export views hot-context.jsonl and notebook.json, and an opt-in observation face with three metrics whose thresholds are frozen before any data. The sessionZones switch defaults to off and 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 labeled synthetic_fixture, enrolled as test_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 labeled simulated_trigger_drill or fixture_contract and 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)

Tests