What's Changed
- Feat: /scope command — complexity estimate before work-on by @RapierCraft in #621
- Feat: /changelog command — auto-generate release notes from FORGE annotations by @RapierCraft in #622
- Feat: /status command — pipeline-wide situational awareness by @rapiercraft-forge[bot] in #620
- Feat: /explain command — plain-English breakdown of FORGE annotations by @RapierCraft in #623
- Feat: /diagnose command — trace pipeline annotation chain and identify failure point by @RapierCraft in #629
- Feat: /replay command — read-only playback of pipeline runs by @RapierCraft in #625
- feat(commands): /resume — context recovery after compaction by @RapierCraft in #624
- Feat: /adopt command — bootstrap existing repos for ForgeDock by @RapierCraft in #627
- Fix: session-start.mjs hook registration in settings.json by @RapierCraft in #631
- chore: merge stranded Wave 1 code into staging (lane routing fix) by @RapierCraft in #640
- Fix: grep -oP not portable on macOS in /adopt issue count (#638) by @RapierCraft in #644
- Fix(adopt): correct phase skip target from Phase 5 to Phase 6 by @RapierCraft in #645
- Fix: remove dead awk CONTRACT extraction in /explain Phase 3 by @RapierCraft in #646
- Fix(adopt): Investigation type maps to 'feature' label instead of 'documentation' by @RapierCraft in #642
- fix(diagnose): correct FORGE:INVESTIGATOR:COMPLETE → INVESTIGATION:COMPLETE in F3/F4 by @RapierCraft in #647
- Fix: emit 'no PRs found' message when changelog range yields empty result by @RapierCraft in #643
- fix(status): replace grep -oP with portable sed for macOS compatibility by @RapierCraft in #641
- Fix: /replay triple-quote injection via env var body pass by @RapierCraft in #648
- Feat: inject ForgeDock behavioral rules into project CLAUDE.md on install by @RapierCraft in #649
- Feat: stub-based command install to reduce context load by ~99% by @RapierCraft in #656
- Fix: add enable/disable/status CLI commands (#608) by @RapierCraft in #660
- Fix: uninstall fully reverses all install side-effects by @RapierCraft in #661
- Feat: forgedock doctor — installation health check by @RapierCraft in #662
- Feat: wire premium install TUI into forgedock.mjs (#605) by @RapierCraft in #664
- feat(devdocs): create devdocs/agent/github-cli-patterns.md — GitHub CLI cheat sheet for pipeline agents by @RapierCraft in #695
- feat(bin): merge /scope command to main — pre-flight complexity estimate (#681) by @RapierCraft in #696
- feat(devdocs): DevDocs v2 frontmatter schema — add lifecycle fields to all template files by @RapierCraft in #697
- Fix: gh api --jq --arg broken pattern in review-pr.md and review-pr-agents.md by @RapierCraft in #698
- Fix: gh gist edit stdin pipe — use temp file in investigate.md by @RapierCraft in #700
- Feat(docs): claude-breakpoints.json — structured registry of known Claude Code version breakpoints by @RapierCraft in #699
- Feat(scripts): transition-label.sh — label state machine with validation by @RapierCraft in #702
- feat(scripts): classify-lane.sh — deterministic lane routing from issue milestone by @RapierCraft in #703
- Feat(scripts): scaffold .forgedock/scripts/ directory and gitignore integration on init by @rapiercraft-forge[bot] in #704
- Feat: validate-pr-target.sh — hard-fail if PR base doesn't match classified lane by @rapiercraft-forge[bot] in #712
- feat(installer): symlink scripts/ to ~/.claude/scripts/ and wire classify-lane.sh into orchestrate.md by @rapiercraft-forge[bot] in #713
- Feat: universal vs adaptive scripts boundary — precedence rules and override semantics by @rapiercraft-forge[bot] in #714
- fix(work-on): branch existence validation + PR_BASE computed before worktree creation by @rapiercraft-forge[bot] in #718
- Feat(commands): /compat-audit — on-demand Claude Code compatibility and feature parity report by @rapiercraft-forge[bot] in #717
- Feat: DevDocs v2 index format + selective loading by @rapiercraft-forge[bot] in #720
- Feat: DevDocs self-dogfooding — scaffold own devdocs/ with v2 schema by @rapiercraft-forge[bot] in #729
- Feat: machine-readable phase checkpoint — deterministic resume without prose parsing by @rapiercraft-forge[bot] in #730
- feat(scripts): forge.yaml learned section and pattern capture (#667) by @rapiercraft-forge[bot] in #728
- feat(work-on): complexity-proportional fast-path — skip phases for simple and investigation tasks by @rapiercraft-forge[bot] in #736
- Feat(commands): /optimize command — generate per-repo adaptive scripts (#668) by @rapiercraft-forge[bot] in #735
- feat(orchestrate): stall detection and structured auto-resume (#683) by @rapiercraft-forge[bot] in #737
- perf(docs): measure and document token savings from per-repo adaptive scripts (#673) by @rapiercraft-forge[bot] in #741
- docs(quality-gate): clarify adaptive behavior and stack-specific checks by @rapiercraft-forge[bot] in #751
- fix(compat-audit): export FORGE_HOME_PATH before Node.js heredoc by @rapiercraft-forge[bot] in #749
- Fix: format-commit.sh template — add TYPE arg to fix SCOPE used as type prefix by @rapiercraft-forge[bot] in #748
- feat(ci): add test gate before npm publish by @rapiercraft-forge[bot] in #750
- Fix: replace hardcoded user-specific paths in devdocs with generic placeholders by @rapiercraft-forge[bot] in #753
- docs(readme): soften benchmark claim to avoid unverifiable specifics by @rapiercraft-forge[bot] in #754
- fix(cli): use os.homedir() instead of process.env.HOME by @rapiercraft-forge[bot] in #755
- fix(scripts): guard -R flag against missing value in classify-lane.sh by @rapiercraft-forge[bot] in #752
- fix(work-on): add FORGE:HEARTBEAT inline at Phase 1/3/5 entry points (#740) by @rapiercraft-forge[bot] in #756
- Fix: gitignore dedup guard uses line-by-line active-line check (#708) by @rapiercraft-forge[bot] in #757
- fix(build): sanitize issue labels before AWK domain matching to prevent injection by @rapiercraft-forge[bot] in #759
- fix(work-on): resolve correction capture owner login via tiered lookup by @rapiercraft-forge[bot] in #758
- fix(work-on): clarify AC for TRIVIAL fast-path — Builder Contract is retained, not skipped by @rapiercraft-forge[bot] in #760
- Fix(compat-audit): use npx forgedock update in breakpoints advisory by @rapiercraft-forge[bot] in #761
- fix(scripts): strip git-invalid chars from classify-lane.sh slug (#707) by @rapiercraft-forge[bot] in #762
- fix(devdocs): remove closed issues #619 and #635 from milestone table by @rapiercraft-forge[bot] in #763
- docs: document yq as prerequisite tooling for forge commands by @rapiercraft-forge[bot] in #764
- fix(hooks): replace ghost enable/disable commands in session-start hook by @rapiercraft-forge[bot] in #765
- docs(architecture): clarify adaptive script execution costs in token savings table by @rapiercraft-forge[bot] in #767
- fix(scripts): wire FORGE_LABEL_MAP env var to transition-label.sh by @rapiercraft-forge[bot] in #768
- fix(compat-audit): pass VERSION_CACHE via env var instead of interpolating into node -e string by @rapiercraft-forge[bot] in #769
- Refactor: remove unused
stepparameter fromcopyTreeinner function by @rapiercraft-forge[bot] in #770 - docs(scripts): integrate adaptive_scripts.enabled check into resolve_script() algorithm by @rapiercraft-forge[bot] in #771
- fix(scripts): symmetric remote branch validation in classify-lane.sh fast-lane path by @rapiercraft-forge[bot] in #772
- fix(installer): uninstall() removes scripts from ~/.claude/scripts/ by @rapiercraft-forge[bot] in #773
- fix(installer): add PIPELINE_SCRIPTS allowlist to restrict linkScripts() output by @rapiercraft-forge[bot] in #774
- fix(devdocs): remove 7 closed issues from milestone table by @rapiercraft-forge[bot] in #777
- Feat(pipeline): per-issue graph decision record for provenance and benchmarking by @RapierCraft in #778
- Fix(pipeline): standardize GDR lane placeholder to {lane} convention by @RapierCraft in #781
- fix(work-on): pipe gh api output to jq for --arg variable injection by @rapiercraft-forge[bot] in #788
- Fix: empty slug guard for Unicode/symbol-only milestone titles in classify-lane.sh by @rapiercraft-forge[bot] in #787
- fix(commands): replace grep -oP with portable sed/grep -oE for macOS compatibility by @rapiercraft-forge[bot] in #794
- fix(commands): replace greedy sed with grep -oE for GDR count extraction by @RapierCraft in #796
- fix(doctor): use execFileSync args array to prevent shell injection by @rapiercraft-forge[bot] in #797
- Fix: stripJsonc trailing-comma removal integrated into parser (no regex post-pass) by @rapiercraft-forge[bot] in #798
- Fix: symlink update cleans up .tmp and guards outer catch with ENOENT by @rapiercraft-forge[bot] in #799
- Fix: refresh stale FORGE_HOME export in shell profile on reinstall by @rapiercraft-forge[bot] in #800
- fix(installer): extend hook path escaping to cover $, backtick, ! (#792) by @rapiercraft-forge[bot] in #801
- milestone: Deterministic Pipeline v2 → staging by @rapiercraft-forge[bot] in #802
- fix(scripts): convert GH_REPO_FLAG to array in classify-lane.sh by @rapiercraft-forge[bot] in #816
- Fix: mark claude-code peerDependency as optional to prevent ERESOLVE on npx by @rapiercraft-forge[bot] in #818
- fix(commands): replace grep -oP PCRE with portable grep -oE in Wave 2 commands by @rapiercraft-forge[bot] in #817
- Feat: auto-move review findings to fast lane when milestone PR merges by @rapiercraft-forge[bot] in #819
- Fix: work-on.md uses resolve_script() at all script call sites by @rapiercraft-forge[bot] in #821
- fix(scripts): validate -R argument format in classify-lane.sh (#806) by @rapiercraft-forge[bot] in #824
- Fix: escape FORGE_HOME metacharacters in shell profile export (#808) by @rapiercraft-forge[bot] in #825
- Fix(review-pr): assign REPO in Phase 1A to fix unset-variable on clean-review path by @rapiercraft-forge[bot] in #826
- Fix: linkCommands() missing Windows EPERM symlink fallback by @rapiercraft-forge[bot] in #827
- Fix: escape backslashes in path fields before YAML embedding (#810) by @RapierCraft in #829
- Fix: suppress init() stdout when called from install() (#812) by @rapiercraft-forge[bot] in #830
- Fix: add atomicWriteFile() helper — eliminate non-atomic writes in injectManagedBlock, removeManagedBlock, and forge.yaml init by @rapiercraft-forge[bot] in #831
- Fix: add EPERM/EACCES fallback to symlink update path in linkCommands() and linkScripts() by @rapiercraft-forge[bot] in #832
- Fix: resolve_script() call sites use canonical case dispatch instead of cut -d: -f2- by @rapiercraft-forge[bot] in #833
- Fix: work-on.md stale transition-label.sh prose → resolve_script convention by @rapiercraft-forge[bot] in #835
- Ship milestone: Deterministic Pipeline v2 by @rapiercraft-forge[bot] in #837
- Ship milestone: L0–L1 Licensing, Governance & Repo Split by @rapiercraft-forge[bot] in #836
- Fix: Phase 4C classify-lane recompute error guard by @RapierCraft in #840
- Fix: rename run_script comment header to usage-pattern notation by @rapiercraft-forge[bot] in #841
- Fix: correct run_script comment — validate-pr-target warns, does not exit 1 by @rapiercraft-forge[bot] in #842
- Release: deterministic pipeline v2, project-agnostic commands, licensing & governance by @rapiercraft-forge[bot] in #843
Full Changelog: v1.0.16...v1.0.17