v3.10.2
Patch. Rolls up a privacy fix, a path-containment hardening and triage observability.
Fixed
- Personal email removed from public metadata (#1156): a personal address had leaked into user-facing package metadata. Replaced with the public handle so scrapers can't harvest it.
- Path guards use containment, not string prefix (KJC-BUG-0098): direct-action file writes (
create_file,git_add) confined the target to the project directory with a string-prefix check, which a sibling path like../project-evilcould slip past. The guard now uses apath.relative-based containment test, so a crafted path cannot escape the repo.
Added
- Per-role triage rationale (KJC-TSK-0601): triage decided which roles to activate but only exposed one global
reasoningblob — the per-role why was invisible. Triage now emits a deterministicroleRationale(role, enabled, source, reason) mirroring the activation logic, rendered under thetriage:endevent so each activate/skip decision is observable. The rationale describes each role's trigger, never a per-task claim, so it is never invented; on triage failure, skipped roles degrade to a neutral reason.
Docs
- Recorded by-design non-goals (KJC-TSK-0602):
docs/design-decisions.mddocuments whynpm installis not run with--ignore-scripts, why there is no built-in sandbox, and why there is no user-editable YAML/JSON config — so reviews stop re-proposing them.