{
  "1.6.13": {
    "version": "1.6.14",
    "date": "2026-07-25",
    "notes": "Run-task prompt-integrity release. (1) Repairs FORGE-S34-T07 converter damage across meta sources: four documents (meta-collate, meta-fix-bug, meta-retro, meta-retrospective) had their whole tail collapsed into one broken forge_collate args array and are restored; 26 inline-code spans across 15 files had their closing backtick swallowed into the final argument, yielding invalid enum values such as \"planned`\"; meta-migrate's shell emit block and eight run_bash() pseudo-code lines in meta-orchestrate were rewritten into syntactically invalid forms and are corrected. (2) {SYNTAX_CHECK}/{BUILD_COMMAND} now substitute: they used the single-brace form substitute-placeholders never matches AND were absent from its key map, so every materialized implement_plan.md shipped the literal token into the runtime prompt. New check-placeholders.cjs gate flags either brace form for known keys. (3) The plan phase now declares the engineer persona it is actually dispatched with, instead of ordering the subagent to adopt the architect identity. (4) The validate phase reads SPRINT_REQUIREMENTS.md — previously it validated against the plan's restatement of the acceptance criteria, which cannot catch a criterion the plan dropped. (5) Identity announcement is forge_banner-first with a documented Bash fallback, and workflows no longer order a re-read of the already-loaded persona. (6) Placeholder aliases unified on {record_id}; Store-Write Verification sections now state the procedure instead of holding only an HTML comment; plan-phase FSM prose no longer understates the legal entries into `planned`. (7) Carries the FORGE-BUG-042 written_at change, which landed in 1.6.13 without a migration entry: written_at is store-owned and stamped at set-summary time, removed from the summary output contract in 8 base-pack and 9 meta workflow prompts.",
    "target": "workflows:plan_task,workflows:implement_plan,workflows:validate_task,workflows:review_plan,workflows:review_code,workflows:architect_approve,workflows:commit_task,workflows:collator_agent,workflows:sprint_retrospective,workflows:triage,workflows:migrate_structural,personas:all,tools:substitute-placeholders,tools:check-placeholders,workflows-js:wfl-run-task",
    "regenerate": [
      "workflows:plan_task",
      "workflows:implement_plan",
      "workflows:validate_task",
      "workflows:review_plan",
      "workflows:review_code",
      "workflows:architect_approve",
      "workflows:commit_task",
      "workflows:collator_agent",
      "workflows:sprint_retrospective",
      "workflows:triage",
      "workflows:migrate_structural",
      "personas:all",
      "tools:substitute-placeholders",
      "tools:check-placeholders",
      "workflows-js:wfl-run-task"
    ],
    "breaking": false,
    "manual": [
      "Run /forge:update, then /forge:rebuild to re-materialize workflows and personas. Existing projects carry the unsubstituted {SYNTAX_CHECK}/{BUILD_COMMAND} tokens in .forge/workflows/implement_plan.md until they do; verify afterwards with `node .forge/tools/check-placeholders.cjs .forge/workflows .forge/personas` (exit 0 = clean).",
      "If you route models per phase, note that validate is now sonnet-tier and commit/writeback haiku-tier in both the wfl-run-task driver and the forge-cli pipeline config. Override via pipelines.<name>.phases.<role>.model-override."
    ]
  },
  "1.6.12": {
    "version": "1.6.13",
    "date": "2026-07-19",
    "notes": "Token-metric truthfulness. (1) Pricing (lib/pricing.cjs): family-tier string matching — any model naming 'opus'/'sonnet'/'haiku' that isn't an explicitly-listed generation is now priced at its family tier (claude-opus/claude-sonnet/claude-haiku catch-alls) instead of canonicalizing to null and reporting a misleading $0.00. Fixes claude-sonnet-5 / claude-haiku-4-5 showing $0.00 in COST_REPORT despite hundreds of millions of cache-read tokens. Models with no recognised family word (e.g. gpt-*) still return null — no false pricing. (2) New optional token field `contextTokens` on event + event-sidecar schemas: the PEAK (high-water) per-turn context-window size (max of input+cacheRead+cacheWrite over turns), a NON-cumulative size metric. store-cli record-usage gains `--context-tokens`; forge-usage-report computes the peak from Claude-Code Workflow transcripts; collate surfaces a new 'Context (peak)' column in Per-Task / Per-Role / Model Split / bug Cost tables. Rationale: cumulative cacheReadTokens re-counts the same cached prefix on every turn and balloons to tens of millions — a billing quantity, not a context-size quantity, and not comparable to Claude Code's per-agent token figure. Additive/backward-compatible: contextTokens is optional; old events/sidecars without it still validate. New tests across pricing/store-cli/forge-usage-report/collate.",
    "target": "schemas:event,schemas:event-sidecar,tools:store-cli,tools:collate,tools:forge-usage-report,tools:lib:pricing",
    "regenerate": [
      "schemas:event",
      "schemas:event-sidecar",
      "tools:store-cli",
      "tools:collate",
      "tools:forge-usage-report",
      "tools:lib:pricing"
    ],
    "breaking": false,
    "manual": [
      "Run /forge:update to refresh the schemas and cost tooling. contextTokens is populated on new runs only — historical events lack it and render blank in the Context (peak) column (cumulative Cache Read is still shown). No store migration required."
    ]
  },
  "1.6.11": {
    "version": "1.6.12",
    "date": "2026-07-13",
    "notes": "Fix: the review-code workflow told the supervisor subagent to write its summary sidecar with `artifact:\"review-impl-summary\"` (REVIEW-IMPL-SUMMARY.json) and then register it via `forge_store set-summary ... code_review`, which auto-resolves the sidecar for phase `code_review` to REVIEW-CODE-SUMMARY.json (PHASE_TO_KIND['code_review']='review-code-summary'). The two filenames never matched, so set-summary silently re-ingested the STALE round-1 sidecar (verdict 'revision') and returned OK — the freshly-written 'approved' verdict in REVIEW-IMPL-SUMMARY.json was orphaned (no VALID_SUMMARY_PHASES entry maps to it) and never reached record.summaries.code_review.verdict. The orchestrator then read the stale 'revision', burned the review-code revision cap, and halted — deterministically, on every approving review after a prior revision round, since the stale REVIEW-CODE-SUMMARY.json persisted and could never be overwritten via the instructed path (WI-S48-T01 systemic halt; reproduce: any review-code task that approves after round 1 returned revision). Also corrected the JSON-shape example in the same Emit-Summary step: it used `findings` (an optional schema field) where `key_changes` is REQUIRED by PHASE_SUMMARY_SCHEMA / artifact.cjs SUMMARY_REQUIRED — a summary with only `findings` fails set-summary validation, sending the subagent down a wrong retry path. The meta source `meta-review-implementation.md` now instructs `artifact:\"review-code-summary\"` and the `key_changes`-required field, matching PHASE_TO_KIND. New regression test (phase-workflow-guards.test.cjs :: summary-sidecar-kind-consistency) asserts every summary-emitting workflow's forge_artifact summary kind equals PHASE_TO_KIND[<set-summary phase key>], so this class of sidecar/set-summary divergence cannot recur silently.",
    "target": "workflows:review_code",
    "regenerate": [
      "workflows:review_code"
    ],
    "breaking": false,
    "manual": [
      "Run /forge:update (or /forge:rebuild workflows:review_code) to refresh the review-code workflow. Projects with a task currently halted at the review-code revision cap should, after updating, reset the pipeline to the review-code phase and re-run: `4ge reset <TASK-ID> --to review-code` — the next review pass now writes the approved verdict to the sidecar that set-summary actually reads, so the verdict reaches the store and the pipeline advances. No store or KB migration is required; existing REVIEW-IMPL-SUMMARY.json sidecars are inert orphans and can be deleted."
    ]
  },
  "1.6.10": {
    "version": "1.6.11",
    "date": "2026-07-13",
    "notes": "Removed the misleading 'Verdict Detection' / 'orchestrator branches on this' Generation Instructions from the review workflow metas (review_plan, review_code, validate, review_sprint_completion). These developer-facing meta instructions falsely claimed the orchestrator branches on the literal `**Verdict:**` markdown line in review artifacts; in reality all verdict routing reads schema-validated store summaries (record.summaries.<key>.verdict, or task.status for approve) via read-verdict.cjs — the markdown `**Verdict:**` line is a human breadcrumb only, never parsed by any gate. The generated workflow output is unchanged (the false claims were never emitted into .forge/workflows/*.md — only the step-4 `**Verdict:**` format instruction and the store-summary guidance ship, both of which are retained). Also corrected the stale base-pack-byte-budget assertion message that said 'downstream preflight gates parse only this exact form', and added an explicit test-justified retention rationale to the read-verdict.cjs unknown-phase underscore fallback (covered by read-verdict.test.cjs). Closes Entelligentsia/forge#113.",
    "target": "workflows:review_plan,workflows:review_code,workflows:validate_task,workflows:architect_review_sprint_completion",
    "regenerate": [
      "workflows:review_plan",
      "workflows:review_code",
      "workflows:validate_task",
      "workflows:architect_review_sprint_completion"
    ],
    "breaking": false,
    "manual": [
      "No behaviour change. Run /forge:update to refresh the four named review workflows (content is identical — the misleading developer-facing Generation Instructions were never emitted into generated output); or skip it — no store or KB migration is required."
    ]
  },
  "1.6.9": {
    "version": "1.6.10",
    "date": "2026-07-02",
    "notes": "seed-store.cjs now always lays down the store skeleton: it writes a COLLATION_STATE.json baseline (with the actual seeded sprint/task/bug counts, featureCount 0) even when zero entities are present. Before this, a fresh /forge:init on a project with no pre-existing sprints/tasks/bugs left .forge/store/ entirely absent — seed-store no-oped ('Seeded: 0 sprint(s)...') because the store dir was only ever created lazily by Store.writeSprint/Task/Bug. The result was an inconsistent post-init state: Phase 4 appended .forge/store/events/ to .gitignore for a directory that did not exist, and there was no collation watermark until the first /forge:collate. Reads already degraded gracefully (store-cli list -> [], validate-store -> passed) and writes self-created the store, so this was low-severity, but init now leaves a consistent store. --dry-run is unchanged (writes nothing). The next real /forge:collate overwrites the baseline with live counts.",
    "target": "tools:seed-store",
    "regenerate": [
      "tools"
    ],
    "breaking": false,
    "manual": [
      "Run /forge:update (or /forge:rebuild tools) to re-vendor .forge/tools/seed-store.cjs. No store or KB migration is required — existing projects already have a COLLATION_STATE.json once they have collated. Projects initialised before this fix that never ran /forge:collate will simply gain the baseline on their next collate; no manual action needed."
    ]
  },
  "1.6.8": {
    "version": "1.6.9",
    "date": "2026-07-01",
    "notes": "FORGE-S35-T06 (Slice 5): named release of the reconciled /forge:init step-machine (FEAT-011, Slices 0-4). No .cjs/.js logic change in this task — the version bump IS the deliverable: it draws the release boundary around the frozen 10-doc KB contract (1.6.5), the per-step Phase-2 substance fragments (1.6.6), the confident not-applicable stub + widened verify gate (1.6.7), and the wfl-init.js Phase-2 fragment convergence (1.6.8). The forge-cli payload is re-vendored so dist/forge-payload matches 1.6.9 plugin source and forge.bundledVersion is bumped 1.6.5 -> 1.6.9 to close the two-layer drift (BUG-019 bundledVersion == manifest forge_version gate). Backwards-compat: non-breaking; the underlying init/verify behaviour already shipped across 1.6.5-1.6.8 — this entry consolidates them under one migratable release and refreshes the vendored bundle.",
    "target": "init:phase-2-discover,tools:verify-phase,schemas:payload-manifest",
    "regenerate": [
      "tools"
    ],
    "breaking": false,
    "manual": [
      "Run /forge:update (or /forge:rebuild tools) to re-vendor the 1.6.9 tools bundle. No store or KB migration is required beyond the 1.6.5-1.6.8 chain already applied; this release pins the version boundary, refreshes the forge-cli payload, and flips the payload-manifest init/phases select to recursive so the Slice-2 phase-2/ substance fragments vendor into .forge/init/phases/phase-2/ (wfl-init.js references phase-2/index.md and phase-2/context.md literally)."
    ]
  },
  "1.6.7": {
    "version": "1.6.8",
    "date": "2026-07-01",
    "notes": "FORGE-S35-T05 (Slice 4): converge the markdown-workflow init driver (init/base-pack/workflows-js/wfl-init.js) onto the shared Phase-2 fragment set, matching what forge-cli's run-init-pipeline.ts already does. Before this, every Phase-2 subagent prompt in wfl-init.js told the agent to read the whole init/phases/phase-2-discover.md fat rulebook 'for the full doc spec for {docId}' — so a weak model saw all 10 doc specs plus the index/context/scaffold steps and could execute the wrong one; and all 10 KB docs fanned out in a single parallel() wave. Now: the kb-doc prompt composes the SHARED procedure init/generation/generate-kb-doc.md + its OWN init/phases/phase-2/<name>.md substance fragment + a trailing <!-- AGENT PARAMS --> block (role/docId/kbFolder/isoTimestamp); the index and context prompts likewise repoint at phase-2/index.md and phase-2/context.md; the gate agent inlines the scaffold mkdir/touch commands instead of reading phase-2-discover.md Step 2 — phase-2-discover.md is no longer read by any Phase-2 prompt. The KB-doc fan-out now runs in two cross-reference waves per the init-step-machine ADR §5: Wave A = the 8 leaf docs, then Wave B = the 2 derived docs (architecture/stack-checklist ← stack,testing; business-domain/domain-concepts ← domain-model) selected BY DOC NAME via KB_DOC_IDS.filter() (never an array slice, which would mis-partition the interleaved order), each wave keeping the JS-held retry-once cap and failedDocs halt. KB_DOC_IDS and the verify-phase --phase 2 10-doc contract are unchanged (kb-doc-contract drift guard stays green). forge-cli keeps its single 10-doc wave for now; reconciling it to the same 8+2 layout is a deferred follow-up. Backwards-compat: no store/schema/hook change; regenerating vendored tools/workflows via /forge:rebuild picks up the new driver.",
    "target": "init:workflows-js:wfl-init",
    "regenerate": [
      "tools"
    ],
    "breaking": false,
    "manual": [
      "Run /forge:update (or /forge:rebuild tools workflows-js) to re-vendor the converged init driver. This only affects the markdown-workflow /forge:init path; no store or KB migration is required. Behaviour is equivalent — the same 10 KB docs are produced — but each Phase-2 subagent now sees only its own doc's fragment, and the 2 derived docs are generated in a second wave after their referenced leaves."
    ]
  },
  "1.6.6": {
    "version": "1.6.7",
    "date": "2026-07-01",
    "notes": "FORGE-S35-T04 (Slice 3): make the fixed 10-doc KB surface always materialize — an absent topic becomes a CONFIDENT not-applicable stub, and the Phase-2 verify gate enforces substantive-OR-not-applicable while keeping completeness advisory. Before this, each Phase-2 substance fragment ended its 'Not applicable' clause with 'set confidence low/accordingly' (contradicting the policy that an absent topic is a certainty), generate-kb-doc.md never spelled the stub format out, and verifyPhase2 in verify-phase.cjs only checked existence + a confidence-header token — a header-only/empty doc passed. Now: all 10 stub-bearing fragments (stack, processes, routing, database, testing, deployment, entity-model, stack-checklist, domain-model, domain-concepts) prescribe the confident stub — header line `<!-- AUTO-GENERATED by /forge:init — confidence: 100% — status: not-applicable -->` + `# Heading` + the one-sentence absence statement; generate-kb-doc.md documents that shape authoritatively (Rule 3); and verifyPhase2 rejects a doc that carries a confidence header but no `status: not-applicable` marker AND no non-empty body after the header. No confidence-percentage hard gate and no entity-count bar are introduced — an entity-less/library project passes. index.md and context.md carry no absent-topic stub and are unchanged. wfl-init.js is intentionally left intact (its repoint is Slice 4). Backwards-compat: a KB carrying header-only empty stubs with no `status: not-applicable` marker now FAILS --phase 2 until re-materialized with the marker or a body.",
    "target": "tools:verify-phase,init:generation:generate-kb-doc,init:phases:phase-2",
    "regenerate": [
      "tools"
    ],
    "breaking": false,
    "manual": [
      "Run /forge:update (or /forge:rebuild tools) to receive the updated verify-phase.cjs gate, the confident not-applicable stub policy in the init/phases/phase-2/ fragments, and the generate-kb-doc.md stub documentation. If your KB carries header-only empty stubs (a confidence header but no body and no `status: not-applicable` marker), re-run /forge:init KB materialization so each absent-topic doc gains the marker or a body — otherwise verify-phase --phase 2 will fail."
    ]
  },
  "1.6.5": {
    "version": "1.6.6",
    "date": "2026-07-01",
    "notes": "FORGE-S35-T03 (Slice 2): split the fat Phase-2 rulebook into per-step substance fragments so each /forge:init discovery subagent sees ONLY its own docId's work. Before this, the forge-cli native init pipeline (run-init-pipeline.ts) preloaded the entire init/phases/phase-2-discover.md rulebook and injected it verbatim into every Phase-2 subagent (10 kb-doc + index + context), differentiated only by a trailing AGENT PARAMS block — a weak model read the whole rulebook and executed all of it. Now: generate-kb-doc.md is confirmed as the SHARED procedure (write path, confidence header, verify-back, not-applicable stub) with a composition preamble; 12 new substance fragments live under init/phases/phase-2/ (10 KB_DOC_ID basenames + index + context), each carrying its topic focus, which Phase-1 discovery input to read, its required output, a not-applicable stub, and a unique <!-- kb-doc-fragment: <name> --> marker. The dispatcher (init-phase-dispatch.ts) gains readInitSharedProcedure + readInitPhase2Fragment (throw-on-missing); run-init-pipeline.ts sets the Phase-2 base = shared procedure and each step's buildPrompt appends its OWN fragment + params — phase-2-discover.md is no longer injected into any subagent. build-payload.cjs's single-level .md-only INIT_RULEBOOK_DIRS walk gained one-level recursion so the new phase-2/ subdir lands in the bundle (12 fragments copied). Scope: phase-2-discover.md and wfl-init.js are intentionally left intact — the wfl-init.js workflow-port repoint onto these fragments is Slice 3; the KB_DOC_IDS / verify-phase 10-doc contract is unchanged. Backwards-compat: no break; the fragment tree ships via the payload bundle, not generation.",
    "target": "init:phases:phase-2,init:generation:generate-kb-doc",
    "regenerate": [],
    "breaking": false,
    "manual": [
      "Run /forge:update to receive the new init/phases/phase-2/ substance-fragment tree and the generate-kb-doc.md composition preamble. This only affects the forge-cli native /forge:init pipeline; no store or KB migration is required. The wfl-init.js markdown workflow port still reads phase-2-discover.md and is repointed onto these fragments in a later slice."
    ]
  },
  "1.6.4": {
    "version": "1.6.5",
    "date": "2026-07-01",
    "notes": "FORGE-S35-T01: freeze ONE shared 10-doc KB contract across the Phase-2 verify gate and both init fan-out drivers, closing a three-way drift. Before this, verify-phase.cjs ARCH_DOCS listed 7 architecture-only docs and hardcoded an 'architecture/' path prefix; wfl-init.js KB_DOC_IDS listed a different 7 (with two business-domain/ docs); and init/phases/phase-2-discover.md's doc-spec table mis-pathed entity-model (under business-domain/) and stack-checklist (at KB root). The widened gate now checks 10 canonical docIds — architecture/{stack,processes,routing,database,testing,deployment,entity-model,stack-checklist} + business-domain/{domain-model,domain-concepts} — resolving each prefix-agnostically as {kbPath}/{docId}.md and additionally requiring a confidence-header token (/confidence:\\s*\\d+%/i, matching both in-tree AUTO-GENERATED header forms; not-applicable stubs still satisfy). wfl-init.js KB_DOC_IDS and forge-cli run-init-types.ts KB_DOC_IDS are synced byte-identical to the gate's ARCH_DOCS, so each fan-out agrees with its own line-327 gate; a new drift-guard test (tools/__tests__/kb-doc-contract.test.cjs) pins all three arrays to the canonical order. phase-2-discover.md's table is corrected (option B) to the canonical {KB_PATH}/{docId}.md paths with updated counts — keeping it the live interim path authority for both fan-out drivers; its removal + per-step fragments are deferred to FORGE-S35-T03. Backwards-compat: a pre-existing KB carrying only the old 7 docs (or the mis-relocated entity-model/stack-checklist paths) now fails --phase 2 until re-run; entity-model is homed under architecture/ per FEAT-011.",
    "target": "tools:verify-phase,workflows-js:wfl-init,init:phases:phase-2-discover",
    "regenerate": [
      "tools",
      "workflows-js"
    ],
    "breaking": false,
    "manual": [
      "Run /forge:update, then /forge:rebuild tools workflows-js to re-vendor .forge/tools/verify-phase.cjs and refresh the init driver. Existing projects whose KB predates the 10-doc contract (only 7 docs, or entity-model/stack-checklist at the old paths) will fail /forge:health Phase-2 verify until the missing docs are generated at the canonical architecture/ + business-domain/ paths — re-run /forge:init discovery or author them by hand."
    ]
  },
  "1.6.3": {
    "version": "1.6.4",
    "date": "2026-06-28",
    "notes": "Fix dead vendored reference to forge-usage-report.cjs (FORGE-BUG-030/036 MODULE_NOT_FOUND class). The tool was added at 1.6.3 (2026-06-21) and registered in schemas/structure-manifest.json, and init/base-pack/workflows-js/wfl-fix-bug.js, wfl-run-task.js, and wfl-run-sprint.js reference it, but it was missing from payload-manifest.json's tools selection. build-payload.cjs therefore did not copy it into the default payload, leaving bootstrapped projects with a dead .forge/tools/forge-usage-report.cjs reference (caught by the forge-cli vendored-refs gate) and a runtime MODULE_NOT_FOUND risk. Added forge-usage-report.cjs to the tools include list. Also regenerated integrity.json, structure-manifest.json, and enum-catalog.json, which had drifted to version 1.6.2 while plugin.json was at 1.6.3.",
    "target": "schemas:payload-manifest",
    "regenerate": [],
    "breaking": false,
    "manual": []
  },
  "1.6.2": {
    "version": "1.6.3",
    "date": "2026-06-21",
    "notes": "Fix postflight-gate false-halt on slugged artifact directories. The postflight gate's buildSubstitutions reconstructed the artifact dir from bare IDs (sprints/<sprintId>/<taskId>), so on projects whose on-disk dirs carry slugs (sprintId 'S39' -> 'sprint_39_helpdesk_front_door', taskId 'WI-S39-T01' -> 'WI-S39-T01-inbound-email-threading') it looked for PLAN.md at engineering/sprints/S39/WI-S39-T01/ and reported output-missing for an artifact that existed at the slug path — halting a pipeline whose plan phase succeeded. The plan phase, forge_artifact, and the preflight gate all resolve via the task record's authoritative `path` field, but postflight did not, so the two gates disagreed for every phase. postflight now derives {sprint}/{task} from rec.path using the same deriveSprintTaskFromArtifactPath helper the preflight gate already uses (prepending the `sprints/` segment per postflight's {sprint} convention), and falls back to ID reconstruction only when no usable path is present. Single fix covers every phase (plan/implement/review/validate/approve/commit) since they share one substitution map.",
    "target": "tools:postflight-gate",
    "regenerate": [],
    "breaking": false,
    "manual": [
      "After /forge:update, re-run any task that false-halted with 'output-missing: artifact absent: engineering/sprints/<ID>/<ID>/PLAN.md' — the artifact already exists at the slug path and the gate now finds it."
    ]
  },
  "1.6.1": {
    "version": "1.6.2",
    "date": "2026-06-21",
    "notes": "Fix wfl:run-task spurious escalation at commit. The driver's hardcoded default pipeline mapped the `writeback` phase to update_implementation.md — the engineer's revision-applier, which sets task status back to 'implemented'. Running after `approve` (status='approved'), writeback reset the status, then the `commit` phase (commit-task.cjs requires status 'approved') tripped its precondition and escalated the task. writeback is the COLLATOR phase per meta-orchestrate (role->persona: writeback->collator); it now correctly maps to collator_agent.md, which writes markdown KB views + WRITEBACK-SUMMARY.json only and does NOT change task status — so commit still sees 'approved'. Also corrects the driver's ROLE_TO_NOUN and banner map for writeback (engineer -> collator).",
    "target": "workflows-js:wfl-run-task",
    "regenerate": [],
    "breaking": false,
    "manual": []
  },
  "1.6.0": {
    "version": "1.6.1",
    "date": "2026-06-21",
    "notes": "MCP reliability + Workflow token accounting. (1) The vendored MCP server now spawns its cjs tools via process.execPath (absolute path of the running node) instead of bare \"node\" — fixes `spawn node ENOENT` that killed all 12 cjs-wrapper tools when Claude Code launched the stdio server with a PATH lacking node (NVM/fnm/volta/asdf or any restricted env). (2) resolveProjectRoot() now validates CLAUDE_PROJECT_DIR is a real directory before trusting it, falling back to cwd — fixes a misleading ENOENT when an unexpanded ${projectRoot} token reached execFile's cwd. (3) The init .mcp.json template drops the broken env.CLAUDE_PROJECT_DIR block (Claude Code injects CLAUDE_PROJECT_DIR itself). (4) The code-orchestrated JS drivers (wfl-run-task/run-sprint/fix-bug) migrated their subagent-prompt call-sites from Bash node .forge/tools/*.cjs to mcp__forge__* tool calls; the mcp-callsite gate now also scans the workflows-js drivers (T07 blind spot). wfl-init stays on Bash (it runs before the MCP server exists). (5) Removed the dead per-phase merge-sidecar dispatch (its pi-runtime writer does not exist in the Workflow path); added forge-usage-report.cjs — a deterministic no-LLM tool that reconciles per-phase token cost from the Workflow transcript onto COMPLETE events before collate, wired into all three orchestration drivers.",
    "target": "mcp:server,init:.mcp.json,workflows-js:wfl-run-task,workflows-js:wfl-run-sprint,workflows-js:wfl-fix-bug,tools:forge-usage-report",
    "regenerate": [],
    "breaking": false,
    "manual": [
      "After /forge:update, restart Claude Code so the forge MCP server reloads with the spawn + project-root fixes.",
      "Re-running `4ge init claude .` refreshes the .mcp.json template (drops the unused env block) — existing projects keep working via the server's cwd fallback."
    ]
  },
  "1.5.1": {
    "version": "1.6.0",
    "date": "2026-06-20",
    "notes": "FORGE-S34: MCP tool surface. A vendored stdio MCP server (forge/forge/mcp/server.cjs) exposes all 14 forge_* tools to Claude Code. 4ge init claude . writes an idempotent project-scoped .mcp.json; model-facing markdown (commands, workflows, skills, personas) migrated from Bash/node .forge/tools/*.cjs call-sites to mcp__forge__* invocations. forge_ask_user reimplemented over MCP elicitation; forge_markdown carries its remark/mdast engine in the bundle. On first run after /forge:update, Claude Code prompts to approve the forge MCP server.",
    "target": "mcp:server,init:.mcp.json,commands:*,workflows:*,skills:*,personas:*",
    "regenerate": [
      "commands:*",
      "workflows:*",
      "skills:*",
      "personas:*"
    ],
    "breaking": false,
    "manual": [
      "After /forge:update, restart Claude Code and approve the 'forge' MCP server when prompted (project-scoped .mcp.json).",
      "The forge_* tools are now available as mcp__forge__* — commands and workflows have been updated to use them automatically."
    ]
  },
  "1.5.0": {
    "version": "1.5.1",
    "date": "2026-06-19",
    "notes": "Store-read token efficiency. (1) store-cli.cjs `read` gains a `--format flat` mode that emits non-JSON `key: value` lines (nested objects → dotted keys, primitive arrays → comma-joined, object arrays → indexed dotted keys) — a token-efficient alternative to JSON for whole-record reads; honours existing `--fields`/`--no-summaries` projection; default read and `--json` behaviour are unchanged (back-compat). (2) The six phase-gate workflows (plan_task, review_plan, implement_plan, review_code, validate_task, architect_approve) now read task state with `--fields status` instead of `--json` — projecting only the field the state check needs instead of pulling the whole record (~2,100 → ~7 tokens on a fat task record with summaries). No store-record or schema change; status-gate semantics are identical.",
    "target": "tools:store-cli,workflows:plan_task,workflows:review_plan,workflows:implement_plan,workflows:review_code,workflows:validate_task,workflows:architect_approve",
    "regenerate": [
      "workflows:plan_task",
      "workflows:review_plan",
      "workflows:implement_plan",
      "workflows:review_code",
      "workflows:validate_task",
      "workflows:architect_approve"
    ],
    "breaking": false,
    "manual": []
  },
  "1.4.13": {
    "version": "1.5.0",
    "date": "2026-06-11",
    "notes": "FORGE-S32-T07: plugin v1.5.0 — shim-only sunset release. The stable skillforge marketplace channel stops being a parallel distribution mechanism and becomes a one-way migration ramp to the CLI-first install (npm @entelligentsia/forgecli, the 4ge binary). NEW forge/forge/tools/apply-plugin-shim.cjs is a release-branch shim-overlay generator (sibling of rewrite-plugin-urls.cjs): it overwrites the release-branch forge/forge/commands/*.md with two template tiers — a FULL consent-gated migration shim for init/update/rebuild (migration explanation + node/npm preflight + prose-only consent-gated `npm i -g @entelligentsia/forgecli && 4ge init claude .` offer + print-only fallback) and a SHORT redirect notice ('run /forge:init to migrate') for every other command — then regenerates integrity.json so /forge:health verification still passes on plugin installs. CRITICAL: the shim is a RELEASE-BRANCH OVERLAY only; main's forge/forge/commands/ stays the real unified T06 tree because build-payload.cjs copies it verbatim into the CLI npm bundle — shimming main would poison the CLI payload. The tool refuses to apply without --target release (mirrors rewrite-plugin-urls --target discipline). README + skillforge marketplace listing are rewritten CLI-first; the marketplace appears only as a deprecation/migration note. The forge-releaser ritual wires apply-plugin-shim into Step 2 on the release branch and makes the build-payload-from-main + verify-publish gate explicit. The dual-path code strip and the retirement of apply-plugin-shim.cjs itself are deferred to S34 (mechanical). No store-record or schema migration; installed, already-bootstrapped projects keep their materialized .claude/commands/forge/ and converge on the next 4ge update / re-bootstrap (idempotent — preserves config/store/KB).",
    "target": "tools:apply-plugin-shim,commands:release-shim-overlay,release:plugin-sunset",
    "regenerate": [],
    "breaking": false,
    "manual": [
      "The Forge marketplace plugin is being sunset. Migrate to the CLI-first install: `npm i -g @entelligentsia/forgecli` then `4ge init claude .` in your project. The migration is idempotent and preserves .forge/config.json, .forge/store/** and your knowledge-base folder. On the v1.5.0 plugin, running /forge:init (or /forge:update / /forge:rebuild) walks you through this migration with explicit consent."
    ]
  },
  "1.4.12": {
    "version": "1.4.13",
    "date": "2026-06-11",
    "notes": "FORGE-S32-T06: command-tree unification. The two payload command trees were collapsed into one. forge/forge/commands/ is now the single source of truth for ALL /forge:* commands: the 14 non-colliding base-pack sprint-workflow shims (approve, collate, commit, fix-bug, implement, new-sprint, plan, plan-sprint, retro, review-code, review-plan, run-sprint, run-task, validate) were folded in, and the three former-collision winners (init, check-agent, enhance) overwrite the plugin copies with the base-pack winner bytes. forge/forge/init/base-pack/commands/ was deleted AND build-base-pack.cjs no longer regenerates it (Section-5 command-generation loop + expectedFiles 'Commands (16)' block removed). The payload manifest drops its init/base-pack/commands entry; build-payload bundles one commands/ tree and base-pack/ no longer carries a commands/ subdir; bootstrap copies one directory with no union/collision ordering; registerAllForgeCommands enumerates dist/forge-payload/commands/ (forge:reset added to EXPLICITLY_REGISTERED_NAMES so the repoint introduces no new auto-stub). Installed .claude/commands/forge/ is byte-for-byte identical to the prior union output (AC3 parity preserved) and the frozen expected-install-set.json drops the 17 vendored .forge/.base-pack/commands/*.md entries. Plugin-channel semantic delta: the plugin-served init/check-agent/enhance bytes change to the base-pack winners; the plugin channel is retired at T07. See doc/decisions/command-model.md. No store-record migration; existing projects keep their installed commands and converge on the next 4ge update / re-bootstrap (idempotent).",
    "target": "commands:*,init:base-pack:commands:*,payload-manifest:commands,tools:build-base-pack,tools:substitute-placeholders,tools:build-manifest",
    "regenerate": [],
    "breaking": false,
    "manual": []
  },
  "1.4.11": {
    "version": "1.4.12",
    "date": "2026-06-11",
    "notes": "FORGE-S32-T05: dead-payload trim via manifest. Removed the four superseded init/generation orchestrator placeholders (generate-knowledge-base.md, generate-personas.md, generate-skills.md, generate-templates.md) — each had zero live runtime citation (only historical vision/ docs + migration notes); the live per-subagent rulebooks generate-{commands,kb-doc,persona,skill,template,tools,workflows}.md are retained and the payload-manifest init/generation entry now carries an explicit curated include list. On the builder side (forge-cli) the dead build-payload Pass-1 substitute-placeholders bundle-root output (personas/skills/workflows/templates/) and its --include-full restore branch were removed; runtime re-substitutes from .base-pack/ at init Phase 3b, so that output was never consumed. DELIBERATELY RETAINED (audit verdicts refuted, reconciled): the non-dot schemas/ mirror (health.md/update.md read $FORGE_ROOT/schemas/ with no .schemas/ fallback in both plugin and fallback $FORGE_ROOT modes), schemas/structure-manifest.json (check-structure.cjs reads it via /forge:health step 8 with no --forge-root against installed projects), and the tools/lib store-{nlp,query-exec,facade}.cjs facades (required by store-query.cjs). No store-record migration; existing installs keep their generation copies until /forge:update narrows them.",
    "target": "payload:init/generation-trim,build-payload:pass1-removed",
    "regenerate": [],
    "breaking": false,
    "manual": []
  },
  "1.4.10": {
    "version": "1.4.11",
    "date": "2026-06-11",
    "notes": "FEAT-009 T03: new /forge:reset command + reset-plan.cjs tool — a guardrailed, NLP-backed pipeline-state reset. reset-plan.cjs is a pure, read-only PLANNER: given a task/bug/sprint and a target phase it computes the status transition(s) plus cross-entity referential-integrity warnings (committed-work git divergence, parent-sprint incoherence, dependents resting on rewound work, and sprint cascade of transitive dependents) WITHOUT mutating the store. The /forge:reset command interprets a natural-language request, runs the planner, presents the transitions + integrity implications, requires explicit confirmation, then applies via store-cli update-status --force. Complements forge-cli's deterministic `4ge reset` (single-entity task/bug). New tool + command; structure-manifest/enum-catalog/integrity regenerated. No store-record migration.",
    "target": "commands:reset,tools:reset-plan",
    "regenerate": [],
    "breaking": false,
    "manual": []
  },
  "1.4.9": {
    "version": "1.4.10",
    "date": "2026-06-11",
    "notes": "FORGE-BUG-047: store.cjs FSImpl.writeFeature() read data.feature_id, but feature records key on `id` (matching the schema, the store-cli template, and every FEAT-00x record; writeTask uses data.taskId and writeBug uses data.bugId correctly). data.feature_id was always undefined, so writes misfiled to features/undefined.json — features could not be created or updated through the sanctioned store-cli gateway at all, and store-cli reported exit 0 so the failure was silent. The pre-existing store.test.cjs round-trip used a mock store keyed on yet another name (data.featureId), so it never exercised the real FSImpl and never caught this. Fix: writeFeature now reads data.id; a new real-FSImpl round-trip test (write by id, read back, assert no features/undefined.json) locks it. Tool fix; no store-record migration.",
    "target": "tools:store",
    "regenerate": [],
    "breaking": false,
    "manual": []
  },
  "1.4.8": {
    "version": "1.4.9",
    "date": "2026-06-11",
    "notes": "FORGE-BUG-045: payload-manifest.json's integrity.json entry declared install:'.forge/' but is never vendored into a bootstrapped project's .forge/ tree — the historical bootstrap only HASHES payloadRoot/integrity.json for the .bootstrap-manifest.json integrity field, never installs it. It is bundle-only (shipped to dist/forge-payload/integrity.json for verify-integrity.cjs forge-root resolution). This was the last over-broad-install entry missed by the FORGE-BUG-044 sweep; a manifest-driven bootstrap honouring install (FORGE-S32-T03) would install a phantom .forge/integrity.json, breaking AC4 byte-parity. Fix: the entry now declares bundleOnly:true and drops install (validating against the existing bundleOnly if/then/else contract from FORGE-BUG-044 — no schema or checker code change); a regression-lock test pins the corrected entry. Declarative data correction; no store-record migration.",
    "target": "schemas:payload-manifest",
    "regenerate": [],
    "breaking": false,
    "manual": []
  },
  "1.4.7": {
    "version": "1.4.8",
    "date": "2026-06-10",
    "notes": "FORGE-BUG-044: payload-manifest.json declared install:'.forge/schemas/' for the schemas/transitions dir entry and the migrations.json file entry, but neither is ever vendored into a bootstrapped project's .forge/schemas/ (they are bundle-only — shipped to dist/forge-payload/.schemas/ for transition-guard.ts / migration-engine.ts resolution). A manifest-driven bootstrap honouring install (FORGE-S32-T03) would have installed >=4 phantom files, breaking AC4 byte-parity. Fix: NEW bundleOnly boolean in payload-manifest.schema.json with a draft-07 if/then/else contract (install forbidden when bundleOnly:true, else required; install dropped from base required[]); the two entries now declare bundleOnly:true and drop install; check-payload-manifest.cjs gains a bundle-only self-consistency pass (inconsistencies[] folded into ok + CLI exit) so the over-broad install field cannot recur. Declarative + tooling-enforced; no store-record migration.",
    "target": "schemas:payload-manifest,tools:check-payload-manifest",
    "regenerate": [],
    "breaking": false,
    "manual": []
  },
  "1.4.6": {
    "version": "1.4.7",
    "date": "2026-06-10",
    "notes": "Declarative payload manifest + source-drift check (FORGE-S32-T02). NEW forge/forge/payload-manifest.json names every shipped artifact (source -> bundle -> install -> removal owner), spec'd by NEW forge/forge/schemas/payload-manifest.schema.json, replacing the implicit contract previously spread across build-payload.cjs / bootstrap.ts / uninstall.ts hand-maintained copy lists (the FORGE-BUG-030/036 MODULE_NOT_FOUND class). NEW forge/forge/tools/check-payload-manifest.cjs is a CI-only dev tool (not vendored to instances) that exits non-zero on a missing source or an orphan file under a recursive payload tree; wired into plugin-ci.yml. The three forge-cli consumers are rewired to read the manifest in FORGE-S32-T03. build-manifest.cjs DEV_ONLY_TOOLS now excludes check-payload-manifest.cjs; structure-manifest.json regenerated to list the newly-vendored payload-manifest.schema.json.",
    "target": "tools:check-payload-manifest,schemas:payload-manifest,schemas:structure-manifest,tools:build-manifest",
    "regenerate": [],
    "breaking": false,
    "manual": []
  },
  "1.4.5": {
    "version": "1.4.6",
    "date": "2026-06-09",
    "notes": "Security hardening of the forge-permissions auto-approver (forge-engineering#42). The Bash auto-allow patterns were unanchored command prefixes (`cat *`, `cp *`, `gh issue *`, `git push *`, `node .../tools/*`), so a prompt-injected agent could read a secret and exfiltrate/execute it with no permission prompt. Patterns are now anchored to their argument shape: `cat`/`cp` only within `.forge/`/`engineering/`, `node` tools only from a trusted Forge root ($FORGE_ROOT/$CLAUDE_PLUGIN_ROOT, plugin cache, or a /.forge path), `gh issue` only against the current repo (no -R/--repo), `git push` only to a named remote (no explicit http(s)/ssh/git/file URL). A non-match falls through to Claude Code's normal permission flow (the human is asked) — it never blocks. Legit in-tree Forge workflow commands still auto-allow, so no new prompt storm. New test forge/hooks/__tests__/forge-permissions.test.cjs pins both directions.",
    "target": "hooks:forge-permissions",
    "regenerate": [],
    "breaking": false,
    "manual": [
      "Run /forge:update to pick up the hardened forge-permissions hook. Interactive Claude Code sessions may now see a one-time permission prompt for commands outside the Forge working set (e.g. reading files outside .forge/, pushing to an explicit remote URL) — approve as normal. Autonomous forge-cli (pi) runs are unaffected (pi has no permission gate)."
    ]
  },
  "1.2.21": {
    "version": "1.3.0",
    "date": "2026-06-07",
    "notes": "CLI-first bootstrap: /forge:init now dispatches workflow('wfl:init') — the dynamic JS driver added in S31-T04. init.md command wrapper hoists interactive prompts (KB folder, CLAUDE.md offer, marketplace-skills offer). Phase-1 and Phase-4 rulebooks annotated with orchestrator-owned step markers. sdlc-init.md reduced to a spec pointer. New base-pack/commands/init.md project-local wrapper authored. No change to installed projects (init.md is a plugin command, not a materialized base-pack command).",
    "target": "commands:init,init:wfl-init,init:phases:phase-1-collect,init:phases:phase-4-register,init:sdlc-init,init:base-pack:commands:init",
    "regenerate": [],
    "breaking": false,
    "manual": [
      "No action required for existing initialized projects. New inits use the dynamic wfl:init driver. The Workflow tool is required; upgrade Claude Code if not available."
    ]
  },
  "1.2.20": {
    "version": "1.2.21",
    "date": "2026-06-06",
    "notes": "commit-task.cjs hardening from its first live firing (HELLO-BUG-002 transcript analysis, forge-engineering#40). (1) Gitignored staging paths are pre-filtered with git check-ignore and warn-skipped — previously one ignored path aborted the all-or-nothing git add and the agent retried the identical command. (2) A clean staging set is now a legitimate no-op SUCCESS: the tool seals the record's terminal status and returns {ok:true, committed:false, reason:nothing-to-commit} — a bug whose fix is already at HEAD ends fixed without improvised manual transitions. Result JSON gains an explicit committed flag. meta-commit.md: forge_commit named tool is the primary surface on forgecli (typed args — no shell-quoting of the commit message); bash form stays as the Claude Code fallback; no-op outcome documented as success.",
    "target": "tools:commit-task,workflows:commit_task",
    "regenerate": [
      "tools",
      "workflows"
    ],
    "breaking": false,
    "manual": [
      "Run /forge:update, then /forge:rebuild tools workflows to refresh .forge/tools/commit-task.cjs and .forge/workflows/commit_task.md."
    ]
  },
  "1.2.19": {
    "version": "1.2.20",
    "date": "2026-06-06",
    "notes": "Deterministic commit choreography (forge-engineering#40). The commit phase was the most expensive phase of the pipeline (15-31% of run input tokens) because an LLM re-derived deterministic choreography turn-by-turn. New tools/commit-task.cjs owns the whole sequence — preflight gate, status precondition, staging-set derivation (record artifact dir + implementation file provenance), commit-boundary guard (aborts on a pre-populated index), git commit, terminal status transition (task→committed / bug→fixed) — with --dry-run, argv-array spawns, and operator-gated --force. The implement phase now records files_changed provenance in IMPLEMENTATION-SUMMARY.json (new optional PHASE_SUMMARY_SCHEMA key, max 100 paths) so commit never re-derives the change surface from git. meta-commit.md rewritten: agent inspects once (git diff --stat), crafts the message, calls the tool once; explicit no-summary contract (commit is not in VALID_SUMMARY_PHASES — the previous prompt commanded writing a SUMMARY that the schema rejects, sending agents on an unwinnable format hunt plus 3 write-verification retries); batched-inspection rule; commit-early/reset/redo loop forbidden.",
    "target": "tools:commit-task,tools:store-cli,workflows:commit_task,workflows:implement_plan",
    "regenerate": [
      "tools",
      "workflows"
    ],
    "breaking": false,
    "manual": [
      "Run /forge:update, then /forge:rebuild tools workflows to vendor .forge/tools/commit-task.cjs and refresh .forge/workflows/commit_task.md + implement_plan.md. Until the rebuild, the regenerated commit workflow will reference a tool that is not yet vendored and will halt loudly (by design)."
    ]
  },
  "1.2.18": {
    "version": "1.2.19",
    "date": "2026-06-06",
    "notes": "Event-type discipline in the JS workflow drivers (forge-engineering#39 Phase 3). wfl-run-task.js and wfl-fix-bug.js now carry TASK_TYPE_TOKENS / BUG_TYPE_TOKENS maps (verbatim ports of _fragments/event-vocabulary.md) and inject explicit per-phase type guidance into the subagent emit instructions: start events MUST NOT carry a type field, complete events set the exact pass/fail token for the phase, and copying the action value (start/complete) into type is explicitly forbidden — that guess-leak was the source of the schema-rejected type:start/type:complete store residue. Also fixes wfl-run-task emitSkip(): the skip event emitted iteration 0, violating the schema's minimum of 1, so every pre-task skip event was silently rejected; now 1.",
    "target": "workflows-js:wfl-run-task,workflows-js:wfl-fix-bug",
    "regenerate": [
      "workflows-js"
    ],
    "breaking": false,
    "manual": [
      "Run /forge:update, then /forge:rebuild to regenerate .claude/workflows/wfl-run-task.js and wfl-fix-bug.js from the base-pack. Prompt/instruction text + one literal fix — no schema or tool change."
    ]
  },
  "1.2.17": {
    "version": "1.2.18",
    "date": "2026-06-06",
    "notes": "Event-type vocabulary gets a spec owner (forge-engineering#39). New canonical fragment _fragments/event-vocabulary.md defines the phase→type token tables for task/bug/sprint events; schemas/event.schema.json now mirrors it: adds the bug-pipeline fail tokens fix-revision-requested (approve) and bug-commit-failed (commit) that forge-cli already emits (previously rejected by the enum — events and their token telemetry were silently dropped), adds bug-skipped (pre-loop skip; requires bugId, no phase/iteration), and retires bug-fixed (defined, emitted by nothing, zero store occurrences). The wfl-fix-bug.js base-pack driver's skip emit was triple-broken against the schema (underscore bug_skipped token, missing required eventId/model/provider, undeclared reason key) — now emits a valid bug-skipped event with the skip reason in notes and model/provider \"n/a\". meta-fix-bug.md and meta-orchestrate.md reference the vocabulary fragment; emitted tokens MUST come from its tables.",
    "target": "schemas:event,fragments:event-vocabulary,fragments:event-emission-schema,workflows:fix_bug,workflows:orchestrate_task,workflows-js:wfl-fix-bug",
    "regenerate": [
      "schemas",
      "workflows",
      "workflows-js"
    ],
    "breaking": false,
    "manual": [
      "Run /forge:update, then /forge:rebuild schemas workflows to refresh .forge/schemas/event.schema.json, .forge/workflows/ (fix_bug.md, orchestrate_task.md, _fragments/), and the regenerated .claude/workflows/wfl-fix-bug.js. Projects with the legacy invalid store events (type start/complete/feature_implemented) can clear them via /forge:repair — strip the invalid type field (untyped events are valid)."
    ]
  },
  "1.2.16": {
    "version": "1.2.17",
    "date": "2026-06-04",
    "notes": "Fix two deterministic false-halt bugs in the S26-T19 postflight output guard, exposed on its first live firing (the guards were dormant until the v1.2.16 base-pack recompile activated them; CART-S03-T01 plan halted despite a fully successful phase). (1) Require predicates: the materialized outputs blocks use bare record paths (summaries.plan.verdict) while the gate passed state={task:record}; every bare require evaluated undefined and failed unconditionally. readField now falls back to the entity record (state.task / state.bug) after the direct walk. (2) Artifact paths: {sprint} was substituted with the bare sprintId, dropping the sprints/ segment, so artifact checks probed <engineering>/<sprintId>/<taskId> instead of <engineering>/sprints/<sprintId>/<taskId> and always reported output-missing. New buildSubstitutions() resolves {sprint} to the path segment under engineering (sprints/<id> for tasks, bugs for bug records).",
    "target": "tools:postflight-gate",
    "regenerate": [
      "tools"
    ],
    "breaking": false,
    "manual": [
      "Run /forge:update, then /forge:rebuild tools to re-vendor .forge/tools/postflight-gate.cjs. Without this, every phase with an outputs block halts with output-missing/require-failed despite succeeding."
    ]
  },
  "1.2.15": {
    "version": "1.2.16",
    "date": "2026-06-04",
    "notes": "Remove phase-side review-iteration self-limiting (forge-engineering#34). The standalone-invocation fallback in the review/validate workflows read maxReviewIterations from .forge/config.json — a redundant protection layer that produced a Key-not-found error on every review phase and, worse, worked against the recovery model: loop budgeting belongs solely to the orchestrator (run-task PHASE_PIPELINE maxIterations), exhaustion escalates to a human, and a deliberate human standalone re-run IS the escape hatch for stuck items — a phase consulting its own cap can refuse exactly that. The workflows now treat user-invoked runs as iteration 1 with no limit and never read an iteration cap from config; orchestrated runs keep taking N-of-M from the Review Loop Context block injected by the orchestrator.",
    "target": "workflows:review_plan workflows:review_code workflows:validate_task",
    "regenerate": [
      "workflows"
    ],
    "breaking": false,
    "manual": [
      "Run /forge:update, then /forge:rebuild workflows to refresh .forge/workflows/ (review_plan.md, review_code.md, validate_task.md). Prompt-text only — no tool or schema change."
    ]
  },
  "1.2.14": {
    "version": "1.2.15",
    "date": "2026-06-03",
    "notes": "COST_REPORT now accounts incomplete (aborted/failed) phase attempts. forge-cli >=1.0.16 emits phase events with verdict aborted (user cancel) / failed (halt-on-failure) carrying the provider-billed tokens of incomplete attempts; previously those tokens were invisible (the CART-S02-T03 baseline under-counted by 259,950 tokens across two aborted plan passes — husk events with no token data). collate.cjs adds an Incomplete Passes section to COST_REPORT listing each aborted/failed attempt (task, phase, outcome, tokens); Per-Task/Per-Role/Model-Split totals already sum verdict-agnostically, so the previously-missing spend now lands in the totals automatically once events arrive.",
    "target": "tools:collate",
    "regenerate": [
      "tools"
    ],
    "breaking": false,
    "manual": [
      "Run /forge:update, then /forge:rebuild tools to re-vendor .forge/tools/collate.cjs. Report-layer only — no schema change; older forge-cli versions simply produce no incomplete-pass events."
    ]
  },
  "1.2.13": {
    "version": "1.2.14",
    "date": "2026-06-03",
    "notes": "Correct the set-summary / set-bug-summary call signature in the review and triage workflows. meta-review-implementation.md, meta-review-plan.md, and meta-bug-triage.md documented a forge_store invocation with named entity/id/phase fields (forge_store({ command:'set-summary', entity:'task', id:'{taskId}', phase:'code_review' })) — but the forge_store tool schema accepts only { command, args[] }. Subagents handed the non-existent named form mis-built args, landing the record id in the phase slot; the phase-ownership guard rejected it ('expected summary key code_review'), summaries.code_review was never written, and the orchestrator halted the task as 'verdict missing'. All sites now use the canonical positional form forge_store({ command:'set-summary', args:['{taskId}', 'code_review'] }) with a one-line signature reminder; the _fragments/store-cli-verbs.md cheat-sheet documents the forge_store { command, args[] } shape and the 'id in both slots' failure. Also fixed a forge_store read call in meta-bug-triage.md that used the same invalid named form.",
    "target": "workflows:review_code workflows:review_plan workflows:bug-triage",
    "regenerate": [
      "workflows"
    ],
    "breaking": false,
    "manual": [
      "Run /forge:update, then /forge:rebuild workflows to refresh .forge/workflows/ (review_code.md, review_plan.md, triage.md, and the store-cli-verbs fragment) with the corrected set-summary signature. Prompt-text only — no tool or schema change."
    ]
  },
  "1.2.12": {
    "version": "1.2.13",
    "date": "2026-06-03",
    "notes": "Deterministic post-phase exit guard (FORGE-S26-T19). New parseOutputs() export in parse-gates.cjs handles ```outputs phase=X``` fence blocks with closed grammar (artifact + require directives; unknown throws). New postflight-gate.cjs evaluator runs post-phase; returns { phase, reasonCode, detail, remediation } with new output-missing and output-stub reasonCodes; no LLM in path. forge-cli run-task.ts now calls runPostflightGate() after runForgeSubagent returns and before FSM advance; on UNSATISFIED halts + calls existing runHaltAdvisor. wfl-run-task.js gets a #22 parity-seam comment. meta-plan-task.md and meta-implement.md: prose Tier-2 self-check replaced by declarative outputs blocks + thin pointer reminders.",
    "target": "tools:parse-gates tools:postflight-gate",
    "regenerate": [
      "workflows"
    ],
    "breaking": false,
    "manual": [
      "Run /forge:rebuild to pick up updated meta-workflow changes (meta-plan-task.md, meta-implement.md now include declarative outputs blocks). postflight-gate.cjs is additive — no-op for workflows without outputs blocks."
    ]
  },
  "1.2.11": {
    "version": "1.2.12",
    "date": "2026-06-03",
    "notes": "Rebuild/republish bump — no functional source change from 1.2.11. Cut to ship a fresh plugin manifest + integrity hashes and a corresponding forge-cli 1.0.12 build/install. Carries the 1.2.11 halt-recovery-advisor payload (FORGE-S26-T18) unchanged.",
    "target": "release:rebuild",
    "regenerate": [],
    "breaking": false,
    "manual": []
  },
  "1.2.10": {
    "version": "1.2.11",
    "date": "2026-06-03",
    "notes": "Halt-recovery advisor (FORGE-S26-T18). preflight-gate.cjs now emits structured JSON on stdout on gate failure: { phase, reasonCode, detail, remediation }. reasonCode values: artifact-missing, predecessor-verdict-missing, illegal-status, tool-error. Both LLM orchestrators (meta-orchestrate.md, meta-fix-bug.md) parse and render the structured failure instead of raw stderr. forge-cli run-task and fix-bug upgraded to runPreflightGateWithData() which returns structured failure alongside the PreflightResult enum; on halt, the CLI spawns a read-only halt-recovery advisor subagent on the advisorModel config slot (or getAvailable()[0] fallback). New optional advisorModel field added to forge-cli layered config (L1 global / L2 project). Post-phase self-check guards added to meta-plan-task.md and meta-implement.md (Tier 2) to prevent false complete events when a phase subagent silently fails to write its primary output.",
    "target": "tools:preflight-gate",
    "regenerate": [
      "workflows"
    ],
    "breaking": false,
    "manual": [
      "Run /forge:rebuild to pick up updated meta-workflow changes (meta-orchestrate.md, meta-fix-bug.md, meta-plan-task.md, meta-implement.md). The structured JSON stdout from preflight-gate.cjs is additive — orchestrators that do not parse it still receive human-readable stderr and exit 1."
    ]
  },
  "1.2.9": {
    "version": "1.2.10",
    "date": "2026-06-03",
    "notes": "Fix incomplete .forge/tools/ vendored closure. generate-tools.md and rebuild.md copied tools via `*.cjs` globs only, silently skipping the two `.js` lib helpers (lib/result.js, lib/validate.js) and the top-level list-skills.js. Because store-cli.cjs does a top-level require('./lib/validate.js') and collate.cjs requires './lib/result.js', a freshly vendored .forge/tools/ left store-cli.cjs dead-on-arrival (ENOENT) and broke KB collation. Latent since the vendored-tools model landed; S29 made it fatal by moving tool execution off $FORGE_ROOT/tools/ onto the vendored copy. Both vendoring sites now copy `.cjs` and `.js` (find -maxdepth 1, excludes __tests__/) and record both in the generation manifest. New regression guard tools/__tests__/vendored-tools-closure.test.cjs ties the documented copy extensions to the actual require()-closure.",
    "target": "tools:vendor-closure",
    "regenerate": [
      "tools"
    ],
    "breaking": false,
    "manual": [
      "Run /forge:rebuild tools to re-vendor .forge/tools/ with the complete closure. Existing projects vendored by v1.2.4–v1.2.9 are missing .forge/tools/lib/result.js, .forge/tools/lib/validate.js, and .forge/tools/list-skills.js — store-cli and KB collation are broken until this re-vendor runs."
    ]
  },
  "1.2.8": {
    "version": "1.2.9",
    "date": "2026-06-03",
    "notes": "Finish the FORGE_ROOT retirement in the workflow/persona layer (vendored-path scope). Remove the vestigial 'Resolve FORGE_ROOT (config.paths.forgeRoot)' preamble bullet from meta-approve/review-plan/review-implementation/validate/commit/plan-task/implement/bug-triage (the gate calls already use node .forge/tools/preflight-gate.cjs). Switch persona identity banners to node .forge/tools/banners.cjs <id> at the generator (build-base-pack.cjs identityBlock) and in the three base-pack-only personas (librarian/orchestrator/product-manager); drop the broken paths.forgeRoot resolution. meta-collate/collator now invoke node .forge/tools/collate.cjs directly. meta-migrate resolves the plugin root from CLAUDE_PLUGIN_ROOT (plugin-side reads of init/base-pack are not vendored). Stale paths.forgeRoot doc references removed from store-cli.spec.md, meta-enhance config_fields, and tool-discipline.md. paths.forgeRoot is intentionally retained as a maintained convenience field (written by check-update.cjs) for skills/commands that resolve the plugin root — those are out of scope for this entry.",
    "target": "workflows:forge-root-residual-cleanup",
    "regenerate": [
      "workflows",
      "personas"
    ],
    "breaking": false,
    "manual": [
      "Run /forge:rebuild workflows personas to regenerate the updated workflow and persona files. The vendored banners/collate invocations require .forge/tools/ to be present — run /forge:rebuild tools first if it is absent (see the 1.2.7 migration)."
    ]
  },
  "1.2.7": {
    "version": "1.2.8",
    "date": "2026-06-03",
    "notes": "Remove all $FORGE_ROOT references from init/smoke-test.md. Switch tool exec check to node .forge/tools/validate-store.cjs, generation-manifest stamp to node .forge/tools/generation-manifest.cjs, version read to .forge/tools/.forge-tools-version, distribution detection to the distribution field in .forge-tools-version, and remove the forgeRoot field from update-check-cache.json stamp. Smoke-test runs only at init time — existing projects are not affected.",
    "target": "init:smoke-test",
    "regenerate": [
      "init"
    ],
    "breaking": false,
    "manual": [
      "Re-run /forge:init on new projects to pick up the updated smoke-test. Existing projects are unaffected — smoke-test runs only once at init time."
    ]
  },
  "1.2.6": {
    "version": "1.2.7",
    "date": "2026-06-02",
    "notes": "Remove paths.forgeRoot from config.schema.json required[] and properties. forge-preflight.cjs now resolves plugin root via forgeRef-based cache scan (mirrors manage-config.cjs Priority 2) instead of reading config.paths.forgeRoot. manage-config.cjs resolve-forge-root drops Priority 3 (forgeRoot fallback). generate-tools.md drops Step 1 (forgeRoot write). update.md removes forgeRoot refresh from Step 4 config section and fixes tools regenerate category to invoke /forge:rebuild tools instead of running schema refresh inline.",
    "target": "config:forgeRoot",
    "regenerate": [
      "tools"
    ],
    "breaking": false,
    "manual": [
      "Run /forge:rebuild tools to re-vendor .forge/tools/ on existing projects. Projects that have never run /forge:rebuild tools will have .forge/tools/ absent until this step."
    ]
  },
  "1.2.5": {
    "version": "1.2.6",
    "date": "2026-06-02",
    "notes": "Add vendored-tools integrity and staleness check to /forge:health. Exports checkToolsVersion(projectRoot) from check-structure.cjs: reads .forge/tools/.forge-tools-version marker and paths.forgeRef from config, returns { present, vendoredVersion, activeVersion, stale, reason }. generate-tools.md Step 2c now writes .forge/tools/.forge-tools-version after the tool copy loop. rebuild.md tools category now re-writes the marker after re-copy. health.md gains step 8b (vendored tools presence + staleness check, emitting 〇/△/× with /forge:rebuild tools recommendation). Closes the integrity gap for existing projects that ran /forge:rebuild tools in v1.2.4 without the marker.",
    "target": "tools:health",
    "regenerate": [
      "tools"
    ],
    "breaking": false,
    "manual": [
      "Run /forge:update, then /forge:rebuild tools to write .forge/tools/.forge-tools-version. Until this runs, /forge:health will report 'stale (marker absent)' — non-breaking."
    ]
  },
  "1.2.4": {
    "version": "1.2.5",
    "date": "2026-06-02",
    "notes": "Rewrite all ~159 node \"$FORGE_ROOT/tools/X.cjs\" call-sites in meta/workflows/*.md, meta/workflows/_fragments/*.md, and wfl-*.js drivers to use the fixed project-relative form node .forge/tools/X.cjs. Delete the FORGE_ROOT export preamble from all three JS drivers (wfl-run-task.js, wfl-run-sprint.js, wfl-fix-bug.js). Tools are now vendored in .forge/tools/ (added in v1.2.4), so no subagent needs to resolve a plugin root path at runtime. Drift test guard updated: asserts no $FORGE_ROOT remains in any driver source. Existing projects must regenerate workflows and workflows-js to pick up the new paths.",
    "target": "workflows:*",
    "regenerate": [
      "workflows",
      "workflows-js"
    ],
    "breaking": false,
    "manual": [
      "Run /forge:update, then run /forge:rebuild tools (if not done in v1.2.4 step), then /forge:rebuild workflows and /forge:rebuild workflows-js. Tools must be vendored in .forge/tools/ before running the rewritten workflows."
    ]
  },
  "1.2.3": {
    "version": "1.2.4",
    "date": "2026-06-02",
    "notes": "Add tools vendor category: copy plugin tools/*.cjs + tools/lib/*.cjs into .forge/tools/ at init and rebuild, mirroring the existing schemas copy. Adds tools namespace to structure-manifest.json (via build-manifest.cjs TOOLS_FILES constant), Step 2b to generate-tools.md (init copy), and tools/tools:<filename> category to rebuild.md (verbatim re-copy from $FORGE_ROOT/tools/). check-structure.cjs validateManifest now maps the tools namespace to forgeRoot/tools/ with recursive lib/ enumeration. Foundation for FORGE-S29 call-site rewrite (T02+). No existing call-sites changed in this task.",
    "target": "tools",
    "regenerate": [
      "tools"
    ],
    "breaking": false,
    "manual": [
      "Run /forge:update, then /forge:rebuild tools to materialise .forge/tools/."
    ]
  },
  "1.2.2": {
    "version": "1.2.3",
    "date": "2026-06-02",
    "notes": "Harden FORGE_ROOT / .forge/config.json resolution in the packaged JS workflow drivers. A friction trace of a real /fix-bug run showed phase subagents repeatedly probing ../.forge/config.json (the PARENT directory — 5 of 11 subagents) and one invoking `node \"$FORGE_ROOT/tools/preflight-gate.cjs\"` with an unexported $FORGE_ROOT that expands to '' → '/tools/preflight-gate.cjs' (Cannot find module). Root cause: the per-phase subagent prompt preamble said only 'Resolve FORGE_ROOT from .forge/config.json paths.forgeRoot' — no cwd anchor and no instruction to export $FORGE_ROOT, even though every subsequent command used $FORGE_ROOT as a shell variable. Replaced all ~23 preamble sites across wfl-run-task.js / wfl-run-sprint.js / wfl-fix-bug.js with a directive that (a) anchors the config to ./.forge/config.json in the current working directory ('never a parent directory'), (b) tells the agent to EXPORT FORGE_ROOT, and (c) STOPs if $FORGE_ROOT is empty or $FORGE_ROOT/tools is missing. Added a regression guard in workflows-js-drift.test.cjs. Prompt-text only — no orchestration-logic change.",
    "target": "workflows-js:wfl-run-task",
    "regenerate": [
      "workflows-js:wfl-run-task",
      "workflows-js:wfl-run-sprint",
      "workflows-js:wfl-fix-bug"
    ],
    "breaking": false,
    "manual": [
      "Run /forge:update, then /forge:rebuild workflows-js to refresh .claude/workflows/wfl-*.js."
    ]
  },
  "1.2.1": {
    "version": "1.2.2",
    "date": "2026-06-02",
    "notes": "Fix three orchestration-logic edge-case bugs in the packaged JS workflow drivers (found by an adversarial review of the v1.2.1 packaged workflows). (S1) wfl-run-sprint.js re-dispatch passed { taskId, resumeFrom } but wfl:run-task parses only the task id, so resumeFrom was silently dropped — removed the misleading arg; the retry is a clean re-dispatch that resumes from store state. (S2) wfl-run-sprint.js treated a skipped child as non-terminal, so a legitimately `blocked` task (waiting on a dependency) was re-dispatched and then force-escalated; a skipped child is now terminal-acceptable. (F1) wfl-fix-bug.js had no null guard on the finalize dispatch — a skipped/errored finalize fell through and the run was reported bugStatus:'fixed', escalated:false even though collate + the finalize gate never ran; it now escalates on a null finalize while preserving bugStatus:'fixed'. Added text-contract regression guards in workflows-js-drift.test.cjs. Deferred (tracked for a follow-up): revision-counter/eventId attribution (wfl-run-task), count-bucket taxonomy + full-parallel dependency ordering (wfl-run-sprint), and two MINORs in wfl-fix-bug (phase('Pipeline') grouping, escalateBug bugId).",
    "target": "workflows-js:wfl-run-sprint",
    "regenerate": [
      "workflows-js:wfl-run-sprint",
      "workflows-js:wfl-fix-bug"
    ],
    "breaking": false,
    "manual": [
      "Run /forge:update, then /forge:rebuild workflows-js to refresh .claude/workflows/wfl-run-sprint.js and wfl-fix-bug.js."
    ]
  },
  "1.2.0": {
    "version": "1.2.1",
    "date": "2026-06-02",
    "notes": "Fix wfl-fix-bug.js invalid meta. The fix-bug JS driver declared its meta with `desc:` and `steps:` instead of `description:` and `phases:`, so the Workflow runtime rejected it ('meta.description must be a non-empty string') and the named-workflow registry silently skipped it — /forge:fix-bug (and any /<prefix>:fix-bug) could never launch wfl:fix-bug. This shipped latent since the driver was authored and was exposed by the v1.2.0 orchestration-prose retirement, which removed the fix_bug.md fallback. Renamed desc->description and steps->phases (adding the Resolve phase) to match wfl-run-task.js / wfl-run-sprint.js. Added a meta-contract regression guard (workflows-js-drift.test.cjs) that asserts every JS driver exposes name + non-empty description + phases.",
    "target": "workflows-js:wfl-fix-bug",
    "regenerate": [
      "workflows-js:wfl-fix-bug"
    ],
    "breaking": false,
    "manual": [
      "Run /forge:update to receive the fix, then /forge:rebuild workflows-js to refresh .claude/workflows/wfl-fix-bug.js. /<prefix>:fix-bug will then launch wfl:fix-bug correctly."
    ]
  },
  "1.1.2": {
    "version": "1.2.0",
    "date": "2026-06-02",
    "notes": "Retire LLM orchestration prose. The deterministic JS drivers (.claude/workflows/wfl-run-task.js, wfl-run-sprint.js, wfl-fix-bug.js — category workflows-js) are now the only orchestration truth; /forge:run-task, /forge:run-sprint and /forge:fix-bug already dispatch to them via workflow(wfl:*). The prose orchestrators orchestrate_task.md, run_sprint.md and fix_bug.md are no longer built into the base-pack, no longer generated into .forge/workflows/, and no longer tested (the orchestrators-retired and orchestrator-base-pack-parity drift tests are removed; only the JS drivers are tested). meta-orchestrate.md and meta-fix-bug.md are kept in meta/ as reference specs only. build-base-pack and build-manifest drop the three workflow mappings; workflow-gen-plan.json goes 16->15; the rebuild orchestration-generation step and generate-orchestration.md rulebook are removed. The three retired prose files are added to /forge:update's delete-workflow scan so existing projects have the orphaned .forge/workflows/orchestrate_task.md, run_sprint.md and fix_bug.md removed (rebuild only regenerates and clears manifest entries; it does not delete files on disk).",
    "target": "workflows-js:wfl-run-task",
    "regenerate": [
      "workflows",
      "workflows-js"
    ],
    "breaking": false,
    "manual": [
      "Run /forge:update — it removes the retired orchestrate_task.md / run_sprint.md / fix_bug.md from .forge/workflows/ via its delete-workflow scan (prompts before deleting any you have hand-edited).",
      "Orchestration now runs through .claude/workflows/wfl-*.js — no action needed for /forge:run-task, /forge:run-sprint, or /forge:fix-bug."
    ]
  },
  "1.1.1": {
    "version": "1.1.2",
    "date": "2026-06-02",
    "notes": "v1.1.2 — Fix collate.cjs resolveTaskDir: when a task store record's `path` field points at a file inside the task directory (e.g. .../FORGE-S22-T04/PLAN.md) rather than the directory itself, Case 1 returned basename('PLAN.md') instead of the task dir. Downstream, collate's existsSync(sprintDir/PLAN.md) check failed and the task's INDEX.md was silently never generated. Case 1 now verifies its candidate is a real directory on disk and otherwise falls through to the filesystem scan (which resolves the dir by taskId). Symptom: 18 task INDEX.md files across FORGE-S22/S23 were missing despite valid store records.",
    "target": "tools:collate",
    "regenerate": [
      "tools:collate"
    ],
    "breaking": false,
    "manual": [
      "Run /forge:update to receive the fixed collate tool.",
      "After update, run /forge:collate (or /forge:rebuild) to regenerate any task INDEX.md files that were skipped."
    ]
  },
  "1.1.0": {
    "version": "1.1.1",
    "date": "2026-06-02",
    "notes": "v1.1.1 — LOW-polish orchestration parity (FORGE-S28-T09). #19: emitSkip() agent helper emits a task-dispatch/action:skip event when the pre-task SKIP_STATUS guard fires, giving the event log a complete accounting of every task. #20: writeback step added to the hardcoded default pipeline prompt in wfl-run-task.js (orchestrate_task.md §3 full default: …approve → writeback → commit, writeback→update_implementation.md). #21: structural-limitation comment documents Progress-Monitor IPC as a host-layer concern (JS driver has no shell access, so the Pi/forge-cli TS layer must open the pipe). #22: BANNER_MAP constants added to both wfl-run-task.js and wfl-run-sprint.js; wfl-run-task phase-start log line now shows the persona label. #23: wfl-run-sprint.js adds an agent step to transition sprint status to 'active' before the wave loop begins, mirroring run_sprint.md Step 1. Also fixes pre-existing forge/package.json test regression (accidental 'dependencies' field removed; placeholder-coverage no-npm test passes).",
    "target": "workflows-js:wfl-run-task",
    "regenerate": [
      "workflows-js:wfl-run-task",
      "workflows-js:wfl-run-sprint"
    ],
    "breaking": false,
    "manual": [
      "Run /forge:update to receive the updated JS workflow orchestrators.",
      "After update, run /forge:rebuild workflows-js to regenerate .claude/workflows/wfl-*.js in your project."
    ]
  },
  "1.0.11": {
    "version": "1.1.0",
    "date": "2026-06-02",
    "notes": "v1.1.0 — (1) New rebuild/update surface for the JS orchestration workflows: workflows-js is now a first-class /forge:rebuild category (verbatim copy of .claude/workflows/*.js from base-pack, no LLM/placeholder substitution) and a recognised /forge:update regenerate target; build-manifest.cjs declares a workflows-js namespace so /forge:health and check-structure cover .claude/workflows/*.js. Previously these files were materialised only at /forge:init and had no regeneration path. (2) Fix FORGE-BUG-041: wfl-run-task.js emitRetryEvent/mergeSidecar passed schema:{type:'string'} to agent(), an invalid StructuredOutput input_schema (Anthropic requires type:'object'); the subagent could never call StructuredOutput so the workflow threw after the nudge limit — every wfl:run-task task escalated immediately after its plan phase. Dropped the invalid schema option from both calls. With (1) in place, /forge:update now auto-delivers this fix via the workflows-js:wfl-run-task regenerate target.",
    "target": "workflows-js:wfl-run-task",
    "regenerate": [
      "workflows-js:wfl-run-task"
    ],
    "breaking": false,
    "manual": []
  },
  "1.0.10": {
    "version": "1.0.11",
    "date": "2026-05-31",
    "notes": "v1.0.11 — Orchestration waste reduction (FORGE-S27 Track A, shipped tasks A1/A3/A4/NH1/NH2). New forge-preflight.cjs aggregates deterministic pre-dispatch glue into a single blob read, eliminating ~20 hand-run round-trips from the orchestrator preamble. New preflight-session.cjs SessionStart hook pre-warms the blob for run-task/fix-bug/run-sprint. banners.cjs gains --quiet flag; orchestrate_task loop uses it so verbose banner output does not accrete in the transcript. meta-orchestrate.md state-ledger compaction discipline: /compact retains the one-line [checkpoint] ledger and sheds raw tool output. meta-fix-bug.md: A1+A3 treatment ported (preflight cross-ref, --quiet flag, spurious cost bullet removed). token-forensics.cjs: message.id-dedup harness for correct through-model token accounting. A2 (context-pack/forge-compress port) remains escalated and is not included in this release.",
    "target": "tools:forge-preflight",
    "regenerate": [
      "tools:forge-preflight",
      "hooks:preflight-session",
      "workflows:orchestrate_task",
      "workflows:fix_bug",
      "tools:banners",
      "tools:token-forensics"
    ],
    "breaking": false,
    "manual": [
      "Run /forge:update to copy the updated tools and hooks into your project."
    ]
  },
  "1.0.9": {
    "version": "1.0.10",
    "date": "2026-05-31",
    "notes": "v1.0.10 — set-summary self-resolve hardening. When the JSON file is omitted, set-summary/set-bug-summary resolve the CANONICAL sidecar name (e.g. VALIDATION-SUMMARY.json) from the phase→kind map. If that file is missing but a near-name summary sidecar exists in the same dir (e.g. an agent wrote VALIDATE-SUMMARY.json via the Write tool instead of forge_artifact's canonical name), the error now surfaces the near-name file and points at the canonical write path (forge_artifact artifact:\"<kind>\"), instead of a silent 'file not found' dead-end. Surfaced by cartographer CART-S01-T01 validate, where the QA subagent wrote a non-canonical sidecar and the verdict never reached the store (orchestrator then correctly escalated via read-verdict). No behavior change when the canonical file is present.",
    "target": "tools:store-cli",
    "regenerate": [
      "tools"
    ],
    "breaking": false,
    "manual": [
      "Run /forge:update to copy the updated tools into your project."
    ]
  },
  "1.0.8": {
    "version": "1.0.9",
    "date": "2026-05-31",
    "notes": "v1.0.9 — store-cli suggestion drift-map: add create→write. Agents reach for REST-style `create <entity>`, but store-cli has no `create` verb (records are written with `write`), and create→write is beyond Levenshtein ≤2 so only the curated drift-map can surface it. `store-cli create sprint` now emits `Unknown command: create (Did you mean \"write\"?)`. Pure error-message UX improvement; no behavior change for valid commands. Observed on cartographer sprint-init dogfooding.",
    "target": "tools:store-cli",
    "regenerate": [
      "tools"
    ],
    "breaking": false,
    "manual": [
      "Run /forge:update to copy the updated tools into your project."
    ]
  },
  "1.0.7": {
    "version": "1.0.8",
    "date": "2026-05-31",
    "notes": "v1.0.8 — artifact-resolution Phase 4 (issue #111). ArtifactStore gains a backend registry: artifactStore.register(backend, impl) and per-call routing by the handle's `backend` (default 'fs'). Adding a storage backend is now implementing the six-method interface and registering it — no prompt or call-site changes (the acceptance criterion). Ships MemArtifactImpl, a complete synchronous in-memory reference backend, as the canonical template for real S3/CMS/DB providers. Per the ADR sync constraint, a networked impl is sync-bound for in-process callers and reachable async-internally only through the forge-cli subprocess surface — so no live remote backend is bundled. tools-only; no schema, workflow, or store-layout changes.",
    "target": "tools:artifact-store",
    "regenerate": [
      "tools"
    ],
    "breaking": false,
    "manual": [
      "Run /forge:update to copy the updated tools into your project."
    ]
  },
  "1.0.6": {
    "version": "1.0.7",
    "date": "2026-05-31",
    "notes": "v1.0.7 — artifact-resolution Phase 3 (issue #111). Introduces the ArtifactStore/FsArtifactImpl provider seam (tools/artifact-store.cjs), mirroring the store.cjs Store/FSImpl pattern: a backend-agnostic, synchronous facade (read/write/exists/url/list/delete) delegating to a swappable impl, default-wired to the filesystem. artifact.cjs is now a thin CLI over the facade and gains exists/url/delete subcommands; entity-dir resolution moved into artifact-store.cjs (re-exported for back-compat). Records gain an optional backend-agnostic locator {backend,ref} (schemas/_defs/locator.schema.json, $ref'd from task/bug/sprint); record.path stays REQUIRED as the read-time alias (the resolver derives {backend:'fs',ref:path} when locator is absent), so legacy records work unchanged and no store rewrite is forced. Concepts docs (task.md/bug.md) updated. Materialization of locator into stored records is deferred — the alias covers it. No FSM/lifecycle or store-layout changes.",
    "target": "tools:artifact,tools:artifact-store,schemas:task,schemas:bug,schemas:sprint",
    "regenerate": [
      "tools",
      "schemas"
    ],
    "breaking": false,
    "manual": [
      "Run /forge:update to copy the updated tools and schemas into your project."
    ]
  },
  "1.0.5": {
    "version": "1.0.6",
    "date": "2026-05-31",
    "notes": "v1.0.6 — artifact-resolution Phase 2 (issue #111). (1) The orchestrator's Verdict Detection no longer reads a markdown review artifact via the removed parse-verdict.cjs — meta-orchestrate.md was the last reference to that deleted tool, which would have crashed the verdict step. It now reads the verdict from the store record via read-verdict.cjs (--phase <role> --task|--bug <id>), branching on the stdout token; no artifact path is constructed. (2) Removed the stale verdict-source table that hard-coded {sprintDir}/{taskDir} markdown paths. (3) meta-commit reads ARCHITECT_APPROVAL by kind via forge_artifact instead of a built path; meta-collate anchors WRITEBACK-SUMMARY on the sprint record's path. (4) Documented canonical artifact addressing + the placeholder-token glossary in the store-cli-verbs fragment (rename-unsafe: tools parse the literal tokens). No schema or store-layout changes.",
    "target": "workflows:orchestrate_task,workflows:commit,workflows:collate",
    "regenerate": [
      "workflows:orchestrate_task",
      "workflows:commit",
      "workflows:collate"
    ],
    "breaking": false,
    "manual": [
      "Run /forge:update to copy the updated workflows into your project."
    ]
  },
  "1.0.4": {
    "version": "1.0.5",
    "date": "2026-05-31",
    "notes": "v1.0.5 — artifact-resolution Phase 1 (issue #111). set-summary / set-bug-summary now self-resolve the phase-summary sidecar from the store record's path: the JSON file argument is optional and the call collapses to `set-summary <id> <phase>`. This fixes the 2-arg arity failure (plan-phase set-summary previously exited 1 with Usage) and removes the hand-built `engineering/sprints/{sprint}/{task}/…-SUMMARY.json` paths from the implement/validate/approve/bug-triage workflows, which broke on non-default on-disk layouts. New canonical kind registry tools/lib/artifact-kinds.cjs (ARTIFACT_CATALOG + bug-mode overrides + phase→kind map) is now the single source consumed by artifact.cjs and store-cli.cjs. No schema or store-layout changes; the explicit jsonFile form remains accepted for back-compat.",
    "target": "tools:store-cli,tools:artifact,tools:artifact-kinds,workflows:implement_plan,workflows:validate_task,workflows:approve_task,workflows:triage",
    "regenerate": [
      "tools",
      "workflows:implement_plan",
      "workflows:validate_task",
      "workflows:approve_task",
      "workflows:triage"
    ],
    "breaking": false,
    "manual": [
      "Run /forge:update to copy the updated tools and workflows into your project."
    ]
  },
  "1.0.3": {
    "version": "1.0.4",
    "date": "2026-05-30",
    "notes": "v1.0.4 — two store/path tool fixes. (1) preflight-gate.cjs now derives {sprint}/{task} from the store record's task.path instead of reconstructing sprints/{sprintId}/{taskId}/, fixing false 'artifact missing' halts on projects whose on-disk layout differs from the default (legacy sprint_NN_*/tasks/ trees and tasks/-nested dirs). (2) The store-query NLP path no longer degrades an explicit-ID query into a full-store scan: the parser keeps primary=tasks when a follow-word ('with sprint'/'with feature') accompanies an anchored task ID, and the engine re-routes a stripped anchored ID to its entity and applies a default result cap (new 'truncated' flag) so unbounded listings never dump the whole store. No schema, workflow, or store-layout changes.",
    "target": "tools:preflight-gate,tools:store-query",
    "regenerate": [
      "tools"
    ],
    "breaking": false,
    "manual": [
      "Run /forge:update to copy the updated tools into your project."
    ]
  },
  "1.0.2": {
    "version": "1.0.3",
    "date": "2026-05-28",
    "notes": "v1.0.3 — FORGE-BUG-040 (GH-110) fix. /forge:fix-bug now runs each phase as a phase-scoped subagent: triage uses the new triage.md workflow, plan-fix uses plan_task.md (bug-mode), implement uses implement_plan.md (bug-mode). Previously all three pointed at fix_bug.md (orchestrator-only body), causing the triage subagent to execute the entire lifecycle in one phase. Bug schema, transitions, and store layout are unchanged.",
    "target": "workflows:triage,workflows:fix_bug",
    "regenerate": [
      "workflows:triage",
      "workflows:fix_bug"
    ],
    "breaking": false,
    "manual": []
  },
  "1.0.1": {
    "version": "1.0.2",
    "date": "2026-05-27",
    "notes": "v1.0.2 — deprecated command cleanup + init bug fixes. Redirect stubs removed (old command names are now unknown). paths.commands uses project prefix. artifact.cjs strips trailing filenames from store path. Deprecated command references replaced across all meta sources.",
    "target": "commands,init:phases,init:sdlc-init,tools:artifact",
    "regenerate": [
      "commands"
    ],
    "breaking": false,
    "manual": [
      "Deprecated command redirect stubs removed. Old names (sprint-intake, sprint-plan, retrospective, regenerate, store-query, store-repair, quiz-agent, calibrate, update-tools, migrate, materialize) are now unknown commands. See docs/migration/v0-to-v1.md for the mapping.",
      "If your project has .claude/commands/<prefix>/sprint-intake.md, sprint-plan.md, retrospective.md, or quiz-agent.md — these are stale and can be deleted."
    ]
  },
  "1.0.0": {
    "version": "1.0.1",
    "date": "2026-05-27",
    "notes": "v1.0.1 — init phase decomposition (FORGE-S26-T17). New shared verify-phase.cjs tool; sdlc-init.md rewritten as thin orchestrator; per-phase prompt files extracted to init/phases/.",
    "target": "tools:verify-phase,init:phases",
    "regenerate": [
      "tools"
    ],
    "breaking": false,
    "manual": []
  },
  "0.52.1": {
    "version": "1.0.0",
    "date": "2026-05-26",
    "notes": "v1.0.0 — v1.0 DevX Overhaul (FORGE-S26). 7 command renames, 6 command removals, fast-mode dead code removal, health --fix, rebuild --enrich, init --migrate, pipeline step guards, revision loop visibility, post-init welcome, Tomoshibi enhancements, forge:status plugin command, v1.0 documentation restructure.",
    "target": "commands:new-sprint,commands:plan-sprint,commands:retro,commands:rebuild,commands:search,commands:repair,commands:check-agent,commands:calibrate,commands:enhance,commands:migrate,commands:materialize,commands:update-tools,commands:collate,commands:status,workflows:orchestrate_task,workflows:plan_task,workflows:implement_plan,workflows:fix_bug,config:mode",
    "regenerate": [
      "commands",
      "workflows",
      "tools"
    ],
    "breaking": true,
    "manual": [
      "Removed commands: /forge:update-tools, /forge:materialize, /forge:enhance, /forge:calibrate, /forge:migrate, /forge:collate (user surface). Use /forge:update for schema refresh, /forge:rebuild --enrich for enhancement, /forge:health --fix for calibration, /forge:init --migrate for migration.",
      "Renamed commands: /forge:sprint-intake → /forge:new-sprint, /forge:sprint-plan → /forge:plan-sprint, /forge:retrospective → /forge:retro, /forge:regenerate → /forge:rebuild, /forge:store-query → /forge:search, /forge:store-repair → /forge:repair, /forge:quiz-agent → /forge:check-agent. Old names redirect with deprecation notice.",
      "Config: 'mode' field removed from .forge/config.json schema. Remove it manually from existing projects or run /forge:update."
    ]
  },
  "0.52.0": {
    "version": "0.52.1",
    "date": "2026-05-26",
    "notes": "fix(tool-discipline): add forge_artifact and forge_verify_apply discipline lines to meta/fragments/tool-discipline.md — fragment was missing two bullet points present in the FORGE_TOOL_DISCIPLINE TypeScript constant, causing subagents to receive incomplete discipline text when the fragment was present.",
    "target": "fragments:tool-discipline",
    "regenerate": [],
    "breaking": false,
    "manual": []
  },
  "0.51.4": {
    "version": "0.52.0",
    "date": "2026-05-26",
    "notes": "New tools: artifact.cjs, verify-apply.cjs; tool-discipline.md canonical fragment; store-cli list/read --no-summaries, --fields, --limit, --count flags.",
    "target": "tools:artifact,tools:verify-apply,tools:store-cli",
    "regenerate": [
      "tools"
    ],
    "breaking": false,
    "manual": []
  },
  "0.51.3": {
    "version": "0.51.4",
    "date": "2026-05-26",
    "notes": "fix(meta-enhance): Phase 2 rejections sidecar path fix — mkdir -p before gates write, explicit $PROJECT_ROOT path in step 5b.5, verification assertion after 5b.5+5c. Prevents bare rejections.json landing at project root instead of .forge/enhancement-proposals/. Also includes update.md Step 4 config refresh fix and manage-config backfill subcommand.",
    "target": "workflows:enhance",
    "regenerate": [
      "workflows:enhance"
    ],
    "breaking": false,
    "manual": []
  },
  "0.51.2": {
    "version": "0.51.3",
    "date": "2026-05-23",
    "notes": "Workflow prose updated to reference forge_artifact tool for all phase artifact reads/writes. Eliminates manual path construction — models use typed tool calls with entity ID resolution and JSON summary schema validation.",
    "target": "workflows:all-phase-workflows,workflows:_fragments/store-cli-verbs",
    "regenerate": [
      "workflows:plan_task",
      "workflows:review_plan",
      "workflows:implement_plan",
      "workflows:review_code",
      "workflows:validate_task",
      "workflows:architect_approve",
      "workflows:fix_bug",
      "workflows:collator_agent",
      "workflows:_fragments/store-cli-verbs"
    ],
    "breaking": false,
    "manual": []
  },
  "0.51.1": {
    "version": "0.51.2",
    "date": "2026-05-23",
    "notes": "S25 post-refactor regression fixes: (A) store-cli-verbs.md — explicit 4-arg update-status syntax; (B) implement workflow — two-step plan-approved→implementing→implemented transition; (C/D) collator workflow — no-set-summary Iron Law + WRITEBACK-SUMMARY.json Finalize step.",
    "target": "workflows:implement_plan,workflows:collator_agent,workflows:_fragments/store-cli-verbs",
    "regenerate": [
      "workflows:implement_plan",
      "workflows:collator_agent",
      "workflows:_fragments/store-cli-verbs"
    ],
    "breaking": false,
    "manual": []
  },
  "0.51.0": {
    "version": "0.51.1",
    "date": "2026-05-23",
    "notes": "FORGE-S25-T28 — Guardrails CI consolidation. Adds --check mode to build-manifest.cjs and build-enum-catalog.cjs (non-destructive drift detection; exits 1 when structure-manifest.json or enum-catalog.json/transitions/*.json are stale). Wires manifest-drift + enum-catalog-drift gates into plugin-ci.yml. Adds forge/forge/CLAUDE.md documenting the four CI gates.",
    "target": "tools:build-manifest",
    "regenerate": [
      "tools:build-manifest",
      "tools:build-enum-catalog"
    ],
    "breaking": false,
    "manual": []
  },
  "0.50.0": {
    "version": "0.50.1",
    "date": "2026-05-23",
    "notes": "FORGE-S25-T26 — Catalog generator + plugin consumers. Adds build-enum-catalog.cjs emitting forge/schemas/enum-catalog.json + forge/schemas/transitions/{task,sprint,bug}.json from T25 ADR canonical FSM tables. Canonicalizes store-cli.cjs TASK_TRANSITIONS/SPRINT_TRANSITIONS/BUG_TRANSITIONS to T25 ADR (D-T-1..D-T-9, D-S-1..D-S-4, D-B-1). Narrows FAILED_STATES: removes blocked, plan-revision-required, code-revision-required (all transitions are now explicit in the tables). Extends substitute-placeholders.cjs with {{ENUM:entity.field}} placeholder support (resolves to comma-separated schema enum values). Adds @catalogSync annotation to hooks/lib/common.cjs:FORGE_COMMAND_PATTERNS + fills 15 missing command patterns; syncs inline copy in hooks/triage-error.cjs. build-manifest.cjs gains post-step to regenerate enum-catalog on every manifest rebuild. gen-integrity.cjs tracks new catalog + transition files. New tests: build-enum-catalog.test.cjs (14 cases), store-cli-transitions.test.cjs (9 regression cases, D-T-* / D-S-* / D-B-*). integrity.json regenerated.",
    "target": "schemas:enum-catalog",
    "regenerate": [
      "schemas:enum-catalog",
      "schemas:transitions",
      "tools:build-enum-catalog",
      "tools:store-cli",
      "tools:substitute-placeholders",
      "tools:build-manifest",
      "tools:gen-integrity",
      "hooks:triage-error",
      "hooks:lib/common"
    ],
    "breaking": false,
    "manual": []
  },
  "0.49.0": {
    "version": "0.50.0",
    "date": "2026-05-23",
    "notes": "FORGE-S25-T15 — hooks:h5-polish. Drop mtime sentinel in post-init.cjs (H-5c); add logSwallowedError helper to hooks/lib/common.cjs (H-5b); interpolate CLAUDE_PLUGIN_ROOT into forge-permissions.cjs node-tool rule (H-5d); reduce check-update.cjs HTTPS timeout 5s→2s (H-5a); complete hooks/README.md swallowed-error policy section. integrity.json regenerated.",
    "target": "hooks:h5-polish",
    "regenerate": [],
    "breaking": false,
    "manual": []
  },
  "0.48.2": {
    "version": "0.49.0",
    "date": "2026-05-23",
    "notes": "FORGE-S25-T14 — hooks/*.js → *.cjs rename + extract hooks/lib/{plugin-detection,update-url,update-msg}.cjs + REGISTRY private. Closes H-2, H-3, H rename. gen-integrity.cjs updated to glob .cjs. integrity.json regenerated. forge-cli/scripts/build-payload.cjs hook filter updated from .js to .cjs (cross-repo).",
    "regenerate": [],
    "breaking": false,
    "manual": []
  },
  "0.48.1": {
    "version": "0.48.2",
    "date": "2026-05-23",
    "notes": "FORGE-S25-T13 — Release-time URL rewrite strategy for plugin.json (S-12), structure-manifest.json product-manager edge fix (S-7), additionalProperties CI gate (S-4/N-S-2), schema-evolution-policy ADR. Adds rewrite-plugin-urls.cjs tool (--target main|release) for release workflow automation. Fixes build-manifest.cjs parseMetaDeps to filter non-generated personas (product-manager, orchestrator) from workflow edges. Regenerates structure-manifest.json. Adds schema-additionalProperties.test.cjs CI gate asserting every *.schema.json has root additionalProperties:false. Sets plugin.json URLs to main-branch raw GitHub content.",
    "regenerate": [
      "schemas:structure-manifest"
    ],
    "breaking": false,
    "manual": []
  },
  "0.48.0": {
    "version": "0.48.1",
    "date": "2026-05-23",
    "notes": "Fix preflight-gate sprint directory slug resolution. When a sprint directory has a slug suffix (e.g. 'FORGE-S25-foundation-refactor' for sprintId 'FORGE-S25'), the gate was using the bare sprintId as the directory path, causing artifact-not-found failures even when the artifact existed under the slugged directory. Adds resolveSprintArtifactDir() (exported) that scans engineering/sprints/ for an exact match then a '<sprintId>-*' prefix match, analogous to resolveTaskArtifactDir(). resolveTaskArtifactDir() gains an optional resolvedSprintDir parameter. CLI shim resolves the sprint dir before resolving the task dir and uses it for the {sprint} substitution.",
    "regenerate": [],
    "breaking": false,
    "manual": []
  },
  "0.47.2": {
    "version": "0.48.0",
    "date": "2026-05-22",
    "notes": "FORGE-S25-T10 — extract _fragments/{store-write-verification,iron-laws,generation-instructions}.md + backfills. Closes CM-1, CM-2, CM-3, CM-4, CM-6, N-CM-4, N-CM-5. Three new canonical fragment files added to meta/workflows/_fragments/ and mirrored to init/base-pack/workflows/_fragments/. The 9-line Store-Write Verification block (byte-identical across 9 workflows) replaced with a single comment marker; 3 variant workflows (sprint-plan, collate, enhance) retain inline text with inline note. iron-laws.md and generation-instructions.md are template-guide fragments (CM-2/CM-3/CM-6 closed-as-documented, not closed-as-deduplicated — duplication stays inline, fragments document the canonical structure; see doc/decisions/meta-fragment-includes.md). Iron Laws backfilled into 3 previously missing workflows (meta-migrate, meta-retrospective, meta-sprint-intake). Generation Instructions backfilled into 2 missing workflows (meta-enhance, meta-migrate). meta-review-plan: ## Generation Notes renamed to ## Generation Instructions. Intentional-omission comments added for meta-quiz-agent and meta-review-sprint-completion. FRAGMENT_MAP in build-manifest.cjs updated with 3 new entries (now 9 total). Byte budgets in phase-frontmatter.test.cjs lowered for files where SWV block was removed: meta-validate (5888→5376), meta-update-plan (3584→3072), meta-update-implementation (4096→3584); other 6 files remain within existing budgets. All 1513 plugin tests pass. Regeneration required: workflows and _fragments.",
    "regenerate": [
      "workflows:_fragments",
      "workflows:commit_task",
      "workflows:implement_plan",
      "workflows:review_plan",
      "workflows:update_implementation",
      "workflows:approve_task",
      "workflows:update_plan",
      "workflows:review_implementation",
      "workflows:validate_task",
      "workflows:plan_task",
      "workflows:architect_sprint_plan",
      "workflows:collator_agent",
      "workflows:enhance",
      "workflows:fix_bug",
      "workflows:orchestrate_task",
      "workflows:migrate_structural",
      "workflows:sprint_retrospective",
      "workflows:architect_sprint_intake",
      "workflows:quiz_agent"
    ],
    "breaking": false,
    "manual": [
      "Run /forge:update to receive the 3 new _fragments/ files and updated workflow files that now carry fragment reference markers instead of verbatim Store-Write Verification blocks.",
      "CM-2/CM-3/CM-6 (Iron Laws and Generation Instructions duplication) are closed-as-documented via the template-guide pattern — the prose remains inline in each workflow. No manual deduplication needed."
    ]
  },
  "0.47.1": {
    "version": "0.47.2",
    "date": "2026-05-22",
    "notes": "FORGE-S25-T07 — extract lib/frontmatter.cjs (CRLF normalization), lib/slug.cjs (maxLen=30), lib/fsutil.cjs. Closes findings N-T-3, N-T-4, T-5. lib/frontmatter.cjs: canonical YAML frontmatter extractor normalizing all line endings (CRLF/CR/mixed) to LF on read — resolves silent divergence between build-base-pack.cjs and substitute-placeholders.cjs. lib/slug.cjs: deriveSlug(title, {maxLen=30}) with trailing-hyphen trim — closes slug truncation divergence between seed-store.cjs (truncated at 30) and store-facade.cjs (no truncation). lib/fsutil.cjs: ensureDir/isFile/isDirectory — consolidates 4 inline mkdirSync sites. One-shot migration script: tools/migrate-slug-maxlen.cjs (dry-run by default; --apply renames KB directories for any bug whose title exceeds 30 chars). forge-cli build-payload.cjs LIB_ALLOWLIST updated with frontmatter.cjs, slug.cjs, fsutil.cjs. Decision doc: doc/decisions/lib-extraction-contract.md.",
    "regenerate": [
      "tools:seed-store",
      "tools:store-facade",
      "tools:build-base-pack",
      "tools:substitute-placeholders"
    ],
    "breaking": false,
    "manual": [
      "Run `node forge/forge/tools/migrate-slug-maxlen.cjs` to check for long-title bug entities that may have slug changes under maxLen=30. If affected entities are reported, run with --apply to rename KB directories."
    ]
  },
  "0.47.0": {
    "version": "0.47.1",
    "date": "2026-05-22",
    "notes": "FORGE-S25-T06 — extract lib/json-io.cjs + lib/schema-loader.cjs (memoized). Closes findings T-1, T-10, H-4d, N-T-2. Creates forge/forge/tools/lib/json-io.cjs (readJson/writeJson shared primitives extracted from FSImpl in store.cjs) and forge/forge/tools/lib/schema-loader.cjs (memoized 4-path search chain: project → in-tree → plugin-installed → forge-cli bundled .schemas/; extracted from _getSchemas() in store-cli.cjs). Migrates four consumers: tools/store.cjs (FSImpl._readJson/_writeJson now delegate to lib/json-io.cjs), tools/lib/store-facade.cjs (_loadDir, getEntity, loadForgeConfig inline JSON.parse calls replaced with readJson), tools/store-cli.cjs (_getSchemas() body replaced with loadSchemas() wrapper — memoization and 4-path chain live in schema-loader.cjs; dead _schemas variable removed), hooks/validate-write.js (inline loadSchema() replaced with resolveSchemaLoader()+loadSchemas() — gains the bundled .schemas/ path that the previous inline implementation was missing). Adds unit tests: json-io.test.cjs (7 cases), schema-loader.test.cjs (7 cases), store-facade.test.cjs (9 cases). Full plugin test suite 1516/1516 passing. forge-cli build-payload.cjs LIB_ALLOWLIST updated with json-io.cjs + schema-loader.cjs; npm run build passes; both files confirmed in dist/forge-payload/tools/lib/. MINIMAL_REQUIRED is now canonical in schema-loader.cjs (exported); store-cli.cjs retains its own copy for the exported symbol surface (backward-compat). resetSchemaCache() exported for test isolation only. Additive, non-breaking — no schema changes, no workflow regeneration needed.",
    "regenerate": [
      "tools:store-facade",
      "tools:store-cli",
      "hooks:validate-write"
    ],
    "breaking": false,
    "manual": [
      "After /forge:update, the new lib/json-io.cjs and lib/schema-loader.cjs files will be installed alongside the updated tools. No manual steps needed for standard installs.",
      "forge-cli users: rebuild the forge-cli bundle (npm run build in forge-cli/) to pick up the two new lib files in the forge-cli bundled payload."
    ]
  },
  "0.46.2": {
    "version": "0.47.0",
    "date": "2026-05-22",
    "notes": "FORGE-S25-T12 schema hygiene — extract schemas/_defs/phaseSummary.schema.json (single-source for task + bug phase-summary shape; superset includes the bug-only `route` field used by meta-fix-bug.md triage). Refactor task.schema.json + bug.schema.json `summaries.*` slots to external $ref into the shared _defs file; drop inline $defs.phaseSummary from both (proven equivalent — bug `route` field now lives in the shared definition). Upgrade config.schema.json $schema to draft 2020-12 + HTTPS $id (https://github.com/Entelligentsia/agentic-skills/forge/config.schema.json) — body already 2020-12-compatible. Add root additionalProperties:false to config.schema.json — live dogfooded config validates clean, so no manual strip step is needed for known-good consumers. Port rich content from sdlc-config.schema.json into config.schema.json (pipelines definition, calibrationHistory, sprint.execution, pipeline.skipPhases + includeTokenDataInBugReports, commands.syntaxCheck object form, mode description) so config.schema.json becomes the single canonical source. DELETE forge/sdlc-config.schema.json outright (FORGE-S25-T12 / S-6) — three plugin consumers rewritten to schemas/config.schema.json in the same task: commands/health.md:57, init/sdlc-init.md:83, init/smoke-test.md:26+114. forge-cli's write-guard already loaded config.schema.json. Pre-commit grep across forge/forge/ + forge-cli/src/ confirmed zero live consumers of sdlc-config.schema.json (vision/*.md historical design docs only). Fix migrations.json typos schemas:events -> schemas:event at entries 0.43.12 and 0.43.11 (third occurrence at 0.45.0 was already correct). Remove stale schemas:update-check-cache target from 0.40.2 (FORGE-S25-T12 N-S-1; never resolvable — update-check-cache is a runtime cache, not a schema; documented via notes_addendum on the 0.40.2 entry). PREREQUISITE shared-surface change in forge-cli (paired same-commit): migration-engine.ts `schemas` branch in resolveCategory now walks .schemas/ recursively and preserves relative subdir structure under .forge/schemas/, so the new _defs/ subtree actually ships to user installs via /forge:update. forge-cli build-payload.cjs schema copy loop likewise recursive so the bundle carries _defs/phaseSummary.schema.json. Test surface: forge-cli adds migration-engine-defs.test.ts (5 cases, test-first) + migration-engine-dryrun.test.ts (2 cases, F-5 behavioural). Plugin tests stay 1492 green; forge-cli tests stay green (3 pre-existing unrelated doctor.test.ts failures from local auth env). Additive: no record field changes (phaseSummary $ref resolves to the same shape); store validation unchanged (validate-store.cjs validates top-level fields only, does not traverse $ref).",
    "regenerate": [
      "schemas",
      "commands:health",
      "init:sdlc-init",
      "init:smoke-test"
    ],
    "breaking": false,
    "manual": [
      "If any project carries non-canonical keys at the root of .forge/config.json, the tightened additionalProperties:false will fail validation under the new draft-2020-12 schema. Inspect the live config and remove unknown root keys before /forge:update completes. Live dogfooded configs validate clean — this step only applies to hand-edited installs.",
      "After /forge:update, manually delete `.forge/sdlc-config.schema.json` if present — it is the now-removed sibling schema; the regenerate mechanism only writes, it does not prune. No tooling reads it post-migration."
    ]
  },
  "0.46.1": {
    "version": "0.46.2",
    "date": "2026-05-22",
    "notes": "chore: FORGE-S25-T01 — plugin test baseline + no-skip CI gate. Adds `forge/tools/check-no-skipped-tests.cjs` (fails on committed it.skip / describe.skip / test.skip / it.only / describe.only / test.only / xit / xdescribe under forge/tools/__tests__ and forge/hooks/__tests__; warn-only secondary scan for FIXME:skip / TODO:re-enable so reminder comments cannot self-trip the gate; self-excludes its own paired test which carries literal marker fixtures). Expands `npm test` glob to `forge/tools/__tests__/*.test.cjs forge/hooks/__tests__/*.test.cjs` so hook failures can no longer hide outside CI. Lands `forge/.github/workflows/plugin-ci.yml` (Node 20, single job: skip-gate -> npm test -> manifest regen -> verify-integrity; no `npm ci` until T28 adds devDependencies + lockfile, marked with TODO(FORGE-S25-T28)). Deletes stale duplicate hook tests `check-update.test.js` and `forge-permissions.test.js` (canonical `.cjs` counterparts live in tools/__tests__/; grep proved zero callers outside docs/security/). Renames surviving hook tests post-init.test.js / post-sprint.test.js / validate-write.test.js to .test.cjs for layout uniformity (hook source `.js -> .cjs` rename deferred to T14). Adds `enhancement` to the store-cli emit RESERVED_GLOB so post-init/post-sprint hooks' enhancement-trigger events stop being silently dropped by the FK check — root-cause fix for the two pre-existing hook test failures. Adds `npm run lint:no-skip` script. Documents the no-skipped-tests policy in `forge/CLAUDE.md` Script Test Suite section. Full plugin suite now 1492/1492 (was 1437; +55 — hook suite + skip-gate + enhancement FK regression). Additive, non-breaking — no schema change, no workflow regeneration needed.",
    "regenerate": [
      "tools:check-no-skipped-tests",
      "tools:store-cli",
      "workflows:plugin-ci-tmp-smoke-job"
    ],
    "breaking": false,
    "manual": []
  },
  "0.46.0": {
    "version": "0.46.1",
    "date": "2026-05-22",
    "notes": "build: regenerate base-pack/workflows/enhance.md from meta sources to ship the FORGE-S24 SKILL-CURATION Phase 2 pipeline. The 0.45.1–0.45.7 entries declared `workflows:enhance` in their `regenerate` lists, but the meta→base-pack derivation (node tools/build-base-pack.cjs) was not re-run during the sprint, so the installable workflow stayed at the pre-S24 algorithm and downstream projects migrating to 0.46.0 received a stale workflow that lacked queue-drain (step 1a), recurrence scoring, delete-candidate detection (step 5b), compression gate (step 5b.5), and the LLM-judge step (step 5c). This patch bump regenerates the base-pack copy (init/base-pack/workflows/enhance.md — 280→600 lines, 20 S24 markers landed) and forces a re-copy on any project sitting at 0.46.0 by declaring `workflows:enhance` here. No plugin source change beyond the regenerated workflow file. Additive, non-breaking.",
    "regenerate": [
      "workflows:enhance"
    ],
    "breaking": false,
    "manual": []
  },
  "0.45.7": {
    "version": "0.46.0",
    "date": "2026-05-22",
    "notes": "chore: FORGE-S24 SKILL-CURATION sprint completion — gated rollout marker (FORGE-S24-T12). No plugin source change in this bump; the seven preceding entries (0.45.1 → 0.45.7) carry the actual SKILL-CURATION machinery: `skill_usage` event variant (T01, 0.45.1), proposal op classification (T02, 0.45.2), recurrence scoring (T04, 0.45.3), delete-candidate detection (T05, 0.45.4), LLM-judge rubric (T03, 0.45.5), compression gate (T06, 0.45.6), and queue-drain (T07, 0.45.7). T12 lands the gated-rollout contract on the forge-cli side via `forgeCli.skillCuration.enabled` (default OFF) — the four forge-cli modules (T08 skill-retriever, T09 skill-usage-tracker, T10 skill-curator-subagent, T11 friction-emit) no-op at entry when the flag is off, so a flag-off run is byte-identical to pre-FORGE-S24 behaviour. This plugin-side minor bump (0.45.7 → 0.46.0) is the convergent terminal marker for the sprint: it signals to operators running `/forge:update` that the full SKILL-CURATION pipeline has shipped end-to-end, and pairs with the forge-cli 0.13.4 → 0.14.0 bump that lands the rollout flag. No regeneration is required (no manifest entry change, no workflow change, no schema change in this bump alone — those landed in 0.45.1–0.45.7). Operators who want to enable the pipeline must (1) upgrade forge-cli to 0.14.0+ AND (2) set `forgeCli.skillCuration.enabled: true` in their project config at `<cwd>/.pi/forge-cli/config.json` (or the env override `FORGE_CLI_SKILL_CURATION_ENABLED=1` for one-shot operator use). Until both conditions hold, the new event variants and friction subkinds remain emitter-silent — the plugin schema continues to accept them on receipt, so a delayed forge-cli upgrade is non-blocking. Additive, non-breaking.",
    "regenerate": [],
    "breaking": false,
    "manual": []
  },
  "0.45.6": {
    "version": "0.45.7",
    "date": "2026-05-22",
    "notes": "feat: queue drain at sprint close — per-task curator → batched review (FORGE-S24-T07). Adds `forge/tools/queue-drain.cjs` exporting `bodyHash(body)` (sha256 hex digest, UTF-8), `dedupeKey(proposal)` (`<op>|<target_path>|<sha256(diff_body)>` composite), `dedupeProposals(proposals)` (first-seen-wins, no-mutation), `queuePathFor({queueRoot, sprintId, taskId, ts})` (canonical `.forge/enhancement-proposals/queue/<sprintId>/<taskId>-<ts>.json` path), `appendToQueue({queueRoot, sprintId, taskId, ts, proposals})` (writes one file per curator run; throws if path exists — append-only invariant per AC1), and `drainQueue({queueRoot, sprintId})` (returns `{proposals, files, errors}` after deduping the sprint sub-dir; empty-safe when queue missing per AC5; skips malformed JSON and reports them via `errors`; deterministic lexicographic file ordering ⇒ chronological because of the ts suffix). Per-task curators (T10) append proposals to the queue throughout the sprint without collision (AC2 — distinct ts per call); Phase 2 reads the queue once at sprint close, dedupes by `{op, target_path, body-hash}` (AC3), and merges the queued proposals with the friction-synthesised ones, then feeds a SINGLE batched array through recurrence (T04) → delete-candidate detection (T05) → compression gate (T06) → judge (T03) — one prompt per sprint, not one per task (AC4, paper §3.2.1 grouped reward). `meta/workflows/meta-enhance.md` Phase 2 gains step 1a (drain queue) and step-5 merge sub-block; the zero-input guard now checks both friction events AND queued proposals before exiting cleanly with `frictionCount:0,queuedCount:0`. The drain is read-only — Phase 2 never deletes queue files; operators triage them during retrospective. Test-first per Iron Law 2: `queue-drain.test.cjs` (19 cases — exports surface, bodyHash sha256 contract + empty-body digest + collision contract, dedupeKey AC3 composite + field-sensitivity, dedupeProposals dedup + order-preservation + no-mutation + empty + non-array, queuePathFor AC1 canonical layout + input validation x3, appendToQueue AC1 fresh-file write + AC2 no-collision + append-only refusal, drainQueue AC5 empty/missing safety + AC3 multi-file dedup merge + AC4 single-batch output + sprint scoping + input validation x2 + malformed-JSON resilience) landed before the helper. Pure helpers; fs-touching helpers are `appendToQueue` and `drainQueue` only. Full suite 1437/1437 (was 1418; +19). Additive, non-breaking.",
    "regenerate": [
      "tools:queue-drain",
      "workflows:enhance"
    ],
    "breaking": false,
    "manual": []
  },
  "0.45.5": {
    "version": "0.45.6",
    "date": "2026-05-22",
    "notes": "feat: compression gate — reject >20% growth without 3+ frictions (FORGE-S24-T06). Adds `forge/tools/compression-gate.cjs` exporting `GROWTH_THRESHOLD` (0.20), `MIN_SUPPORTING_FRICTIONS` (3), `evaluateGrowth({currentBody, newBody}) -> {currentBytes, newBytes, growthRatio}`, `evaluateProposal({proposal, currentBody, newBody, supportingFrictionCount}) -> {admit, reason, growthRatio, currentBytes, newBytes, supportingFrictionCount, threshold, minSupportingFrictions, op}`, and `filterProposals({proposals, currentBodyFor, newBodyFor, supportingFrictionCountFor}) -> {admitted, rejected}`. The gate runs in `meta/workflows/meta-enhance.md` Phase 2 as new step 5b.5 BEFORE the LLM judge (5c) — cheap deterministic filter first. Only `update_skill` proposals are gated; `insert_skill` and `delete_skill` pass through unconditionally (insert bloat is the judge's `body_under_2kb` axis; delete only shrinks). Growth is measured byte-wise via `Buffer.byteLength(body, 'utf8')` on the new body that would land after applying the proposal's diff. Threshold comparison is strict (>0.20) so ties at exactly 20% admit. Default supporting friction count = `proposal.sourceFrictionIds.length`; the caller may override via `supportingFrictionCountFor(proposal)` when the policy is to count frictions citing the same skill across the sprint. Updates on an empty current body yield `growthRatio: Infinity` and the friction-support rule still applies; shrinks (negative growth) admit unconditionally. Rejected proposals are persisted to the same `phase2-<timestamp>-rejections.json` sibling that the T03 judge writes, with reason `compression_gate_growth_unsupported` and the full evaluation record alongside the original proposal — every drop (gate or judge) stays traceable. Closes the unbounded-growth failure mode of SkillOS — pasting pages of trajectory copy-paste to 'patch' a friction now requires real recurrence evidence. Test-first per Iron Law 2: `compression-gate.test.cjs` (25 cases — GROWTH_THRESHOLD/MIN_SUPPORTING_FRICTIONS constants, evaluateGrowth shape, UTF-8 multibyte byte counting, empty-current-body Infinity ratio, AC1 0-friction rejection, AC2 3-friction admission, 2-friction insufficiency, AC5 exact-20% strict admission, under-threshold admission, sourceFrictionIds fallback, shrink admission, AC4 insert_skill/delete_skill pass-through, input validation x5, filterProposals AC6 ordering/partition, empty input, no-mutation invariant, callback contracts, supportingFrictionCountFor override) landed before the helper. Pure module; no fs access; no LLM call. Full suite 1418/1418 (was 1393; +25). Additive, non-breaking.",
    "regenerate": [
      "tools:compression-gate",
      "workflows:enhance"
    ],
    "breaking": false,
    "manual": []
  },
  "0.45.4": {
    "version": "0.45.5",
    "date": "2026-05-22",
    "notes": "feat: LLM-judge step in Phase 2 — Sonnet rubric, drop <3/5 (FORGE-S24-T03). Adds `forge/tools/judge-proposal.cjs` exporting `RUBRIC_AXES` (frozen 5-axis tuple: specificity, when_not_to_use, no_trajectory_copy_paste, body_under_2kb, cites_friction), `scoreProposal(proposal) -> { axes, average }` (deterministic per-axis 0..5 scorer), and `decideJudgement({ axes }) -> { verdict, average, axes, reason }` (pure aggregator: verdict === 'drop' iff average < 3, strict; ties at 3.0 keep). The rubric is single-sourced in this helper — Sonnet's role is to apply the same axes and emit scores that the helper then validates and aggregates; in the absence of an LLM call the deterministic scorer is the fallback. `decideJudgement` fails loud on missing or out-of-range axes (RangeError) so a malformed score sheet never silently coerces into a verdict. `meta/workflows/meta-enhance.md` Phase 2 gains step 5c calling `scoreProposal` + `decideJudgement` for every proposal between delete-candidate detection (5b) and artifact write (6); kept proposals continue to step 6, dropped proposals are persisted to a sibling `phase2-<timestamp>-rejections.json` carrying the original proposal alongside `{ verdict, average, axes, reason }` so every rejection is traceable for retro review (AC3). Per-axis heuristics: specificity scores deep paths, named (non-generic) skill files, non-trivial rationales, and recurrence trails; when_not_to_use checks for the literal phrase; no_trajectory_copy_paste flags long verbatim runs or unbroken non-whitespace blocks >= 400 bytes; body_under_2kb gates on `Buffer.byteLength(diff_body,'utf8') <= 2048`; cites_friction rewards `sourceFrictionIds.length` >= 1, boosting for multi-citation and recurrence. Consumes recurrence data from T04 in the specificity and cites_friction axes — proposals that recurred across multiple tasks score higher. Test-first per Iron Law 2: `judge-proposal.test.cjs` (13 cases — rubric-axes shape, 5/5 keep fixture, 1/5 drop fixture, body byte boundary at exactly 2048, zero-citation suppression, phrase-presence binary, AC6 explicit 2.8/5 drop fixture, keep + drop end-to-end decisions, exact-3.0 boundary keeps, missing-axis RangeError, out-of-range RangeError) landed before the helper. Pure module; no fs access; no LLM call. Full suite 1393/1393 (was 1380; +13). Additive, non-breaking.",
    "regenerate": [
      "tools:judge-proposal",
      "workflows:enhance"
    ],
    "breaking": false,
    "manual": []
  },
  "0.45.3": {
    "version": "0.45.4",
    "date": "2026-05-22",
    "notes": "feat: delete-candidate detection — 3-sprint zero-use (FORGE-S24-T05). Adds `forge/tools/delete-candidate-detector.cjs` exporting `scanZeroUse({events, sprintOrder, windowSize})` and `buildDeleteProposals({events, sprintOrder, windowSize, targetPathFor})`. The detector scans `skill_usage` events across the trailing `windowSize` (default 3) sprints; any skill with at least one in-window observation AND zero `retrieved` AND zero `used` qualifies as a delete candidate. Skills with zero in-window observations are explicitly NOT proposed — that case is indistinguishable from a newly-added skill that hasn't been loaded yet. `meta/workflows/meta-enhance.md` Phase 2 gains step 5b calling `buildDeleteProposals` between recurrence annotation (step 5a) and artifact write (step 6). Each delete proposal carries `op: 'delete_skill'`, `target_path` resolved via the supplied `targetPathFor(skillId)` callback, a diff body and rationale that name the cold skill and the observed sprints, `sourceFrictionIds: []` (usage-derived, not friction-derived), `window_size`, `window_sprint_ids`, plus neutral `recurrence_count: 1` and `recurrence_task_ids: []` so the proposal shape stays uniform with the rest of the Phase 2 array. Carry-over caveat documented in the workflow: the trailing-3-sprint window only becomes meaningful once 3 sprints have elapsed since `skill_usage` emission landed in T01 (0.45.1); short-history runs produce advisory rather than authoritative deletes. This is the only mechanism by which the skill repository shrinks, completing the three-op classification rollout from T02 (insert/update were already in play). Test-first per Iron Law 2: `delete-candidate-detector.test.cjs` (16 cases — three-sprint zero-use baseline, retrieved=true disqualification, used=true disqualification, trailing-window guard against pre-window usage, default windowSize 3, configurable windowSize, never-observed-in-window suppression, empty events, friction-event filtering, short-history carry-over case, no-mutation invariant, multi-skill output, deterministic ordering, callback contract, plus AC restatement cases) landed before the detector. Pure module; no fs access. Full suite 1380/1380 (was 1364; +16). Additive, non-breaking.",
    "regenerate": [
      "tools:delete-candidate-detector",
      "workflows:enhance"
    ],
    "breaking": false,
    "manual": []
  },
  "0.45.2": {
    "version": "0.45.3",
    "date": "2026-05-22",
    "notes": "feat: cross-task replay scoring — recurrence boost (FORGE-S24-T04). Adds `forge/tools/replay-scoring.cjs` exporting `computeRecurrence({events, subkind, skillId, fromTaskId, taskOrder})` and `annotateProposals(proposals, frictionEvents, taskOrder)`. For each Phase 2 enrichment proposal synthesised from a friction event at task `t`, the annotator scans tasks `t+1..N` in the same sprint for friction events matching the same `(subkind, evidence.skillId)` pair and stamps `recurrence_count` (>= 1, includes the origin task) and `recurrence_task_ids` (taskOrder-sorted) onto the proposal. Forward-only scan: earlier tasks before `fromTaskId` are excluded. Proposals without resolvable `sourceFrictionIds` (eventId not in the friction set, or the resolved event lacks subkind/evidence.skillId) receive a neutral `recurrence_count: 1` and empty `recurrence_task_ids: []`. `meta/workflows/meta-enhance.md` Phase 2 gains step 5a calling `annotateProposals` between synthesis (step 5) and artifact write (step 6); the step 5 contract is tightened to require `sourceFrictionIds` to carry every contributing eventId so the recurrence scan can resolve provenance. `forge/schemas/proposal.schema.json` gains optional `recurrence_count` (integer minimum:1) and `recurrence_task_ids` (array of strings) properties — additive only, both fields are optional, `additionalProperties: false` continues to reject unknown keys. Feeds T03 (judge) so specificity scoring can boost frictions that recurred across multiple tasks. Test-first per Iron Law 2: `replay-scoring.test.cjs` (11 cases — AC3 three-task recurrence, single-task baseline, forward-only-direction guard, subkind mismatch rejection, skillId mismatch rejection, intra-task dedup, fromTaskId-outside-taskOrder fallback, missing-evidence guard, full annotateProposals happy path, unresolved-provenance neutral case, no-mutation invariant) landed before the helper. Full suite 1364/1364 (was 1353; +11). Additive, non-breaking.",
    "regenerate": [
      "tools:replay-scoring",
      "schemas:proposal",
      "workflows:enhance"
    ],
    "breaking": false,
    "manual": []
  },
  "0.45.1": {
    "version": "0.45.2",
    "date": "2026-05-22",
    "notes": "feat: Phase 2 proposal op classification (FORGE-S24-T02). Adds `forge/schemas/proposal.schema.json` and `forge/tools/proposal-normalize.cjs`. The new schema enumerates `op` ∈ {insert_skill, update_skill, delete_skill} with required `target_path` + `diff_body`; `additionalProperties: false` rejects unknown fields. `meta/workflows/meta-enhance.md` Phase 2 (steps 5–6) now requires every enrichment proposal to carry this triplet and writes a machine-readable `phase2-<timestamp>.json` alongside the existing markdown artifact. Back-compat: legacy proposals without `op` are normalised to `insert_skill` via `proposal-normalize.cjs:normaliseProposal()` — downstream consumers route through the helper explicitly so normalisation is auditable. Foundation for T03 (judge), T05 (delete-candidate detection), T06 (compression gate), T07 (queue drain). Test-first per Iron Law 2: `proposal-schema.test.cjs` (6 cases including missing-op rejection, unknown-op rejection, additionalProperties:false, and the legacy normalisation contract) landed before the schema. Full suite 1353/1353. Additive, non-breaking.",
    "regenerate": [
      "schemas:proposal"
    ],
    "breaking": false,
    "manual": []
  },
  "0.45.0": {
    "version": "0.45.1",
    "date": "2026-05-22",
    "notes": "feat: event.schema.json — new `skill_usage` event variant (FORGE-S24-T01, plan 08 Phase B). Adds `skill_usage` to the `type` enum and a conditional allOf branch requiring {skillId, retrieved, used, tool_call_success_rate, retrieval_score}. Top-level numeric properties (`tool_call_success_rate`, `retrieval_score`) carry [0,1] declarative bounds; `skillId` is `minLength: 1`. The root `additionalProperties: false` gate continues to reject unknown fields on every variant. Foundation for Sprint S24 SKILL-CURATION: T02 emits, T04 retrieval-score correlation, T05 delete-candidate detection, T08 replay scoring all consume records of this type. No code path change to validate-store.cjs — the existing validateRecord() handles the new allOf branch via the same machinery used for friction / sprint-complete / sprint-halted variants. Additive, non-breaking: existing event records remain valid. Note on target version: TASK_PROMPT requested v0.45.0 but that tag already shipped (snapshot-replay change); bumping to 0.45.1 is the minimum forward step.",
    "regenerate": [
      "schemas:event"
    ],
    "breaking": false,
    "manual": []
  },
  "0.44.10": {
    "version": "0.45.0",
    "date": "2026-05-21",
    "notes": "feat: Approach A — snapshot replay (forge#107). manage-versions gains a new replay subcommand that restores user-enhanced files captured by /forge:enhance Phase 2 snapshots after /forge:regenerate writes fresh base-pack content. Fulfills layer 3 of the composition contract (Working Artifact = base + snapshot + user_enhancements) declared at manage-versions.cjs:13. regenerate.md updated to invoke replay per category (personas, skills, workflows, templates) between subagent generation and manifest record. Overlay semantics: user-enhanced files retain captured content; later snapshots win on collision. Pairs with v0.44.10 (forge#108 archive-path fix) which made layer 2 functional in the first place.",
    "regenerate": [
      "commands:regenerate",
      "tools:manage-versions"
    ],
    "breaking": false,
    "manual": []
  },
  "0.44.9": {
    "version": "0.44.10",
    "date": "2026-05-21",
    "notes": "fix: manage-versions add-snapshot now archives files correctly when --enhanced-elements paths include the .forge/ prefix (forge#108). Previously, every archive directory has been created empty since basePackVersion 0.43.3 — layer 2 of the composition contract was silently a no-op. Tool now strips a leading .forge/ from each element path before joining; both .forge/-relative (e.g. personas/X.md) and project-root-relative (.forge/personas/X.md) forms accepted. Unblocks forge#107 (Approach A — snapshot replay). Pure tool fix.",
    "regenerate": [
      "tools:manage-versions"
    ],
    "breaking": false,
    "manual": []
  },
  "0.44.8": {
    "version": "0.44.9",
    "date": "2026-05-21",
    "notes": "fix: /forge:regenerate personas + skills silently overwrote manual modifications (forge#106 / FORGE-BUG-037). Pre-write generation-manifest check added to both single-file and full-rebuild paths in commands/regenerate.md, mirroring the workflows + templates pattern. Closes asymmetric modification-detection across the four structural-element categories. Markdown-only fix.",
    "regenerate": [
      "commands:regenerate"
    ],
    "breaking": false,
    "manual": []
  },
  "0.44.7": {
    "version": "0.44.7",
    "date": "2026-05-21",
    "notes": "fix: build-persona-pack.cjs schema mismatch — tool now accepts both base-pack (no frontmatter) and meta (YAML frontmatter) persona files; derives id/role/summary/responsibilities/outputs/file_ref from content for base-pack; derives file_ref from path for base-pack skills; throws (no empty-pack write) when both dirs are empty.",
    "regenerate": [
      "tools:build-persona-pack"
    ],
    "breaking": false,
    "manual": []
  },
  "0.44.5": {
    "version": "0.44.6",
    "date": "2026-05-20",
    "notes": "P1 bug-fix batch (forge-cli#25): (C) substitute-placeholders.cjs now probes .base-pack/ before init/base-pack/ when no --base-pack flag is given, and short-circuits on --help/--h before any path check; (D) store-cli.cjs list event traverses all events/ sub-directories (bugs/, enhancement/, <sprintId>/) and returns the union — previously exited 1 with 'Unknown entity type: event'; (E) substitute-placeholders.cjs gains --category flag to limit materialisation to named subdirectories; commands/regenerate.md documents the --category scope-enforcement rule.",
    "regenerate": [
      "tools:substitute-placeholders",
      "tools:store-cli",
      "commands:regenerate"
    ],
    "breaking": false,
    "manual": []
  },
  "0.44.4": {
    "version": "0.44.5",
    "date": "2026-05-21",
    "notes": "Migration apply path — runMigrations() deterministic engine + /forge:update integration (FORGE-S23-T01). Adds forge-cli migration-engine.ts: semver-range traversal [from, to) on keys, per-category resolver (84 unique category strings), idempotency ledger at .forge/applied-migrations.json, always-on schema refresh post-pass, fileOps forward-compat, path-traversal defense. The /forge:update command now prompts to apply migrations after npm upgrade; FORGE_NON_INTERACTIVE=1 auto-applies. update_plan and plan_task workflows reference migration application steps.",
    "regenerate": [
      "workflows:update_plan",
      "workflows:plan_task"
    ],
    "breaking": false,
    "manual": []
  },
  "0.44.3": {
    "version": "0.44.4",
    "date": "2026-05-19",
    "notes": "Supervisor persona gains a top-level Iron Law forbidding `store-cli update-status` writes from any review phase. The workflow-level guard at meta-review-plan.md:76 and meta-review-implementation.md:82 (\"Bug mode — NO status write\") already existed; this is the persona-level reinforcement. Surfaced during FORGE-BUG-003 re-run testing of the forge-cli stale-ctx fix, where a supervisor subagent attempted `update-status bug FORGE-BUG-003 status plan-approved` against a bug already in terminal `fixed` state. store-cli correctly rejected the illegal transition; the persona update is defense-in-depth so the model stops attempting the write at all.",
    "regenerate": [
      "personas:supervisor"
    ],
    "breaking": false,
    "manual": []
  },
  "0.44.2": {
    "version": "0.44.3",
    "date": "2026-05-19",
    "notes": "Add `route` (enum [A, B]) to phaseSummary in bug.schema.json and the mirrored PHASE_SUMMARY_SCHEMA constant in store-cli.cjs. Required so triage subagents can record the fix-bug pipeline route decision via set-bug-summary. EMG-BUG-001 v0.44.2 first run failed with `route: undeclared field` because the schema's additionalProperties:false rejected the new field. Optional, triage-only by convention; non-triage phases ignore it.",
    "regenerate": [
      "tools:store-cli",
      "schemas:bug"
    ],
    "breaking": false,
    "manual": []
  },
  "0.44.1": {
    "version": "0.44.2",
    "date": "2026-05-19",
    "notes": "parse-gates.cjs now accepts `n/a` as a valid `after <phase> = <verdict>` directive value, matching read-verdict.cjs § ALLOWED_VERDICTS. EMBERGLOW-BUG-001 (v0.44.1 second run) halted at preflight exit 2 (gate misconfigured) because the new fix-bug meta uses `after triage = n/a` (legitimate for setup phases that produce verdict: \"n/a\") and the parser hardcoded the verdict set to {approved, revision}. Test added covering n/a parsing.",
    "regenerate": [
      "tools:parse-gates"
    ],
    "breaking": false,
    "manual": []
  },
  "0.44.0": {
    "version": "0.44.1",
    "date": "2026-05-19",
    "notes": "Rename the triage route field from summaries.triage.path to summaries.triage.route to avoid collision with bug.path (artifact directory). Symptom from v0.44.0 first run on emberglow (EMBERGLOW-BUG-001): triage subagent wrote `\"path\": \"A\"` to the bug record, overwriting the artifact directory, causing TRIAGE.md to land under .forge/store/bugs/ instead of engineering/bugs/. Field is now `route`. The fix-bug meta carries a 'Field-naming caution' callout citing the regression so future readers understand why route is named route, not path.",
    "regenerate": [
      "workflows:fix_bug"
    ],
    "breaking": false,
    "manual": [
      "If any bug at EMBERGLOW-BUG-001 vintage carries `path: \"A\"` or `path: \"B\"`, restore its real artifact directory before regeneration: FORGE_ALLOW_FORCE=1 node .forge/tools/store-cli.cjs write bug '{...corrected JSON with path: \"engineering/bugs/{slug}\"...}'"
    ]
  },
  "0.43.19": {
    "version": "0.44.0",
    "date": "2026-05-19",
    "notes": "fix-bug workflow rewrite — aligns with run-task persona/phase/state-transition model except for a single post-triage branch: Path A (short-circuit — minor severity, single-file ≤20-line diff, obvious regression test) skips plan-fix and review-plan; Path B (default, full loop) runs the entire pipeline. Six sub-workflows (plan_task, implement_plan, review_plan, review_code, architect_approve, commit_task) accept --bug in addition to --task and route bug-mode through BUG_PHASE_VERDICT_SOURCE in read-verdict.cjs. Bug status enum collapsed to reported→triaged→in-progress→fixed (terminal); removed approved and verified — vestigial states that produced the FORGE-BUG-002 LLM-translation trap. store-cli emit and validate-store now reserve the virtual sprint dir 'bugs' (matches validate-store.spec.md). collate.cjs reads bug events from the shared events/bugs/ directory filtered by event.bugId; new store.cjs purgeBugEvents filters and deletes only the target bug's events plus matching sidecars. Fixes silent cost-summary data loss and disk leak in bug-phase event tracking.",
    "regenerate": [
      "workflows:fix_bug",
      "workflows:plan_task",
      "workflows:implement_plan",
      "workflows:review_plan",
      "workflows:review_code",
      "workflows:architect_approve",
      "workflows:commit_task",
      "tools:store-cli",
      "tools:store",
      "tools:validate-store",
      "tools:collate",
      "schemas:bug"
    ],
    "breaking": false,
    "manual": [
      "Run /forge:update to regenerate the seven workflows, four tools, and bug schema.",
      "If any bug record in .forge/store/bugs/ has status 'approved' or 'verified', transition it to 'fixed' before regeneration — those enum values were removed. Use: FORGE_ALLOW_FORCE=1 node .forge/tools/store-cli.cjs update-status bug <BUG-ID> status fixed --force"
    ]
  },
  "0.43.18": {
    "version": "0.43.19",
    "date": "2026-05-17",
    "notes": "G7 — FK-check on store-cli emit sprintId, reserved-prefix carve-out (SYS-*), --allow-synthetic escape hatch, and orphan event-dir flagger in validate-store. store-cli emit now rejects sprintIds not found in .forge/store/sprints/ and not matching SYS-* prefix, with Did-you-mean suggestions. validate-store adds Pass 2b scanning .forge/store/events/ for subdirs with no matching sprint record (warns ORPHAN_EVENT_DIR). Fixes silent acceptance of bare-string sprintIds that created orphan event dirs.",
    "regenerate": [
      "tools:store-cli",
      "tools:validate-store"
    ],
    "breaking": false,
    "manual": []
  },
  "0.43.17": {
    "version": "0.43.18",
    "date": "2026-05-17",
    "notes": "G4 — Vocab-drift detector and 'Did you mean?' suggestions across store-cli + validate.js error paths. New lib/suggest.cjs (Levenshtein + curated DRIFT_MAP) attaches suggestions at 12 store-cli error sites (entity types, transition rules, illegal transitions, unknown entity, unknown command) and at validate.js enum + undeclared-field errors. 46 suggest.test.cjs unit tests + 10 store-cli CLI integration tests added. Agent self-correction observed in fresh-corpus capture (e.g. `list tasks` → 'Did you mean \"task\"?'). Pairs with G3 aliases (0.43.17).",
    "regenerate": [
      "tools:store-cli",
      "tools:validate-store"
    ],
    "breaking": false,
    "manual": []
  },
  "0.43.16": {
    "version": "0.43.17",
    "date": "2026-05-17",
    "notes": "G3 — Six read-aliases for high-friction get ops on store-cli (get, get-task, get-bug, get-sprint, get-summary, get-bug-summary). ALIAS_MAP rewrites argv to ['read', entity, id, ...flags]; summary aliases route as direct cmdGetSummary/cmdGetBugSummary switch cases. Eliminates 37 of 39 erroring get* ops in the 927-op friction fixture (94.9%). Additive surface — no schema change, no removed verbs. 15 new node:test cases including byte-equality pairs and error variants. store-cli-verbs.md (base-pack + meta) refreshed.",
    "regenerate": [
      "tools:store-cli",
      "workflows:_fragments_store-cli-verbs"
    ],
    "breaking": false,
    "manual": []
  },
  "0.43.15": {
    "version": "0.43.16",
    "date": "2026-05-15",
    "notes": "Sprint finalization ceremony (Plan 12). Add sprint-complete and sprint-halted event variants to event.schema.json with conditional requireds via allOf/if/then. Loosen top-level required (move taskId/phase/iteration into task-scoped allOf branch). Gate workflow finalize step-4 on verdict (Approved → completed; Revision Required + partial → partially-completed; Revision Required + complete → no transition). Update validate-store.cjs allOf if/then interpreter to support enum predicates alongside const. Pairs with forge-cli v0.6.6.",
    "regenerate": [
      "schemas:event",
      "workflows:architect_review_sprint_completion"
    ],
    "breaking": false,
    "manual": []
  },
  "0.43.14": {
    "version": "0.43.15",
    "date": "2026-05-14",
    "notes": "Slice-2 fragment-sweep completion. v0.43.14 introduced the orchestrator-emits-everything contract and surgically rewrote the five phase workflows (plan/review-plan/implement/validate/commit) plus their meta sources, but 16 other workflows — every other base-pack workflow body — still carried the pre-Slice-2 'Emit the complete event ... via store-cli emit' instruction and 'Execute Token Reporting' step in their Finalize blocks. Any subagent reading those workflows would faithfully reproduce the exact hallucination class Slice 2 was built to kill (LLM-fabricated model/provider strings). This patch removes those two lines from every remaining workflow — meta sources (meta-approve, meta-update-implementation, meta-review-implementation, meta-review-sprint-completion, meta-sprint-intake, meta-sprint-plan, meta-collate, meta-update-plan, meta-fix-bug, meta-retrospective) and base-pack mirrors (architect_sprint_plan, sprint_retrospective, architect_approve, collator_agent, architect_review_sprint_completion, fix_bug, update_implementation, architect_sprint_intake, update_plan, review_code). Replaced with the canonical 'Do NOT emit a phase event yourself; the orchestrator (or kickoff handler) owns event emission' directive. Also swept the friction-emit code block in meta-fix-bug.md and base-pack/fix_bug.md to point at friction-emit.cjs (matches the pattern shipped for meta-orchestrate in v0.43.14). For workflows that are kickoff-only standalones today (sprint-intake, sprint-plan, collate, retrospective, review-sprint-completion), removing the hardcoded emit means honest-absence of event coverage until the corresponding forge-cli kickoff handlers learn to emit on the LLM's behalf — a follow-up item. Tests: 1202 pass.",
    "regenerate": [
      "workflows:fix_bug",
      "workflows:update_plan",
      "workflows:update_implementation",
      "workflows:review_code",
      "workflows:architect_approve",
      "workflows:architect_sprint_intake",
      "workflows:architect_sprint_plan",
      "workflows:architect_review_sprint_completion",
      "workflows:sprint_retrospective",
      "workflows:collator_agent",
      "tools:integrity"
    ],
    "breaking": false,
    "manual": []
  },
  "0.43.13": {
    "version": "0.43.14",
    "date": "2026-05-14",
    "notes": "Telemetry contract Slice 2 — orchestrator-emits-everything. Slice 1 (v0.43.13) added `provider` as required and moved cost out of the schema, but subagents were still hand-building 14-field event JSON containing runtime facts (model, provider, eventId, timestamps, iteration) and hallucinating them (HLO-S01-T05 evidence: events carried `provider:\"anthropic\"`/`model:\"claude-sonnet-4-20250514\"` while the subagent actually ran on `glm-5.1:cloud`). Slice 2 makes runtime attribution the orchestrator's responsibility end-to-end. Plugin-side changes: (1) workflow fragments `_fragments/event-emission-schema.md` and `_fragments/friction-emit.md` rewritten in both meta/ and init/base-pack/ — replace 'build a 14-field event JSON' instructions with 'write {PHASE}-SUMMARY.json; the orchestrator emits the event'. ALL hardcoded example model strings removed (the source of pattern-copy hallucination). (2) Phase meta workflows (meta-plan-task, meta-review-plan, meta-implement, meta-validate, meta-commit) and their base-pack mirrors (plan_task, review_plan, implement_plan, validate_task, commit_task) drop the `Emit the complete event ... via store-cli emit` line and the `Execute Token Reporting` step — subagents now only write SUMMARY and return. (3) meta-orchestrate.md + base-pack/orchestrate_task.md Event Emission and Friction Emit sections rewritten: orchestrator owns emission; friction is recorded by subagents via the new `friction-emit.cjs` tool which appends judgement-only records to `.forge/cache/FRICTION-{workflow}.jsonl`, drained and stamped with runtime attribution by the orchestrator. (4) New tool `forge/forge/tools/friction-emit.cjs` — judgement-only CLI that refuses any runtime-attribution flag (--model, --provider, --eventId, timestamps, tokens). (5) New tool `forge/forge/tools/backfill-provider.cjs` — one-shot helper for the 0.43.13 manual[] item (stamps provider:\"unknown\" on legacy events missing the field; sidecars skipped). Both tools shipped test-first per Iron Law 2. Slice 2 runtime emit site lives in forge-cli (run-task.ts) — see forge-cli v0.6.5 changelog. Tests: 1202 pass.",
    "regenerate": [
      "fragments:event-emission-schema",
      "fragments:friction-emit",
      "workflows:plan_task",
      "workflows:review_plan",
      "workflows:implement_plan",
      "workflows:validate_task",
      "workflows:commit_task",
      "workflows:orchestrate_task",
      "tools:friction-emit",
      "tools:backfill-provider",
      "tools:integrity"
    ],
    "breaking": false,
    "manual": [
      "Run `node $FORGE_ROOT/tools/backfill-provider.cjs` once on existing installs to stamp `provider:\"unknown\"` on legacy events missing the field — this is the helper promised in 0.43.13 manual[]. After backfill, all event reads should validate cleanly."
    ]
  },
  "0.43.12": {
    "version": "0.43.13",
    "date": "2026-05-14",
    "notes": "Telemetry contract fix (Slice 1) — refactors the token-usage capture pipeline from a subagent self-probe (which never worked: pi runtime has no `/cost` probe, and the workflow's `tokenSource: \"missing\"` writes were rejected by the schema enum [reported, estimated] causing 8 schema_drift errors per HLO-S01-T04 run) to an orchestrator-owned model. Three changes: (1) event.schema.json adds `provider` as a required field — same model is priced differently across providers (Anthropic direct vs Bedrock vs Vertex; ZAI cloud vs self-host) and cost is unattributable without it; auto-populated via new discoverProvider() helper from FORGE_PROVIDER / CLAUDE_CODE_PROVIDER env vars, falling back to \"unknown\" rather than guessing. (2) Dropped `estimatedCostUSD` from event + event-sidecar schemas entirely — cost is derived at collate time from (provider, model, tokens) via tools/lib/pricing.cjs, keeping the dataset truthful when pricing changes. (3) Rewrote meta/workflows/_fragments/finalize.md AND init/base-pack/workflows/_fragments/finalize.md to delete the broken `/cost` probe + `\"missing\"` write instructions; new rule: subagents MUST NOT write token sidecars; orchestrator owns telemetry and emits the canonical event with provider-reported usage. If runtime doesn't surface usage, fields are omitted (honest absence beats placeholder zeros). collate.cjs drops the `missing` bucket from tokenSourceCounts — token-less events surface as husks instead. Tool changes: store-cli.cjs (CANONICAL_TOKEN_FIELDS + SIDECAR_ACCEPTED_FIELDS adjusted, --provider flag added on record-usage, --estimated-cost-usd flag explicitly rejected with helpful error, discoverProvider() exported); estimate-usage.cjs (removed PRICE_PER_1M heuristic table + DEFAULT_PRICE_PER_1M — returns only inputTokens/outputTokens/tokenSource); collate.cjs (cost recomputed via pricing.cjs is now the only source). Slice 2 (forge-cli runtime emit site) will wire the orchestrator emit path that consumes this contract — out of scope here. Tests: 1173 pass, 1 pre-existing FRAGMENT_MAP failure unrelated to this slice. No `.forge/` or `engineering/` edits.",
    "regenerate": [
      "schemas:event",
      "schemas:event-sidecar",
      "fragments:finalize",
      "tools:store-cli",
      "tools:estimate-usage",
      "tools:collate",
      "tools:integrity"
    ],
    "breaking": false,
    "manual": [
      "Existing event records on disk that lack `provider` will fail strict validation. On re-running collate or any read path that validates events, stamp legacy records with `provider: \"unknown\"` — a one-shot backfill helper will ship in a follow-up patch. New events emitted by `store-cli emit` auto-populate `provider` via FORGE_PROVIDER env var or fall back to \"unknown\".",
      "`estimatedCostUSD` is no longer accepted on event or event-sidecar records. Existing records on disk that carry the field will fail strict validation; collate's recomputation path (lib/pricing.cjs) is now authoritative."
    ]
  },
  "0.43.11": {
    "version": "0.43.12",
    "date": "2026-05-14",
    "notes": "build-base-pack.cjs + build-manifest.cjs allowlist bug — fragments added to meta/workflows/_fragments/ after the allowlists were last edited never reached init/base-pack/workflows/_fragments/, so the user-facing bundle silently dropped them. Discovered while debugging HLO-S01-T03 plan-phase friction in the testbench: store-cli verb fumble (#95) and event-shape iteration (#87) persisted after /forge:regenerate because store-cli-verbs.md and friction-emit.md were missing from the regenerated `.forge/workflows/_fragments/` even though the workflow body referenced them. Fix: both build-base-pack.cjs (fragment copy loop + expected-files validator) and build-manifest.cjs (FRAGMENT_MAP) now enumerate fragments dynamically from `meta/workflows/_fragments/*.md` instead of from hardcoded lists. Added parity assertion in build-base-pack.test.cjs that base-pack `_fragments/` must equal meta `_fragments/` exactly. Also bumped base-pack-byte-budget overrides for plan_task.md (5120→5632), implement_plan.md (5120→5888), validate_task.md (4096→4608) to absorb the now-included fragment references. Discovered blind spot: the replay-friction harness validates meta-source, not base-pack output — #95 PASSed in HLO-S01 without ever generating the user-facing fragment. Manifest fragment count 4 → 6 (store-cli-verbs.md + friction-emit.md now shipped).",
    "regenerate": [
      "tools:build-base-pack",
      "tools:build-manifest",
      "fragments:store-cli-verbs",
      "fragments:friction-emit",
      "tools:integrity"
    ],
    "breaking": false,
    "manual": []
  },
  "0.43.10": {
    "version": "0.43.11",
    "date": "2026-05-13",
    "notes": "HLO-S01 friction-fix sweep — batched migration covering 10 fixes surfaced by the 2026-05-13 dogfood run on /home/boni/src/forge-testbench/hello/ (umbrella forge#93). All non-breaking; each verified by the replay-friction harness (engineering/runbooks/hlo-s01/ in forge-engineering). Fixes: (a) #78/#76 meta-review-plan: `review-approved` → `plan-approved` so the review→plan-approved status flip matches the FSM; (b) #80 widen `event.type` enum to cover task-implemented, plan-complete, review-passed and the rest of the emitted set; (c) #79 task FSM permits `planned → implemented` (was illegal, breaking run-task phase 4 writeback); (d) #96 inline FSM transition table into plan_task / review_plan / implement_plan workflow prose so subagents read state machine inline, not from a sibling fragment; (e) #95 embed store-cli verb cheat-sheet into all run-task / fix-bug phase workflows via new shared `_fragments/store-cli-verbs.md` — eliminates `forge_store` invocation hallucinations; (f) #84 replace `/cost` slash-command pre-flight in implement/validate/update-implementation with a runtime-conditional probe ({{RUNTIME_COST_CMD}}) — fixes hard-fail when /cost is unavailable in the runtime; (g) #94 surface resolved `commands.test` (placeholder substitution) in workflow bodies, not just frontmatter — subagents now see the actual test command; (h) #87 gate `--force` behind `FORGE_ALLOW_FORCE` env in store-cli AND inline canonical event-shape into every workflow emit line (was two-bug pair: LLM-bypass + event mismatch); (i) #82 commit_task no longer hardcodes 'Claude' as Co-author — uses runtime principal; (j) forge-cli#5 forge-tools piece — native `--task-suffix` / `--sprint-suffix` flags on store-cli short-form resolution. Row 8 (forge#86 kickoff-shim markers in review_plan/review_code) was already covered by the 0.43.5 wave-2 migration — no new sub-target needed. forge#7 deferred (SKIPPED: needs live FORGE_DEBUG capture). Also bumped per-file byte budgets in phase-frontmatter.test.cjs across all nine subagent-targeted meta-workflow files (e.g. meta-plan-task 5500→6912, meta-implement 5500→7168, meta-update-plan 3072→3584) — same precedent as the 0.43.6 wave: legitimate friction-fix growth from #95 cheat-sheet + #96 FSM table + #87 event-shape + #84 cost probe + #94 commands.test inlined across phases. Budgets sized to current bytes + ~10% headroom, 512B-aligned.",
    "regenerate": [
      "workflows:plan_task",
      "workflows:review_plan",
      "workflows:implement_plan",
      "workflows:validate_task",
      "workflows:update_implementation",
      "workflows:commit_task",
      "schemas:event",
      "tools:store-cli",
      "fragments:store-cli-verbs",
      "tools:integrity"
    ],
    "breaking": false,
    "manual": []
  },
  "0.43.9": {
    "version": "0.43.10",
    "date": "2026-05-13",
    "notes": "Verdict-source refactor: preflight-gate `after <phase>` predicates now read structured verdicts from store.task.summaries.<canonical>.verdict (and task.status for approve), not regex-parse markdown. New module forge/tools/read-verdict.cjs centralises the phase.role → canonical-summary-key mapping (mirrors VALID_SUMMARY_PHASES) and the approve-via-status sentinel. Eliminates three classes of recurring bugs: (a) forge#91 (approve phase markdown-vs-store mismatch), (b) forge-cli#11 (review-code → code_review key reversal), (c) the underscore-swap defensive fallback dance in run-task.ts (still present, now redundant). Removed: forge/tools/parse-verdict.cjs and its test (no consumers remaining). preflight()'s `verdictSources` parameter and the `resolveVerdictSources` helper are gone — `after` reads live from state.task / state.bug directly. The `**Verdict:**` line in review markdown is now a human breadcrumb only; the byte-budget lint asserting its presence is retained but documented as advisory. meta-approve.md updated to clarify the markdown line is not load-bearing. Live testbench HLO-S01-T01 commit preflight: EXIT=0 via the new store path. +11 read-verdict unit tests, +2 preflight tests (approve via status; revision in store).",
    "regenerate": [
      "tools:preflight-gate",
      "tools:read-verdict",
      "workflows:architect_approve"
    ],
    "breaking": false,
    "manual": []
  },
  "0.43.8": {
    "version": "0.43.9",
    "date": "2026-05-13",
    "notes": "meta-approve.md now instructs the architect persona to emit the canonical `**Verdict:** [Approved | Revision Required]` line, matching the contract review-plan / review-code / validate meta workflows already document. The commit-phase preflight gate parses this exact line via parse-verdict.cjs; alternative phrasings (e.g. `Approval Status: APPROVED`) yield null and fail with `predecessor review for \"approve\" has no parseable **Verdict:** line`. Live regression on testbench HLO-S01-T01 phase 8 (commit). +1 Generation Instruction `Verdict Detection`, +4 structural lint tests in base-pack-byte-budget.test.cjs that assert every verdict-emitting phase file (review_plan, review_code, validate_task, architect_approve) contains the literal `**Verdict:**` token.",
    "regenerate": [
      "workflows:architect_approve"
    ],
    "breaking": false,
    "manual": []
  },
  "0.43.7": {
    "version": "0.43.8",
    "date": "2026-05-13",
    "notes": "preflight-gate.cjs: gate-less phases now pass through (exit 0) instead of escalating (exit 2). Some run-task phases are intentionally gate-less by design — writeback (collator regen) has no predecessor verdict to check. The previous semantic conflated `phase not declared in any workflow` and `workflow declares no gate block for phase` with `misconfiguration` (exit 2), causing live regression at phase 7 (writeback) of /forge:run-task HLO-S01-T01: `× preflight gate escalated for phase writeback (exit 2); manual intervention required`. Both `no workflow declares phase` and `no gate block for declared phase` now exit 0 with an informational stderr note. Exit 2 stays reserved for real argument / parse errors (unchanged). +1 regression test (sibling case: workflow exists, no gate block).",
    "regenerate": [
      "tools:preflight-gate"
    ],
    "breaking": false,
    "manual": []
  },
  "0.43.6": {
    "version": "0.43.7",
    "date": "2026-05-13",
    "notes": "Pack-06 materialization-marker regression fix, third (final) wave + structural lint. Adds Iron Laws + Store-Write Verification sections (plus persona-load step and `forge_store` token) to the remaining six meta workflows that subagent-target the run-task / fix-bug pipeline: meta-validate.md, meta-approve.md, meta-collate.md, meta-commit.md, meta-update-plan.md, meta-update-implementation.md. Live testbench surfaced the gap at phase 5 (validate) of /forge:run-task: kickoff shim hard-failed with `× workflow regression: Store-Write Verification not found in validate_task.md`. Three waves (0.43.2 plan/implement, 0.43.5 review-plan/review-code, 0.43.6 validate/approve/collate/commit/update-plan/update-impl) is the cost of discovering one phase at a time. Encoded a regression lint in base-pack-byte-budget.test.cjs (`phase files carry kickoff-shim markers`) that asserts all four markers across every PHASE_FILE — future drop-throughs fail the build, not the smoke test. Also bumped per-file byte budgets for meta-validate.md (4096→5120), meta-approve.md / meta-commit.md (3072→4096). See forge#? (this entry's GH issue).",
    "regenerate": [
      "workflows:validate_task",
      "workflows:architect_approve",
      "workflows:collator_agent",
      "workflows:commit_task",
      "workflows:update_plan",
      "workflows:update_implementation"
    ],
    "breaking": false,
    "manual": []
  },
  "0.43.5": {
    "version": "0.43.6",
    "date": "2026-05-13",
    "notes": "preflight-gate.cjs artifact-dir resolution fix. Two compounding bugs surfaced when a sprint dir contained an artifact directory named exactly `<taskId>` (no `-<slug>` suffix — modern convention). (1) resolveTaskArtifactDir Pass 1 required `entry.startsWith(taskId + '-')`, rejecting exact-match entries. Pass 2's `<sprintId>-` prefix matcher also didn't apply when taskId already embeds sprintId (e.g. taskId=`HLO-S01-T01`, sprintId=`S01`). resolveTaskArtifactDir returned null. (2) The fallback then set `taskArtifactPath = taskRecord.path` directly — but `taskRecord.path` is the primary source FILE (e.g. `TASK_PROMPT.md`), not a directory. Predecessor-review resolution then appended `PLAN_REVIEW.md` to the file path, producing bogus paths like `.../TASK_PROMPT.md/PLAN_REVIEW.md` (ENOTDIR), failing every `after <phase>` gate. Fix: Pass 1 now also accepts `entry === taskId`; fallback dirname()s task.path when it has a file extension. Live testbench regression: phase 3 (implement) of `/forge:run-task HLO-S01-T01` was hard-failing preflight. After patch, EXIT=0. See forge#?.",
    "regenerate": [
      "tools:preflight-gate"
    ],
    "breaking": false,
    "manual": []
  },
  "0.43.4": {
    "version": "0.43.5",
    "date": "2026-05-13",
    "notes": "Pack-06 materialization-marker regression fix, second wave. Adds Iron Laws + Store-Write Verification sections (plus `.forge/personas/supervisor.md` persona-load step and `forge_store` tokens) to meta-review-plan.md and meta-review-implementation.md so generated review_plan.md and review_code.md carry the four markers required by forge-cli /forge:run-task's per-phase kickoff shim. Without these markers, every fresh init since 0.43.2 has shipped review-plan / review-code workflows that hard-fail phase 2 (and phase 4) of /forge:run-task with `× workflow regression: Store-Write Verification not found ...`. Root cause: 0.43.2 patched meta-plan-task.md and meta-implement.md, but the symmetric review metas were missed. Side-effect: per-file byte budgets bumped for review_plan.md / review_code.md (4096→5120) and meta-review-plan.md / meta-review-implementation.md (3200/4200→4500/5500) to fit the marker blocks. See forge#85.",
    "regenerate": [
      "workflows:review_plan",
      "workflows:review_code"
    ],
    "breaking": false,
    "manual": []
  },
  "0.43.3": {
    "version": "0.43.4",
    "date": "2026-05-13",
    "notes": "meta-sprint-intake.md gains a step 0 Project Orientation block that tells the subagent its cwd is the project root and points it at `.forge/config.json` (+ `forge_config` MCP) for config and `engineering/` for knowledge. Philosophy: orientation, not enforcement. Surfaced via forge-cli dogfooding (glm-5.1:cloud on pi/ollama runtime) where a model without that context hallucinated `cd /home/user/project` and ran `find / -name config.json` across five sibling project roots before the user aborted (see forge#83). Regression test `meta-sprint-intake-cwd-anchor.test.cjs` asserts the orientation text remains.",
    "regenerate": [
      "workflows:sprint_intake"
    ],
    "breaking": false,
    "manual": []
  },
  "0.43.2": {
    "version": "0.43.3",
    "date": "2026-05-10",
    "notes": "Adds workflows/enhance.md to base-pack (FORGE-S20-T04 sprint-completion gap fix). meta-enhance.md now generates init/base-pack/workflows/enhance.md via the standard transformWorkflow path; build-base-pack expects 20 workflow files (was 19); enhance.md ships with Iron Laws + Store-Write Verification + forge_store + engineer.md markers required by the forge-cli /forge:enhance kickoff shim. Without this file, /forge:enhance hard-failed every fresh init with `× forge:enhance — workflow not found at .forge/workflows/enhance.md`. enhance.md is orchestrator-only audience and exempt from the 4KB phase-file byte budget. Pairs with forge-cli v0.5.7.",
    "regenerate": [
      "workflows:enhance"
    ],
    "breaking": false,
    "manual": []
  },
  "0.43.1": {
    "version": "0.43.2",
    "date": "2026-05-10",
    "notes": "Pack-06 materialization-marker regression fix. Adds Iron Laws + Store-Write Verification sections (plus persona-load step and forge_store token) to meta-plan-task.md and meta-implement.md so generated plan_task.md and implement_plan.md carry the four markers required by forge-cli /forge:plan and /forge:implement kickoff shims. Without these markers, every fresh init produced workflows that hard-failed on dispatch with `× workflow regression: Store-Write Verification not found` (and three siblings: Iron Laws, forge_store, persona file path). Root cause: forge-cli FORGE-S20-T04/T05/T06 added kickoff-shim materialization preconditions but never updated the corresponding meta sources or base-pack regen. Side-effect: bumps base-pack byte budget for plan_task.md/implement_plan.md from 4096→5120 (per-file overrides) and meta-plan-task/meta-implement from 4096→5500 to fit the marker blocks. Pairs with forge-cli v0.5.6.",
    "regenerate": [
      "workflows:plan_task",
      "workflows:implement_plan"
    ],
    "breaking": false,
    "manual": []
  },
  "0.43.0": {
    "version": "0.43.1",
    "date": "2026-05-10",
    "notes": "Direct-exec contract patch. Replaces all `/forge:store ...` slash-command references in init/base-pack/workflows/*.md (and _fragments/) with the canonical `node \"$FORGE_ROOT/tools/store-cli.cjs\" ...` direct-cjs form already used by meta/workflows/*.md. Pairs with forge-cli v0.5.1 (system-prompt tool-discipline block, kickoff-prompt rewrites, and bin fast-path for `forge {store|collate|validate-store|store-query} ...`). Root cause: cartographer testbench observed haiku-4-5 burning 26-220s per `bash forge store ...` shell-out — each invocation spawned a fresh pi/agent loop. Fix: prescriptive system prompt + canonical workflow text + bin fast-path. Existing `/forge:store` materialized workflows remain functional under the bin fast-path; no manual migration required for projects on v0.43.0.",
    "regenerate": [
      "workflows:base-pack-store-cli-form"
    ],
    "breaking": false,
    "manual": []
  },
  "0.42.0": {
    "version": "0.43.0",
    "date": "2026-05-10",
    "notes": "FORGE-S20 Sprint A — Friction emit channel + foundation. T00 lands the writer side of the friction channel: event.schema.json gains `type:\"friction\"` enum with conditional required {workflow, persona, issue} via a JSON-Schema `allOf if/then` block; validate-store.cjs gains a minimal `allOf if/then required` interpreter; five meta-workflows (implement, fix-bug, validate, plan-task, orchestrate) now carry an explicit Friction Emit section describing trigger conditions and the canonical flat-payload `node \"$FORGE_ROOT/tools/store-cli.cjs\" emit` shape. T01 narrows the optional slots reserved by T00: `subkind` is constrained to a frozen enum (skill_unused|skill_failed|skill_missing|skill_stale|skill_redundant) plus a reserved `^x_[a-z_]+$` experimental namespace (no migration required for x_*), encoded as a single combined regex pattern; `evidence` is shaped into a closed object (trajectory_excerpt:string, tool_errors:string[], retrieval_score:number 0..1, skillId:string ref); validate-store.cjs gains a minimal `pattern` interpreter on string fields. Unblocks Plan 08 Phase B (dynamic skill curation): /forge:enhance --phase 2 reader has been waiting for typed writers since S13-T08. Non-breaking: events without `type` continue to validate exactly as before, and T00-shaped friction events without subkind/evidence remain valid because those slots are not in the friction allOf then-required block.",
    "regenerate": [
      "events:friction-emit",
      "events:friction-subkind",
      "workflows:implement",
      "workflows:fix-bug",
      "workflows:validate",
      "workflows:plan-task",
      "workflows:orchestrate",
      "tools:store-cli",
      "tools:validate-store",
      "schemas:event"
    ],
    "breaking": false,
    "manual": []
  },
  "0.41.0": {
    "version": "0.42.0",
    "date": "2026-05-10",
    "notes": "Release-routine catch-up bump. No code changes. Promotes v0.40.3 (substitute-placeholders --target pi) and v0.41.0 (store-cli describe/template + validate hint) cumulatively to skillforge marketplace under a single tag. Users on v0.40+ → /forge:update is non-breaking. Users on <v0.40 still need the v0.40.0 manual migration path (run /forge:update then /forge:migrate per v0.40.0 entry).",
    "regenerate": [],
    "breaking": false,
    "manual": []
  },
  "0.40.3": {
    "version": "0.41.0",
    "date": "2026-05-09",
    "notes": "Add store-cli describe/template subcommands and validate.js error hint (FORGE-BUG-029-friction). describe <entity> prints raw JSON Schema; template <entity> prints canonical sample with required fields populated. validateRecord errors now include a hint pointing to template/describe when entity is known. Reduces write→reject→retry friction on weak/non-Anthropic models. No breaking changes.",
    "regenerate": [
      "tools:store-cli",
      "tools:lib:validate"
    ],
    "breaking": false,
    "manual": []
  },
  "0.40.2": {
    "version": "0.40.3",
    "date": "2026-05-08",
    "notes": "Add --target pi mode to substitute-placeholders.cjs (FORGE-S16-T01). New walkBasePackPi() function and PI_TARGET_SUBDIRS constant enable forge-cli T02 build pipeline to produce flat pi-shaped output trees from init/base-pack/ with {{KEY}} tokens preserved for downstream resolution. No user-side action required.",
    "regenerate": [
      "tools:substitute-placeholders"
    ],
    "breaking": false,
    "manual": []
  },
  "0.40.1": {
    "version": "0.40.2",
    "date": "2026-05-05",
    "notes": "v0.40.2 hotfix bundle (FORGE-S14). Fixes: manage-versions/manage-config FORGE_ROOT resolution (FR-001, FR-005); substitute-placeholders _fragments nesting and commands path SoT (FR-004, FR-006); structure-manifest missing entries and check-structure alignment (FR-006, FR-007); build-persona-pack/build-context-pack source_hash (FR-012); manage-versions --source flag (FR-013); update-check-cache idempotent write (FR-014); build-overlay exit code (FR-015); /forge:update completion semantics and subagent probe (FR-002, FR-009, ADR-S14-01); sprintsCovered union-merge preservation (FR-003, ADR-S14-02); init CLAUDE.md creation (FR-008); forgeRef portability (FR-010); migrate export FORGE_ROOT (FR-011); .gitignore store/events/ unconditional (FR-016); /forge:update phase numbering (FR-017). New shared libraries: forge-root.cjs, paths.cjs. No breaking changes.",
    "regenerate": [
      "tools:manage-versions",
      "tools:manage-config",
      "tools:substitute-placeholders",
      "tools:check-structure",
      "tools:build-manifest",
      "tools:build-persona-pack",
      "tools:build-context-pack",
      "tools:build-overlay",
      "tools:lib/forge-root",
      "tools:lib/paths",
      "commands:update",
      "commands:init",
      "commands:migrate",
      "workflows:migrate_structural",
      "workflows:_fragments",
      "schemas:config",
      "schemas:structure-manifest"
    ],
    "breaking": false,
    "manual": [],
    "notes_addendum": "removed schemas:update-check-cache target — not a schema (runtime cache only); the target was never resolvable. Removed by FORGE-S25-T12 (N-S-1)."
  },
  "0.40.0": {
    "version": "0.40.1",
    "date": "2026-05-02",
    "notes": "Read-side collate patch (FORGE-S13-T12): sidecar merge by eventId deduplication, ingestion-quality (IQ) section in COST_REPORT.md, model canonicalization via new pricing.cjs library, no (unknown) row in cost table, deterministic cost recompute replaces stale sidecar values. Foundation for v0.41 emit-side improvements. New tool: tools/lib/pricing.cjs (29 tests). No schema changes. No emit-side changes. No workflow regeneration required.",
    "regenerate": [
      "tools:collate",
      "tools:pricing"
    ],
    "breaking": false,
    "manual": []
  },
  "0.32.0": {
    "version": "0.40.0",
    "date": "2026-05-02",
    "notes": "Base-pack init with progressive enhancement (S13 — T02–T06 + T08–T10 + T11 friction reconciliation). Replaces multi-minute LLM cold-start init with a deterministic 4-phase pipeline (Collect → Discover → Materialize → Register, ~30–45s). Working artefacts ship as a base-pack with {{KEY}} placeholders; init substitutes from config.json + project-context.json (no LLM in materialization). New project-context.json schema (T02), substitute-placeholders.cjs tool (T03), 4-phase sdlc-init.md (T04), versioned structural snapshots in structure-versions.json (T05), npm run build-base-pack regeneration script (T06), enhancement agent skill at meta/workflows/meta-enhance.md and commands/enhance.md (T08), post-init + post-sprint hooks (T09), migration agent at meta/workflows/meta-migrate.md (T10), and bucket-A friction fixes (T11) covering forge#71 (7 sub-bugs in /forge:update) and forge#72 (preflight-gate workflow shadowing). Breaking: --fast aliases to default; init-progress.json is now 4-phase; structure-versions.json + project-context.json are net-new files; manage-versions.cjs is now the gateway for snapshot writes.",
    "regenerate": [
      "workflows:orchestrate_task",
      "workflows:fix_bug",
      "workflows:plan_task",
      "workflows:implement_plan",
      "workflows:review_plan",
      "workflows:review_code",
      "workflows:validate_task",
      "workflows:architect_approve",
      "workflows:commit_task",
      "workflows:update_plan",
      "workflows:update_implementation",
      "workflows:sprint_retrospective",
      "workflows:architect_sprint_intake",
      "workflows:architect_sprint_plan",
      "workflows:architect_review_sprint_completion",
      "workflows:run_sprint",
      "workflows:quiz_agent",
      "workflows:collator_agent",
      "workflows:_fragments",
      "workflows:enhance",
      "workflows:migrate_structural",
      "commands:init",
      "commands:enhance",
      "commands:migrate",
      "commands:calibrate",
      "commands:update",
      "commands:regenerate",
      "tools:substitute-placeholders",
      "tools:manage-versions",
      "tools:build-base-pack",
      "tools:preflight-gate"
    ],
    "breaking": true,
    "manual": [
      "Init flow is now 4 phases (Collect → Discover → Materialize → Register). --fast and --full both run the same deterministic pipeline; existing init-progress.json checkpoints from 12-phase runs are deleted automatically on resume.",
      "structure-versions.json and project-context.json are net-new files at .forge/. Existing installations without them are migrated by /forge:migrate (T10).",
      "Existing users on v0.28–v0.30.x: run /forge:update to install the new tools and workflows, then /forge:migrate to synthesise project-context.json from existing .forge/ artefacts. /forge:migrate archives the pre-migration .forge/ contents to .forge/archive/pre-migration/.",
      "After /forge:update, run /forge:update-tools to install the three new schemas (project-context.schema.json, structure-versions.schema.json, project-overlay.schema.json) into .forge/schemas/. /forge:update does not regenerate schemas — this is by design (T11 forge#71-bug3); /forge:update-tools is the dedicated path for schema installation.",
      "After /forge:update-tools, run /forge:health to verify integrity.json and snapshot v0 register cleanly.",
      "T11 fixes: /forge:update Step 1 baseline derivation now uses localVersion ?? migratedFrom ?? LOCAL_VERSION; preflight-gate.cjs no longer requires --workflow workaround for orchestrate_task; integrity.json regenerated from current hashes (no false-positive on /forge:health post-update)."
    ]
  },
  "0.31.0": {
    "version": "0.32.0",
    "date": "2026-05-01",
    "notes": "Init flow rewrite (T04): replace 12-phase init with 4-phase model (Collect → Discover → Materialize → Register). forge/commands/init.md and forge/init/sdlc-init.md fully rewritten. Phase 3 calls substitute-placeholders.cjs to produce fully functional workflows (no stubs). Phase 4 writes structure-versions.json at .forge/structure-versions.json (T05 stub), generation-manifest.json, persona-pack.json, context-pack.md/json, init-context.json/md, store seed, update-check cache, and invokes refresh-kb-links. --fast and --full flags accepted as no-ops (both run identical 4-phase flow). Old 12-phase checkpoint files deleted automatically on resume.",
    "regenerate": [],
    "breaking": false,
    "manual": []
  },
  "0.30.0": {
    "version": "0.31.0",
    "date": "2026-05-01",
    "notes": "Add build-base-pack development tool (T06): new forge/tools/build-base-pack.cjs regenerates init/base-pack/ from meta-sources with genericization rules; forge/tools/build-base-pack-rules.json defines string-replacement map; re-genericizes all base-pack files (workflows, templates, commands, personas, skills) to replace hardcoded 'Forge' persona names with {{PROJECT_NAME}} placeholders; forge/package.json exposes npm run build-base-pack; 208 tests pass.",
    "regenerate": [],
    "breaking": false,
    "manual": []
  },
  "0.29.0": {
    "version": "0.30.0",
    "date": "2026-05-01",
    "notes": "Prompt-efficiency structural cut (T01_6): (1) phase meta sources split by audience — orchestrate_task/fix_bug carry audience:orchestrator-only, all phase files carry audience:subagent with context: block; (2) PROJECT_OVERLAY replaces mandatory MASTER_INDEX.md reads — build-overlay.cjs materialises a ≤1kB task-scoped index slice injected by the orchestrator; architecture_block is now conditional on phase.context.architecture; (3) store-cli success-path stdout is now silent — pass --verbose for legacy JSON echo; (4) new _fragments/finalize.md carries the /cost sidecar contract; (5) review-code and validate phases default to diff-first read mode. Breaking: store-cli JSON stdout no longer emitted on success.",
    "regenerate": [
      "workflows:orchestrate_task",
      "workflows:fix_bug",
      "workflows:plan_task",
      "workflows:implement_plan",
      "workflows:review_plan",
      "workflows:review_code",
      "workflows:validate_task",
      "workflows:architect_approve",
      "workflows:commit_task",
      "workflows:update_plan",
      "workflows:update_implementation",
      "workflows:_fragments",
      "schemas:project-overlay",
      "tools:build-overlay",
      "tools:store-cli"
    ],
    "breaking": true,
    "manual": [
      "store-cli success-path stdout is now silent. Any script that parsed store-cli JSON output must be updated to pass --verbose or read from disk. Run /forge:update to regenerate all workflows and tools."
    ]
  },
  "0.28.1": {
    "version": "0.29.0",
    "date": "2026-04-29",
    "notes": "Security hardening (FORGE-BUG-016): fix 5 critical findings from security scan v0.28.0. (1) Bulk permission escalation: persist only matched rule instead of all 31 rules. (2) Remove node -e/p auto-approve — arbitrary code execution requires explicit approval. (3) Add domain allowlist for update URLs. (4) Block prototype pollution (__proto__/constructor/prototype) in getByPath/setByPath. (5) Add path traversal guard to cmdProgress/cmdProgressClear. Also scopes broad wildcards (touch, rmdir, rm -f) and adds require.main guard to forge-permissions.js.",
    "regenerate": [
      "hooks:forge-permissions",
      "hooks:check-update",
      "tools:manage-config",
      "tools:store-cli"
    ],
    "breaking": true,
    "manual": [
      "node -e one-liners will now prompt for approval — this is intentional. Run /forge:update to refresh hooks and tools."
    ]
  },
  "0.27.1": {
    "version": "0.28.0",
    "date": "2026-04-29",
    "notes": "Escalation hardening (GH-66): subagent response validation with retry-then-escalate, blocked/escalated status guard in phase gates and pre-task check, inline escalation procedure at all call sites, Iron Law prohibiting silent workarounds, expanded Error Recovery table. No schema changes.",
    "regenerate": [
      "workflows:orchestrate_task",
      "personas:orchestrator"
    ],
    "breaking": false,
    "manual": [
      "Run /forge:update to regenerate the orchestrate_task workflow and orchestrator persona. Tasks previously stuck in blocked/escalated status will now be skipped by the orchestrator instead of re-attempted."
    ]
  },
  "0.27.0": {
    "version": "0.27.1",
    "date": "2026-04-28",
    "notes": "Fix check-structure.cjs false-negative for namespaced commands: add prefixed:true to commands namespace in structure-manifest.json so the tool resolves .claude/commands/{prefix}/*.md correctly (GH-70).",
    "regenerate": [],
    "breaking": false,
    "manual": []
  },
  "0.26.0": {
    "version": "0.27.0",
    "date": "2026-04-23",
    "notes": "Store query engine: deterministic NLP-based store querying via store-cli nlp/query/schema commands. Decomposes store-query marketplace experiment into 4 forge tool modules (store-query.cjs, lib/store-facade.cjs, lib/store-nlp.cjs, lib/store-query-exec.cjs). Adds query-logger.cjs PostToolUse hook, forge:store-query-nlp and forge:store-query-grammar plugin skills, forge:store-query-validator agent, /forge:store-query command, and context-gathering shortcuts in plan/fix-bug/sprint-plan workflows. Replaces 5-6 manual KB navigation tool calls with 1-2 structured query calls.",
    "regenerate": [
      "tools",
      "workflows"
    ],
    "breaking": false,
    "manual": []
  },
  "0.25.0": {
    "version": "0.26.0",
    "date": "2026-04-23",
    "notes": "Permission prompt storm fix (BUG-014): add PermissionRequest hook that auto-approves known Forge tool patterns (node tools, shell commands, writes to .forge/ and .claude/commands/, WebFetch to raw.githubusercontent.com). First run shows ~17 approval prompts that persist to .claude/settings.local.json; subsequent runs have zero prompts for Forge patterns. Also updates bug status for FORGE-BUG-014.",
    "regenerate": [
      "hooks"
    ],
    "breaking": false,
    "manual": [
      "Restart Claude Code after updating for the new hook to take effect. On first Forge command, approve each permission prompt once — they will persist for future sessions."
    ]
  },
  "0.24.2": {
    "version": "0.25.0",
    "date": "2026-04-22",
    "notes": "Fix permission-check rejection of $FORGE_ROOT in slash command frontmatter. Replace all !-prefixed manage-config.cjs calls with direct .forge/config.json reads using literal paths. Eliminates 'Contains simple_expansion' errors when running Forge commands without --dangerously-skip-permissions.",
    "regenerate": [],
    "breaking": false,
    "manual": []
  },
  "0.24.1": {
    "version": "0.24.2",
    "date": "2026-04-22",
    "notes": "Token telemetry reliability: workflows now emit placeholder sidecars with null token fields when /cost unavailable (was: skip silently). Users backfill via estimate-usage.cjs. Always emit sidecar with source: reported or missing.",
    "regenerate": [
      "workflows"
    ],
    "breaking": false,
    "manual": []
  },
  "0.23.0": {
    "version": "0.24.0",
    "date": "2026-04-21",
    "notes": "Multi-plugin detection: check-update.js now scans all plugin locations (~/.claude/plugins/, ./.claude/plugins/) to detect multiple Forge installations. Reports scope (user/project), distribution (forge@forge/forge@skillforge), and enabled status. Enables /forge:update to advise users with multiple installations.",
    "regenerate": [],
    "breaking": false,
    "manual": []
  },
  "0.24.0": {
    "version": "0.24.1",
    "date": "2026-04-21",
    "notes": "Fix init mode selection: Resume Detection now requires the mode field to be present in init-progress.json. Stale checkpoints without a mode field (from interrupted runs that didn't complete Mode Selection) fall through to the full Fast/Full prompt instead of silently defaulting to 'full' via config.json fallback.",
    "regenerate": [],
    "breaking": false,
    "manual": []
  },
  "0.22.1": {
    "version": "0.23.0",
    "date": "2026-04-21",
    "notes": "Fix path resolution bug: replace require('.forge/config.json') in node -e one-liners with manage-config.cjs calls. The bare require() resolved from process.cwd() which failed when the shell wasn't in the project root.",
    "regenerate": [],
    "breaking": false,
    "manual": []
  },
  "0.22.0": {
    "version": "0.22.1",
    "date": "2026-04-20",
    "notes": "Fix preflight-gate.cjs task directory resolution: scan sprint directory for artifact directory name instead of extracting source filename from task.path. Also fixes resolveVerdictSources to use the correct artifact directory path for verdict files.",
    "regenerate": [],
    "breaking": false,
    "manual": []
  },
  "0.21.0": {
    "version": "0.22.0",
    "date": "2026-04-20",
    "notes": "Calibrate baseline auto-initialization: /forge:calibrate now computes and writes the initial calibration baseline when absent instead of dead-ending with 'run /forge:init'. health.md recommends /forge:calibrate for missing baseline.",
    "regenerate": [
      "commands"
    ],
    "breaking": false,
    "manual": []
  },
  "0.20.0": {
    "version": "0.21.0",
    "date": "2026-04-20",
    "notes": "Structured Result returns for resolveTaskDir (collate.cjs) and estimateTokens (estimate-usage.cjs): both now return { ok, value } / { ok, code, message } instead of null. Shared error codes in forge/tools/lib/result.js. Callers checking for null must update to check result.ok.",
    "regenerate": [
      "tools"
    ],
    "breaking": false,
    "manual": []
  },
  "0.19.2": {
    "version": "0.20.0",
    "date": "2026-04-20",
    "notes": "S11 tech-debt fixes: event timestamp zeroing fixed (store-cli.cjs), preflight-gate now scans all workflow files, ROLE_TIER fallback applied in orchestrate_task, collate generates task INDEX.md files with correct links, calibrationBaseline backfilled in fast-mode init/update, quiz-agent slash command added, generate-commands updated with quiz-agent and flat-file cleanup.",
    "regenerate": [
      "tools",
      "workflows",
      "commands"
    ],
    "breaking": false,
    "manual": []
  },
  "0.19.1": {
    "version": "0.19.2",
    "notes": "Add Japanese kanji to each banner, shown alongside the name in render and badge",
    "regenerate": [],
    "breaking": false,
    "manual": []
  },
  "0.19.0": {
    "version": "0.19.1",
    "notes": "Collapse banner art from 5-line ASCII blocks to single creative lines",
    "regenerate": [],
    "breaking": false,
    "manual": []
  },
  "0.18.1": {
    "version": "0.19.0",
    "notes": "UX polish: tomoshibi prefix lowercase, progress IPC persona emoji, ensure-ready single-line banner",
    "regenerate": [],
    "breaking": false,
    "manual": []
  },
  "0.18.0": {
    "version": "0.18.1",
    "date": "2026-04-19",
    "notes": "Bug fix: preflight-gate.cjs now scans all .forge/workflows/*.md files for gates phase blocks instead of looking only for two hardcoded meta-*.md filenames that only exist in the Forge development environment.",
    "regenerate": [
      "tools"
    ],
    "breaking": false,
    "manual": []
  },
  "0.17.1": {
    "version": "0.18.0",
    "date": "2026-04-19",
    "notes": "Write-boundary schema enforcement. New PreToolUse hook (hooks/validate-write.js) intercepts Write/Edit/MultiEdit against Forge-owned paths under .forge/store/ and validates the proposed contents against the matching schema — task, sprint, bug, feature, event, event-sidecar, collation-state, and progress-log entries. Three new schemas added (event-sidecar, progress-entry, collation-state). store-cli gains schema enforcement on the four previously unvalidated write paths (sidecar emit, sidecar merge, progress append, collation-state write). Shared validator extracted to tools/lib/validate.js and reused by both the hook and store-cli. Emergency bypass via FORGE_SKIP_WRITE_VALIDATION=1, which also appends an audit line to the affected sprint's progress.log.",
    "regenerate": [
      "hooks",
      "schemas"
    ],
    "breaking": false,
    "manual": [
      "Run /forge:update to install the new write-boundary hook. Any existing tooling that writes malformed JSON to .forge/store/ will now be rejected at write time — fix the data, don't bypass the hook."
    ]
  },
  "0.17.0": {
    "version": "0.17.1",
    "date": "2026-04-19",
    "notes": "Architecture context pack. build-context-pack.cjs walks engineering/architecture/*.md and emits .forge/cache/context-pack.md and context-pack.json. Orchestrators inject the pack summary into every subagent prompt, replacing per-phase stack.md reads with a single cached summary. Phase workflows updated to consult the injected summary first and read full docs only on escalation. /forge:health detects stale packs. /forge:regenerate, /forge:collate, and /forge:materialize rebuild the pack.",
    "regenerate": [
      "workflows",
      "tools"
    ],
    "breaking": false,
    "manual": [
      "Run /forge:regenerate to build the initial context pack at .forge/cache/context-pack.md."
    ]
  },
  "0.16.0": {
    "version": "0.17.0",
    "date": "2026-04-19",
    "notes": "Artifact summaries in task manifest. Tasks and bugs gain an optional summaries field (plan, review_plan, implementation, code_review, validation). Phase workflows emit terse JSON sidecars via store-cli set-summary / set-bug-summary. Orchestrator injects summaries into downstream subagent prompts as a fast path, falling back to full artifact paths when summaries are absent. Old tasks without summaries continue to work unchanged.",
    "regenerate": [
      "workflows",
      "tools"
    ],
    "breaking": false,
    "manual": []
  },
  "0.15.0": {
    "version": "0.16.0",
    "date": "2026-04-19",
    "notes": "Persona/skill by reference. Subagent prompts inject a compact persona/skill summary from .forge/cache/persona-pack.json instead of verbatim persona and skill file prose. build-persona-pack.cjs compiles YAML frontmatter from meta/personas/ and meta/skills/ into the pack, triggered by /forge:regenerate and /forge:materialize. FORGE_PROMPT_MODE=inline preserves legacy behaviour for one version as a rollback path.",
    "regenerate": [
      "personas",
      "workflows"
    ],
    "breaking": false,
    "manual": [
      "Run /forge:regenerate to rebuild the persona pack at .forge/cache/persona-pack.json."
    ]
  },
  "0.14.1": {
    "version": "0.15.0",
    "date": "2026-04-19",
    "notes": "Gate-check enforcement. Orchestrator and atomic phase workflows now run preflight-gate.cjs before every subagent spawn and parse verdicts via parse-verdict.cjs (closed vocabulary). Missing artifacts, forbidden states, and malformed verdicts halt loudly with structured events instead of silently advancing. No schema changes.",
    "regenerate": [
      "workflows"
    ],
    "breaking": false,
    "manual": []
  },
  "0.14.0": {
    "version": "0.14.1",
    "date": "2026-04-18",
    "notes": "collate now generates Sprint, Task, and Bug INDEX.md files — closes broken knowledge graph links from MASTER_INDEX.md. refresh-kb-links skill gains KB integrity check that warns when INDEX files are missing.",
    "regenerate": [],
    "breaking": false,
    "manual": []
  },
  "0.13.1": {
    "version": "0.14.0",
    "date": "2026-04-18",
    "notes": "Tomoshibi unified into single oracle agent; KB-visibility logic extracted to forge:refresh-kb-links plugin skill. Agent-tool Tomoshibi invocations in update, init, and collate replaced with Skill-tool invocations.",
    "regenerate": [],
    "breaking": false,
    "manual": []
  },
  "0.13.0": {
    "version": "0.13.1",
    "date": "2026-04-18",
    "notes": "Tomoshibi Oracle warns before config changes that require regeneration — project.prefix change now shows impact and exact follow-up command before [Y/n] prompt.",
    "regenerate": [],
    "breaking": false,
    "manual": []
  },
  "0.12.6": {
    "version": "0.13.0",
    "date": "2026-04-18",
    "notes": "Generated commands are now namespaced under project prefix (/{prefix}:plan etc.). Command files gain description: frontmatter. /forge:remove is prefix-aware. /forge:add-task shows namespaced next-step commands.",
    "regenerate": [
      "commands",
      "workflows"
    ],
    "breaking": false,
    "manual": [
      "After regenerating, delete the old flat command files: rm -f .claude/commands/{sprint-intake,sprint-plan,run-task,run-sprint,plan,review-plan,implement,review-code,fix-bug,approve,commit,collate,retrospective}.md"
    ]
  },
  "0.12.5": {
    "version": "0.12.6",
    "date": "2026-04-18",
    "notes": "New /forge:ask command (Tomoshibi Oracle concierge) + plugin integrity checks. /forge:ask routes project-status, config, version, workflow/command explanation queries through the new tomoshibi-oracle agent. /forge:health gains a tamper-evident integrity check via verify-integrity.cjs + inline verifier hash. gen-integrity.cjs generates the release-time hash manifest (integrity.json).",
    "regenerate": [],
    "breaking": false,
    "manual": []
  },
  "0.12.4": {
    "version": "0.12.5",
    "date": "2026-04-17",
    "notes": "Visual upgrade for fast-mode capability announcement: framed em-dash block with lantern-yellow progress bars and zen-blue horizontal rules. New banners.cjs ZEN_BLUE constant + ruleLine() helper + --rule CLI subcommand. phaseHeader em-dash banner is now zen-blue tinted for system-wide horizontal-rule consistency.",
    "regenerate": [],
    "breaking": false,
    "manual": []
  },
  "0.12.3": {
    "version": "0.12.4",
    "date": "2026-04-17",
    "notes": "Fast-mode capability announcement: every materialise round (per-workflow stub trigger or /forge:materialize --all) now emits a 2-line summary like '〇 Forge is currently in fast mode · 5% capabilities generated (2 of 41) — this round will lift capabilities to 29% (12 of 41, +10 artifact(s))'. Silent on full installs. New ensure-ready.cjs subcommands: --capabilities, --capabilities-after, --announce.",
    "regenerate": [],
    "breaking": false,
    "manual": []
  },
  "0.12.2": {
    "version": "0.12.3",
    "date": "2026-04-17",
    "notes": "Visual onboarding character: hero banners and per-phase/step badges across /forge:init, /forge:update, /forge:regenerate, /forge:health (and light touch on /forge:config and /forge:materialize). banners.cjs gains progressBar, subtitle, phaseHeader, plain-mode (NO_COLOR / non-tty / --plain). Backwards-compatible — all existing API + emits still work; new visuals are additive.",
    "regenerate": [],
    "breaking": false,
    "manual": []
  },
  "0.12.1": {
    "version": "0.12.2",
    "date": "2026-04-17",
    "notes": "/forge:init mode prompt now defaults to Fast (was Full). Order in the prompt and the resume switch options is also flipped so [1] = Fast, [2] = Full. Pressing Enter at the prompt picks Fast. Pre-existing --fast and --full flags continue to work unchanged.",
    "regenerate": [],
    "breaking": false,
    "manual": []
  },
  "0.12.0": {
    "version": "0.12.1",
    "date": "2026-04-17",
    "notes": "Interactive fast/full prompt for /forge:init (with --full escape hatch). New /forge:config command for mode switching. Regenerate and materialize now respect fast mode and no longer auto-flip to full. Explicit promotion: /forge:config mode full. /forge:init Phase 12 and /forge:update Step 5 now offer to gitignore .forge/store/events/ (transient agent logs).",
    "regenerate": [],
    "breaking": false,
    "manual": []
  },
  "0.11.3": {
    "version": "0.12.0",
    "date": "2026-04-17",
    "notes": "Fast-mode init: /forge:init --fast runs in ~30s + Phase 2, deferring heavy LLM generation to first use. Machine-readable dep graph (deps: frontmatter in all 17 meta workflows, edges section in structure-manifest.json). New lazy-materialize.md rulebook, ensure-ready.cjs tool, /forge:materialize command. Per-file scoping for skills and templates in /forge:regenerate. Config mode field (fast/full).",
    "regenerate": [],
    "breaking": false,
    "manual": []
  },
  "0.11.2": {
    "version": "0.11.3",
    "date": "2026-04-16",
    "notes": "Parallelise init and regenerate: Phase 3 KB fan-out (7 parallel docs), Phase 4 personas fan-out, Phases 5+6 skills+templates parallel, Phases 8+9 orchestration+commands parallel. Regenerate workflows now uses build-init-context.cjs fan-out. Regenerate default runs 4 parallel steps instead of 5 sequential categories. New per-subagent rulebooks: generate-persona.md, generate-skill.md, generate-template.md, generate-kb-doc.md.",
    "regenerate": [],
    "breaking": false,
    "manual": []
  },
  "0.11.1": {
    "version": "0.11.2",
    "date": "2026-04-16",
    "notes": "Fix generate-workflows.md: preserve meta-workflow requirements frontmatter in generated output (needed for runtime model selection); fix self-check to look for persona symbol after closing --- rather than at absolute line 1.",
    "regenerate": [
      "workflows"
    ],
    "breaking": false,
    "manual": []
  },
  "0.11.0": {
    "version": "0.11.1",
    "date": "2026-04-16",
    "notes": "Fix Phase 7 fan-out: extractPersonaSymbol now handles first-line emoji format; generate-workflows.md strips meta YAML frontmatter; workflow-gen-plan.json corrects architect_sprint_intake persona to product-manager.",
    "regenerate": [
      "workflows"
    ],
    "breaking": false,
    "manual": []
  },
  "0.10.1": {
    "version": "0.11.0",
    "date": "2026-04-16",
    "notes": "Phase 7 of /forge:init now fans out all 16 atomic workflow generations in parallel via Agent subagents; adds build-init-context.cjs (deterministic project brief) and workflow-gen-plan.json (fan-out table).",
    "regenerate": [],
    "breaking": false,
    "manual": []
  },
  "0.10.0": {
    "version": "0.10.1",
    "date": "2026-04-16",
    "notes": "Fix: quiz_agent.md was missing from new inits — add meta-quiz-agent.md so Phase 7 generates the KB knowledge-check workflow.",
    "regenerate": [
      "workflows"
    ],
    "breaking": false,
    "manual": []
  },
  "0.9.18": {
    "version": "0.10.0",
    "date": "2026-04-16",
    "notes": "0.9.x → 0.10.0 — Tomoshibi agent (灯): coding-agent instruction files linked to Forge KB and workflows; KB folder name configurable at init pre-flight (paths.engineering); forge:init Phase 12, forge:update Step 7, meta-collate Finalize. Full 0.9.x cycle: store custodian gateway, named-agent IPC with phase banners and Monitor streaming, orchestrator context compaction, banner library, calibrate command, add-task, health improvements, structure manifest, BUG-008/009 fixes.",
    "regenerate": [
      "workflows",
      "commands",
      "personas",
      "skills",
      "tools"
    ],
    "breaking": false,
    "manual": []
  },
  "0.9.17": {
    "version": "0.10.0",
    "date": "2026-04-16",
    "notes": "0.9.x → 0.10.0 — see 0.9.18 entry.",
    "regenerate": [
      "workflows",
      "commands",
      "personas",
      "skills",
      "tools"
    ],
    "breaking": false,
    "manual": []
  },
  "0.9.16": {
    "version": "0.10.0",
    "date": "2026-04-16",
    "notes": "0.9.x → 0.10.0 — see 0.9.18 entry.",
    "regenerate": [
      "workflows",
      "commands",
      "personas",
      "skills",
      "tools"
    ],
    "breaking": false,
    "manual": []
  },
  "0.9.15": {
    "version": "0.10.0",
    "date": "2026-04-16",
    "notes": "0.9.x → 0.10.0 — see 0.9.18 entry.",
    "regenerate": [
      "workflows",
      "commands",
      "personas",
      "skills",
      "tools"
    ],
    "breaking": false,
    "manual": []
  },
  "0.9.14": {
    "version": "0.10.0",
    "date": "2026-04-16",
    "notes": "0.9.x → 0.10.0 — see 0.9.18 entry.",
    "regenerate": [
      "workflows",
      "commands",
      "personas",
      "skills",
      "tools"
    ],
    "breaking": false,
    "manual": []
  },
  "0.9.13": {
    "version": "0.10.0",
    "date": "2026-04-16",
    "notes": "0.9.x → 0.10.0 — see 0.9.18 entry.",
    "regenerate": [
      "workflows",
      "commands",
      "personas",
      "skills",
      "tools"
    ],
    "breaking": false,
    "manual": []
  },
  "0.9.12": {
    "version": "0.10.0",
    "date": "2026-04-16",
    "notes": "0.9.x → 0.10.0 — see 0.9.18 entry.",
    "regenerate": [
      "workflows",
      "commands",
      "personas",
      "skills",
      "tools"
    ],
    "breaking": false,
    "manual": []
  },
  "0.9.11": {
    "version": "0.10.0",
    "date": "2026-04-16",
    "notes": "0.9.x → 0.10.0 — see 0.9.18 entry.",
    "regenerate": [
      "workflows",
      "commands",
      "personas",
      "skills",
      "tools"
    ],
    "breaking": false,
    "manual": []
  },
  "0.9.10": {
    "version": "0.10.0",
    "date": "2026-04-16",
    "notes": "0.9.x → 0.10.0 — see 0.9.18 entry.",
    "regenerate": [
      "workflows",
      "commands",
      "personas",
      "skills",
      "tools"
    ],
    "breaking": false,
    "manual": []
  },
  "0.9.9": {
    "version": "0.10.0",
    "date": "2026-04-16",
    "notes": "0.9.x → 0.10.0 — see 0.9.18 entry.",
    "regenerate": [
      "workflows",
      "commands",
      "personas",
      "skills",
      "tools"
    ],
    "breaking": false,
    "manual": []
  },
  "0.9.8": {
    "version": "0.10.0",
    "date": "2026-04-16",
    "notes": "0.9.x → 0.10.0 — see 0.9.18 entry.",
    "regenerate": [
      "workflows",
      "commands",
      "personas",
      "skills",
      "tools"
    ],
    "breaking": false,
    "manual": []
  },
  "0.9.7": {
    "version": "0.10.0",
    "date": "2026-04-16",
    "notes": "0.9.x → 0.10.0 — see 0.9.18 entry.",
    "regenerate": [
      "workflows",
      "commands",
      "personas",
      "skills",
      "tools"
    ],
    "breaking": false,
    "manual": []
  },
  "0.9.6": {
    "version": "0.10.0",
    "date": "2026-04-16",
    "notes": "0.9.x → 0.10.0 — see 0.9.18 entry.",
    "regenerate": [
      "workflows",
      "commands",
      "personas",
      "skills",
      "tools"
    ],
    "breaking": false,
    "manual": []
  },
  "0.9.5": {
    "version": "0.10.0",
    "date": "2026-04-16",
    "notes": "0.9.x → 0.10.0 — see 0.9.18 entry.",
    "regenerate": [
      "workflows",
      "commands",
      "personas",
      "skills",
      "tools"
    ],
    "breaking": false,
    "manual": []
  },
  "0.9.4": {
    "version": "0.10.0",
    "date": "2026-04-16",
    "notes": "0.9.x → 0.10.0 — see 0.9.18 entry.",
    "regenerate": [
      "workflows",
      "commands",
      "personas",
      "skills",
      "tools"
    ],
    "breaking": false,
    "manual": []
  },
  "0.9.3": {
    "version": "0.10.0",
    "date": "2026-04-16",
    "notes": "0.9.x → 0.10.0 — see 0.9.18 entry.",
    "regenerate": [
      "workflows",
      "commands",
      "personas",
      "skills",
      "tools"
    ],
    "breaking": false,
    "manual": []
  },
  "0.9.2": {
    "version": "0.10.0",
    "date": "2026-04-16",
    "notes": "0.9.x → 0.10.0 — see 0.9.18 entry.",
    "regenerate": [
      "workflows",
      "commands",
      "personas",
      "skills",
      "tools"
    ],
    "breaking": false,
    "manual": []
  },
  "0.9.1": {
    "version": "0.10.0",
    "date": "2026-04-16",
    "notes": "0.9.x → 0.10.0 — see 0.9.18 entry.",
    "regenerate": [
      "workflows",
      "commands",
      "personas",
      "skills",
      "tools"
    ],
    "breaking": false,
    "manual": []
  },
  "0.9.0": {
    "version": "0.10.0",
    "date": "2026-04-16",
    "notes": "0.9.x → 0.10.0 — see 0.9.18 entry.",
    "regenerate": [
      "workflows",
      "commands",
      "personas",
      "skills",
      "tools"
    ],
    "breaking": false,
    "manual": []
  },
  "0.8.10": {
    "version": "0.9.0",
    "date": "2026-04-15",
    "notes": "0.8.x → 0.9.0 — Store Custodian: deterministic store gateway (store-cli.cjs), 16 meta-workflows migrated from direct writes to custodian, sprint schema gains goal and features fields. Full 0.8.x cycle: Sprint S06 cap, slug-aware directory discovery, ghost event fix, collate purge-events, init migration baseline stamp, workflow canonical naming, effort: frontmatter, fix sprint-plan and forge:update Step 4.",
    "regenerate": [
      "workflows",
      "commands",
      "personas",
      "skills",
      "tools"
    ],
    "breaking": false,
    "manual": []
  },
  "0.8.9": {
    "version": "0.9.0",
    "date": "2026-04-15",
    "notes": "0.8.x → 0.9.0 — see 0.8.10 entry.",
    "regenerate": [
      "workflows",
      "commands",
      "personas",
      "skills",
      "tools"
    ],
    "breaking": false,
    "manual": []
  },
  "0.8.8": {
    "version": "0.9.0",
    "date": "2026-04-15",
    "notes": "0.8.x → 0.9.0 — see 0.8.10 entry.",
    "regenerate": [
      "workflows",
      "commands",
      "personas",
      "skills",
      "tools"
    ],
    "breaking": false,
    "manual": []
  },
  "0.8.7": {
    "version": "0.9.0",
    "date": "2026-04-15",
    "notes": "0.8.x → 0.9.0 — see 0.8.10 entry.",
    "regenerate": [
      "workflows",
      "commands",
      "personas",
      "skills",
      "tools"
    ],
    "breaking": false,
    "manual": []
  },
  "0.8.6": {
    "version": "0.9.0",
    "date": "2026-04-15",
    "notes": "0.8.x → 0.9.0 — see 0.8.10 entry.",
    "regenerate": [
      "workflows",
      "commands",
      "personas",
      "skills",
      "tools"
    ],
    "breaking": false,
    "manual": []
  },
  "0.8.5": {
    "version": "0.9.0",
    "date": "2026-04-15",
    "notes": "0.8.x → 0.9.0 — see 0.8.10 entry.",
    "regenerate": [
      "workflows",
      "commands",
      "personas",
      "skills",
      "tools"
    ],
    "breaking": false,
    "manual": []
  },
  "0.8.4": {
    "version": "0.9.0",
    "date": "2026-04-15",
    "notes": "0.8.x → 0.9.0 — see 0.8.10 entry.",
    "regenerate": [
      "workflows",
      "commands",
      "personas",
      "skills",
      "tools"
    ],
    "breaking": false,
    "manual": []
  },
  "0.8.3": {
    "version": "0.9.0",
    "date": "2026-04-15",
    "notes": "0.8.x → 0.9.0 — see 0.8.10 entry.",
    "regenerate": [
      "workflows",
      "commands",
      "personas",
      "skills",
      "tools"
    ],
    "breaking": false,
    "manual": []
  },
  "0.8.2": {
    "version": "0.9.0",
    "date": "2026-04-15",
    "notes": "0.8.x → 0.9.0 — see 0.8.10 entry.",
    "regenerate": [
      "workflows",
      "commands",
      "personas",
      "skills",
      "tools"
    ],
    "breaking": false,
    "manual": []
  },
  "0.8.1": {
    "version": "0.9.0",
    "date": "2026-04-15",
    "notes": "0.8.x → 0.9.0 — see 0.8.10 entry.",
    "regenerate": [
      "workflows",
      "commands",
      "personas",
      "skills",
      "tools"
    ],
    "breaking": false,
    "manual": []
  },
  "0.8.0": {
    "version": "0.9.0",
    "date": "2026-04-15",
    "notes": "0.8.x → 0.9.0 — see 0.8.10 entry.",
    "regenerate": [
      "workflows",
      "commands",
      "personas",
      "skills",
      "tools"
    ],
    "breaking": false,
    "manual": []
  },
  "0.7.11": {
    "version": "0.8.0",
    "date": "2026-04-14",
    "notes": "0.7.x → 0.8.0 — Sprint S06: orchestrator persona noun-based lookup, meta-workflows purged of inline Persona sections, forge:regenerate includes personas, sprint schema path field, slug-aware seed-store/collate/validate-store. Full 0.7.x cycle: Japanese nature persona palette, orchestrator announcements, ghost event fix, false breaking-change suppression, validate-store slug and filesystem checks.",
    "regenerate": [
      "workflows",
      "commands",
      "personas",
      "skills"
    ],
    "breaking": false,
    "manual": []
  },
  "0.7.10": {
    "version": "0.8.0",
    "date": "2026-04-14",
    "notes": "0.7.x → 0.8.0 — see 0.7.11 entry.",
    "regenerate": [
      "workflows",
      "commands",
      "personas",
      "skills"
    ],
    "breaking": false,
    "manual": []
  },
  "0.7.9": {
    "version": "0.8.0",
    "date": "2026-04-14",
    "notes": "0.7.x → 0.8.0 — see 0.7.11 entry.",
    "regenerate": [
      "workflows",
      "commands",
      "personas",
      "skills"
    ],
    "breaking": false,
    "manual": []
  },
  "0.7.8": {
    "version": "0.8.0",
    "date": "2026-04-14",
    "notes": "0.7.x → 0.8.0 — see 0.7.11 entry.",
    "regenerate": [
      "workflows",
      "commands",
      "personas",
      "skills"
    ],
    "breaking": false,
    "manual": []
  },
  "0.7.7": {
    "version": "0.8.0",
    "date": "2026-04-14",
    "notes": "0.7.x → 0.8.0 — see 0.7.11 entry.",
    "regenerate": [
      "workflows",
      "commands",
      "personas",
      "skills"
    ],
    "breaking": false,
    "manual": []
  },
  "0.7.6": {
    "version": "0.8.0",
    "date": "2026-04-14",
    "notes": "0.7.x → 0.8.0 — see 0.7.11 entry.",
    "regenerate": [
      "workflows",
      "commands",
      "personas",
      "skills"
    ],
    "breaking": false,
    "manual": []
  },
  "0.7.5": {
    "version": "0.8.0",
    "date": "2026-04-14",
    "notes": "0.7.x → 0.8.0 — see 0.7.11 entry.",
    "regenerate": [
      "workflows",
      "commands",
      "personas",
      "skills"
    ],
    "breaking": false,
    "manual": []
  },
  "0.7.4": {
    "version": "0.8.0",
    "date": "2026-04-14",
    "notes": "0.7.x → 0.8.0 — see 0.7.11 entry.",
    "regenerate": [
      "workflows",
      "commands",
      "personas",
      "skills"
    ],
    "breaking": false,
    "manual": []
  },
  "0.7.3": {
    "version": "0.8.0",
    "date": "2026-04-14",
    "notes": "0.7.x → 0.8.0 — see 0.7.11 entry.",
    "regenerate": [
      "workflows",
      "commands",
      "personas",
      "skills"
    ],
    "breaking": false,
    "manual": []
  },
  "0.7.2": {
    "version": "0.8.0",
    "date": "2026-04-14",
    "notes": "0.7.x → 0.8.0 — see 0.7.11 entry.",
    "regenerate": [
      "workflows",
      "commands",
      "personas",
      "skills"
    ],
    "breaking": false,
    "manual": []
  },
  "0.7.1": {
    "version": "0.8.0",
    "date": "2026-04-14",
    "notes": "0.7.x → 0.8.0 — see 0.7.11 entry.",
    "regenerate": [
      "workflows",
      "commands",
      "personas",
      "skills"
    ],
    "breaking": false,
    "manual": []
  },
  "0.7.0": {
    "version": "0.8.0",
    "date": "2026-04-14",
    "notes": "0.7.x → 0.8.0 — see 0.7.11 entry.",
    "regenerate": [
      "workflows",
      "commands",
      "personas",
      "skills"
    ],
    "breaking": false,
    "manual": []
  },
  "0.6.13": {
    "version": "0.7.0",
    "date": "2026-04-13",
    "notes": "0.6.x → 0.7.0 △ Breaking — Portability migration: legacy model: fields → structured requirements blocks (3D Agent Model); grounding and descriptive pathing (ID-description folder naming, absolute path injection). Full 0.6.x cycle: distribution-aware update URLs, QA validate phase, store.cjs facade, collate fixes, skillforge git-subdir.",
    "regenerate": [
      "workflows",
      "commands",
      "personas",
      "skills",
      "tools"
    ],
    "breaking": true,
    "manual": [
      "Check .forge/config.json for custom model overrides in config.pipelines. If present, migrate to the requirements block format in the corresponding workflow artifacts."
    ]
  },
  "0.6.12": {
    "version": "0.7.0",
    "date": "2026-04-13",
    "notes": "0.6.x → 0.7.0 — see 0.6.13 entry.",
    "regenerate": [
      "workflows",
      "commands",
      "personas",
      "skills",
      "tools"
    ],
    "breaking": true,
    "manual": [
      "Check .forge/config.json for custom model overrides in config.pipelines. If present, migrate to the requirements block format in the corresponding workflow artifacts."
    ]
  },
  "0.6.11": {
    "version": "0.7.0",
    "date": "2026-04-13",
    "notes": "0.6.x → 0.7.0 — see 0.6.13 entry.",
    "regenerate": [
      "workflows",
      "commands",
      "personas",
      "skills",
      "tools"
    ],
    "breaking": true,
    "manual": [
      "Check .forge/config.json for custom model overrides in config.pipelines. If present, migrate to the requirements block format in the corresponding workflow artifacts."
    ]
  },
  "0.6.10": {
    "version": "0.7.0",
    "date": "2026-04-13",
    "notes": "0.6.x → 0.7.0 — see 0.6.13 entry.",
    "regenerate": [
      "workflows",
      "commands",
      "personas",
      "skills",
      "tools"
    ],
    "breaking": true,
    "manual": [
      "Check .forge/config.json for custom model overrides in config.pipelines. If present, migrate to the requirements block format in the corresponding workflow artifacts."
    ]
  },
  "0.6.9": {
    "version": "0.7.0",
    "date": "2026-04-13",
    "notes": "0.6.x → 0.7.0 — see 0.6.13 entry.",
    "regenerate": [
      "workflows",
      "commands",
      "personas",
      "skills",
      "tools"
    ],
    "breaking": true,
    "manual": [
      "Check .forge/config.json for custom model overrides in config.pipelines. If present, migrate to the requirements block format in the corresponding workflow artifacts."
    ]
  },
  "0.6.8": {
    "version": "0.7.0",
    "date": "2026-04-13",
    "notes": "0.6.x → 0.7.0 — see 0.6.13 entry.",
    "regenerate": [
      "workflows",
      "commands",
      "personas",
      "skills",
      "tools"
    ],
    "breaking": true,
    "manual": [
      "Check .forge/config.json for custom model overrides in config.pipelines. If present, migrate to the requirements block format in the corresponding workflow artifacts."
    ]
  },
  "0.6.7": {
    "version": "0.7.0",
    "date": "2026-04-13",
    "notes": "0.6.x → 0.7.0 — see 0.6.13 entry.",
    "regenerate": [
      "workflows",
      "commands",
      "personas",
      "skills",
      "tools"
    ],
    "breaking": true,
    "manual": [
      "Check .forge/config.json for custom model overrides in config.pipelines. If present, migrate to the requirements block format in the corresponding workflow artifacts."
    ]
  },
  "0.6.6": {
    "version": "0.7.0",
    "date": "2026-04-13",
    "notes": "0.6.x → 0.7.0 — see 0.6.13 entry.",
    "regenerate": [
      "workflows",
      "commands",
      "personas",
      "skills",
      "tools"
    ],
    "breaking": true,
    "manual": [
      "Check .forge/config.json for custom model overrides in config.pipelines. If present, migrate to the requirements block format in the corresponding workflow artifacts."
    ]
  },
  "0.6.5": {
    "version": "0.7.0",
    "date": "2026-04-13",
    "notes": "0.6.x → 0.7.0 — see 0.6.13 entry.",
    "regenerate": [
      "workflows",
      "commands",
      "personas",
      "skills",
      "tools"
    ],
    "breaking": true,
    "manual": [
      "Check .forge/config.json for custom model overrides in config.pipelines. If present, migrate to the requirements block format in the corresponding workflow artifacts."
    ]
  },
  "0.6.4": {
    "version": "0.7.0",
    "date": "2026-04-13",
    "notes": "0.6.x → 0.7.0 — see 0.6.13 entry.",
    "regenerate": [
      "workflows",
      "commands",
      "personas",
      "skills",
      "tools"
    ],
    "breaking": true,
    "manual": [
      "Check .forge/config.json for custom model overrides in config.pipelines. If present, migrate to the requirements block format in the corresponding workflow artifacts."
    ]
  },
  "0.6.3": {
    "version": "0.7.0",
    "date": "2026-04-13",
    "notes": "0.6.x → 0.7.0 — see 0.6.13 entry.",
    "regenerate": [
      "workflows",
      "commands",
      "personas",
      "skills",
      "tools"
    ],
    "breaking": true,
    "manual": [
      "Check .forge/config.json for custom model overrides in config.pipelines. If present, migrate to the requirements block format in the corresponding workflow artifacts."
    ]
  },
  "0.6.2": {
    "version": "0.7.0",
    "date": "2026-04-13",
    "notes": "0.6.x → 0.7.0 — see 0.6.13 entry.",
    "regenerate": [
      "workflows",
      "commands",
      "personas",
      "skills",
      "tools"
    ],
    "breaking": true,
    "manual": [
      "Check .forge/config.json for custom model overrides in config.pipelines. If present, migrate to the requirements block format in the corresponding workflow artifacts."
    ]
  },
  "0.6.1": {
    "version": "0.7.0",
    "date": "2026-04-13",
    "notes": "0.6.x → 0.7.0 — see 0.6.13 entry.",
    "regenerate": [
      "workflows",
      "commands",
      "personas",
      "skills",
      "tools"
    ],
    "breaking": true,
    "manual": [
      "Check .forge/config.json for custom model overrides in config.pipelines. If present, migrate to the requirements block format in the corresponding workflow artifacts."
    ]
  },
  "0.6.0": {
    "version": "0.7.0",
    "date": "2026-04-13",
    "notes": "0.6.x → 0.7.0 — see 0.6.13 entry.",
    "regenerate": [
      "workflows",
      "commands",
      "personas",
      "skills",
      "tools"
    ],
    "breaking": true,
    "manual": [
      "Check .forge/config.json for custom model overrides in config.pipelines. If present, migrate to the requirements block format in the corresponding workflow artifacts."
    ]
  },
  "0.5.9": {
    "version": "0.6.0",
    "date": "2026-04-09",
    "notes": "0.5.x → 0.6.0 — Feature tier: Feature entity (feature.schema.json, .forge/store/features/), feature_id in sprint/task schemas, collate generates features/ registry, health reports per-feature coverage, docs/concepts/ added. Full 0.5.x cycle: fix-bug as true orchestrator, validate-store null handling, collate FORGE_ROOT fix, update UX improvements, canary source detection.",
    "regenerate": [
      "workflows",
      "commands",
      "tools"
    ],
    "breaking": false,
    "manual": []
  },
  "0.5.8": {
    "version": "0.6.0",
    "date": "2026-04-09",
    "notes": "0.5.x → 0.6.0 — see 0.5.9 entry.",
    "regenerate": [
      "workflows",
      "commands",
      "tools"
    ],
    "breaking": false,
    "manual": []
  },
  "0.5.7": {
    "version": "0.6.0",
    "date": "2026-04-09",
    "notes": "0.5.x → 0.6.0 — see 0.5.9 entry.",
    "regenerate": [
      "workflows",
      "commands",
      "tools"
    ],
    "breaking": false,
    "manual": []
  },
  "0.5.6": {
    "version": "0.6.0",
    "date": "2026-04-09",
    "notes": "0.5.x → 0.6.0 — see 0.5.9 entry.",
    "regenerate": [
      "workflows",
      "commands",
      "tools"
    ],
    "breaking": false,
    "manual": []
  },
  "0.5.5": {
    "version": "0.6.0",
    "date": "2026-04-09",
    "notes": "0.5.x → 0.6.0 — see 0.5.9 entry.",
    "regenerate": [
      "workflows",
      "commands",
      "tools"
    ],
    "breaking": false,
    "manual": []
  },
  "0.5.4": {
    "version": "0.6.0",
    "date": "2026-04-09",
    "notes": "0.5.x → 0.6.0 — see 0.5.9 entry.",
    "regenerate": [
      "workflows",
      "commands",
      "tools"
    ],
    "breaking": false,
    "manual": []
  },
  "0.5.3": {
    "version": "0.6.0",
    "date": "2026-04-09",
    "notes": "0.5.x → 0.6.0 — see 0.5.9 entry.",
    "regenerate": [
      "workflows",
      "commands",
      "tools"
    ],
    "breaking": false,
    "manual": []
  },
  "0.5.2": {
    "version": "0.6.0",
    "date": "2026-04-09",
    "notes": "0.5.x → 0.6.0 — see 0.5.9 entry.",
    "regenerate": [
      "workflows",
      "commands",
      "tools"
    ],
    "breaking": false,
    "manual": []
  },
  "0.5.1": {
    "version": "0.6.0",
    "date": "2026-04-09",
    "notes": "0.5.x → 0.6.0 — see 0.5.9 entry.",
    "regenerate": [
      "workflows",
      "commands",
      "tools"
    ],
    "breaking": false,
    "manual": []
  },
  "0.5.0": {
    "version": "0.6.0",
    "date": "2026-04-09",
    "notes": "0.5.x → 0.6.0 — see 0.5.9 entry.",
    "regenerate": [
      "workflows",
      "commands",
      "tools"
    ],
    "breaking": false,
    "manual": []
  },
  "0.4.1": {
    "version": "0.5.0",
    "date": "2026-04-06",
    "notes": "0.4.x → 0.5.0 — Japanese-style marks (〇△×🌱🌿⛰️) across all output, agent personas with symbols, command renames (plan/review-plan/review-code), generation-manifest tool, engineering/tools/ eliminated (all tools from $FORGE_ROOT/tools/), paths.forgeRoot and paths.customCommands added to config schema.",
    "regenerate": [
      "workflows",
      "commands"
    ],
    "breaking": false,
    "manual": []
  },
  "0.4.0": {
    "version": "0.5.0",
    "date": "2026-04-06",
    "notes": "0.4.x → 0.5.0 — see 0.4.1 entry. If upgrading from 0.4.0 directly, first run: node engineering/tools/manage-config.cjs pipeline backfill-models",
    "regenerate": [
      "workflows",
      "commands"
    ],
    "breaking": false,
    "manual": []
  },
  "0.3.15": {
    "version": "0.4.0",
    "date": "2026-04-05",
    "notes": "0.3.x → 0.4.0 △ Breaking — Pre-built CJS tools shipped (collate, seed-store, validate-store, manage-config); revision loop fix; context accumulation fix (BUG-001); error triage hook; graceful error handling. Full 0.3.x cycle included.",
    "regenerate": [
      "workflows",
      "commands",
      "tools"
    ],
    "breaking": true,
    "manual": [
      "Backfill explicit model fields on pipeline phases: node engineering/tools/manage-config.cjs pipeline backfill-models"
    ]
  },
  "0.3.14": {
    "version": "0.4.0",
    "date": "2026-04-05",
    "notes": "0.3.x → 0.4.0 — see 0.3.15 entry.",
    "regenerate": [
      "workflows",
      "commands",
      "tools"
    ],
    "breaking": true,
    "manual": [
      "Backfill explicit model fields on pipeline phases: node engineering/tools/manage-config.cjs pipeline backfill-models"
    ]
  },
  "0.3.13": {
    "version": "0.4.0",
    "date": "2026-04-05",
    "notes": "0.3.x → 0.4.0 — see 0.3.15 entry.",
    "regenerate": [
      "workflows",
      "commands",
      "tools"
    ],
    "breaking": true,
    "manual": [
      "Backfill explicit model fields on pipeline phases: node engineering/tools/manage-config.cjs pipeline backfill-models"
    ]
  },
  "0.3.12": {
    "version": "0.4.0",
    "date": "2026-04-05",
    "notes": "0.3.x → 0.4.0 — see 0.3.15 entry.",
    "regenerate": [
      "workflows",
      "commands",
      "tools"
    ],
    "breaking": true,
    "manual": [
      "Backfill explicit model fields on pipeline phases: node engineering/tools/manage-config.cjs pipeline backfill-models"
    ]
  },
  "0.3.11": {
    "version": "0.4.0",
    "date": "2026-04-05",
    "notes": "0.3.x → 0.4.0 — see 0.3.15 entry.",
    "regenerate": [
      "workflows",
      "commands",
      "tools"
    ],
    "breaking": true,
    "manual": [
      "Backfill explicit model fields on pipeline phases: node engineering/tools/manage-config.cjs pipeline backfill-models"
    ]
  },
  "0.3.10": {
    "version": "0.4.0",
    "date": "2026-04-05",
    "notes": "0.3.x → 0.4.0 — see 0.3.15 entry.",
    "regenerate": [
      "workflows",
      "commands",
      "tools"
    ],
    "breaking": true,
    "manual": [
      "Backfill explicit model fields on pipeline phases: node engineering/tools/manage-config.cjs pipeline backfill-models"
    ]
  },
  "0.3.9": {
    "version": "0.4.0",
    "date": "2026-04-05",
    "notes": "0.3.x → 0.4.0 — see 0.3.15 entry.",
    "regenerate": [
      "workflows",
      "commands",
      "tools"
    ],
    "breaking": true,
    "manual": [
      "Backfill explicit model fields on pipeline phases: node engineering/tools/manage-config.cjs pipeline backfill-models"
    ]
  },
  "0.3.8": {
    "version": "0.4.0",
    "date": "2026-04-05",
    "notes": "0.3.x → 0.4.0 — see 0.3.15 entry.",
    "regenerate": [
      "workflows",
      "commands",
      "tools"
    ],
    "breaking": true,
    "manual": [
      "Backfill explicit model fields on pipeline phases: node engineering/tools/manage-config.cjs pipeline backfill-models"
    ]
  },
  "0.3.7": {
    "version": "0.4.0",
    "date": "2026-04-05",
    "notes": "0.3.x → 0.4.0 — see 0.3.15 entry.",
    "regenerate": [
      "workflows",
      "commands",
      "tools"
    ],
    "breaking": true,
    "manual": [
      "Backfill explicit model fields on pipeline phases: node engineering/tools/manage-config.cjs pipeline backfill-models"
    ]
  },
  "0.3.6": {
    "version": "0.4.0",
    "date": "2026-04-05",
    "notes": "0.3.x → 0.4.0 — see 0.3.15 entry.",
    "regenerate": [
      "workflows",
      "commands",
      "tools"
    ],
    "breaking": true,
    "manual": [
      "Backfill explicit model fields on pipeline phases: node engineering/tools/manage-config.cjs pipeline backfill-models"
    ]
  },
  "0.3.5": {
    "version": "0.4.0",
    "date": "2026-04-05",
    "notes": "0.3.x → 0.4.0 — see 0.3.15 entry.",
    "regenerate": [
      "workflows",
      "commands",
      "tools"
    ],
    "breaking": true,
    "manual": [
      "Backfill explicit model fields on pipeline phases: node engineering/tools/manage-config.cjs pipeline backfill-models"
    ]
  },
  "0.3.4": {
    "version": "0.4.0",
    "date": "2026-04-05",
    "notes": "0.3.x → 0.4.0 — see 0.3.15 entry.",
    "regenerate": [
      "workflows",
      "commands",
      "tools"
    ],
    "breaking": true,
    "manual": [
      "Backfill explicit model fields on pipeline phases: node engineering/tools/manage-config.cjs pipeline backfill-models"
    ]
  },
  "0.3.3": {
    "version": "0.4.0",
    "date": "2026-04-05",
    "notes": "0.3.x → 0.4.0 — see 0.3.15 entry.",
    "regenerate": [
      "workflows",
      "commands",
      "tools"
    ],
    "breaking": true,
    "manual": [
      "Backfill explicit model fields on pipeline phases: node engineering/tools/manage-config.cjs pipeline backfill-models"
    ]
  },
  "0.3.2": {
    "version": "0.4.0",
    "date": "2026-04-05",
    "notes": "0.3.x → 0.4.0 — see 0.3.15 entry.",
    "regenerate": [
      "workflows",
      "commands",
      "tools"
    ],
    "breaking": true,
    "manual": [
      "Backfill explicit model fields on pipeline phases: node engineering/tools/manage-config.cjs pipeline backfill-models"
    ]
  },
  "0.3.1": {
    "version": "0.4.0",
    "date": "2026-04-05",
    "notes": "0.3.x → 0.4.0 — see 0.3.15 entry.",
    "regenerate": [
      "workflows",
      "commands",
      "tools"
    ],
    "breaking": true,
    "manual": [
      "Backfill explicit model fields on pipeline phases: node engineering/tools/manage-config.cjs pipeline backfill-models"
    ]
  },
  "0.3.0": {
    "version": "0.4.0",
    "date": "2026-04-05",
    "notes": "0.3.x → 0.4.0 — see 0.3.15 entry.",
    "regenerate": [
      "workflows",
      "commands",
      "tools"
    ],
    "breaking": true,
    "manual": [
      "Backfill explicit model fields on pipeline phases: node engineering/tools/manage-config.cjs pipeline backfill-models"
    ]
  },
  "0.2.0": {
    "version": "0.3.0",
    "date": "2026-04-02",
    "notes": "Pluggable pipeline routing, /forge:add-pipeline command, manage-config tool spec, extended /forge:regenerate with tools and knowledge-base categories.",
    "regenerate": [
      "workflows"
    ],
    "breaking": false,
    "manual": []
  },
  "1.3.0": {
    "version": "1.4.0",
    "date": "2026-06-07",
    "notes": "Fixed /forge:* command namespace (CLI-first redesign). Project-prefix command namespaces (/acme:*, /hello:*) are retired: getCommandsSubdir() now returns 'forge' unconditionally, base-pack command templates carry literal /forge: headings ({{PREFIX}} removed), and substitute-placeholders materializes commands to .claude/commands/forge/. All command .md files (plugin commands/ + base-pack commands/) resolve FORGE_ROOT with a vendored fallback: ${CLAUDE_PLUGIN_ROOT:-$(pwd)/.forge} — full parity for plugin-less projects bootstrapped by '4ge init claude' where tools/schemas/hooks are vendored under .forge/. Rulebooks (generate-commands, phase-3-materialize, phase-1-collect, meta-migrate, migrate_structural) updated to the fixed namespace.",
    "target": "tools:lib:paths,tools:substitute-placeholders,commands:*,init:base-pack:commands:*,init:generation:generate-commands,init:phases:phase-1-collect,init:phases:phase-3-materialize,meta:workflows:meta-migrate,init:base-pack:workflows:migrate_structural",
    "regenerate": [
      "commands"
    ],
    "breaking": true,
    "manual": [
      "Existing projects with prefix-namespaced commands (.claude/commands/<prefix>/): re-run materialization (or /forge:rebuild) to produce .claude/commands/forge/, then delete the old .claude/commands/<prefix>/ directory. The old commands keep working until removed but will not receive updates."
    ]
  },
  "1.4.0": {
    "version": "1.4.1",
    "date": "2026-06-07",
    "notes": "wfl-init.js Workflow-harness parse fix: the driver shipped wrapped in 'export default async function wflInit(args)' — the Workflow tool permits exactly one export (the meta literal) and evaluates the rest as an async function body, so every /forge:init dispatch failed at launch with \"SyntaxError: Unexpected keyword 'export'\". Body now runs at top level reading the global args. New regression test (wfl-drivers-parse.test.cjs) parses all four base-pack drivers exactly the way the harness does.",
    "target": "init:base-pack:workflows-js:wfl-init",
    "regenerate": [
      "workflows"
    ],
    "breaking": false,
    "manual": [
      "Projects bootstrapped with the broken driver: re-run '4ge init claude .' (idempotent repair overwrites .claude/workflows/wfl-init.js)."
    ]
  },
  "1.4.1": {
    "version": "1.4.2",
    "date": "2026-06-07",
    "notes": "wfl-init.js Workflow-API rewrite (forge#112): the driver mis-used the harness API four ways — phase(title, callback) callbacks were silently discarded so init ran 0 agents while reporting fabricated ok:true; parallel() received promises instead of thunks; agent() had model as first arg instead of opts.model; structured results lacked opts.schema. Phase bodies now run inline at top level, fan-outs use thunks, all agents use agent(prompt, {model, label, phase, schema}), and the report reflects real phase results. Rulebook reads use vendored .forge/init/... paths with direct-analysis fallback. Contract enforced by wfl-drivers-parse.test.cjs (phase-callback, thunk, arg-order, referenced-rulebook-exists gates).",
    "target": "init:base-pack:workflows-js:wfl-init",
    "regenerate": [
      "workflows"
    ],
    "breaking": false,
    "manual": [
      "Projects bootstrapped with the broken driver: re-run '4ge init claude .' (idempotent repair overwrites .claude/workflows/wfl-init.js)."
    ]
  },
  "1.4.2": {
    "version": "1.4.3",
    "date": "2026-06-07",
    "notes": "wfl-init.js verify-phase CLI alignment (forge#112 follow-up): the Phase 2 verify prompts invoked 'verify-phase.cjs --phase 2' bare, but the tool requires '--phase 2 --kb-path <path>' (exit 2 without it). Both Phase 2 invocations now pass --kb-path \"${kbFolder}\". New contract gates in wfl-drivers-parse.test.cjs assert every driver verify-phase invocation uses a supported phase (1-3) and that --phase 2 always carries --kb-path.",
    "target": "init:base-pack:workflows-js:wfl-init",
    "regenerate": [
      "workflows"
    ],
    "breaking": false,
    "manual": []
  },
  "1.4.3": {
    "version": "1.4.4",
    "date": "2026-06-07",
    "notes": "First full CLI-first field-test gap fixes (config drift + manifest scope): (1) phase-1-collect.md no longer instructs the config-writer to derive paths.commands from the project prefix — it is ALWAYS '.claude/commands/forge' (the prefix-derived instruction survived the 1.4.0 namespace redesign and produced paths.commands='.claude/commands/git' -> check-structure 0/14). (2) generate-tools.md gains an explicit step writing paths.forgeRoot='.forge' — without it the register agent improvised an absolute npm-global payload path, which breaks on version upgrades and nvm switches. (3) build-manifest.cjs excludes 10 plugin-development tools from the tools namespace — the structure manifest describes instances, and expecting dev tools produced false 49/59 'missing tools' gaps in /forge:health.",
    "target": "init:phases:phase-1-collect,init:generation:generate-tools,tools:build-manifest,schemas:structure-manifest",
    "regenerate": [],
    "breaking": false,
    "manual": [
      "Existing CLI-first projects with drifted config: run node .forge/tools/manage-config.cjs set paths.commands '\".claude/commands/forge\"' and set paths.forgeRoot '\".forge\"', then re-run '4ge init claude .' to refresh .forge/schemas/structure-manifest.json."
    ]
  },
  "1.4.4": {
    "version": "1.4.5",
    "date": "2026-06-09",
    "notes": "Collate-workflow KB-link refresh is orchestrator-owned under forge-cli. collator_agent.md (base-pack) + meta-collate.md (meta source) no longer instruct the collator subagent to invoke the forge:refresh-kb-links Skill tool: forge-cli subagents run via the Pi runtime, which has no Skill tool, so the instruction triggered a multi-call bash-probe loop before falling back. The Claude Code TUI standalone path still uses the Skill tool; under forge-cli the run-task orchestrator owns the KB refresh (runRefreshKbLinks) after the writeback phase. Prose-only change to the generated collate workflow.",
    "target": "workflows:collator_agent,meta:meta-collate",
    "regenerate": [
      "workflows:collator_agent"
    ],
    "breaking": false,
    "manual": [
      "Run /forge:update (or /forge:rebuild) to regenerate the collate workflow (collator_agent.md) with the orchestrator-owned KB-refresh guidance."
    ]
  }
}
