Record<string,string> widened EvalModelKind to string, so a typo'd
kind only failed at runtime; as const satisfies keeps the closed set
the doc comment promises.
Seven small fixes, one theme (claims matching code):
- telemetry-sync strips local-only fields with jq del() (structural) instead
of quote-fragile sed regexes; unparseable lines are dropped, never
forwarded unstripped. Sed survives only as a jq-less fallback.
- telemetry-log rejects non-integer durations BEFORE the range caps, whose
test(1) comparisons silently no-op on non-numerics — a malformed duration
spliced raw text into the JSONL stream.
- browse's local telemetry honors the persistent tier (config.yaml
telemetry: off), not just the preamble's env hint — direct $B use and
embedders now respect the opt-out.
- gstack-context-bill --exact sees GSTACK_-promoted keys inside Conductor
(conductor-env-shim wired at the CLI entry), and the TOTAL line no longer
double-counts every nested skill through the root skill's walk (v1.63
deferred polish; the telemetry-sync HTTP-status outcome deferred alongside
it turned out already shipped).
- setup's Chromium probe is deadline-bounded (90s, background + poll-kill —
macOS has no GNU timeout) and prefers Node for the launch probe everywhere
(the bun --eval hang family behind #2136); the install is single-flight
behind a lock dir with an actionable stale-lock message. Probe verified
live on this Mac.
- the review resolver's dev-server check reads CLAUDE.md and the plan file
before falling back to an expanded port probe, and says how to make
itself smarter next time.
- eval/harness model IDs resolve through lib/eval-model.ts
(GSTACK_EVAL_MODEL[_KIND] env overrides, per-kind defaults, tested) at the
SDK-capture and PTY-warmup sites; the bash-embedded distill snippet
mirrors the resolution inline.
- memory-ingest's silent-zero shape (staged>0, imported+unchanged==0,
errors==0) warns even under --quiet — a run that indexes nothing must
never look healthy again.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>