Skip to content

v1.3.0 — Parity + correctness release

Choose a tag to compare

@cheezy cheezy released this 07 Jun 00:54
· 57 commits to main since this release

[1.3.0] - 2026-06-07

Parity + correctness release. Closes the full stride-pi-vs-stride gap audit (goal G166): brings every skill, agent, and TypeScript extension up to the canonical Claude Code plugin's feature set — schema_version 1.3 review reports with security_considerations, the missing task-enricher subagent, the ## after_goal GOAL_* env fix, claim-baseline changed_files anchoring, and a zero-config default install — while keeping the intentional Pi-specific adaptations explicit.

Added

  • task-enricher subagent (W1013, W1014) — the previously-missing fifth agent. New extensions/subagent-dispatch/agents/stride-task-enricher.md ports the canonical four-phase enrichment procedure (intent parse → six-step codebase exploration → complexity → 17-item checklist incl. security_considerations) to the Pi agent format, and a matching inline stride-enriching-tasks skill path. task-enricher is wired into the dispatch registry (extracted to a pi-free extensions/subagent-dispatch/agents-registry.ts, imported by index.ts), so the dispatch tool now resolves 5 agents. First-ever subagent-dispatch test suite added (index.test.ts).
  • security_considerations as a first-class review_queue-scored field across the creation, enrichment, decomposition, and review skills/agents (W1007, W1008, W1011) — added to the scored-field banners, the per-task field templates, every worked example, the Embedded-Object-Formats subsection (array-of-strings, with the "None — …" escape hatch), and the ## Consuming Provided Context (--dir bundle) sections.
  • Doc-level orchestrator gating on every internal sub-skill (W1007, W1008, W1015, W1016, W1017, W1018) — INTERNAL frontmatter descriptions, ## STOP — orchestrator check blocks, and skills_version: 1.0. This is deliberately doc-level only: stride-pi does not ship the Claude plugin's PreToolUse skill-gate hook (Pi has no equivalent), so the gating is framing, not enforcement.

Fixed

  • after_goal now actually forwards GOAL_* env (W1019) — the 1.2.0 changelog claimed GOAL_ID / GOAL_IDENTIFIER / GOAL_TITLE / GOAL_DESCRIPTION were forwarded into the ## after_goal child process, but no code parsed the server's hook.env. New extractGoalEnvFromResult in after-goal-detector.ts sources GOAL_* (plus BOARD_* / COLUMN_* / AGENT_NAME) verbatim from hook.env; omitted canonical keys default to empty strings; prototype-pollution keys and non-string values are dropped; the API token is never injected. buildHookEnv / runHook gained an extraEnv parameter.
  • after_goal env-cache deletion ordering on the mark_reviewed route (W1019) — the env cache was deleted before after_goal ran on /mark_reviewed. Extracted the post-hook sequence into a pure, import-free after-goal-runner.ts (runAfterGoalAndCleanup) that runs after_goal first, then cleans up — mirroring canonical stride-hook.sh ordering.
  • TASK_BASE_REF persistence so changed_files anchors to the claim baseline (W1020) — changed-files.ts read TASK_BASE_REF to anchor diffs, but nothing computed or persisted it, so the snapshot always fell back to HEAD~1 and mis-reported the delta whenever the commit count since claim ≠ 1. index.ts now runs git rev-parse HEAD at claim time, adds TASK_BASE_REF to TASK_ENV_KEYS, and persists it via writeEnvCache (with taskToEnv refactored to a git-free TASK_FIELD_MAP). Empty refs preserve the HEAD~1 fallback.
  • Missing required completion fields (W1016) — every /complete JSON example in stride-completing-tasks omitted completion_summary, actual_complexity, and actual_files_changed (a copy-paste-level bug that fails strict validation); added to both examples plus skills_version. The dispatched reviewer_result shape was upgraded from the thin legacy envelope to the full structured block with the "do not send only the thin envelope" warning.

Changed

  • Reviewer review-report contract upgraded to schema_version 1.3 (W1009, W1010, W1015, W1017) — both reviewer variants (the dispatched ext-agent and the inline skill) emit the full canonical fenced ```json block: status, `issue_counts`, `issues[]` with the 7-value category enum (incl. `security` and `project_check`), `acceptance_criteria[]`, `project_checks[]` (CODE-REVIEW.md mechanism), and the four per-section verdicts (`testing_strategy` / `patterns` / `pitfalls` / `security_considerations`). The two variants are reconciled to describe the same block (no dual-variant contradiction). The orchestrator (`stride-workflow` Step 6) and `stride-subagent-workflow` gained the structured-block extraction + legacy↔structured field mapping and parse-failure fallback.
  • task-decomposer and hook-diagnostician fleshed out to canonical depth (W1011, W1012) — the decomposer gained the full methodology (scope analysis, boundary identification, dependency ordering, complexity table, dependency-graph patterns, special cases, a complete worked example) and removed a duplicate ## Constraints header; the diagnostician gained the 6-category Failure Pattern Catalog, structured-JSON-vs-raw-text input detection (documenting both the Pi hook-bridge result shape and the cross-plugin stride-hook.sh shape), timeout thresholds, and two worked examples.
  • Default install now ships the extensions (W1021) — install.sh installs the hook-bridge + subagent-dispatch extensions by default, so .stride.md lifecycle hooks auto-fire out of the box (matching the Claude plugin's zero-config wiring). Added a --no-extensions (alias --skills-only) opt-out; --with-extension is kept as a deprecated no-op. Removed the empty prompts declaration from package.json and the unused .gitkeep-only prompts/ and top-level agents/ placeholder dirs.
  • stride-claiming-tasks sends skills_version on every claim (W1018) with a stale-skills handling pointer.

Validation & Tests

  • All node --test suites green: 85/85 (hook-bridge 79, subagent-dispatch 6). New coverage: extractGoalEnvFromResult + runAfterGoalAndCleanup (W1019, 13 tests), TASK_BASE_REF round-trip + anchored-diff (W1020, 2 tests), and the AGENT_NAMES registry resolution (W1014, 6 tests).
  • dispatch_agent event contract verified live (W1022) — ran pi --mode json -p against pi-coding-agent@0.67.68 and confirmed the final assistant answer arrives as a message_end event with message.content[].text, validating extractMessageText's filter. The full content-bearing happy-path and the tool_result_end name remain unverified on the test box (no working LLM provider) and are documented as such in docs/smoke-test-w277-dispatch-agent.md and docs/validation-phase3.md.

Intentional Pi-specific deviations (not gaps)

  • Doc-level gating, no enforcement hook. Internal sub-skills carry ## STOP — orchestrator check framing and INTERNAL descriptions, but stride-pi does not ship the Claude plugin's PreToolUse skill-gate (Pi has no PreToolUse hook). The gate is documentation, by design.
  • Dual dispatch/inline path. Pi has no native subagent dispatch, so every subagent role ships both as a dispatched dispatch_agent extension agent and as an inline skill fallback (--no-extensions). The work and output shape are identical; only isolation differs.
  • hook-bridge re-platforming. Lifecycle hooks run via the hook-bridge Pi extension intercepting the curl tool_call/tool_result events (with a placeholder *_result in the request body), rather than the Claude plugin's hooks.json. The single HOOK_TIMEOUT_MS = 120000 deadline replaces the server-supplied per-hook timeouts.

Source

G166 / W1007–W1023. Final parity audit, version bump, and CHANGELOG/README/AGENTS update closing the stride-pi-vs-stride gap analysis.