# Changelog

All notable changes to `@fastpace-ai/fp` are documented here. Newest first.

## 0.53.0 — Compliance module SKU + real GRC integrations

### Governance & Compliance module (GTM Option B)
- **`+compliance` entitlement** — `requireModule('compliance')` / `hasModule`
  gate a purchasable add-on to Team/Platform (bundled with Enterprise). Conservative
  no-downgrade cut: only the evidence-SLO / auditor-guarantee surface
  (`evidence-inbox`, `evidence-expiry`) sits behind the module; readiness, framework
  mapping, risk, and evidence packs stay in Team.

### Real GRC push integrations (F2.8 → production)
- **`fastpace compliance push --live`** now performs a real HTTPS POST of the
  per-provider evidence payload to **Vanta / Drata / Secureframe**. Endpoint + token
  come from env (`FASTPACE_<PROVIDER>_{ENDPOINT,TOKEN}`) or
  `fastpace.config.yaml compliance_push.<provider>`; Bearer auth; https-only; the
  token is never logged.
- **`fastpace compliance connect --provider <p>`** — validate the live-push config
  (endpoint + token) without sending evidence.

## 0.52.0 — Merge-gate P0/P1 + hierarchy cascade

### Merge gate (MERGE-GATE-PLAN P0/P1)
- **`fastpace gate check`** reads the `gate:` block of fastpace.config.yaml
  (`required_checks`, `aibom_max_age_days`, `soft`, `stamp_all`); flags override.
- **`fastpace gate init`** scaffolds `.github/workflows/fastpace-audit-gate.yml`
  and prints the branch-protection steps (soft → required rollout).
- **`fastpace gate install-hook` + `gate stamp`** — commit-time provenance
  stamping: a never-blocking `prepare-commit-msg` hook writes a **signed** run
  manifest and appends the canonical `AI-*` trailer so `gate check` verifies
  provenance **without any runtime hook**. Stamps only AI-signed messages by
  default; `--all` / `gate.stamp_all` stamps everything.
- Fixes two latent gate bugs: `checkProvenance` now accepts the canonical `AI-*`
  trailers (not only `Fp-*`), and `verifyProvenance` is called correctly with a
  ref string.

### Hierarchy cascade (METRICS-PLAN Phase 3)
- **`org_unit:`** path in fastpace.config.yaml flows into each install summary.
- **Org rollup** gains cascading subtree subtotals (`aggregateByOrgUnit`) +
  RBAC-scoped views (`scopeItems`: admin/security = all, team_lead = subtree,
  dev = own). Surfaced at `/api/org/rollup.by_org_unit` and a new "By org unit
  (cascading subtotals)" dashboard card.

## 0.51.0 — Cost by assistant in the ROI surface

- **ROI report** (`summarizeWindow` / `buildRoiReport`) gains `summary.by_vendor`
  — cost/tokens/calls per assistant from the signed manifest vendor tag (sniffed
  for pre-0.48 manifests).
- **Local dashboard · ROI** renders a **"Cost by assistant (cross-vendor)"** card
  above the by-runtime breakdown; `fastpace roi` CLI prints the same slice.
- Sample dataset updated to a 3-vendor fleet (totals unchanged) so the
  cross-vendor slice is visible before real telemetry accumulates.

## 0.50.0 — Cross-vendor metrics visible in the local UI + org dashboard

Makes every 0.48–0.49 cross-vendor metric visible where operators look:
- **Local dashboard · Governance posture** now renders **Shadow AI** (ungoverned
  AI commits, per-vendor attribution) and **Policy conformance** (per-vendor
  deployed-config drift) alongside the assistant mix.
- **Local dashboard · DORA** gains an **AI attribution** card: AI vs human plus
  the **by-assistant** split (commits + share %).
- **Local dashboard · Org rollup** fleet aggregate shows the cross-vendor
  **assistant mix** and fleet-wide **shadow AI** (ungoverned count + coverage %).
- **Org dashboard data layer**: install summaries carry a compact `shadow_ai`
  posture; `aggregateFleet` sums it into a fleet-wide governance-coverage %.

## 0.49.0 — Cross-vendor cost, reliability & DORA splits

Neutralizes the commoditized metrics: cost, reliability, and DORA now slice by
assistant — the dimension no single vendor's dashboard can show.

### Features
- **`fastpace cost report`** gains a **"Per assistant (cross-vendor)"** section
  (`by_vendor` in the report payload), grouped by the signed run-manifest vendor
  tag. Also fixes the report renderer, which read stale field names and always
  printed $0.00.
- **Reliability by assistant** — `computeReliabilityScore().by_vendor`: per-vendor
  score from vendor-tagged manifests (denominator) + commit-sniffed correction
  attribution (numerator). Rendered in the dashboard's Reliability view.
- **DORA by assistant** — `dora.compute().split.by_assistant`: AI-assisted
  commits attributed per vendor with share %.
- **`fastpace plugin ingest`** — normalize raw vendor telemetry (Codex Compliance
  API / OTel; JSON or JSONL) through the universal signal adapters into
  `fastpace/signals.jsonl`.
- **`fastpace posture`** now renders per-vendor policy conformance.

## 0.48.0 — Vendor-neutral governance across Claude Code, Codex & Gemini CLI

fastpace becomes the vendor-neutral governance & compliance layer: one hook
codebase, one policy, and one context source, projected/compiled to each of the
three agentic CLIs.

### Features
- **`fastpace plugin`** — one hook codebase → three vendor plugins. `build`
  generates deployable bundles (Claude Code `.claude-plugin`, Codex
  `.codex-plugin`, Gemini CLI extension) from the 15 shared hook scripts (15/15
  hooks native on all three); `coverage` shows the hook→native-event matrix;
  `policy` compiles `fastpace.policy.yaml` to each vendor's native enforcement
  (permissions / requirements.toml / Policy Engine) with a native-vs-advisory
  coverage matrix; `context` projects `fastpace/context/` → CLAUDE.md / AGENTS.md
  / GEMINI.md.
- **`fastpace posture`** (F5.3) — governance-first metrics emitter: provenance
  coverage, audit-chain integrity, reliability, risk, red-team, exception debt,
  NHI, supply-chain, **cross-vendor assistant mix**, **shadow-AI +
  governance-coverage-by-tool**, and **policy-conformance**. `--json` feeds the
  local UI, org dashboard, and trust portal. Full cross-vendor metric set is live
  (nothing faked/deferred).
- **Vendor model + signed vendor tag.** Run manifests carry a signed `vendor`
  field (claude-code | codex | gemini-cli); org dashboard aggregates a fleet
  assistant mix.
- **Universal signal adapters.** Normalize Claude OTel / Codex Compliance API /
  Gemini OTel into one fastpace record shape for cross-vendor provenance.
- **Local dashboard** gains a Governance posture panel (`/api/posture`).

## 0.47.0 — Consumer-credit/infosec frameworks + ERD security (F3.9, F3.10)

Completes the compliance-breadth track and adds design-time security analysis
to the PRD → ERD flow.

### Features

- **Framework catalog → 18.** Adds **FCRA / Reg V**, **SOX / ITGC**,
  **NIST SP 800-53 Rev 5**, and **NIST CSF 2.0**, each wired end-to-end
  (evidence schema, gap-analysis, readiness PDF, control mappings, dedup
  crosswalks). All built-in frameworks now derive from one registry
  (`compliance/frameworks.js`).

- **`fastpace threat-model <slug>`** (F3.9) — generates a STRIDE + LINDDUN
  threat model from an ERD's security section into
  `fastpace/threats/<slug>.md`. Negation-aware signal detection; flags STRIDE
  categories that apply but lack a mitigation as open gaps. Team+ tier.

- **`fastpace compliance check-erd <slug>`** — checks an ERD's security design
  against the framework(s) the PRD declares (or `--framework`), reporting
  addressed vs. open mapped controls. Writes `fastpace/compliance/erd-<slug>.md`.

- **`fastpace compliance monitor-erd`** — surveys every ERD for threat-model /
  compliance-check freshness (missing, stale, or open-gap artifacts).

- **`fastpace compliance drift`** (F3.10) — continuous compliance-drift monitor
  rolling up five thresholded signals (audit-chain coverage, correction-rate
  spike, evidence-snapshot freshness, ADR coverage, ERD security posture) into
  one ok/warn/alert report, persisted + audit-signed. Thresholds tunable via
  `--window` / `--coverage-floor` / `--evidence-max-age`.

- **Risk register** now ingests open STRIDE gaps from generated threat models
  as `threat_model_gap` entries.

- **Dashboard:** new **Compliance / ERD security** view — per-ERD threat-model
  + compliance status with the rendered reports and run / re-run buttons.

- **`/fp-prd-to-erd` skill** runs the threat model + compliance check
  automatically after writing an ERD and folds open items back into the design.

## 0.46.0 — Financial-services + privacy frameworks

### Features

- Built-in support for **CCPA/CPRA**, **GLBA** (Safeguards Rule), and
  **ECOA / Reg B**, plus completion of the previously half-wired **FedRAMP-M**,
  **DORA**, **NIST AI 600-1**, and **PCI DSS** into the evidence pipeline.
- The `/compliance-report` web form offers the full framework set.

## 0.40.0 — Ship layer table-stakes (Wave 5c.A)

First release of the v0.40 → v0.45 lifecycle-deepening track described in
[wave-5-plan.md](../../wave-5-plan.md). Targets the **thinnest layer of the
four** — release → deploy → post-deploy — and ships 5 features that turn
"fastpace stops paying attention at `main`" into a first-class signed
release surface.

### Features

- **`fastpace release-notes`** — synthesize release notes from
  commits + manifests + linked Linear/Jira tickets. Groups by
  conventional-commit prefix (feat / fix / security / breaking /
  internal). `--since <tag>|<date>`, `--out FILE`, `--append FILE`.
  Team+ tier.

- **`fastpace release track`** — what's in `main` but not yet
  tagged, risk-ranked by lines × age × AI-attribution. Surfaces
  release-train cadence (avg days between tags) + overdue signal.
  Team+ tier.

- **`fastpace release link <tag> --fixes <bugged-tag>`** + **`release graph`** —
  declare hot-fix relationships across releases. State at
  `fastpace/releases/graph.json` (committable). Team+ tier.

- **`fastpace deploy record --tag <t> --env <e>`** — signed deploy
  attestation written to `fastpace/deploys/<id>.json` AND appended to
  the audit chain as a `deploy.recorded` event. Hash-linked to the
  previous audit entry. Team+ tier.

- **`fastpace deploy list / show <id>`** — query recent deploys.

- **`fastpace retro`** — release/sprint retrospective markdown
  generator. Composes commits + AI-attributed sessions + recent
  learnings + hook-blocks resolved + postmortems + AI cost. Window
  via `--release <tag>` / `--sprint <id>` / `--since <date>`.
  Team+ tier.

### Audit-chain extension

The audit log now carries a new `deploy.recorded` event type alongside
existing hook events. `fastpace verify` walks the chain through deploy
events identically to hook events — backward-compatible (legacy chains
without deploy events still verify cleanly).

### Dashboard

- New **Releases** tab in `fastpace ui` (Metrics group): release-train
  cadence, recent deploys, retro shortcuts.
- New `GET /api/org/releases` endpoint on the org dashboard for
  fleet-wide release cadence + rollback-rate rollups.

### Deferred to v0.41.0 (sub-wave 5c.B)

The Platform+ ship-layer differentiators — `deploy verify` (post-deploy
metrics validation), `canary watch`, `rollback assess`, customer-facing
changelog, release-window enforcement — ship in v0.41.0 alongside the
metrics-source connector (Datadog / Prometheus / Sentry adapters). Per
[exec-plans/metrics-source-connector-prep.md](../../exec-plans/metrics-source-connector-prep.md).

## 0.36.0 — Wave 4: the long-tail (23 new commands)

Closes out the team-tier-platform-in-a-box.md plan. Wave 4 ships the 23
long-tail features deferred from v0.35.0. Tier split:

**Team+ (7 commands, broadly useful per-repo additions):**

- `fastpace coverage` — intersects fastpace/manifests/*.json with lcov.info to
  surface AI-touched files without tests. `--since`, `--json`, `--lcov <path>`.
- `fastpace bisect` — git bisect that knows which commits are AI-touched.
  `start <good> <bad> | suspects | manifest <sha> | end`. Hands the resulting
  "first bad commit" to its run-manifest in one report.
- `fastpace diagram` — auto-generated architecture diagram (Mermaid default,
  excalidraw available). Reads package.json workspaces, top-level dirs, and ADRs.
- `fastpace new <template> <dir>` — scaffold a new repo from a bundled or
  per-repo template. Substitutes {{repo}} in file contents.
- `fastpace ide-sync` — distributes the AI-relevant slice of IDE config
  (.vscode/settings.json AI keys, .editorconfig, .gitattributes, Cursor rules)
  from the same baseline as `fastpace sync config`. `check | apply`.
- `fastpace decision` — lightweight team-decision log (distinct from formal
  ADRs). `capture "<title>" | list | search <q> | show <slug>`.
- `fastpace branch-protection` — cross-repo branch-rule sync via GitHub REST
  API. Reads .fastpace/branch-protection.yaml. `check | apply | show`.

**Platform+ (8 commands, team / human-signal surface):**

- `fastpace handoff prepare <author>` — departing-dev knowledge bundle. Commits,
  manifests, ADRs, decisions, learnings, ownership %. `--out`, `--tarball`.
- `fastpace bus-factor` — knowledge concentration per area. Smallest authors
  set covering 80% of recent commits. Bus-factor=1 flagged as risk.
- `fastpace recognition weekly` — appreciation digest derived from hook-block
  resolutions, recent shippers, new learnings. `--slack` outputs the post.
- `fastpace burnout-check` — **OPT-IN per-dev** anti-burnout nudge.
  Manager-private; never goes to org dashboard. `--enable | --opt-out | --status`.
  Default OFF; ships with surveillance-conscious framing per the strategy doc.
- `fastpace pair <teammate>` — borrow another teammate's pattern profile
  (commit prefixes, files-touched, recent shipping). `--inject` writes to
  .fastpace/pair-context.md so the next /fp-* skill picks it up.
- `fastpace pr-queue` — open PRs ranked by reviewer-attention ROI (size + age +
  AI-label boost). Uses gh CLI when available; falls back to GITHUB_TOKEN.
- `fastpace escalate <path>` — route to the right human. Reads CODEOWNERS +
  recent authorship. `--slack | --ticket` integrate with existing connectors.
- `fastpace mob` — mob-programming session recorder. `start <name> | join |
  status | end`. Writes summary markdown on `end`.

**Platform+ (8 commands, AI infra / observability):**

- `fastpace lock-in` — AI vendor concentration score (Herfindahl-Hirschman
  scaled 0-100). 0=multi-vendor, 100=single. >60 flagged as risk.
- `fastpace heatmap` — AI-usage heat map across the codebase. AI lines vs human
  lines vs AI share % per top-level directory. `--since | --depth | --json`.
- `fastpace redteam-fleet` — extends the per-repo redteam to a fleet rollup.
  Iterates .fastpace/org-repos.json; aggregates findings. `run | report`.
- `fastpace price-watch` — model-price-change watcher. Diffs assets/
  model-prices.json against a snapshot. `--impact` multiplies by current usage.
- `fastpace model-route` — multi-tier model routing policy
  (fastpace.model-route.yaml). Advisory today; real enforcement when the model
  gateway lands. `init | show | check`.
- `fastpace key-vault` — BYOK key registry. Stores fingerprint + env-var name
  (never the raw key). `set --from-env $VAR | rotate | list | unset`.
- `fastpace local-model` — local fallback policy (Ollama-shaped) at
  fastpace.local-model.yaml. `init | show | status`. Advisory; gateway-dep for
  auto-routing.
- `fastpace token-budget` — monthly per-dev / per-team token caps at
  fastpace.token-budget.yaml. `set --scope team|user --tokens N | show |
  check`. Warnings via cost dashboard; real enforcement needs gateway.

### Gateway-dependent items — what ships today

Four commands (`model-route`, `key-vault`, `local-model`, `token-budget`) ship
their **config surfaces** in v0.36.0. Hooks and the cost dashboard surface
warnings against the configured policies. Real call-time enforcement requires
the model gateway, which remains parked until 2027 per the strategy doc.
This way orgs can adopt the config conventions now and the enforcement layer
turns on without policy migration when the gateway lands.

### Help + dispatcher

All 23 new commands wired into `src/cli.js` and grouped into three new
sections in `src/commands/help.js`:
- "Wave-4 — Team+ long-tail"
- "Wave-4 — Platform+ collaboration"
- "Wave-4 — Platform+ AI infra / observability"

### Platform-team metrics — local UI tab + org dashboard rollup

New `src/ui/platform-metrics.js` aggregates the Wave-4 measurables into a
single rollup served at `GET /api/platform-metrics` and rendered as a new
dashboard tab at **Metrics / Platform team (Wave 4)**:

- Bus factor — smallest authors set covering 80% of recent commits
- AI share % — per top-level directory
- Vendor lock-in — Herfindahl 0–100 on model + vendor
- Coverage gap — manifest-touched files without lcov coverage
- Token-budget % — vs `fastpace.token-budget.yaml` cap
- Redteam findings — count + last-run timestamp
- Drift configured — yes/no per repo

Every install (≥ 0.36.0) ships this rollup to the org dashboard via the
existing audit-replication shipper. The new `GET /api/org/platform-metrics`
endpoint surfaces a fleet rollup (bus-factor distribution, vendor
concentration, coverage gap sum, redteam findings, token-budget breaches)
which renders as a new section on the org dashboard's Overview view. Repos
on pre-v0.36.0 are excluded from each metric's denominator so legacy
fleets don't drag the rollup.

### Operator surface — tier-mapping.json moved into source

`/etc/fastpace/tier-mapping.json` is no longer operator-managed-only.
Source of truth is now `packages/license-service/config/tier-mapping.json`
in the repo. `scripts/deploy.sh` syncs it to `/etc/fastpace/tier-mapping.json`
on the VM (`root:fastpace-svc 0640`) on every `api` deploy. The file
contains Stripe **price IDs only** (not secrets — those still live in
`/etc/fastpace/stripe-api.key.*` under operator control). Now-source-
controlled entries: `default`, `price_team_monthly`, `price_team_annual`,
`price_platform_monthly`, `price_platform_annual`, `price_platform_viewer`,
`price_platform_trial`, `price_enterprise`.

### Pricing page — 4-column overflow fix

`packages/website/src/pages/pricing.astro` `.pricing-grid` now uses
`repeat(4, minmax(0, 1fr))` + `min-width: 0` on grid items, and the
2-column breakpoint lifts from 1280 → 1500px so the 4-card layout only
renders when there is actually room. Fixes the cards-overflowing-the-
viewport issue at 1280–1500px reported after the v0.35.0 rebrand.

### Platform-team index — Wave 4 sections + metrics card grid

`/platform-team/` page gets three new skill groups (Wave 4 Team+ long-tail,
Wave 4 Platform+ collaboration, Wave 4 Platform+ AI infra) and a new
"Wave 4 metrics" section with 10 metric cards: each names what the metric
measures, which command produces it, and why a platform team cares. Goes
right after the differentiators grid.

## 0.35.0 — Team-tier rebrand: "platform team in a box"

Reframes Team-tier from a feature-list ("Community + dashboard + compliance push")
to buyer-pain framing ("the platform team your AI-coding surface needs — without
the headcount"). Adds a new **Platform** tier between Team and Enterprise to hold
the differentiators. See [team-tier-platform-in-a-box.md](../../team-tier-platform-in-a-box.md).

### New tier ladder

- **Community** — free, source-available (ELv2). Unchanged.
- **Team** — $29/editor-seat/mo annual. Now includes the four Wave-1 primitives.
- **Platform** *(NEW)* — $99/editor-seat/mo annual. The differentiators a real
  platform team would build but never have time to.
- **Enterprise** — from $99/seat or $25K/yr floor. Unchanged.

### Wave 1 — Team-tier primitives (shipped)

- `fastpace sync config` — pulls an org-blessed `.claude/` baseline (hooks,
  skills, agents, settings.json) into every repo. Source can be a git URL or
  a local path. Atomic diff + apply. Preserves per-repo `fastpace/` directory.
  Shares the `sync` command name with the existing Jira/Linear sync (Wave-1
  uses the `config` subcommand to disambiguate; legacy behavior intact).
- `fastpace welcome` — onboarding agent. Runs discovery if needed, prints a
  personalized 2-minute walkthrough, writes a cheat-sheet to
  `~/.fastpace/welcome-<repo>.md`. Companion skill `/fp-welcome` takes over
  when Claude is in the seat.
- **Cost dashboard** — `src/cost.js` aggregates manifest token counts × per-model
  prices (`assets/model-prices.json`). `fastpace cost report` /
  `fastpace cost forecast` for CLI; the existing F2.15 ROI dashboard tab
  surfaces the same data in the UI. Placeholder dataset when no real
  manifests have been collected.
- `fastpace.policy.yaml` + `fastpace policy {init,validate,show}` —
  team-weight policy primitive. Schema: `allowed_models`,
  `allowed_mcp_servers`, `max_prompt_tokens`, `blocked_paths`,
  `agent_scope_caps`, `fail_mode` (open|closed). Hooks
  (`agent-scope-guard`, `mcp-scope-mediator`, `prompt-redactor`) read the
  file at runtime; absent file → existing behavior (no break). Coexists
  with the F2.11 signed-bundle policy on the same `fastpace policy`
  command.

### Wave 2 — Platform-tier differentiators (working scaffolds)

- `fastpace standup` (Team+) — Monday digest from manifests + git: shipped
  commits, hook-block summary, AI-cost summary, top files touched. Output
  modes: stdout, `--out <file>`, `--slack`.
- `fastpace dora` — DORA metrics (deploy frequency, lead time, change failure
  rate, MTTR) sliced AI-assisted vs human-only. New `tagAIAssisted` helper in
  `src/ui/dora.js` is the AI/human classifier (commit-trailer signals).
- `fastpace ask` + `/fp-ask` skill — cross-repo Q&A over the org-synced
  context set.
- `fastpace refactor plan / execute` + `cross-repo-refactor` agent —
  org-wide refactor planning grounded in the sync baseline.
- `fastpace learnings-sync push / pull / status` — team-aggregated learnings
  push/pull on top of `/fp-extract-learnings`.
- Slack integration — `fastpace integrate slack --webhook <url>` and the
  `src/integrations/slack-webhook.js` poster (Team+).
- Linear integration deeper wiring (Platform+) — `/fp-write-prd` opens
  Linear issues directly.

### Wave 3 — Platform-tier differentiators (working scaffolds)

- `fastpace mcp registry list / show / install / add` — org-blessed MCP
  server registry with 10 starter entries (filesystem, git, github, postgres,
  slack, linear, sentry, jira, confluence, fetch). Two-tier load order:
  bundled defaults shadowed by per-repo overrides at
  `.fastpace/mcp-registry.json`.
- `fastpace incident replay <range> | --since <date> | --file <path>` —
  chronological replay of AI sessions from manifest receipts. `--json` for
  machine consumption (feeds postmortem + dashboard).
- `fastpace postmortem draft --incident <id> [--since/--until]` — markdown
  postmortem from commits + manifests + audit-log hook-block patterns.
- `fastpace drift check / report / fix` — measures `.claude/` delta vs the
  org baseline configured by `sync config`. Reports missing / changed /
  extra files; `fix` delegates to sync.
- `fastpace prompts list / show / use / add` — shared prompt library.
  7 bundled starters (code review, debug, refactor, API design, migration,
  test discipline, security review); `.fastpace/prompts/` for local
  additions. Frontmatter-driven.

### Tier-gating

- New `src/tier.js` helper with `requireTeam()` / `requirePlatform()` —
  every gated command bounces unlicensed callers with an upgrade message
  pointing to `fastpace.net/pricing` and `fastpace activate <key>`.
- License schema extended to support `tier: platform`. license-service
  Stripe webhooks updated to issue Platform-tier keys (new SKU + price
  ID slot).

### Documentation

- README — 4-tier table, buyer-pain framing for Team, new Platform section.
- ONBOARDING — four-tier ladder section + Platform walkthrough +
  rebrand-readiness checklist.
- `LITE-VS-PRO-PLAN.md` → renamed to `LITE-VS-TEAM-PLATFORM-PLAN.md`
  capturing the four-tier split (preserves history via `git mv`).
- LAUNCH-CHECKLIST — Platform-tier license issuance steps.
- New strategy doc: `team-tier-platform-in-a-box.md` (positioning bet,
  feature catalog, sequencing).
- New sales assets: `demo-script-ciso-vpe.md`, cold-outbound template,
  opening deck slide.

### Public site (parallel)

Marketing site updates land on the same release. Homepage hero rewritten
around the positioning sentence; pricing page restructured to 4 tiers
with the four-primitives table for Team and the differentiators table
for Platform. Launch essay at `/blog/platform-team-in-a-box`.

### Not in this release

- **Model gateway / proxy** — deferred per founder decision. Will revisit
  in 2027 after the rebrand has run for two quarters.
- Wave 4 long-tail (test gap detector, `fastpace bisect`, architecture
  diagrams, departing-dev knowledge handoff, etc.) — see
  `team-tier-platform-in-a-box.md` for the full deferred list.

## Unreleased — pre-launch hardening + dual-edition GTM

Five-pass batch executed 2026-05-08 → 2026-05-09 on the path to v0.45 launch.
Bumps will fold these into 0.35.0 / 0.36.0 once the operator runbook (Phase A–P
in [LAUNCH-CHECKLIST.md](../../LAUNCH-CHECKLIST.md)) is exercised end-to-end.

### Licensing posture

- **License switched from MIT to Elastic License 2.0** (SPDX `Elastic-2.0`).
  Permanent source-available. Free for all internal use, education,
  research; permanently prohibits managed-service offerings and
  license-key circumvention. No time-based conversion. Owner of record:
  "fastpace, a division of stanfis, llc." Trademarks held by stanfis, llc.
  Full text: [LICENSE](../../LICENSE) and [NOTICE](../../NOTICE).
- Considered FSL-1.1-Apache-2.0 (Functional Source License with 2-year
  Apache 2.0 conversion) and rejected after pressure-testing — the
  active "no competing use" clause is the moat, the time-bomb adds
  nothing for our threat model. ELv2's two narrow restrictions match
  what we actually want to prevent.

### Access-token system

- **First server-side enforcement layer beyond the local license-file
  check.** Pro-tier surfaces (today: org-dashboard read endpoints) gate
  behind a short-lived bearer token issued by the licensing service.
  Same Ed25519 issuer key as licenses, base64-wrapped to fit
  Authorization headers, verified offline against the bundled pubkey so
  air-gapped installs and license-service outages don't break customer
  dashboards.
- New CLI command `fastpace token [show | refresh | path]` with cache
  at `~/.fastpace/access-token.json` (mode 0600). `fastpace activate`
  and `fastpace license refresh` both also fetch a token (best-effort,
  never fails the parent command).
- license-service: `POST /license/access-token` mints; `marketing_events`
  / `access_token_mint` audit-logged.
- org-dashboard: bearer-auth middleware on the 7 read endpoints
  (`rollup`, `installs`, `baselines`, `maturity`, `seats`, `roi`,
  `summary`). Gated by `FASTPACE_ORG_REQUIRE_TOKEN=on`; default off
  for v0.34 → v0.45 grace, flips at v0.45 alongside `ENFORCE_PRO_GATE`.
  Same-origin browser calls (the bundled web UI) bypass — option (c)
  carve-out from the rollout plan.
- TTL: 7 days online; 365 days for licenses with the `airgap` feature.
- 17-test access-token suite added at
  [packages/fp/test/access-token.test.js](test/access-token.test.js)
  covering verify happy/sad paths, signature spoofing, expiry, schema
  rejection, cache round-trip, and the full org-dashboard gate.

### npm scope rename

- **`@fastpace/*` → `@fastpace-ai/*`** across the workspace. Aligns the
  npm scope with the GitHub org (`fastpace-ai/fastpace`). Pre-launch —
  no published packages on npm under the old scope, so no redirect or
  deprecation shim. 194 replacements across 69 files via a guarded
  regex (preserves email addresses + the `@fastpace_version` SQL bind
  param in license-service/db.js).
- Customer install command is now `npm install -g @fastpace-ai/fp`.
  CLI invocation names (`fastpace`, `fp`, `fastpace-org`) unchanged.

### Dual-edition marketing site

- **Bifurcates fastpace.net into two parallel editions** targeting two
  distinct buyer demographics. Same npm package, same binary, same
  brand — different positioning, different pricing anchors, different
  funnels.
  - **Trust edition** (default, root paths): CISOs / GRC / compliance
    buyers. Comp set: Drata / Vanta / Wiz / Snyk. Tiers: Community /
    Pro / **Compliance Edition** / Enterprise.
  - **Build edition** (paths under `/build/...`): VPs Eng / dev velocity
    buyers. Comp set: Cursor / Copilot / Cody / Cline. Tiers: Personal /
    Team / Org / Enterprise. Anchors at $19/seat against Cursor Pro.
- New trust-edition tier `Compliance Edition` between Pro and Enterprise.
  CTA "Book a 30-min briefing" (sales-led, not self-serve). MSA + DPA,
  audit-grade SLA, evidence-request flow, framework mappings pre-included,
  named CSM. Bridges the previous "$29/seat → custom" cliff that anchored
  fastpace below the compliance-tool comp set.
- New build-edition pages (six): `/build/`, `/build/pricing`,
  `/build/how-it-works`, `/build/agents`, `/build/skills`,
  `/build/integrations`.
- **`<EditionToggle />`** footer component flips visitors between editions.
  Resolver in [packages/website/src/data/editions.ts](../website/src/data/editions.ts).
  17-test suite for the resolver at
  [editions.test.cjs](../website/src/data/editions.test.cjs).
- **First-party A/B analytics — no cookies, no third-party domain.**
  `<MarketingBeacon />` posts page_view + cta_click + edition_toggle
  events to `api.fastpace.net/events/marketing`. `<noscript>` fallback
  via 1×1 transparent GIF endpoint at `/events/marketing/pixel.gif` so
  JS-disabled visitors still register page_views. IPs hashed + truncated
  to /24 (IPv4) or /48 (IPv6) for de-dup only — no PII stored.
- **New owner dashboard at `admin.fastpace.net/marketing`.** Window
  selector (7d / 30d / 90d / all). Stat cards for trust vs. build page
  views and ~unique visitors. Daily trend mini-chart. Top pages, top
  CTAs side-by-side per edition. Edition-toggle direction (asymmetry =
  the actionable signal).
- 25+ existing trust-edition CTAs instrumented with `data-fastpace-cta`
  attributes (Hero, CTA, pricing-tier cards, pricing-bottom buttons).
  Build-edition CTAs all instrumented at creation.
- New `Talk to sales` top-nav link on Base.astro, sandwiched between
  the existing dropdowns and the Test-drive CTA. Anchors the "talk to
  a human" path for compliance buyers who don't self-serve.

### Pricing surface fixes

- **First 5 seats free, _forever_** (was: 30-day trial). Removes the
  trial-gate gimmick. Devs can champion fastpace into their team
  without an approval cycle.
- **Auditors free, unlimited seats.** Practicing audit firms (Big 4,
  boutique, internal-audit functions) get pro free with no seat cap.
  Channel play — auditors recommend tools to clients.
- **OSS maintainers + educators free** retained. Now a peer of the
  auditor program, not the only "free for X" track.
- Pricing grid went 3-col → 4-col with 2x2 breakpoint at 1080px to fit
  the new Compliance Edition tier without crowding the layout.

### Documentation

- New ONBOARDING §3 "Licensing & access-token architecture" — canonical
  internal explainer of the two-layer model (legal + technical),
  alternatives considered, end-to-end mermaid sequence diagram,
  rollout-flag mechanics, what the layer does NOT defend against.
- ONBOARDING §5 codebase tour rewritten for the dual-edition site
  structure.
- ONBOARDING glossary entries added: Access token,
  `FASTPACE_ORG_REQUIRE_TOKEN`, ELv2, stanfis llc.
- THREAT-MODEL.md gets a cross-cutting design-choice block on the
  bearer-token gate. F1.13 next-sprint entry updated to "shipped."
- LAUNCH-CHECKLIST.md: new N.5 (license refresh + token), N.5a
  (marketing event ingest smoke test), N.5b (access-token mint smoke
  test). Phase P split into P.1 / P.2 / P.3 to coordinate
  `ENFORCE_PRO_GATE` + `FASTPACE_ORG_REQUIRE_TOKEN` flips at v0.45.
  Day-2 ops monitoring section gets `/admin/marketing` pointers.
- Website pricing/eli5 + docs site (cli.astro, architecture.astro):
  ELv2 wording, new `Licensing` command tier (`activate`, `license`,
  `token`).

### Tests

- All 17 access-token tests pass (covers cross-license-service +
  org-dashboard middleware integration via in-process HTTP server).
- All 17 editions resolver tests pass.
- Full pre-existing CLI test suite still green (27 files).

## 0.34.0 — Resolves all 8 open roadmap questions (q1–q8) + Sprint 31 marketing pass

User direction: "let's go with your recommendation for all questions." Sprint 31
implements all 8 resolutions in a single coordinated marketing + code pass.

### Added (per-question)
- **q1 — Lethal-trifecta promoted to homepage.** New
  `LethalTrifectaTeaser.astro` between ByTheNumbers and Lifecycle:
  3-leg breakdown (private-data access · untrusted content · exfil channel)
  with the specific shipping primitive that breaks each leg, plus EchoLeak
  callout linking into `/compliance#echoleak-faq`. The full LethalTrifecta
  component stays on `/compliance` for the deeper buyer.
- **q2 — Cohort targets for CISO calls 02-04.** New "Cohort targets"
  section in `assets/docs/ciso-call-program.md`: call 02 = EU-based fintech
  / regulated healthtech (validates EU AI Act + procurement rigor), call
  03 = US federal civilian / defense (air-gapped + FedRAMP), call 04 =
  regulated retail / payments (PCI-DSS overlap). Hard rule: never run two
  calls in the same vertical.
- **q3 — Standing Block-4 procurement probe.** Block 4 (procurement
  reality) was unaddressed in call 01; now a standing block on every
  call. Three required questions: last enterprise security tool budget
  signed, who was on the buying committee, what closed the deal. Calibrates
  Tier 1 SSO/SCIM productization + pricing-tier gating to real budget
  patterns.
- **q4 — NIST AI RMF as primary framework.** Verified that
  `FrameworkMatrix` already leads with NIST in column order. Documented
  rationale: NIST AI RMF is the safe US-auditor default; ISO 42001 is
  the ISO-shop hedge; EU AI Act is mandatory for EU customers.
- **q5 — Dual-form Bedrock alias support.** New `aliasEquivalents()` +
  enhanced `matchesPattern()` in `src/runtimes.js`. Accepts both friendly
  (`bedrock-claude-opus-4.7`) and AWS canonical (`anthropic.claude-opus-4-7-v1:0`)
  forms in policy rules; either form satisfies the other. `bedrock-*`
  prefix rule honors canonical aliases via friendly equivalence. 4 new
  tests in `manifest.test.js` covering both directions + cross-model
  rejection.
- **q6 — Framework control-ID validation pass.** Downloaded the published
  framework PDFs (NIST AI RMF 1.0, NIST AI 600-1 GenAI Profile, EU AI Act
  Reg. 2024/1689) to `frameworks/`. Walked all 8 capability rows × 6
  frameworks = 48 cells. New `packages/website/src/data/validated-controls.json`
  is the single source of truth: each cell carries `verified: boolean` +
  `note` explaining the published-text match. **24 of 48 cells (50%)
  validated** against open-access published text on 2026-05-03. Corrected
  6 NIST AI RMF mappings that were wrong:
  - Discovery manifest: ~~MAP-1.1~~ → **GOVERN-1.6** (AI system inventory)
  - Agent identity & scope: ~~GOVERN-1.4~~ → **GOVERN-3.2** (roles & responsibilities for human-AI configs)
  - Hash-chained audit log: ~~MEASURE-2.7~~ → **MEASURE-3.1** (track existing/unanticipated/emergent risks)
  - Run manifest signing: ~~MEASURE-2.6~~ → **MEASURE-2.7** (system security & resilience documented)
  - Prompt redaction: ~~MAP-2.3~~ → **MEASURE-2.10** (privacy risk documented)
  - ADRs & decision ledger: ~~GOVERN-3.2~~ → **GOVERN-1.4** (risk-management process via transparent policies)
  - NHI inventory export: ~~MAP-1.1~~ → **GOVERN-1.6**
  Plus 5 EU AI Act corrections. ISO/IEC 42001 + SOC 2 + ISO 27001
  remain illustrative pending paid-standard purchase. `FrameworkMatrix`
  refactored to render verified cells with the green-check pill +
  unverified cells with a dim "•" placeholder + italic ID; the
  per-row disclaimer now scopes to unverified cells only and the
  table footer leads with **"20 / 48 cells (42%) validated against
  the published framework text."**
- **q7 — NHI integration-partner stance documented.** Capabilities
  section copy updated: "F1.5 · integration partner with Astrix /
  Oasis / Entro — emit standard inventory, never compete." The
  category bet is documented: fastpace wins at the developer-tool
  wedge, not the NHI consolidation wedge.
- **q8 — Tier hosting model documented in pricing page.** Each of the
  4 pricing tiers (OSS / Team / Business / Enterprise) now carries
  an explicit `Hosting` row: OSS = local-only, Team = hosted SaaS
  default + self-hosted on request, Business = self-hosted recommended
  + hosted available, Enterprise = self-hosted in your VPC + hosted
  optional with explicit data-residency commitment. Closes the "where
  does the dashboard run" question that procurement always asks.

### Changed
- `frameworks/` directory at the worktree root carries the validated
  reference PDFs. ~9 MB total; outside the npm package (so it doesn't
  bloat installs) but in the repo for re-validation.
- Bumped `@fastpace-ai/fp` to 0.34.0; CHANGELOG entry above; package.json bump.

### Caveats
- **q6 is partial.** 24 of 48 cells (ISO/IEC 42001 + SOC 2 + ISO 27001)
  remain illustrative pending paid-standard purchase. The validation
  pass is structured to absorb those cells one-by-one as the standards
  arrive — flip `verified: false` → `verified: true` in
  `src/data/validated-controls.json` and the matrix updates without a
  code change. `frameworks/iso-42001-guide-checklist-3rd-party.pdf` and
  `frameworks/soc2-checklist-3rd-party.pdf` are third-party summaries;
  they're useful for context but don't substitute for the standard text.
- **q5 alias mapping is a hard-coded list.** Adding a new model adds
  one line to `ALIAS_PAIRS`; we don't fuzz-match across forms.

## 0.33.0 — Bitbucket fetcher + standalone org-dashboard webhook producers (F3.10) + production-domain switch

Domain switch: every public surface now points at **fastpace.net**
(production) instead of fastpace.dev. Plus two §3b items finish the
producer-side wiring across the multi-package estate.

Two §3b items finish the producer-side wiring across the multi-package
estate. Both are deferred-by-design caveats from earlier sprints that
graduate to "shipped" here.

### Added
- **F4.7 — Bitbucket fetcher** in `src/commands/reviews.js`. New
  `--provider bitbucket --repo <workspace/repo-slug>` mode talks to the
  Bitbucket Cloud REST API directly via `curl` (no bundled CLI exists for
  Bitbucket the way `gh` and `glab` do). Auth via
  `BITBUCKET_USER` + `BITBUCKET_APP_PASSWORD` env vars (PR:read scope —
  generate at https://bitbucket.org/account/settings/app-passwords/).
  Walks per-PR commit messages for AI-attribution trailers, same shape
  as the GitHub + GitLab fetchers; cache schema unchanged. With this,
  three of the four major code hosts ship out-of-the-box; Azure DevOps
  orgs continue to populate `fastpace/reviews/cache.json` from their own
  workflow.
- **F3.10 — fleet webhook producer in standalone org-dashboard.** New
  `fireFleetWebhooks()` in `packages/org-dashboard/src/server.js` fans
  out fleet-level events to the comma-separated `FLEET_WEBHOOK_URLS`
  endpoint list whenever an ingest crosses an alerting threshold:
  - `fleet.install.first_seen` — install_id never ingested before (excludes
    the very first install on a fresh deploy)
  - `fleet.audit.broken` — any install reports `chain_intact: false`
  - `fleet.maturity.dropped` — fleet aggregate dropped ≥ 5 pts since the
    last computed value
  Fire-and-forget delivery via background `setImmediate` — never blocks
  the ingest response on network behavior. Each event POSTs JSON with
  `x-fastpace-event` header for routing. Closes the §3b deferred
  "F3.10 webhook producers from the standalone server" follow-up.

### Changed
- `fastpace reviews fetch --provider bitbucket` now valid alongside
  `github` and `gitlab`. Help text updated.
- Bumped `@fastpace-ai/fp` to 0.33.0; CHANGELOG entry above; package.json bump.

### Changed (Sprint 30 cont.)
- **Domain switch — fastpace.dev → fastpace.net** across all 28 affected
  files in `packages/website/src/`, `packages/trust-portal/src/`,
  `packages/docs/src/`, and `packages/fp/assets/docs/`. Includes
  canonical URLs, OG tags, sub-processor list, status-page email links,
  trust-portal demo URLs, marketing-site nav links, and the live trust
  portal CTA. Zero `fastpace.dev` references remain in the public surfaces.

### Caveats
- **Bitbucket fetcher requires app password env vars.** Same zero-runtime-
  dep discipline as the gh/glab wrappers. On the github + gitlab side the
  user logs in once via `gh auth login` / `glab auth login`; on bitbucket
  they set the env vars per-shell or per-CI-job.
- **Fleet webhook producer state is in-process.** Restarting the standalone
  server resets `_fleetState.knownInstalls` and `lastFleetAggregate`, so
  the first ingest after a restart may re-fire `fleet.install.first_seen`
  for installs the persistent store already has. A persistent state file
  is a §3b follow-up; documented but deferred.
- **No Azure DevOps fetcher bundled.** Same documented "populate the cache
  yourself from CI" path as before. The cache schema is provider-agnostic
  by design.
- **DNS still needs to point fastpace.net at the same hosting target.**
  This sprint only updates the source code; the actual fastpace.net DNS
  configuration (apex + trust subdomain + docs subdomain) is a deploy
  task, not a code task.

## 0.32.0 — F2.5 evidence-request tracker + §3b polish (Welford merge, history rotation, GitLab fetcher)

Closes the F2.5 customer-facing trust portal in a way that respects the
q8 hosting-decision boundary: fastpace ships the request-tracking system
and the public status-lookup page; the org decides where to host the
public index. Plus three §3b light follow-ups graduate from the deferred
list.

### Added
- **F2.5 — evidence-request tracker** at `src/evidence-requests.js` +
  `src/commands/evidence.js`. Local CLI manages the request lifecycle:
  - `fastpace evidence open --artifact <kind> --org X --email Y [--public]`
    issues a signed request ID (format `ER-XXXXXXXX`) + queue entry.
  - `fastpace evidence list [--status requested|triaged|in_progress|fulfilled|declined]`
    lists requests; `show <id>` prints full detail; `transition <id>
    --status <new>` advances the state machine and re-signs.
  - `fastpace evidence public-index` renders the consent-gated JSON the
    org publishes to `trust.fastpace.dev/data/evidence-index.json`.
  Records carry an F0.1-signed `entry_hash` + `signature`; transitions
  re-sign with the new state. PII (email, reason, requester role) is
  stripped from the public view via `publicStatus()`.
- **Trust portal `/status`** at `packages/trust-portal/src/pages/status.astro`.
  Static page; reads `src/data/evidence-index.json` at build time and
  inlines it for client-side ID lookup. Visitor pastes an
  `ER-XXXXXXXX` ID (or arrives via `?id=`); page renders status headline,
  request card, timeline, and a "verify the signed envelope" callout
  pointing at `fastpace evidence show <id>`. Three demo IDs seeded for
  the live demo: ER-DEMO0001 (fulfilled), ER-DEMO0002 (in progress),
  ER-DEMO0003 (triaged).
- **§3b — Welford fleet baseline merge** in `src/circuit-breaker.js`.
  Replaces the old "weighted mean of means + max stddev across repos"
  approach with a proper parallel-variance merge (Chan et al., 1979).
  Two-population delta term included so combined sample-stddev is exact,
  not approximate. Outlier-heavy fleets no longer hide tighter repos
  behind the loosest one. New helpers: `welfordMerge`, `fieldToWelford`,
  `welfordToField`. Aggregated baseline carries `merge_strategy: 'welford'`.
- **§3b — history.jsonl rotation.** `src/maturity-export.js` keeps at most
  `HISTORY_MAX_SAMPLES` (1000) entries with hysteresis at `HISTORY_ROTATE_AT`
  (1100): rotation only fires when crossing the high-water mark, then
  trims to the low-water. Cheap byte-size pre-check skips the line walk
  for the common case (file well under high-water).
- **§3b — F4.7 GitLab fetcher** in `src/commands/reviews.js`. Adds
  `--provider gitlab --repo <project-path>` mode that shells out to
  `glab` (`glab mr list` + `glab api .../merge_requests/<iid>/approvals`
  + `.../notes`). Walks per-MR commit messages for AI-attribution
  trailers same way the GitHub fetcher does. Cache schema unchanged —
  identical shape, just a different `provider` field.
- **`packages/fp/test/sprint29.test.js`** — 9 module checks: F2.5
  open/list/show/transition lifecycle, status filtering, PII-stripping in
  publicStatus, unknown-status throw; history rotation hysteresis +
  under-high-water no-op; Welford pair-merge math + integration in
  `aggregateFleetBaselines`.

### Changed
- `fastpace help` lists `evidence` after `reviews`.
- Bumped `@fastpace-ai/fp` to 0.32.0; CHANGELOG entry above; package.json bump.

### Caveats
- **F2.5 is local-tracker + static-status-page, not customer-auth.**
  Per q8, fastpace doesn't host customer login. The org publishes the
  consent-gated index from their own install (`fastpace evidence
  public-index > .../trust-portal/src/data/evidence-index.json`) and
  redeploys. Per-customer authenticated downloads (SOC 2 reports gated
  by NDA acceptance + identity verification) are still a hosting decision.
- **§3b GitLab fetcher requires `glab` on PATH.** Same zero-runtime-dep
  discipline as the gh wrapper; orgs without `glab` populate
  `fastpace/reviews/cache.json` directly from their CI.
- **§3b Welford merge changes the value of merged-fleet stddev.** Orgs
  whose circuit-breaker thresholds were tuned against the old "max
  stddev" output may see a slightly different divergence rate. The new
  numbers are statistically correct; the old ones were pessimistic in
  a way that masked outliers. Re-baseline in production deploys before
  loosening any divergence factors.

## 0.31.0 — Tier-4 infra: F4.10 scheduler + F4.11 SSE + F4.13 signed export + F4.14 score-pause

The four remaining Tier-4 items ship together — the maturity dashboard
goes from "fresh on every read" to "live by default", with a signed export
bundle suitable for board decks / Drata-Vanta evidence push and a
score-pause-guarantee status surface for the billing wiring.

### Added
- **F4.10 — per-metric refresh-cadence scheduler** at
  `src/maturity-scheduler.js`. Background timer recomputes the maturity
  aggregate on a configurable cadence (default 60s, override via
  `fastpace.config.yaml > maturity.refresh_seconds`, per-sub-score override
  via `maturity.per_metric_seconds.<id>`). Fires registered onChange
  listeners whenever the aggregate or measured-weight moves. Auto-starts
  with the local UI server; idempotent stop+start; clamped to a 5-second
  minimum interval. New `GET /api/maturity/scheduler` endpoint exposes
  status (running, interval, started_at).
- **F4.11 — SSE stream for live maturity** at `GET /api/maturity/stream`.
  Standard `text/event-stream` with `event: maturity` payloads. Boots with
  the current cached aggregate so reconnects don't see an empty UI; pings
  every 25s to keep proxies happy; cleans up subscribers on socket close.
  Local UI MaturityView wires an `EventSource` and live-updates the
  headline number + bar without a refresh; "live · SSE connected" pill at
  the top of the view shows connection state and flips to "live ·
  reconnecting" on disconnect.
- **F4.13 — signed maturity export bundle** at `src/maturity-export.js`.
  `fastpace maturity export` writes a directory at
  `fastpace/maturity/exports/<iso>-<short>/` containing:
  `manifest.json` (F0.1-signed envelope with per-file sha256 digests),
  `maturity.json` (the full aggregate report Drata/Vanta accept verbatim),
  `summary.md` (board-deck-ready Markdown with the sub-score table + 30-day
  trend), `trend.json` (last 30 sample aggregates from history.jsonl).
  `fastpace maturity verify-export <bundle-dir>` re-verifies entry_hash +
  per-file digests + signature offline (no fastpace install needed). New
  CLI surfaces: `export`, `verify-export`, `list-exports`. UI server now
  appends to `fastpace/maturity/history.jsonl` on every scheduler tick so
  trend data accumulates without explicit user action.
- **F4.14 — score-pause guarantee surface** via
  `fastpace maturity pause-status [--json]`. Reads history.jsonl, computes
  current vs. month-ago delta, and reports OK or PAUSE. Pause threshold
  is -10 pts month-over-month (the user-facing guarantee). The actual
  billing wiring lives outside fastpace — this command is the readable
  status surface the org's billing layer queries.
- **`packages/fp/test/maturity-infra.test.js`** — 12 new tests across
  the four modules: scheduler config-loader edge cases (defaults,
  YAML parsing, minimum-interval clamp), start/stop lifecycle idempotency,
  export bundle build + verify round-trip, tampered-file detection,
  tampered-manifest detection, listExports enumeration, history append
  + load round-trip, score-pause math, and a real-server SSE round-trip
  asserting the first frame carries `event: maturity` + `aggregate`.
- **Sandbox** at `/sandbox` gains `fastpace reviews show` and
  `fastpace maturity export` transcripts. The dispatcher now supports
  sub-sub-commands (e.g. `maturity export` → its own transcript) via a
  compound key lookup. Two new sidebar entries; tab-complete + history
  pick them up automatically.

### Changed
- UI server (`src/ui/server.js`) starts the maturity scheduler at boot
  with an onChange handler that fans out to every SSE subscriber and
  also appends to history.jsonl (so the F4.13 export carries trend data
  without a separate write step).
- Bumped `@fastpace-ai/fp` to 0.31.0; CHANGELOG entry above; package.json bump.

### Caveats
- **F4.11 SSE is single-process.** Subscribers are tracked on the
  scheduler module's `_subs` array. Multi-instance deploys (org-dashboard
  fan-out across N nodes) need a real pub/sub layer — not in scope for
  the local UI server, but documented as a follow-up if the standalone
  org-dashboard ever exposes SSE itself.
- **F4.13 history.jsonl is unbounded.** Each scheduler tick appends one
  line (~80 bytes). At the 60s default that's ~115 KB/day — fine for
  most repos. A rotation step (keep last 1000 samples) is a §3b light
  follow-up.
- **F4.14 score-pause is read-only.** Fastpace never charges; the
  pause-status surface is what the org's billing wiring reads to decide
  whether to pause seat charges. We deliberately don't implement the
  billing side — it lives outside the trust harness.

## 0.30.0 — Tier-4 sub-scores graduate from stub to measured + Stanfis attribution

The five Tier-4 sub-scores that shipped as stubs in v0.28.0 are now real
measured surfaces. The maturity scorecard now reports a true 9/9 instead
of 4/9 + 5 stubs — every competency has a deterministic, auditor-readable
heuristic grounded in fastpace's existing primitives. Plus a 5-line ROI
payload wired into the F3.11 replication shipper, the F4.7 review-maturity
producer (`fastpace reviews fetch`), and the Stanfis, LLC corporate
attribution on every public-facing site.

### Added
- **F4.4 — Test Parity** (was stub) at `src/maturity/testing.js`. Joins
  F2.1 corrections.log with `git log --name-only` over a window. For each
  AI-touched source file, looks for either (a) a same-commit test edit, or
  (b) a pre-existing sibling test file (`foo.ts` ↔ `foo.test.ts` /
  `foo.spec.ts` / `tests/foo.py`). `score = round(100 × ai_files_with_test_parity
  / ai_files_touched)`. Returns 'not_yet_measured' until corrections start
  accumulating.
- **F4.6 — Architectural Guardrails (ADR Drift)** (was stub) at
  `src/maturity/architectural.js`. Walks `fastpace/docs/adrs/*.md`,
  extracts file-path mentions via a permissive regex, and flags AI-attributed
  commits (per F2.3 trailer) that touch ADR-watched files *without* updating
  any ADR. `score = max(0, 100 − drift_pct)`. Returns 'not_yet_measured' when
  no active ADRs exist; returns 100 when AI commits leave watched files alone.
- **F4.7 — Review Maturity** (was stub) at `src/maturity/review-maturity.js`.
  Reads a provider-agnostic cache at `fastpace/reviews/cache.json` (which
  any external workflow can populate). Score is the average of three bars
  over AI-attributed PRs in window: coverage (% with ≥1 review), depth
  (mean review_comments scaled to 8), timeliness (mean first-review minutes
  — 100 at ≤60min, 0 at ≥24h). Returns 'not_yet_measured' until ≥3 AI PRs
  in window.
- **F4.8 — DORA-by-Attribution** (was stub) at `src/maturity/sdlc-dora.js`.
  Splits the four DORA metrics by AI-attributed vs human-attributed commits
  using F2.3 provenance trailers as the attribution signal. Score is the
  mean of four ratio-bars: lead time, deploy freq, change-fail rate, MTTR.
  AI lower-is-better on lead/CFR/MTTR; higher-is-better on deploy freq.
  Returns 'not_yet_measured' until ≥5 AI-attributed commits in window.
- **F4.9 — Prompt Engineering** (was stub) at
  `src/maturity/prompt-engineering.js`. Combines three already-captured
  manifest signals: prompt specificity proxy (byte-length bucketed
  thin/medium/rich), response yield (response/prompt byte ratio), and
  the F2.1 reliability blend. Score = 35×richness + 25×yield + 40×reliability.
  Bytes-only, no plaintext prompt storage — same privacy stance F1.1
  established. Returns 'not_yet_measured' until ≥5 manifests in window.
- **`fastpace reviews`** CLI at `src/commands/reviews.js`. Subcommands
  `fetch --provider github --repo <owner/name> [--limit 100]`, `show`,
  `clear`. The GitHub fetcher shells out to `gh` (`gh pr list` +
  `gh api repos/.../pulls/<n>/reviews` + per-PR commits for AI-attribution
  detection) and writes the cache. Cache schema is provider-agnostic so
  GitLab / Bitbucket / Azure DevOps orgs populate `fastpace/reviews/cache.json`
  from their own CI workflow.
- **F2.15 ROI payload in F3.11 replication shipper** —
  `src/org-dashboard.js > buildSummary()` now includes an `roi` field
  alongside the `maturity` field added in 0.28.0. The 5-line follow-up
  flagged in CHANGELOG 0.29.0 closed: `/api/org/roi` on the standalone
  binary now sees real per-install ROI data once installs upgrade past
  0.30.0; until then it falls back to the bundled sample.
- **Stanfis, LLC attribution** in the footer of all three public Astro
  sites: `packages/website/src/layouts/Base.astro`,
  `packages/trust-portal/src/layouts/Base.astro`,
  `packages/docs/src/layouts/Doc.astro`. Compact, centered, dim — corporate
  attribution without dominating the existing brand surface.
- **Surface tours** — guided 7-step tour overlays on the homepage's
  `OrgDashboardDemo` and `TrustPortalDemo` panels (Take the tour → button,
  next/prev/skip controls, ←/→/Esc keyboard shortcuts, deep-link auto-start
  via `?tour=org-dashboard` or `?tour=trust-portal`).
- **Top-nav Demo dropdown gains a "Surface tours" group** with four
  entries: Org dashboard (auto-starts the OrgDashboardDemo tour), Trust
  portal (auto-starts the TrustPortalDemo tour), ROI dashboard (deep-links
  to the homepage `#roi` anchor), Org rollup (deep-links into the local-UI
  mockup with the CTO persona tour). New icon styles for each entry in
  `packages/website/src/styles/global.css`.
- **`packages/fp/test/maturity-subscores.test.js`** — 14 module checks
  covering every new sub-score: stub-vs-measured transitions, score
  calculation under representative inputs, edge cases (empty cache, no
  ADRs, missing manifests, ratio-bar boundaries, isTestPath patterns,
  specificityBucket buckets).

### Changed
- **MaturityScore homepage component** at
  `packages/website/src/components/MaturityScore.astro` flips all 9
  competencies from `status: 'roadmap'` to `status: 'live'`. Caption
  rewritten to reflect "all 9 measured in v0.30" instead of "5 of 9
  live + 4 land later".
- `fastpace help` lists `reviews` after `roi`.
- Bumped `@fastpace-ai/fp` to 0.30.0; CHANGELOG entry above; package.json bump.

### Caveats
- **F4.7 producer is GitHub-only out of the box.** The cache schema is
  provider-agnostic, but the bundled `fastpace reviews fetch` only knows
  how to talk to `gh`. Orgs on GitLab / Bitbucket / Azure DevOps populate
  `fastpace/reviews/cache.json` from their own CI workflow. Adding native
  fetchers for the other providers is a §3b light follow-up — would land
  as `--provider gitlab|bitbucket|azure` flags in the existing command.
- **F4.8 lead-time is approximated.** Without a code-host PR API, we use
  the median author-time delta between adjacent commits as a proxy.
  Same proxy applied to both AI and human populations so the comparison
  stays fair, but the absolute number isn't a true commit-to-merge interval.
  Real lead time would join F4.7's review cache; documented as a follow-up.
- **F4.6 ADR path extraction is regex-based.** The path-mention regex
  catches `src/foo.ts`, `app/...`, `lib/...`, `packages/...`, `fastpace/...`
  with a 1-6 char extension. Paths in less common roots (custom monorepo
  layouts) won't be picked up — orgs with those should put their ADR
  references in standard prefixes or extend the regex via a
  `MATURITY_ADR_ROOTS` env var (follow-up).
- **F2.5 self-serve trust portal — still partial.** Per state.json q8,
  the per-customer-login + evidence-request-triggers-snapshot-on-target-install
  flow is genuinely a hosting decision (where do per-customer SOC 2 reports
  live? who owns the queue?). The existing /trust + /evidence pages stay
  the design-partner-grade surface until the hosting model is decided.
  Not a code task; not done autonomously.

## 0.29.0 — F2.15 ROI dashboard + Phase 5.4 interactive sandbox at /sandbox

Two long-deferred items shipped together. The ROI dashboard closes the
last open Tier-2 feature; the interactive sandbox upgrades Phase 5.4
from a guided tour to a real terminal emulator visitors can drive.

### Added
- **F2.15 — ROI dashboard.** `src/roi.js` aggregates run manifests (F1.1)
  × per-runtime pricing × hours-saved heuristic into a per-repo and fleet
  ROI report. Surfaces dev-hours saved, AI-call cost, and ROI ratio.
  Source of truth: `fastpace/manifests/` × `fastpace/budgets/policy.json
  > pricing` × `fastpace/roi/policy.json`. Defaults: $15 / $75 per 1M
  tokens for Opus, $3 / $15 for Sonnet, $0.80 / $4 for Haiku, $5 / $25
  fallback for unknown runtimes; $150/h blended dev rate; 24h/quarter
  audit-prep saved. Hours-saved heuristic: 2 / 6 / 12 minutes per call
  bucketed by response complexity (token volume), plus audit-prep hours
  scaled to the window. Ships with an honest "source: sample" fallback
  — the bundled `assets/roi/sample.json` surfaces calibrated illustrative
  numbers (ROI 6.5×, $33,300 saved, $5,110 spent, 4 repos) until the
  install has ≥ 3 manifests in window, at which point the report flips
  to `source: measured` automatically. Closes the master roadmap's
  explicit "needs real customer data" tension by labeling sample data
  as sample.
- **`fastpace roi`** CLI — `report` (pretty terminal report, default),
  `summary` (one-line ROI), `export` (writes `fastpace/roi/<ts>.json`).
  Honors `--window-days <n>` and `--json`.
- **`/api/roi`** in the local UI — `GET /api/roi?window_days=N`
  returns the same report shape as the CLI.
- **ROI sidebar view** in the local UI Compliance / Reliability & risk
  subgroup — sample/measured banner, big ROI ratio + saved/cost/window
  cards, per-runtime + per-repo breakdowns, throughput delta, highest-
  value workflows panel, configuration footer pointing at the policy
  files.
- **`@fastpace-ai/org-dashboard` fleet ROI rollup** at
  `GET /api/org/roi?window_days=N` — sums per-install ROI payloads;
  legacy installs without ROI are excluded from the denominator (do
  not drag the ratio). Falls back to the bundled sample with a clear
  status message until installs upgrade.
- **Marketing website ROI section** at
  `packages/website/src/components/RoiDashboard.astro`, slotted into
  the homepage between Reliability and Guardrails. Headline: "The slide
  procurement keeps asking for." Carries the headline ROI number, the
  full terminal capture mirroring `fastpace roi report`, four "no
  fabrication / hours-saved heuristic / sample-is-labeled / fleet rollup"
  callouts, and a CTA into `/sandbox`.
- **Phase 5.4 — interactive sandbox** at
  `packages/website/src/pages/sandbox.astro`. Real in-browser terminal
  emulator (no third-party embed). 19 curated `fastpace` commands play
  back canned but realistic transcripts: `help`, `doctor`, `identity
  show`, `inventory`, `runtimes list`, `verify`, `agents list`,
  `manifests list`, `reliability score`, `verify-provenance <sha>`,
  `aibom build <tag>`, `nhi export`, `risk`, `snapshot`, `me`, `maturity
  show`, `roi report`, `bench run`, plus `clear`. Command history (↑/↓),
  Tab completion, Ctrl+L / Ctrl+C shortcuts, click-the-sidebar-to-run
  affordance. Wired into the top-nav Demo dropdown under "Hands-on /
  Interactive sandbox" with a green sandbox icon. Closes the original
  Phase 5.4 spec ("Browser-based sandbox at /demo. Tries the full
  lifecycle without install.") with a no-runtime, no-WebContainer,
  zero-dep implementation that stays in lockstep with the real CLI.
- **`packages/fp/test/roi.test.js`** — 10 module checks covering the
  sample fallback path, the measured-mode path with 3+ manifests, per-
  runtime pricing lookup with the unknown fallback, hours-saved
  bucketing, window_days filtering, org pricing override, ROI policy
  override (blended rate + audit-prep hours), summarizeWindow per-
  runtime + per-agent rollups, sample.json shape validation, and the
  audit-prep hours scaling proportionally with window length.

### Changed
- `fastpace help` lists `roi` after `risk`.
- Top-nav Demo dropdown gains a "Hands-on" group above "Take the tour as"
  so the interactive sandbox is the first option visitors see.
- Local UI sidebar Compliance / Reliability & risk count: 6 → 7 (added
  ROI).
- Bumped `@fastpace-ai/fp` to 0.29.0; CHANGELOG entry above; package.json
  version bump.
- Pre-existing `test/agents.test.js` assertion fixed — Sprint 20 added
  the onboarder agent (test had stayed at 6 expected, world moved to 7).

### Caveats
- **F2.15 source: sample fallback.** When an install has < 3 manifests
  in window, `fastpace roi report` returns the bundled illustrative
  dataset rather than a partial measured report. This is the deliberate
  design choice the master roadmap signed off on: rather than fabricate
  partial numbers customers can't trust, surface a labeled sample and
  flip to measured automatically. The ROI view in both the local UI and
  the website carries a visible "source: sample" / "source: measured"
  pill so the data provenance is always one glance away.
- **F2.15 hours-saved heuristic is intentionally simple.** Three buckets
  (2 / 6 / 12 minutes per call by response complexity) plus a window-
  scaled audit-prep contribution. Auditor-readable, no ML, no hidden
  multipliers — `src/roi.js` is the source of truth and the JSON output
  carries the policy used. Orgs override the blended rate + quarterly
  audit-prep hours via `fastpace/roi/policy.json`.
- **Org dashboard fleet ROI requires installs reporting ROI.** The F3.11
  audit-replication shipper needs to start carrying an `roi` payload
  alongside the existing `maturity` payload it added in 0.28.0. Until
  installs upgrade past 0.29, the fleet endpoint surfaces the bundled
  sample. Wiring the shipper is a 5-line follow-up.
- **Sandbox is canned playback.** The transcripts are pre-recorded
  shapes of the real CLI output — not a live runtime. When the dashboard
  visual language shifts (Sprint 18 sidebar reorg-style changes), update
  `sandbox.astro` alongside the live UI. The disclaimer at the top of
  the page makes this explicit.

## 0.28.0 — AI-Native Maturity Scorecard (F4.x — Tier-4 plumbing)

A second strategic surface on top of fastpace's audit primitives. **AI-Native
Maturity** is a 0–100 score across nine industry-standard competencies for
AI-native engineering. Same data plane (audit log + run manifests + corrections
+ specs); new derived view aimed at CTO / VP-Engineering buyers, complementing
the existing trust-harness framing aimed at CISO buyers. All metrics auto-update
as the team uses fastpace — local reads are real-time; fleet rollups push every
5 min via F3.11 audit replication; webhooks fire instantly on hook events.

### Added
- **`src/maturity.js`** — central aggregator. Loads 9 sub-score modules,
  weights them per-config (defaults sum to 100), and emits a derived view
  `{ aggregate, sub_scores, generated_at }`. Cache at
  `fastpace/maturity/latest.json` is best-effort; source of truth is the
  audit log + run manifests so the read is always idempotent.
- **`src/maturity/<id>.js`** — one module per competency:
  - F4.1 `project-setup` — AI-Readiness checklist, 9 install-time artifacts.
  - F4.2 `spec-coverage` — % of last-50 commits with PRD/ERD/exec-plan provenance trailer.
  - F4.3 `context` — context-score (6 dimensions, fallback to heuristic when richer engine absent).
  - F4.5 `harness` — guardrail strictness aggregate (#agents × cap-coverage × path-tightness).
  - F4.4 / F4.6 / F4.7 / F4.8 / F4.9 — stubs returning `not_yet_measured` with roadmap pointer.
- **`fastpace maturity`** CLI (`src/commands/maturity.js`) — subcommands
  `show` (default), `json`, `breakdown`, `refresh`, `explain`. Renders the
  aggregate + 9 sub-bars + breakdown detail, color-coded by score band.
- **`/api/maturity`** in the local UI — recomputes on every read, also
  caches to disk so org-dashboard ingest can read without re-shelling.
- **Maturity sidebar view** at the top of the local UI nav with a green
  "live" pill, headline number, sub-score table with mini bars + per-row
  status, and a footnote explaining the freshness model.
- **Org dashboard** — `aggregateFleet()` now averages a fleet maturity rollup
  across reporting repos (legacy installs without maturity are excluded
  from the denominator, never drag the score down).
  `GET /api/org/maturity` exposes the aggregate.
- **Trust portal** — new `/maturity` page in `packages/trust-portal/`
  describing the rubric + freshness model. Linked from the trust-portal index.
- **Marketing website** — new `Capabilities` "live · auto-updated" callout
  with a pulsing green dot; new `MaturityScore.astro` homepage component
  (between Capabilities and HowItWorks) showing the 9 competencies, a
  sample 72/100 score, and pointers to CLI / local UI / trust portal.
- **Spec doc** — `packages/fp/assets/docs/ai-native-maturity.md` published
  in Sprint 25 with the full rubric, weights, and 4-layer freshness model.
- **Tests** — `test/maturity.test.js` (7 cases: aggregate shape, measured
  vs stub status, denominator excludes stubs, cache round-trip, project-
  setup detects fastpace fixtures, weight overrides via config).

### Tier-4 status
Four of nine sub-scores ship as live measured surfaces in this release
(F4.1 Project Setup, F4.2 Spec-Driven Development, F4.3 Context Management,
F4.5 Harness Engineering). The remaining five (F4.4 Testing, F4.6 Architectural
Guardrails, F4.7 Review Maturity, F4.8 DORA-by-Attribution, F4.9 Prompt
Engineering) ship as stubs with roadmap pointers in `future-work.md` §1b.
F4.10 (per-metric refresh cadence) and F4.11 (WebSocket / SSE for live UI
updates) are next-sprint infra work.

## 0.27.0 — fold /demo into the homepage Dashboard, mirror the full real-UI nav

Sprint 24 shipped a separate `/demo` page; visitors who scrolled the homepage saw a parallel Dashboard mockup that did almost the same thing with different chrome. This sprint folds the two together: the homepage Dashboard becomes the single demo surface, with the full real-UI nav structure plus the `/demo` guided tour overlay merged in.

### Added
- **Homepage `Dashboard.astro` now mirrors the live `fastpace ui` nav structure.** Sidebar surfaces all 55 views: 8 top-level (Dashboard / In-flight / Config / Hooks / Phases / Context / Repo quality / Initiatives) + Compliance label + 5 collapsible Compliance subgroups (Identity & inventory · Agents & guardrails · Audit & provenance · Reliability & risk · Org & policy, 34 views) + 3 collapsible top-level subgroups (Documents · Planning · Learning, 11 views) + Elsewhere subgroup (Trust portal · Org dashboard, 2 views). The collapsible behavior matches the Sprint 18 reorg with chevron rotation, count badges, dashed left-border indent on bodies.
- **6 new rich Compliance views** ported from `/demo`: Identity, Audit chain, Run manifests, Reliability, AI-BOM, Provenance. Each a faithful visual reproduction of the live UI with canned data — same kv-pair layout, same terminal blocks, same callouts.
- **Generic stub view** for the ~30 Compliance views that don't have rich mocks. Per-view friendly title + one-paragraph description (drawn from a JS map keyed by view id) + a callout linking to `docs.fastpace.dev/primitives` for the full picture. Keeps the sidebar fully interactive without ballooning the file with 30 hand-mocked views that would drift from the real UI.
- **Guided tour overlay** at the bottom of the mockup. 8-step walk: In-flight → Identity → Audit chain → Run manifests → Reliability → Exceptions → AI-BOM → Provenance. Next / Prev / Skip buttons + arrow-key shortcuts (Right / Left / Esc). Pre-tour CTA reads "Take the tour →"; mid-tour shows step counter + caption + Prev/Next/Skip; final step's button reads "Finish ✓" and resets state.
- **`#dashboard` anchor** on the section so `/#dashboard` jumps directly to the mockup. Hero CTA + top-nav "Demo" link both point at it.

### Changed
- `pages/demo.astro` deleted. Sprint 24's standalone tour was a parallel mock with different chrome; this sprint consolidates everything at `/#dashboard`. Visitor experience: one demo surface, one canned dataset to maintain, less drift risk when the real UI ships visual changes.
- Hero CTA: "Click through the UI →" now points at `/#dashboard` instead of `/demo`.
- Top-nav "Demo" link points at `/#dashboard` instead of `/demo`.
- Section heading on `Dashboard.astro` reads "100% local dashboard — click around or take the tour".

### Caveats
- The 30 stub views show one-paragraph descriptions only; no canned data. That's intentional — hand-mocking 55 views would balloon the file to ~5,000 lines and drift fast. Visitors who want the artifact-shaped detail click through to `docs.fastpace.dev/primitives` (linked from each stub).
- Subgroup collapse state isn't persisted across page reloads (the real UI persists in `sessionStorage`). The marketing-site demo doesn't have repeat-visit ergonomics; visitors see a fresh state each time.
- The tour pre-state CTA button doubles as the "Take the tour →" entry point. Visitors who click any sidebar button go straight to that view without entering the tour; tour is opt-in.

## 0.26.0 — Phase 5.4 interactive demo at /demo

### Added
- **Phase 5.4 — interactive `/demo`** on the marketing site at `packages/website/src/pages/demo.astro`. Custom Astro simulation of the local UI with canned data and a 7-step guided tour: Dashboard → Identity → Audit chain → Run manifests → Reliability → Exceptions → AI-BOM. Inline tour controller (Next/Prev/Skip-to-end + arrow-key shortcuts), per-step caption overlay, end card with install CTA. Stays in lockstep with the real UI's visual language; no third-party embed (Arcade / Storylane / Loom skipped — closes the §8 5.4 caveat in `future-work.md` without a subscription).
- **Hero CTA** updated: "Click through the UI →" now points to `/demo` instead of `/outcomes#audits`.
- **Top nav** lists `/demo` first in `packages/website/src/layouts/Base.astro` so visitors find it immediately.

### Changed
- Bumped `@fastpace-ai/fp` to 0.26.0 to keep the website + CLI in lockstep on the version display in the docs site sidebar.

### Caveats
- The demo page is hand-authored canned data, not a live fastpace install in a sandbox. Walking out of lockstep with the real UI is the standard maintenance burden for this pattern. When the dashboard's visual language shifts (Sprint 18 sidebar reorg-style changes), update `demo.astro` alongside the dashboard.
- `/outcomes#audits` is still on the site — just no longer linked from the hero. Hero now leads with the demo since it's the higher-engagement first click.
- No screenshots / videos shipped. If 5.3 (demo videos) becomes priority later, re-record using the same flow scripted in this page so the messaging stays consistent.

## 0.25.0 — F3.3 policy DSL + F3.12 model-eval harness + docs version surfacing

### Added
- **F3.3 — lightweight policy DSL.** `src/policy-engine.js` ships a small recursive-descent parser + safe evaluator for expressions like `runtime.startsWith("bedrock-")` or `risk_tier in ["critical","irreversible"] && reviewer != "self"`. Operators: `==`, `!=`, `<`, `<=`, `>`, `>=`, `&&` / `and`, `||` / `or`, `!` / `not`, `in`. String methods: `.startsWith`, `.endsWith`, `.contains`, `.matches` (regex). Atom types: numbers, strings, booleans, null, array literals, dotted identifiers (resolved against the context object). No `eval()`, no arbitrary function call, no property assignment — the safe-list is the surface area. CLI: `fastpace policy-eval check --expr "..." [--ctx-file ctx.json]`. Deliberately not OPA — covers ~80% of real fastpace policy needs in ~300 LOC; orgs that need graph reasoning wire OPA in front.
- **F3.12 — model-eval harness.** `src/model-eval.js` runs a curated task suite against a configured runtime via an org-wired `runner` callback. Per-task: response, latency, token count, deterministic auto-grader pass/fail. Bundled baseline at `assets/eval/baseline.json` ships 6 tasks (smoke, code-write, JSON output, security awareness, refusal, context grounding) graded via `contains` / `regex` / `equals` / `json-has`. Org extends via `<repo>/fastpace/eval/suite.json` (overrides bundled). Persisted scored reports at `fastpace/eval/<ts>-<runtime>.json`, signed with the F0.1 identity. CLI: `fastpace eval suite|seed-suite|list|show|run`. No LLM-as-judge grader by design — that creates a circular dependency on the runtime under test.
- **Docs site version surfacing.** `Doc.astro` now reads `@fastpace-ai/fp`'s `package.json` at build time and surfaces the version in the sidebar with a "What's new →" link to the CHANGELOG. Closes the §6.1 caveat that the docs site is single-version: it now visibly is.
- **`packages/fp/test/sprint23.test.js`** — 3 module checks covering policy-engine parse/eval (basic comparisons, logical operators, dotted-path lookups, `in`, all four string methods, compound expressions, syntax errors, safe method-call fallthrough), model-eval runner (canned-response round-trip, score 100 → 83 when a task fails, persisted + signed report), and grader-shape coverage.

### Changed
- `fastpace help` lists `policy-eval` and `eval` after `airgap`.
- 150/150 smoke tests pass across 21 test files. Sprint 23 adds 3 module checks.

### Caveats
- F3.3 DSL parses dotted identifiers as method-call receivers (`runtime.startsWith(...)`) only when followed by `(`. Multi-level access on method-call results (`foo.bar().baz`) is not supported — keep expressions one-method-deep.
- F3.12 `eval run` is intentionally a hard-fail without a runner — fastpace doesn't ship runtime SDKs (zero-runtime-dep discipline). The CLI prints the runner contract + offers a working `--dry-run` mode that validates wiring without invoking the runtime.
- Baseline auto-graders are deterministic by design. Rubric scoring needs LLM-as-judge, which is its own runtime the org wires; an `llm-judge` grader kind is documented as next-sprint work.

## 0.24.0 — F3.2 air-gapped install + F3.6 mobile-friendly UI + public docs site

Three deploy-target features in one sprint.

### Added
- **F3.2 — air-gapped install bundle.** `src/airgap.js` packs `pkg/` (the `@fastpace-ai/fp` package contents) + `docs/` (offline copies of every public runbook + the threat model) + `install-offline.sh` + `install-offline.ps1` + `INSTALL.md` + `README.md` + a signed `manifest.json` with sha256-per-file integrity hashes into a directory, plus an optional `.tar.gz` alongside. Customer extracts, runs `sudo ./install-offline.sh`, and gets a working `fastpace` symlink at `/usr/local/bin/fastpace` (or any custom prefix via `FASTPACE_PREFIX`). Zero npm involvement; only requires Node 18+ on the host. CLI: `fastpace airgap build|list`.
- **F3.6 — mobile-friendly local UI.** Off-canvas drawer pattern under 760px, with a hamburger button in the main header, a tap-to-close scrim overlay, and `sessionStorage`-persisted open/closed state. Tap targets bumped to ≥36px on touch. Tighter main padding, smaller h1/h2 on phones, single-column form rows, horizontal-scroll for terminal-shaped pre blocks. Tablet pass (760–1080px) trims sidebar width to 200px.
- **§6.1 — public docs site at `docs.fastpace.dev`.** New Astro project at `packages/docs/`. Deploy port 4323. Pages:
  - **Overview**: `/` (index), `/getting-started`, `/architecture`
  - **Reference**: `/cli` (every subcommand grouped Core / Evidence / Org-scale), `/primitives` (every F0.x / F1.x / F2.x / F3.x with shipping version + summary), `/audit-schema`, `/hooks` (hook contract + bundled-hook table + custom-hook example), `/framework-mapping`
  - **Operations**: `/audit-migration`, `/audit-replication`, `/airgap`, `/troubleshooting`
  - **Trust & security**: `/threat-model`, `/ciso-program`
  - **Single source of truth.** Operations + trust pages render canonical markdown directly (`audit-schema.md`, `framework-mapping.md`, `audit-migration.md`, `audit-replication.md`, `THREAT-MODEL.md`, `ciso-call-program.md`) via a small inline build-time markdown renderer (`src/lib/markdown.ts`, zero deps). Edit the markdown in `assets/docs/`, rebuild docs, content updates.
- **`packages/fp/test/sprint22.test.js`** — 2 module checks: airgap bundle build (manifest shape, required files present, install scripts executable, listBundles enumerates) and bash installer syntax (`bash -n` parse confirms no shell errors).

### Changed
- `fastpace help` lists `airgap` after `budgets`.
- Local UI dashboard `index.html` adds a hamburger button + sidebar scrim; `app.js` adds the drawer toggle + viewport-resize handler.
- Workspace `package.json` registers `@fastpace-ai/docs`. New scripts: `npm run docs:dev`, `npm run docs:build`.
- 147/147 smoke tests pass across 20 test files (`fp` 145 + `org-dashboard` 2). Sprint 22 adds 2 module checks.

### Caveats
- F3.2 doesn't bundle Node itself — keeps the bundle small + avoids cross-arch issues. Customer must have Node 18+ pre-installed.
- F3.2 PowerShell installer ships a `.cmd` shim on Windows (no symlinks). Bash installer creates real symlinks on macOS/Linux.
- F3.6 mobile pass is responsive CSS + a small drawer toggle; touch-only gestures (swipe-to-close, pinch-to-zoom on terminal blocks) are deferred.
- §6.1 docs site is single-version. A version selector + multi-branch deploy is documented as next-sprint work; for now the site documents the current released `@fastpace-ai/fp` version.
- The inline markdown renderer covers the constructs the existing fastpace docs use (h1–h6, paragraphs, code blocks, lists, blockquotes, tables, links, bold/italic, hr, frontmatter). Wire `marked` / `remark` later if the docs grow beyond this footprint.

## 0.23.0 — F3.1 audit export + F3.8 context refresh + F3.9 budgets + migration runbook + agents build-time import

Five Tier-3-and-docs items in one focused pass.

### Added
- **F3.1 — hash-chain export bundle for offline verification.** `src/audit-export.js` packs `audit.log` + `identity-pubkey.pem` (active + archived rotated keys) + a single-file zero-dep Node verifier (`verify-offline.js`, lives at `assets/audit-export/`) + a signed `manifest.json` + `README.md` into a directory you hand to your auditor. They run `node verify-offline.js` and get hash-chain integrity + signature validation + bundle-wrapper sha256 cross-check, no fastpace install required. CLI: `fastpace audit export-bundle [--out <dir>]` and `fastpace audit list-exports`.
- **F3.8 — self-healing context refresh.** `src/context-refresh.js` walks ADRs + `fastpace/context/architecture.md` + `fastpace/context/decisions.md` and flags four kinds of staleness: ADRs referencing files that no longer exist, architecture mentions of deleted modules, orphan ADR-#### references in decisions.md, and active ADRs that reference superseded ones. Read-only by default; `--apply` appends a `<!-- STALE: ... -->` marker comment near each match. CLI: `fastpace context refresh [--apply] [--json]`.
- **F3.9 — per-team budget caps.** `src/budgets.js` ties into the F1.1 token-count fields on run manifests (added Sprint 20). Org admin sets per-team monthly caps in tokens or USD, with `warn_at_pct` / `block_at_pct` thresholds. Pricing is org-configured per runtime in `fastpace/budgets/policy.json > pricing` (we don't ship a price table — they change too often). `fastpace budgets report` aggregates the current month's run manifests, groups by team via the agents → team mapping, and surfaces blocked / warn / ok status. CLI: `fastpace budgets set|remove|list|report|policy`.
- **§6.4 — `fastpace audit migrate` runbook** at `assets/docs/audit-migration.md`. Pre-flight checklist, the migration command itself with both human and JSON output, post-verify, restoring from the `.bak.jsonl` backup, edge cases (empty log, malformed line, idempotent re-run, no subset migration), and what the migration explicitly doesn't do (no signature backfill, no body changes, no backup auto-deletion).
- **4.4 — `/agents` page build-time import.** Replaced the hardcoded six-agent array on `packages/website/src/pages/agents.astro` with a build-time loader that reads every `.md` file under `packages/fp/assets/agents/`. Frontmatter parser is inline (no YAML dep). Adding or editing an agent file regenerates the page on next `npm run build`. The page now correctly shows seven agents (the new `onboarder` from Sprint 20 was missing). Closes the §8 4.4 caveat in `future-work.md`.
- **`packages/fp/test/sprint21.test.js`** — 4 module checks: bundle export shape, offline-verifier round-trip (writes a chain → exports → runs the bundled verifier in a child process, asserts `RESULT: PASS`, then tampers and asserts `RESULT: FAIL`), context-refresh staleness detection + `--apply` markers, budgets report math (token sum, USD calc against priced runtime, blocked status when over cap, unassigned bucket).

### Changed
- `fastpace help` lists `context` and `budgets` after `me`.
- `fastpace audit help` lists `export-bundle` and `list-exports` after `migrate`.
- 145/145 smoke tests pass across 19 test files (`fp` 143 + `org-dashboard` 2). Sprint 21 adds 4 new module checks.

### Caveats
- F3.1 export bundle currently writes a directory; orgs can `tar czf` it for transport. We don't bundle a tarball directly to keep the auditor's first action — opening the verifier — straightforward.
- F3.8 context-refresh is detection-and-suggest, never auto-mutate. The `--apply` flag is the only writer and only ever appends `<!-- STALE -->` HTML comments — never deletes or rewrites prose.
- F3.9 budgets enforces at the report layer, not at the runtime call layer. A runtime-call gate (a hook that fires on every call when over `block_at_pct`) is documented as next-sprint work; `fastpace gate check` will pick up the budget signal too.

## 0.22.0 — production caveats batch + `fastpace me` + onboarder + webhook producers

A pass through `future-work.md` §3 (production caveats) and a couple of Tier-3 picks: closes three caveats, adds `fastpace me`, ships an onboarder agent, and wires the F3.10 webhook producers that landed unwired in Sprint 18.

### Added
- **F3.5 — `fastpace me`** per-developer dashboard. `src/me.js` filters reliability + corrections (top files, severity distribution) + exceptions (active + window total + tier breakdown) + audit-chain activity + coach feedback ratings + redaction counts by THIS install's identity. Local-only; nothing transmitted off the machine. CLI: `fastpace me [--window-days 30] [--json]`. API route: `GET /api/me?window_days=N`.
- **F3.4 — onboarder agent** at `assets/agents/onboarder.md`. Walks first-time users through `fastpace init` → identity creation → sample-feature scaffold → audit-chain verify → local-UI launch in five tightly-scoped steps. Hard rules: never edit source outside `fastpace/`, never `git push`, never grant exceptions, one question at a time. Allowed-tools / allowed-paths / blast-radius caps in frontmatter so the agent-scope-guard hook keeps it on the rails.
- **F3.10 — webhook producers wired.** The webhook event bus from Sprint 18 had no producers; this sprint hooks `webhooks.dispatch()` calls into:
  - `runtime-guard` block path → `gate.failed` (background-fire via `_webhook-fire.js` so the hook's allow/block decision is never delayed)
  - `exceptions.requestException()` for high-tier grants (critical / irreversible / exfil_eligible) → `exception.granted`
  - `verify` command on chain-broken outcome → `audit.broken`

### Changed
- **F0.5 — prompt-redactor PII pattern overrides.** `hooks.prompt_redactor.pii_pattern_overrides: [{ name, pattern, flags }]` adds org-specific PII patterns; `hooks.prompt_redactor.pii_pattern_disable: ['Phone']` suppresses noisy built-ins. Compiled once per hook invocation. Closes the original §3 caveat.
- **F1.1 — runner metadata field unions** for Codex / Gemini CLI / Bedrock / Azure OpenAI / Vertex AI. `assets/hooks/run-manifest-writer.js` now reads `model_name` (Codex), `modelId` (Bedrock SDK camelCase), `gemini_model`, `openai_model` plus the existing union. Endpoints accept `bedrock_endpoint`, `azure_endpoint`, `vertex_endpoint`, bare `host`. Training opt-out reads `do_not_train` (Anthropic), `x_anthropic_no_training`, `user_data_opted_out` (OpenAI Enterprise), `bedrock_training_disabled`. New `region`, `deployment`, and `tokens` (input/output/total) fields on the manifest schema.
- **F2.1 — LCS-based diff for correction-detector blame.** Replaced the string-equality changed-line approximation in `assets/hooks/correction-detector.js` with a proper LCS line diff. Identifies which CURRENT-FILE line numbers the developer is touching by aligning pre-edit content vs. live file. Bounded to 5,000-line files; falls back to "any blamed AI line counts" for larger files. Big multi-line edits with reformatting now attribute precisely instead of getting a coarse string-set match.
- 141/141 smoke tests pass across 18 test files (`fp` 139 + `org-dashboard` 2). Sprint 20 adds 3 new module tests: LCS diff correctness, `me` report shape, and exception → webhook dispatch (in-process http server, asserts low-tier suppression + critical-tier delivery + envelope shape).

### Caveats
- F3.10 producers are best-effort and async — a webhook delivery failure never blocks the hook's allow/block decision or the exception flow. Producers fire from THIS install only; cross-install fan-out is the org-dashboard server's job (F3.10 wiring there is the natural follow-up).
- F3.5 `fastpace me` is per-install; cross-developer aggregation lives in `@fastpace-ai/org-dashboard` (F1.13). The two views share their data model.
- F2.1 LCS diff is bounded to 5,000-line files for memory safety; pathological cases fall back to the prior coarse path.
- F1.1 token-cost surfacing is opt-in by the runner — fastpace records what the runner emits, never adds a price multiplier (F2.15 ROI tracking is the proper home for that).

## 0.21.0 — F2.5 trust portal + F1.13 standalone org-dashboard binary

This sprint splits two modules out of the monolith into deployable
packages: a self-serve trust portal at `trust.fastpace.dev` (was an open
Tier-2 item) and a standalone HTTP server for the org dashboard (was an
open §3 production caveat).

### Added
- **F2.5 — `@fastpace-ai/trust-portal`** — new Astro project at `packages/trust-portal/`. Self-serve security posture for CISOs, security architects, and procurement leads:
  - `/` — overview + verify-it-from-the-terminal callout
  - `/attestations` — SOC 2 Type I/II + ISO 27001/42001 status, targets, scope. Source data: `src/data/attestations.json` (versioned in git so changes have an audit trail).
  - `/subprocessors` — short list with regions + statuses; "pass-through" tag for runtime providers that are NOT fastpace sub-processors. Source: `src/data/subprocessors.json`.
  - `/questionnaires` — pre-answered CAIQ, SIG Core, SIG Lite, VSA + custom turnaround. Source: `src/data/questionnaires.json`.
  - `/threat-model` — STRIDE summary cards + residual-risk callouts; full doc lives at repo-root `THREAT-MODEL.md`.
  - `/evidence` — self-serve evidence-request form (mailto for now; production wires to a backend). Six artifact kinds (attestation report / security questionnaire / audit evidence pack / pen test summary / data-flow diagram / other).
  - Self-contained dark theme. Independent deploy target (port 4322, `https://trust.fastpace.dev`).
- **F1.13 — `@fastpace-ai/org-dashboard`** — new package at `packages/org-dashboard/` shipping a standalone HTTP server. Endpoints: `GET /api/health`, `POST /api/org/ingest`, `POST /api/org/ingest-self`, `GET /api/org/rollup`, `GET /api/org/installs`, `GET /api/org/baselines`, `GET /api/org/summary`, `POST /api/auth/saml`. Reuses `@fastpace-ai/fp`'s `org-dashboard`, `audit`, `circuit-breaker`, `identity`, `rbac` modules so logic stays in one place. Trusted-keys ingest verification via `TRUSTED_KEYS_FILE`. SAML envelope verification (F1.14) via env config. Smoke test exercises ingest + rollup + tampering rejection + 404 path.
- **Trust portal cross-link** from the marketing-site `/trust` page (callout box pointing CISOs at the artifact-driven portal).
- **Monorepo workspace + scripts.** Root `package.json` registers both new packages; new top-level scripts `npm run trust:dev` / `trust:build` and `npm run org:start`.

### Changed
- Bumped `@fastpace-ai/fp` to 0.21.0.
- 138/138 smoke tests pass: 136 in `@fastpace-ai/fp` plus 2 in `@fastpace-ai/org-dashboard` (health + ingest/rollup).

### Architecture
The two new packages depend on `@fastpace-ai/fp` via the workspace declaration. No new runtime dependencies beyond what `fp` already pulls in (which is zero — both new packages stay zero-runtime-dep on top of the workspace). The trust portal adds Astro 4.x as a dev/build dependency only.

### Caveats
- F2.5 trust portal first cut is publicly browseable + mailto-driven. Per-customer login (using F1.14 RBAC) and a real evidence-package backend that triggers `fastpace snapshot` on a target install + signed-URL delivery are scoped for the next sprint.
- F1.13 server has no built-in TLS; terminate at your reverse proxy. Built-in admin UI deferred — point the local fastpace UI at the standalone server's API for now (the existing Org rollup view consumes the same JSON shape).
- Both packages can be published to npm independently of `@fastpace-ai/fp` once the org settles on the public-vs-self-hosted decision (q8 in `future-work.md`).

## 0.20.0 — webhooks + replication + bench + per-org redteam + sidebar reorg

This sprint addresses the residual risks from `THREAT-MODEL.md`
(replication closes Tampering; webhooks closes the no-alerting gap)
and reorganizes the Compliance sidebar into collapsible subgroups so
30+ views remain navigable.

### Added
- **F3.10 — Webhook event bus.** `src/webhooks.js` ships a 7-event taxonomy (`audit.broken`, `exception.granted`, `redteam.failed`, `gate.failed`, `sast.blocked`, `reliability.dropped`, `correction.security`). Each delivery carries a fastpace signature in the body plus an HMAC `x-fastpace-signature` header when a shared secret is configured. Subscribers stored at `fastpace/webhooks/subscribers.json` (or in `fastpace.config.yaml > webhooks`); dispatches logged at `fastpace/webhooks/dispatched.log`. CLI: `fastpace webhooks add|remove|list|events|dispatch|test|log`.
- **F3.11 — Audit log replication contract.** `src/audit-replication.js` ships a `replicate(cwd, replicator)` API with a small contract (`{ name, replicate(record), read?(historyEntry) }`). Bundled `fileReplicator` + `httpReplicator` cover local/SMB/NFS and any HTTP ingest endpoint (Splunk HEC, Datadog, custom SIEM). Cloud replicators (S3/GCS/Azure Blob) are NOT bundled — `assets/docs/audit-replication.md` documents the contract with a concrete `@aws-sdk/client-s3` example so orgs wire their own SDK + Object Lock / WORM bucket. Idempotent: re-running picks up from `last_offset`. `verifyReplicatedAgainstSource` reads chunks back and detects drift = tampering signal. CLI: `fastpace replicate to-file|to-http|status`.
- **F2.7 — Per-org red-team scenarios.** `<repo>/fastpace/redteam/scenarios.json` now REPLACES the bundled starter set; `<repo>/fastpace/redteam/scenarios.extra.json` EXTENDS it. `loadScenarios(cwd)` reports `_source` (`bundled` / `org_override` / `bundled_plus_extras`) so reports are clear about provenance.
- **Hook performance benchmarks.** `src/bench.js` spawns each shipped hook N+warmup times against a representative synthetic payload and reports p50/p95/p99/mean/min/max. Signed reports at `fastpace/bench/`. Closes §6.3 of `future-work.md`. CLI: `fastpace bench run|list|show`.
- **Local UI: 5 new Compliance views** (now 33 navigable views): SAST · Coach feedback · Webhooks · Replication · Bench. Each with the same shape as existing views — list/run/inspect with signed-report metadata.
- **Sidebar reorg into collapsible subgroups.** The flat 30+ Compliance buttons are now grouped into 5 expandable headings: **Identity & inventory** (5), **Agents & guardrails** (9), **Audit & provenance** (7), **Reliability & risk** (6), **Org & policy** (7). Each subgroup head shows a chevron + count badge; clicking toggles inline expand/collapse with a `max-height` transition. State persists in `sessionStorage`. Sidebar search auto-expands every group while typing and filters items inside.
- **Top-level nav-group styling refresh.** "Compliance / Documents / Planning / Learning" headings now have a top-border separator, gradient accent dot, increased letter-spacing, and stronger color contrast — they read as section dividers rather than de-emphasized labels.
- **API:** `GET /api/sast/list|adapters`, `POST /api/sast/run`; `GET|POST /api/feedback`, `GET /api/feedback/rollup`; `GET|POST|DELETE /api/webhooks/subscribers`, `GET /api/webhooks/log`, `POST /api/webhooks/test`; `GET /api/replication/status`, `POST /api/replication/run`; `GET /api/bench/list`, `POST /api/bench/run`.
- **`assets/docs/audit-replication.md`** — full contract + AWS S3 example + WORM/immutability hardening guidance + cron schedule example.
- **`packages/fp/test/sprint18.test.js`** — 4 end-to-end smoke tests:
  - redteam per-org override (override replaces, extras extend, fallback to bundled)
  - webhooks dispatch with signature verification (in-process test server)
  - replication idempotency + tamper-detection via verifyReplicatedAgainstSource
  - bench summarize quantile correctness (p50/p95/p99 + empty input)

### Changed
- `fastpace help` lists `webhooks`, `replicate`, `bench` after `feedback`.
- 136/136 smoke tests pass across 17 test files.

### Caveats
- F3.10 webhooks fire when a producer calls `dispatch()`. The producers (the various hook events) wiring `dispatch()` calls is documented but in-tree hooks don't yet auto-fire — orgs hook them via the `fastpace _emit-event` internal command or by importing `webhooks` directly.
- F3.11 replication reads back through the replicator's `read()` to verify integrity. The bundled `fileReplicator` doesn't ship a `read()` (callers can roll their own); the docs example for S3 includes one.
- Sidebar reorg keeps view IDs stable — every old `data-view` value still works in URLs, palette searches, and `goto()` calls.

## 0.19.0 — F2.13 SAST + F2.14 coach feedback + correction-detector blame + STRIDE threat model

This sprint closes the loop on the original-scope Tier-2 deferred items
(SAST/lint as required hooks, coach feedback loop) and ships the STRIDE
threat model that was an open §6.2 item in `future-work.md`. Plus the
F2.1 correction-detector graduates from mtime proxy to git-blame
precision when the repo carries provenance trailers.

### Added
- **F2.13 — SAST/lint as required hooks.** `src/sast.js` is the adapter contract; bundled adapters for **Semgrep** and **ESLint** shell out to the local binary. Custom adapters via `registerAdapter`. PreToolUse hook at `assets/hooks/sast-required.js` matches `git push` (or any opt-in command pattern via `FASTPACE_SAST_GUARD_PATTERNS`). Signed reports at `fastpace/sast/<ts>.json`. CLI: `fastpace sast run|list|show|adapters`. Config: `hooks.sast_required: { enabled, block_on, require_all_tools, tools: [...] }`. `block_on` defaults to `high`; `require_all_tools` defaults to false so a missing tool doesn't break the push. Closes the original F2.5 scope (was reframed in Sprint 14).
- **F2.14 — Coach feedback loop.** `src/coach-feedback.js` issues opaque `rating_token`s embedded in coach-block responses; developers POST back a rating (`helpful` / `not_helpful` / `wrong` / `missing_context`) + free-text reason. Tampered tokens are rejected. Append-only log at `fastpace/coach-feedback.log`; rollups by policy_id and agent_id with effectiveness score (helpful / total) once sample ≥ 3. CLI: `fastpace feedback record|rollup|list`. Closes the original F2.6 scope.
- **F2.1 — Correction detector mtime → git blame upgrade.** `assets/hooks/correction-detector.js` now walks `git blame --line-porcelain` and treats lines as AI-authored only when the authoring commit's message has an `AI-Manifest-Id:` or `Fp-*:` trailer. Falls back to the mtime proxy when (a) the file isn't in git, or (b) no commits in the file's history have provenance trailers (i.e. the install is brand new). The decision metadata (`resolution`, `ai_manifest_ids`) is written into the correction record so audits can distinguish blame-precise from mtime-fallback events.
- **`THREAT-MODEL.md`** at the repo root. Walks each STRIDE category (Spoofing, Tampering, Repudiation, Information disclosure, DoS, EoP) against every shipped primitive. Lists residual risks per category and what changes in the next-sprint horizon. Cross-link from `/trust` is pending the public docs site.
- **`packages/fp/test/sprint17.test.js`** — 2 end-to-end smoke tests:
  - SAST runner with a mock adapter: block_on threshold, require_all_tools, disabled-skip path, listResults persistence.
  - Coach feedback: token issuance + tamper rejection, record/rollup correctness, effectiveness math when sample ≥ 3 vs `null` when sample < 3.

### Changed
- `fastpace help` lists `sast` and `feedback` after `policy`.
- `fastpace.config.yaml` schema gains `hooks.sast_required` (optional; disabled by default).
- 132/132 smoke tests pass across 16 test files.
- `future-work.md` refreshed: §1 documents the F2.5/F2.6/F2.9/F2.11 scope reframings; §3 §6.2 marked closed; version refs bumped.

### Tier-2 status
Counting both the Sprint-14 reframings and the Sprint-17 closeouts of the original scopes, **all 4 originally-open Tier-2 items have shipped under their proper IDs**: F2.5 (control monitor) + F2.13 (SAST), F2.6 (data taps) + F2.14 (coach feedback), F2.9 (audit gate), F2.11 (policy bundle). Customer-facing trust portal (renumbered F2.5 in future-work.md from original F2.9) and ROI tracking (renumbered F2.15) remain open per design.

### Caveats
- F2.13 SAST adapters shell out to the local binary; CI-mode requires those tools to be installed on the runner (or the org ships a custom adapter via `registerAdapter`).
- F2.14 coach feedback requires the coach (F1.9) to start emitting `rating_token`s in its block responses. The hook surface for that is documented in `src/coach-feedback.js` but the in-tree coach agent doesn't emit tokens yet — that's a docs-only follow-up.
- F2.1 blame path uses string-equality on changed lines; large multi-line edits with reformatting may under-attribute. A proper diff (Myers/patience) would tighten precision further; tracked in §3 of `future-work.md`.

## 0.18.0 — polish sprint (CISO call program + trust-page refresh + coach one-click exception)

This is the polish sprint that closes out the "all of them" run on
`future-work.md` items.

### Added
- **CISO call program 02–04 docs.** `assets/docs/ciso-call-program.md` is the working agenda + question bank + open-question register for the next three CISO conversations. Each call has a clear goal, pre-call homework, time-boxed agenda, and three categories of questions (open-ended → sharpening → skeptical). Anti-patterns are listed explicitly so notes don't drift toward marketing-speak. Findings sections at the bottom are pre-populated for inline note-taking.
- **F1.9 — coach agent one-click "Request exception" in the local UI.** The Coach log view now shows a `Request exception →` button on every coach event that has a tool/path/agent/reason context. Click pre-fills the F1.8 exception request from the coach event, prompts for risk tier, TTL, and reviewer (named reviewer still required for critical / irreversible / exfil_eligible — we do not bypass that). Closes the loop: coach surfaces the path, developer takes it without leaving the view.
- **Trust page refresh.** `/trust` Self-mapped framework coverage block updated to enumerate every shipped primitive — F0.1–F0.6, F1.1, F1.3 with fleet-baseline, F1.6, F1.10, F1.11, F1.12 with Sigstore envelope, F1.13, F1.14 with SAML envelope verifier, F2.1, F2.3, F2.4, F2.5, F2.6, F2.7, F2.8, F2.9, F2.10, F2.11, F2.12. `fastpace gate check --format github` is mentioned as the drop-in CI integration.

### Changed
- 130/130 smoke tests still pass (no behavior change to test surface).

### What's NOT done in this sprint
- No new module work — this sprint is intentionally docs / UI / website polish.
- The remaining Tier-2 deferred item from earlier in the roadmap stays in `future-work.md` for the next sprint.

## 0.17.0 — production hardening sprint (SAML / Sigstore / fleet baselines)

This sprint converts three "production caveats" into shipped capabilities,
without breaking the no-runtime-deps discipline.

### Added
- **F1.14 — SAML envelope verifier (real signature + window + audience).** `rbac.verifySamlEnvelope(envelope, settings)` now performs an actual auditable signature check (RS256/RS512/PS256/ES256), `NotBefore` / `NotOnOrAfter` validation with configurable clock skew, issuer match, audience match, and optional `InResponseTo` nonce binding. The legacy `applySamlAssertion` path remains for callers wiring node-saml / passport-saml in front; the new envelope path supports IdPs that prefer to sign a clean JSON profile instead of raw SAML XML. Sibling helper `verifyAndApplySamlEnvelope` chains both.
- **F1.12 — Sigstore-style attestation bundle.** `attestation.wrapAsSigstoreBundle(att)` emits a Cosign / `sigstore-bundle@v0.3` JSON envelope around a sanctioned-install attestation; `verifySigstoreBundle(bundle, attestation, trustedKeys)` recomputes the digest and verifies against a configured trusted-keys map. Public-trust mode for orgs that already run a Sigstore verifier or Rekor instance — the internal Ed25519 path remains the default and is unchanged. We deliberately do NOT pull in the Sigstore TUF root / Rekor in-process: that's a vetted-library job. New `attestation.listAttestations(cwd)` lookup helper used by `controlMonitor.loadFastpaceTruth`.
- **F1.3 — Fleet-wide circuit-breaker baseline.** `circuit-breaker.aggregateFleetBaselines(perRepoBaselines)` produces sample-weighted means + pessimistic stddev across an org's repos. `org-dashboard.buildSummary` now includes each agent's local baseline; `org-dashboard.aggregateFleet` aggregates them; `org-dashboard.publishFleetBaselines(cwd, fleet)` writes per-agent fleet baselines locally. `circuit-breaker.resolveBaseline(cwd, agent)` is the new resolution policy: prefer local when sufficient, else fall back to fleet. New installs benefit from fleet wisdom while their own samples accumulate.
- **`packages/fp/test/sprint15.test.js`** — 3 hardening smoke tests:
  - SAML envelope: happy path + tampered profile + wrong audience + expired window.
  - Sigstore bundle: wrap + verify + tampered-attestation digest mismatch + org-key path.
  - Fleet baselines: weighted-mean correctness, insufficient-row exclusion, store/load, resolveBaseline fallback ordering.

### Changed
- `controlMonitor.loadFastpaceTruth` now calls `attestation.listAttestations`, which it always could — but the helper finally exists in attestation.js's exports.
- 130/130 smoke tests pass across 15 test files.

### Caveats remaining
- SAML envelope verifier supports JSON profile + detached signature. Orgs whose SAML stack only emits raw XML still need a SAML library (e.g. node-saml) in front to extract the assertion before calling fastpace. We document this clearly in the rbac.js header comment.
- Sigstore bundle envelope is correct; integrating against the public Sigstore TUF root / Rekor transparency log requires a Sigstore client library and is left to the deploy.
- Fleet baseline aggregator uses sample-weighted mean of means and max stddev. A more robust statistical model (e.g. Welford's online merge) is straightforward to add later if the simple aggregation hides outliers in practice.

## 0.16.0 — control monitoring + data taps + audit gate + policy bundle (F2.5 / F2.6 / F2.9 / F2.11)

### Added
- **F2.5 — Continuous control monitoring.** `src/control-monitor.js` is the inverse of F2.8: pull control state from Drata / Vanta / Secureframe (or load a snapshot file) and reconcile against fastpace ground truth — audit chain, AI-BOMs, attestations, reliability score, framework mapping. Detects drift: provider says PASSING but fastpace evidence says otherwise (audit chain broken, AI-BOM stale, attestation expired, reliability below threshold), or PROVIDER says FAILING but fastpace has fresh evidence (push hasn't synced). Signed drift report at `fastpace/control-monitor/<provider>-<ts>.json`. CLI: `fastpace control reconcile --snapshot <file>` + `list` + `show`.
- **F2.6 — Trusted data taps.** `src/data-taps.js` is the companion to F1.10 sensitivity tagging. F1.10 tags *what* a piece of context is; F2.6 governs *where* prompt context can come from. A "tap" is a signed allow-list entry with kind (url / glob / mcp), pattern, sensitivity ceiling, and optional TTL. `evaluateContext()` checks any prompt-context source against active taps. CLI: `fastpace taps add|remove|list|check|verify`.
- **F2.9 — Pre-merge audit gate.** `src/audit-gate.js` is a single CLI/CI entrypoint that runs the required checks (provenance, audit_chain, aibom, exceptions, taps) and exits 1 on failure. Signed gate reports at `fastpace/audit-gate/<ts>.json`. `--format github` emits ::error:: annotations for inline GitHub Actions UI. Drop-in workflow at `assets/ci/github-actions/audit-gate.yml`. CLI: `fastpace gate check|list|show`.
- **F2.11 — Org-wide policy engine.** `src/policy-bundle.js` distributes a signed bundle of runtimes / MCP scope / redaction / blast-radius / framework-mapping policies from the org admin to every repo. `pack` builds + signs; `verify` validates signature + expiry; `pull` records as active and writes to history; `apply` merges bundle policies into `fastpace.config.yaml` (with a `local-pre-bundle.json` backup for reverts). CLI: `fastpace policy publish|pull|show|history|diff|verify`.
- **`src/util/sign.js`** — small canonical-JSON + Ed25519 helper (`signObject` / `verifyObject`) used by all four new modules to keep the signing/verifying pattern consistent with `audit.js`.
- **Local UI: Control monitor / Data taps / Audit gate / Policy bundle** views in the Compliance sidebar (now **29 views**).
  - Control monitor: live ground-truth panel + paste-snapshot reconcile box + prior-reports list.
  - Data taps: add tap form + check-source box + active-taps list with verify/expired pills.
  - Audit gate: run-gate button with per-check pass/fail + prior-reports list.
  - Policy bundle: active bundle card + paste-bundle verify/diff/pull/pull+apply box + history.
- **API:** `GET /api/control/list|truth`, `POST /api/control/reconcile`; `GET|POST|DELETE /api/taps`, `POST /api/taps/check`; `GET /api/gate/list`, `POST /api/gate/check`; `GET /api/policy/active|history`, `POST /api/policy/pull|verify|diff`.
- **`assets/ci/github-actions/audit-gate.yml`** — drop-in GitHub Actions workflow that runs the gate on every PR.
- **`packages/fp/test/sprint14.test.js`** — 4 end-to-end smoke tests (control reconcile, taps add/list/check/tamper, audit gate evaluate, policy pack/verify/pull/apply).

### Changed
- `fastpace help` lists `control`, `taps`, `gate`, `policy` after `risk`.
- 127/127 smoke tests pass across 14 test files.

### Tier-2 status
With F2.5 + F2.6 + F2.9 + F2.11 shipped, **Tier 2 is 11/12 done**. Only F2.5 was previously documented as "SAST/lint as required hooks" — that scope got reframed during planning into "continuous control monitoring" (the inverse of F2.8 push). Same for F2.6 / F2.9 / F2.11 — see master-roadmap.md and future-work.md for the live roadmap. The remaining Tier-2 item is documented in future-work.md.

### Tier-2 caveats (this sprint)
- F2.5 ships snapshot ingestion (offline) by default; the live Drata/Vanta/Secureframe API adapters are stubs awaiting the org's API keys.
- F2.6 globToRegex covers `*` / `**` patterns; production deploys with deeper path matching needs may want to swap in a more featureful matcher.
- F2.9 `taps` check is opt-in (passes with a note when no registry exists) so adopting the gate before adopting taps doesn't break the build.
- F2.11 `applyBundle` writes runtimes / mcp_scope / redaction / blast-radius / framework_mapping; other bundle sections are persisted as `active.json` but not auto-merged. Reverts via the `local-pre-bundle.json` backup.

## 0.15.0 — red-team harness + Drata/Vanta push + AI risk register (F2.7 / F2.8 / F2.10)

### Added
- **F2.7 — fastpace red-team harness.** `src/redteam.js` runs a curated set of prompt-injection / jailbreak / data-exfil scenarios against the actual defense modules and asserts each fires correctly. Deterministic, in-process, no network. The starter set covers F0.5 redactor, F0.4 scope-guard, F1.11 runtime-guard, F1.7 MCP scope, F0.2 audit-chain integrity, F1.1 manifest integrity, F1.8 exception workflow. Posture score = passed / total. CLI: `fastpace redteam run|list`.
- **F2.8 — Drata / Vanta / Secureframe push.** `src/compliance-push.js` builds a per-provider evidence map from the F1.15 framework mapping + audit chain + AI-BOM + reliability + redaction. Three adapters (drata / vanta / secureframe) shape the upload payload. Dry-run by default — writes to `fastpace/compliance-push/<provider>-<ts>.json`. Live mode documented as needing API keys (production wires `opts.poster`). CLI: `fastpace compliance push|list`.
- **F2.10 — AI risk register, auto-generated.** `src/risk-register.js` walks `corrections.log` (security severity), `exceptions.log` (high-tier), and `redaction.log` (restricted-file references) into a per-system risk register. Status overrides (closed / accepted) persist across regenerations. CLI: `fastpace risk list|export|review`.
- **Local UI: Red-team / Compliance push / Risk register** views in the Compliance sidebar (now **25 views**). Per the user's three-lane discipline rule.
  - Red-team: scenarios list + Run all button + per-scenario pass/fail with reason.
  - Compliance push: provider selector + dry-run preview + prior-pushes list.
  - Risk register: severity/status pills + status-change buttons + per-row source artifact.
- **API:** `GET /api/redteam`, `POST /api/redteam/run`, `GET /api/compliance/list`, `POST /api/compliance/push`, `GET /api/risk`, `POST /api/risk/review`.
- **`assets/redteam/scenarios.json`** — 12 starter scenarios shipped with the package (auditor-readable JSON; extend with org-specific tests).
- **`packages/fp/test/sprint13.test.js`** — 10 zero-dep smoke tests.

### Changed
- `fastpace help` lists `redteam`, `compliance`, and `risk` between `users` and `uninstall`.
- 123/123 smoke tests pass across 13 test files.

### Tier-2 status
With F2.7 + F2.8 + F2.10 shipped, **Tier 2 is 7/12 done**: F2.1, F2.2, F2.3, F2.4, F2.7, F2.8, F2.10, F2.12. Remaining (deferred): F2.5 SAST/lint as required hooks, F2.6 fastpace coach feedback loop, F2.9 customer-facing trust portal, F2.11 ROI tracking. Each remaining item depends on org-specific data sources or product-marketing surfaces and is intentionally left as future work.

### Tier-2 caveats (F2.7 + F2.8)
- F2.7 ships a deterministic in-process scenario harness — production-grade adversarial testing extends this with the org's specific threat model.
- F2.8 ships dry-run for all three providers + a stub live adapter that throws unless wired to a real API client. Real upload requires the org's API keys + the matching SDK.

## 0.14.0 — org dashboard + RBAC/SCIM/SSO scaffolding (F1.13 / F1.14) — Tier 1 complete

### Added
- **F1.13 self-hosted org dashboard.** `src/org-dashboard.js` builds a signed nightly summary per install (framework readiness, ADR coverage, correction rate, reliability score, audit-chain status, AI-attributed commits over last 30 days — no source code, no prompts, no responses). `ingestSummary` verifies the entry_hash and writes append-only under `fastpace/org-dashboard/<install_id>/<reported_at>.json`. `rollup()` returns the most recent summary per install + a fleet aggregate. CLI: `fastpace org summary | ingest <file> | rollup`. Architecturally complete; standalone-binary deploy (Node http server fronting these routes) documented as the next-step deploy pattern.
- **F1.14 RBAC + SCIM + SSO scaffolding.** `src/rbac.js` — four roles (`dev` / `team_lead` / `security` / `admin`) with a permission matrix. SCIM-shaped in-process provisioning at `fastpace/users.json` plus an append-only history at `.users-history.jsonl`. `applySamlAssertion` is a stub that consumes an *already-validated* SAML profile (production deploys wire `@node-saml/node-saml` in front to do XML signature verification — documented in the module). Auto-provision-on-first-SSO supported when `assertion.auto_provision: true`.
- **`fastpace users list|add|grant|deactivate|remove|roles`** — CLI surface.
- **Local UI: Org rollup + Users & roles views** in the Compliance sidebar (now **22 views**).
  - Org rollup: "seed with this repo" button, fleet aggregate card, per-install summaries with chain-status pills.
  - Users & roles: full role-permission matrix, add-user form (id / email / display name / role / external_id), per-user role select + deactivate + remove actions, SSO note explaining the SAML wiring.
- **API:** `GET /api/org/summary`, `GET /api/org/rollup`, `POST /api/org/ingest`, `POST /api/org/ingest-self`, `GET /api/users`, `POST /api/users`, `PUT /api/users/role`, `POST /api/users/deactivate`, `DELETE /api/users`.
- **`packages/fp/test/sprint12.test.js`** — 9 zero-dep smoke tests.

### Changed
- `fastpace help` lists `org` and `users` between `attest` and `uninstall`.
- 113/113 smoke tests pass across 12 test files.

### Tier-1 completion note
With F1.13 + F1.14 shipped, **Tier 1 is 15/15 complete**. Caveats:
- F1.13 ships as an in-process aggregator that the local UI reads directly. The standalone-binary deploy (a Node http server hosting `/api/org/ingest` + `/api/org/rollup`) is a thin wrapper around the existing module — documented but not a standalone npm package yet.
- F1.14 SSO ships as a SAML assertion-verifier stub. Production SSO requires `@node-saml/node-saml` (or equivalent) wired in front. The roles + SCIM-shaped provisioning + the assertion → user/role mapping are real and tested.

## 0.13.0 — org-scale primitives: NHI export, MCP scope mediation, sanctioned-install attestation (F1.5 / F1.7 / F1.12)

### Added
- **F1.5 NHI registry export.** `src/nhi.js` walks `.integrations.local.json`, `.claude/settings.json`, `.env`, `.env.local`, `.git/config` and produces a hashed roster (sha256 only — plaintext credentials are NEVER written) compatible with Astrix / Oasis / Entro NHI governance platforms. Dedups by hash so the same secret across multiple files is one entry with multiple sources.
- **`fastpace nhi list|export [--format csv|json]`** — CLI surface.
- **F1.7 MCP scope mediation.** `src/mcp-scope.js` + `assets/hooks/mcp-scope-mediator.js` (PreToolUse). Recognizes `mcp__<server>__<method>` tool calls and validates against `mcp.allowed_servers[]` + `per_server_scopes` (allowed_projects / allowed_repos / allowed_channels / allowed_actions / read_only). Action inference maps method names to coarse actions (read / create / update / delete / merge / comment).
- **`fastpace mcp list|check`** — list configured policy + check a hypothetical request.
- **F1.12 sanctioned-install attestation.** `src/attestation.js` cosigns a sanctioned-install record at `~/.fastpace/sanctioned-install.json` with both the F0.1 install identity AND an org-level Ed25519 key. Verifier checks both signatures + `expires_at`. Discovery scans (F0.3) use this to distinguish sanctioned installs from a developer's personal `npm i -g`.
- **`fastpace attest sign|show|verify|revoke`** — CLI surface. `sign` is the right surface for the cosign — it needs file access to the org private key, which never reaches the dashboard.
- **Local UI: NHIs / MCP scopes / Sanctioned install** views in the Compliance sidebar (now **20 views**). Per the user's three-lane discipline rule: every audit-related capability has a Compliance sidebar entry.
  - NHIs: detected list + JSON / CSV export buttons + per-row hashed_value, sources, last_seen.
  - MCP scopes: policy banner + per-server allowlists + a check-this-tool-call probe that calls `/api/mcp/check`.
  - Sanctioned install: status banner + verification breakdown (install signature + org signature + expiry) + revoke button + onboarding hint pointing at the CLI.
- **API:** `GET /api/nhi`, `GET /api/nhi/export?format=csv|json`, `GET /api/mcp`, `POST /api/mcp/check`, `GET /api/attestation`, `POST /api/attestation/verify`, `DELETE /api/attestation`.
- **`packages/fp/test/sprint11.test.js`** — 10 zero-dep smoke tests covering: NHI classifier on well-known shapes, NHI dedup-by-hash with multiple sources, NHI csv/json export round-trip, MCP tool name parser, MCP server allowlist + project/repo/action enforcement, MCP read_only blocks non-read methods, MCP empty policy = pass-through, attestation cosign happy path, tampered-body detection, expired-attestation rejection.

### Changed
- `fastpace help` lists `nhi`, `mcp`, and `attest` between `schema` and `uninstall`.
- `fastpace.config.yaml` schema gains `mcp.allowed_servers[]` + `mcp.per_server_scopes` and `hooks.mcp_scope_mediator.enabled`.
- `installer.js` registers `mcp-scope-mediator.js` as a `.*` PreToolUse hook.
- 104/104 smoke tests pass across 11 test files (added 10 for Sprint 11).

## 0.12.0 — explainability bundles + open audit schema (F2.2 / F2.12)

### Added
- **F2.2 explainability bundle per AI-generated change.** Sidecar at `<repo>/fastpace/explanations/<sha>.json` (or `<manifest_id>.json` when no commit yet) carrying the full "why did the AI generate this?" record: model · endpoint · runtime · params · prompt sha256 · response sha256 · retrieval_context[] · approval_chain[] · correction_events[]. Plaintext is **never** persisted — only hashes + byte lengths. Signed by F0.1.
- **`src/explanations.js`** — `writeExplanation`, `listExplanations`, `loadExplanation`, `findByCommit`, `verifyExplanation`. Same canonical-JSON + sha256 + Ed25519 envelope as the audit chain / run manifest / AI-BOM.
- **`fastpace explain record|show|list|verify`** — CLI surface. `record --sha <sha> [--prompt …] [--response …] [--retrieval <file>:<lines>...] [--reason "<note>"]`.
- **`verify-provenance` extended** — sixth proof layer: when an explanation exists for the commit sha, surface it (and run `verifyExplanation` on it) alongside the existing five layers.
- **F2.12 open audit schema.** New bundled doc `assets/docs/audit-schema.md` (sensitivity: public) is the canonical contract third-party tools build verifiers against. Covers crypto primitives, canonical JSON encoding, audit chain entry, run manifest, discovery manifest, AI-BOM, explanation bundle, provenance trailers, sensitivity tags, and the versioning policy.
- **`fastpace schema show|export [--out <dir>]`** — `show` prints the canonical doc (markdown or JSON-Schema bundle); `export` writes both forms to `<repo>/fastpace/docs/schema/`.
- **Local UI: Explanations view** in the Compliance sidebar. Record-an-explanation form, list with View JSON per row, signature/integrity verification on click. Backed by `GET /api/explanations`, `GET /api/explanations/get`, `POST /api/explanations/record`.
- **Local UI: Schema view** in the Compliance sidebar. Renders the audit-schema.md document with a source-path callout. Backed by `GET /api/schema`.
- **`packages/fp/test/explanations.test.js`** — 5 zero-dep smoke tests: hash + sign discipline, verify round-trip + tamper detection, listing newest-first, find-by-sha-prefix, plaintext-never-persisted regression check.

### Changed
- `fastpace help` lists `explain` and `schema` between `aibom` and `uninstall`.
- `verifyProvenance` result shape now includes `explanation` + `explanation_verification` + `layers.explanation` (additive — existing callers ignore unknown fields).
- 94/94 smoke tests pass across 10 test files (added 5 for F2.2; F2.12 covered by the existing schema show e2e path).

## 0.11.0 — AI Bill of Materials (F2.4)

### Added
- **F2.4 AI-BOM generation** — per-release `fastpace/aibom/<tag>-<ts>.json` aggregating every AI runtime invoked, training-opt-out status, total prompts, redaction events, correction events, AI-attributed commits, agent identity manifests, MCP services / integrations, and the F2.1 reliability score. CycloneDX-AI-flavored attestation envelope. Signed by the F0.1 install identity. Becomes the artifact for AI software supply chain alongside SBOMs.
- **`src/aibom.js`** — `generateAiBom(cwd, opts)`, `listAiBoms`, `loadAiBom`, `verifyAiBom` (recomputes `entry_hash` over canonical body, verifies signature against active F0.1 public key — returns ok=true with `signature_valid: false` when no verifier available, distinguishing integrity from authentication).
- **`fastpace aibom generate|list|show|verify`** — CLI surface. `generate [--since <iso>] [--release <tag>]` writes a new BOM; `list` enumerates; `show [--release <tag>]` prints latest or specified; `verify <path|tag>` validates signature + integrity.
- **Local UI: AI-BOM view** in the Compliance sidebar — generate form (release tag, since date), generated-BOMs list with View JSON / Verify per row, signed/unsigned pill, summary stats (components, calls, redactions, corrections, score). Backed by `GET /api/aibom`, `GET /api/aibom/get`, `POST /api/aibom/generate`, `POST /api/aibom/verify`.
- **Marketing site: Evidence section** updated. Added `AI-BOM v3 · CycloneDX-AI · 412 calls · score 87` line to the snapshot terminal capture, and a sixth bullet beat — "Per-release AI-BOM (F2.4)" — explaining the artifact's role.
- **Marketing site: /trust** — self-mapped framework coverage callout extended to mention F2.1 / F2.3 / F2.4 alongside the Tier-0 + Tier-1 primitives, plus a dedicated sentence about `fastpace aibom generate --release <tag>` as the per-release attestation envelope.
- **`packages/fp/test/aibom.test.js`** — 9 zero-dep smoke tests: envelope shape (CycloneDX-AI / specVersion / serialNumber / signed), version monotonic increment, components dedup-by-(model+runtime+endpoint), corrections + redactions counted in window, verify round-trip, tampered body detection, list newest-first, loadAiBom by release tag, installer fingerprint in metadata.

### Changed
- `fastpace help` lists `aibom` between `verify-provenance` and `uninstall`.
- `src/provenance.js` `execFileSync` calls now wrapped in `execFileSyncSilent` (captures stderr) so calling git in a non-git directory doesn't leak `fatal: not a git repository` to stderr.
- 89/89 smoke tests pass across 9 test files (added 9 for F2.4).

## 0.10.0 — provenance-signed commits + `fastpace verify-provenance` (F2.3)

### Added
- **F2.3 — provenance-signed commits.** AI-attributed commits carry RFC 5322-style trailers in their commit message: `AI-Model:`, `AI-Prompt-Hash:`, `AI-Manifest-Id:`, `AI-Approver:`, `AI-Agent:`, `AI-Audit-Seq:`. `fastpace verify-provenance <sha>` reconstructs the lineage end-to-end: commit → trailers → F1.1 manifest → manifest signature → F0.2 audit-chain link, with per-layer verified/broken status. Exits 0 (verified) / 1 (layer broken) / 2 (artifacts missing).
- **`src/provenance.js`** — `parseTrailers` (case-insensitive on read, refuses trailer-shaped lines without preceding blank line), `buildTrailers` (canonical key order, skips empty fields), `gitCommitInfo`, `gitListAiCommits`, `verifyProvenance`. Zero-dep beyond Node `child_process` for git invocations.
- **`src/commands/verify-provenance.js`** — top-level `fastpace verify-provenance <sha> [--json]` walks the lineage and prints a tree with per-layer ✓/✗ status.
- **`src/commands/provenance.js`** — management subcommands. `fastpace provenance list` prints recent AI-attributed commits with their trailers. `fastpace provenance prepare` sources fields from the most recent run manifest and prints a trailer block ready to pipe into `git commit -m "..." -m "$(fastpace provenance prepare)"`. `fastpace provenance check <sha>` aliases `verify-provenance`.
- **Local UI: Provenance view** in the Compliance sidebar — verify form (paste a sha, click Verify, see proof tree), recent AI-commits list with per-row "Verify this commit" buttons that auto-fill, "Help shape the next commit" trailer-block helper sourced from the latest manifest. Backed by `GET /api/provenance/recent`, `GET /api/provenance/verify?sha=<sha>`, `GET /api/provenance/prepare`.
- **Marketing site: Evidence section** updated. Added `fastpace verify-provenance` to the terminal capture's VERIFY block (now five layers: commit · trailers · manifest · signature · audit-link). Added a fifth bullet beat — "Per-commit provenance (F2.3)" — explaining the five-layer reconstruction.
- **`packages/fp/test/provenance.test.js`** — 10 zero-dep smoke tests covering: parseTrailers happy path, refusal of trailer-shaped block without leading blank line, only-trailers (no body), case-insensitive read, build+parse round-trip, gitCommitInfo, full end-to-end verify against a real git commit + signed manifest, broken-when-manifest-tampered, no-AI-trailers reports correctly, gitListAiCommits filters to AI-attributed only.

### Changed
- `fastpace help` lists `provenance` and `verify-provenance` between `reliability` and `uninstall`.
- 80/80 smoke tests pass across 8 test files (added 10 for F2.3).

## 0.9.0 — correction-event tracking + AI reliability score (F2.1)

### Added
- **F2.1 correction-event tracking + AI reliability score** — the strongest standalone differentiator wedge per the master roadmap: *"we measure when AI is wrong"*.
- **`src/corrections.js`** — module that records correction events, classifies severity (cosmetic / functional / security with auditor-readable rules — no ML), aggregates a 0–100 reliability score over a rolling window, and exposes per-agent / per-severity / top-files breakdowns. Returns `null` when there's no AI authorship to measure against rather than fabricating a number.
- **`assets/hooks/correction-detector.js`** — PostToolUse Edit/Write hook. Skips edits driven by an AI agent (those aren't corrections — they're authorship). For human edits, checks whether the file is recently AI-touched (via `fastpace/manifests/` mtime within 7 days as a proxy until F2.3 ships line-level provenance), classifies the change, appends to `fastpace/corrections.log`, and signs into the F0.2 audit chain.
- **`fastpace reliability score|list`** — CLI surface. `score` prints the headline number with breakdowns; `list` prints the chronological event log with severity filters.
- **Local UI: Reliability view** in the Compliance sidebar — score gauge with severity-coded color, by-severity / by-agent breakdowns, top-files list, recent-events tail. Backed by `GET /api/reliability` + `GET /api/reliability/list`.
- **Marketing site: Phase 3.3 "Reliability we measure" homepage section** between SafeEnablement and Guardrails. Score card + real `fastpace reliability score` capture + four explanation beats + framework anchors (NIST AI RMF MEASURE-2.5/3.2, ISO/IEC 42001 §9.1, EU AI Act Art. 15).
- **`packages/fp/test/corrections.test.js`** — 8 zero-dep smoke tests: classifier (security / cosmetic / functional), record-and-sign round-trip, list filters, score = null on fresh repo, score = 100 with manifests + zero corrections, score drops as corrections mount, breakdowns aggregate correctly, refuses entries without `file`.

### Changed
- `installer.js` registers `correction-detector.js` as a PostToolUse Write|Edit hook.
- `fastpace.config.yaml` schema gains `hooks.correction_detector.enabled` (default true).
- `fastpace help` lists `reliability` between `exception` and `uninstall`.
- 70/70 smoke tests pass across 7 test files (added 8 for F2.1).

## 0.8.0 — blast-radius, circuit breaker, agent ledger, exception workflow, coach (F1.2 / F1.3 / F1.4 / F1.8 / F1.9)

### Added
- **F1.2 blast-radius limits per session** — agent identity manifest gains `max_commands` and `max_duration_seconds`. The `agent-scope-guard` hook bumps a `commands` counter on Bash invocations and stamps `start_at` on the first call so duration enforcement works. Bundled agents pre-tagged with realistic caps. Defaults: 30 commands / 2 hours per session.
- **F1.3 circuit breaker** — `src/circuit-breaker.js` reads the prior 14 days of audit-chain entries, computes per-agent baseline (mean + stddev for files / commands / duration), stores it at `fastpace/.circuit-breaker/<agent>.json`. `checkDivergence` pauses when current ≥ 2.5× baseline mean on any metric. Refuses to fire below 3 sample sessions to avoid new-install false positives. Closes the 95% "couldn't detect a compromised agent" gap.
- **F1.4 agent action ledger** — `fastpace agents log [--agent <id>] [--since <iso>] [--limit N] [--json]` filters the F0.2 audit chain to entries whose summary carries an agent_id. Distinguishable from generic audit-log reading by tracking AGENT identity, not user. Plus `fastpace agents list` for scope summaries.
- **F1.8 exception workflow** — `src/exceptions.js` + `fastpace exception request|list|revoke`. Risk-tier classification: `low` (auto-pass), `medium` (self-approve), `critical / irreversible / exfil_eligible` (require explicit reviewer). Mandatory TTL. Stored append-only at `fastpace/exceptions.log`; every request + revoke also signed into the F0.2 audit chain. `findCovering(req)` lets hooks consult active exceptions.
- **F1.9 coach agent** — every block emitted by any hook now carries a structured coaching message + a pre-filled `fastpace exception request` command. The `_lib.js` `block(reason, ctx)` helper inlines the coach builder; `agent-scope-guard` passes the request shape so the coach is specific to that block.
- **Local UI: Sessions / Exceptions / Coach log views** in the Compliance sidebar (now 12 views total). Sessions: live counters vs limits + divergence indicator + Recompute baseline + End session controls. Exceptions: full request form (tool / path / command-pattern / agent / reason / TTL / risk_tier / reviewer) + active list with revoke + history. Coach log: chronological list of exception events.
- **Marketing site: Phase 3.4 "When something goes wrong" section** between Evidence and Guardrails on the homepage. Four-step scenario: blast-radius → circuit breaker → coach → exception with risk tier. AgentGovernance Scope card updated to mirror the real divergence + paused output.
- **API**: `GET /api/sessions`, `POST /api/sessions/clear`, `POST /api/sessions/baseline`, `GET /api/exceptions`, `POST /api/exceptions/request`, `POST /api/exceptions/revoke`, `GET /api/coach-log`.
- **`packages/fp/test/sprint6.test.js`** — 12 zero-dep smoke tests covering: max_commands and max_duration_seconds enforcement, fastpace agents log filtering, baseline compute + store + load, divergence detection (paused vs insufficient), exception requests for each risk tier, findCovering, revoke + expiry, coach message structure, and end-to-end agent-scope-guard block carrying coach + exception_command in JSON.

### Changed
- `fastpace help` lists `agents` and `exception` between `grant` and `uninstall`.
- 62/62 smoke tests pass across 6 test files (added 12 for sprint 6).

## 0.7.0 — run manifest signing + validated framework mapping (F1.1 / F1.15)

### Added
- **Run manifest signing (F1.1)** — every AI call writes a signed JSON receipt to `fastpace/manifests/<iso>-<short>.json` with model · endpoint · runtime · training-opt-out · prompt sha256 · response sha256 · prompt/response byte length · params · tool · phase · agent_id. Plaintext is never persisted; only digests. `src/run-manifest.js` exposes `writeRunManifest`, `listManifests`, `loadManifest`, `verifyManifest`. `signed_by` carries the F0.1 fingerprint so receipts re-verify against archived `public.pem` after a key rotation.
- **`assets/hooks/run-manifest-writer.js`** — PostToolUse hook that captures whatever runtime metadata the runner surfaces (Claude Code, Codex, Gemini CLI all use slightly different field names; we accept the union) and writes a manifest. Best-effort — missing fields recorded as `null` rather than skipping the receipt.
- **Validated framework mapping (F1.15)** — `assets/docs/framework-mapping.md`: NIST AI RMF · ISO/IEC 42001 · EU AI Act · SOC 2 · ISO 27001 · GDPR controls × every shipped fastpace primitive (F0.1, F0.2, F0.3, F0.4, F0.5, F0.6, F1.1, F1.6, F1.10, F1.11). Each row carries the artifact (audit log path, manifest path, command output) that demonstrates the control. Frontmatter declares `last_validated` + `status`. Single source of truth — `FrameworkMatrix` and other components are intended to source control IDs from here.
- **`src/framework-mapping.js`** — parser + summary helper. Prefers the user-editable copy at `<repo>/fastpace/docs/framework-mapping.md`; falls back to the bundled file.
- **Local UI: Run manifests view** — chronological list with filters by model + since + limit; click a row for full JSON + verification status. Backed by `GET /api/manifests` + `GET /api/manifests/get?id=<id>`.
- **Local UI: Framework mapping view** — summary card (source · primitive_count · framework_count · total_controls · last_validated · status) + per-framework filter pills + a per-primitive table with framework / control / maps_to / evidence columns. Backed by `GET /api/framework-mapping`.
- **Marketing site: Phase 3.2 "Evidence in seconds" section** between DiscoveryFirst and Guardrails on the homepage. Shows real `fastpace snapshot --since YYYY-MM-DD` output unpacking into context, ADRs, audit chain, manifests, discovery, framework map. Anchored against NIST AI RMF MEASURE-2.7, ISO 42001 §9.2, EU AI Act Art. 12, SOC 2 CC8.1.
- **Marketing site: `/trust`** — adds a "Self-mapped framework coverage" callout below the third-party attestations table. Distinguishes external certs (in flight) from the shipped framework-mapping doc.
- **`packages/fp/test/run-manifest.test.js`** — 9 zero-dep smoke tests: write+verify round-trip (signed and unsigned), tampered-body detection, filter by model + since + limit, archived-public.pem still verifies historical receipts after rotation, installer link in manifest, framework-mapping doc parse, summary aggregation, repo-copy preference.

### Changed
- `installer.js` registers `run-manifest-writer.js` as a PostToolUse `.*` hook, and copies bundled `assets/docs/*` into `<repo>/fastpace/docs/` on init (preserving any user edits).
- `fastpace.config.yaml` schema gains `hooks.run_manifest_writer.enabled` (default true).
- 50/50 smoke tests pass across 5 test files (added 9 for run-manifest + framework-mapping).

## 0.6.0 — agent identity, prompt redaction, least-privilege bootstrap (F0.4 / F0.5 / F1.6)

### Added
- **Agent identity & scope manifest (F0.4)** — every bundled agent in `assets/agents/<id>.md` carries frontmatter declaring `agent_id`, `allowed_tools`, `allowed_paths` (glob), `allowed_command_patterns` (regex), `max_files`, `max_tokens`. `src/agent-identity.js` exposes `loadAgentIdentities`, `getAgentIdentity`, `updateAgentFrontmatter`, `checkScope`, `globMatch`. The 6 bundled agents (planner, reviewer, prd-guru, erd-guru, execution-planner, doc-writer) are pre-tagged with realistic scopes.
- **`assets/hooks/agent-scope-guard.js`** — PreToolUse hook that resolves the active agent from hook input (accepts `metadata.agent`, `tool_input.agent`, `subagent_type`, etc.), looks up its identity manifest, and blocks any out-of-scope call. Per-session counters for `max_files` live at `fastpace/.agent-sessions/<agent>__<session>.json` and are bumped before the call fires so a buggy agent can't race past the cap.
- **Prompt redaction hook (F0.5)** — `assets/hooks/prompt-redactor.js` runs UserPromptSubmit. Strips secrets (mirrors `secret-scanner.js`'s patterns), strips PII (email, credit-card, SSN, phone — opt-out via `prompt_redactor.pii: false`), strips configurable PII keywords, and replaces references to F1.10-restricted context files with `[redacted: <path>]`. Every event is logged to `fastpace/redaction.log` with short hashes only — the log itself is redaction-safe. Returns `decision: "modify"` with `new_prompt`; `block_on_redact: true` flips it to a hard block instead.
- **`fastpace grant` (F1.6)** — least-privilege scope mutator. Subcommands: `list <agent>`, `tools|paths|cmds <agent> <values> [--reason]`, `max-files|max-tokens <agent> <N> [--reason]`, `revoke tools|paths|cmds <agent> <values>`. Every grant + revoke appends a signed entry to the F0.2 audit chain. Justification is recommended (warns when omitted).
- **Local UI: Agents view** in the Compliance sidebar — 6 agent cards × identity manifest, mini grant form (key + value + reason → POST `/api/agents/grant`).
- **Local UI: Redaction view** — total events, total hits, breakdowns by kind / by pattern, recent-event tail. Backed by `GET /api/redaction-log`.
- **`/api/agents`, `POST /api/agents/grant`, `GET /api/redaction-log`** — dashboard-facing routes.
- **Marketing site: `/agents` catalog page** (Phase 4.4) — 6 agent cards × real `.identity.yaml` frontmatter, with nav-links from the top nav and footer.
- **`packages/fp/test/agents.test.js`** — 11 zero-dep smoke tests: load identities, glob match (src/**, **/*.md, *.md, exact), checkScope decisions (tool / path / command / counters), deny-all policy, frontmatter round-trip, scope-guard hook block + allow, redactor strips secrets + PII, redactor passes clean, `fastpace grant` round-trip, `fastpace grant max-files`.

### Changed
- `fastpace.config.yaml` schema gains `agents.default_policy` (`bundled` default — backward-compatible — or `deny-all`) and `hooks.{runtime_guard, agent_scope_guard, prompt_redactor}.enabled` flags.
- `installer.js` registers `agent-scope-guard.js` as a PreToolUse `.*` hook and `prompt-redactor.js` as a UserPromptSubmit hook.
- `AgentGovernance` Identity card uses real reviewer config including `allowed_command_patterns`.
- `LethalTrifecta` legs 1 + 2 config snippets updated to real `prompt_redactor` and agent identity schemas.
- `Base.astro` adds an `Agents` link to the top nav and the footer.
- `fastpace help` lists `grant` between `audit` and `uninstall`.

## 0.5.0 — audit spine + sensitivity tagging (F0.2 / F1.10) + Sprint-3 local UI

### Added
- **Hash-chained, signed audit log (F0.2)** — every entry in `fastpace/audit.log` carries `seq`, `prev_hash`, `entry_hash`, and (when an F0.1 identity exists) an Ed25519 `signature`. Tampering breaks the chain at the modified line. `src/audit.js` exposes `appendEntry`, `verifyChain`, `migrate`, `readChain`, `canonicalJson`, `computeEntryHash` — zero deps beyond Node's `crypto`.
- **`fastpace verify`** — walks the chain, recomputes each `entry_hash`, checks the `prev_hash` linkage, verifies signatures against the active install identity. Flags: `--json`, `--path <p>`, `--key <pem>` (verify against an archived rotated key). Exits 0 if intact + signatures verify, 1 otherwise.
- **`fastpace audit migrate`** — upgrades a legacy JSONL audit log to the chain format. Backs up the original to `.audit-migrated-<ts>.bak.jsonl`, then rewrites with `seq` / `prev_hash` / `entry_hash` and signs each entry with the F0.1 identity.
- **`assets/hooks/audit-logger.js`** — rewritten to emit chain entries. Reads the previous chain head efficiently from a 64 KB tail of the log, computes `entry_hash`, and signs (best-effort — falls back to unsigned when no identity is available so it never refuses to log).
- **Sensitivity-tagged context (F1.10)** — files under `fastpace/context/` accept an optional YAML frontmatter `sensitivity:` key with values `public` | `internal` | `restricted`. `src/sensitivity.js` exposes `getSensitivity(path)`, `tagFrontmatter(path, level)`, `listContextFiles(cwd)`, `isIgnored(cwd, path)`. The bundled context-templates ship pre-tagged as `internal`. `restricted` files trigger a warning when not gitignored.
- **Local UI: Audit chain view** in the Compliance sidebar group — chain integrity status, signed/unsigned counts, last-entry summary, "Run verify" action. When the file is in legacy format, surfaces a one-click "Run audit migrate" CTA.
- **Local UI: Sensitivity view** in the Compliance sidebar group — counts by level, file × tag table, per-row select-and-save, banner warning when restricted files aren't gitignored.
- **`/api/audit/verify`, `POST /api/audit/migrate`, `/api/sensitivity` (GET + PUT)** — dashboard-facing routes that delegate to the same modules the CLI runs on.
- **`packages/fp/test/audit.test.js`** — 12 zero-dep smoke tests: canonical JSON stability, append + verify (signed and unsigned), tamper detection on body / removed line / forged signature, legacy migration, sensitivity read default / explicit / invalid, tag round-trip, invalid-level throw.

### Changed
- `fastpace help` lists `verify` and `audit` between `runtimes` and `uninstall`.
- `paths.js` adds `pollerLog: fastpace/poller.log`.
- `integrations/poller.js` writes operational diagnostics to `fastpace/poller.log` instead of `audit.log` — the audit log is the AI-tool ledger and any free-form line breaks the F0.2 chain.
- Bundled context-templates (`architecture.md`, `conventions.md`, `decisions.md`, `glossary.md`, `learnings.md`, `patterns.md`, `stack.md`) are now pre-tagged with `sensitivity: internal`.
- Marketing site: AgentGovernance Observability card now renders the real `fastpace verify` shape (chain integrity / signatures verified / unsigned entries / last-entry block) instead of a speculative mockup.

### Fixed
- `integrations/poller.js` no longer pollutes `audit.log` with operational JSON lines — its log lives at `fastpace/poller.log` from this version forward. Existing audit logs that mixed poller noise with tool entries should be migrated with `fastpace audit migrate` (the migrator skips and replaces unparseable lines safely).

## 0.4.0 — discovery manifest, inventory, approved-runtime registry (F0.3 / F0.6 / F1.11)

### Added
- **`fastpace inventory`** (F0.6) — cross-repo rollup of every agent, hook, runtime, MCP server, skill, and integration on this machine. Reads `~/.fastpace/manifest.json` and the per-repo manifests; refreshes the current repo before reading and prunes entries for deleted repos. Flags: `--json`, `--repo` (this repo only), `--source` (show provenance), `--no-refresh`, `--all`.
- **Discovery manifest** (F0.3) at two well-known paths:
  - `~/.fastpace/manifest.json` — machine-wide rollup carrying the install fingerprint, machine hint, fastpace version, and a deduped list of every fastpace repo on this host.
  - `<repo>/fastpace/manifest.json` — per-repo manifest listing detected agents, hooks, skills, runtimes, MCP servers, integrations, plus `last_activity_at` and `created_at`.
  Honours `FASTPACE_HOME` for the machine-wide path. Both files are written by `fastpace init` and refreshed by `fastpace update`.
- **`fastpace runtimes`** (F1.11) — manage the approved-runtime registry stored at `fastpace.config.yaml > runtimes.allowed[]`. Subcommands: `list`, `check <alias>` (exit 0 if allowed, 1 if not), `add <alias>`, `remove <alias>`, `note "<text>"`. Empty list = no policy; non-empty list activates the runtime-guard hook. Trailing `*` is a prefix match — `bedrock-*` allows every Bedrock runtime.
- **`assets/hooks/runtime-guard.js`** — PreToolUse hook that reads the runtime alias from input (`tool_input.runtime` / `tool_input.model_alias` / `metadata.runtime` / `FASTPACE_RUNTIME` env) and blocks the call when it isn't on the approved list. Empty list = always allow. Wired into `.claude/settings.json` by the installer.
- **`src/manifest.js`** — programmatic API (`buildRepoManifest`, `writeRepoManifest`, `loadMachineManifest`, `updateMachineManifest`, `pruneMissingRepos`, `touchManifests`).
- **`src/runtimes.js`** — programmatic API (`loadRuntimesPolicy`, `checkRuntime`, `addAllowed`, `removeAllowed`, `readRuntimeFromInput`).
- **`packages/fp/test/manifest.test.js`** — 9 zero-dep smoke tests covering manifest write/read, dedup, install-id stability across rotations, prune-missing-repos, runtime allow/block decisions, runtime add/remove round-trip, and two-repo aggregation.

### Changed
- `fastpace init` now writes the discovery manifest as part of its install path, and bootstraps the F0.1 Ed25519 identity if one doesn't exist on the machine yet (best-effort — CI without `FASTPACE_IDENTITY_DIR` continues with a null `install_id`).
- `fastpace update` refreshes the discovery manifest after copying skills/agents/hooks.
- `fastpace doctor` reports two new checks: runtime policy status (warn if no allow-list configured) and discovery manifest presence.
- `fastpace help` lists `inventory` and `runtimes` between `identity` and `uninstall`.
- `fastpace.config.yaml` schema gains `runtimes.allowed[]` and `runtimes.policy_note` keys (defaults: empty list, empty string — backwards compatible).
- `installer.js` registers `runtime-guard.js` as a `.*`-matcher PreToolUse hook in `.claude/settings.json`.
- Marketing site: new `DiscoveryFirst` homepage section between `AgentGovernance` and `Guardrails` showing real `fastpace inventory` output. Inventory card on `AgentGovernance` updated to match. `engineer-to-security-onepager.md` now lists discovery + inventory + runtime registry under "available today" with a real CLI snippet.

## 0.3.0 — cryptographic identity (F0.1)

### Added
- **`fastpace identity`** — manages a per-install Ed25519 keypair stored at `~/.fastpace/identity/` (override with `FASTPACE_IDENTITY_DIR`). Subcommands `show`, `rotate`, `revoke`, `sign <file>`, `verify <file> <sig>`. Private key is written with mode `0600`; the manifest captures `install_id`, fingerprint (`sha256:…`), creation timestamp, and status. Rotation archives the previous keypair under `archive/<iso>/` so artifacts signed by an older key keep verifying; revocation flips status and refuses future `sign()` calls. CI runners refuse to silently mint a persistent identity unless `FASTPACE_IDENTITY_DIR` is set or `--create` is passed; an ephemeral mode is available for per-job keys.
- **`src/identity.js`** — programmatic API (`getIdentity`, `signMessage`, `verifyMessage`, `rotateKey`, `revokeIdentity`, `fingerprintPublicKey`). Foundation primitive that F0.2 (hash-chained audit log), F0.4 (agent identity manifests), F1.1 (run manifest signing), F1.12 (sanctioned-install attestation), and F2.4 (AI-BOM) all sign against.
- **`packages/fp/test/identity.test.js`** — node-runnable smoke tests (zero deps): cold create, idempotent get, sign/verify round-trip, tamper rejection, rotation, revocation, CI guard, fingerprint stability.

### Changed
- `fastpace help` lists `identity` between `changelog` and `uninstall`.
- Marketing site: `AgentGovernance` section gains a small "Tier 0 in flight · sprint 1 / 6" badge while Tier 0 ships. The badge will be removed once F0.6 lands.

## 0.2.0 — developer power tools

### Added
- **`fastpace doctor`** — one-shot diagnostic. Checks Node version, config parseability, `.claude/` structure, skill/agent/hook install completeness, hook executability, foundation context files, orphan watch cards, git repo presence, and `.gitignore` posture for integration secrets. Exit 2 on failures, 0 on warnings-only. Complementary **`/fp-doctor`** skill runs the same checks inside Claude Code.
- **`fastpace search <query>`** — instant, local full-text search across `fastpace/context/`, `fastpace/docs/`, ADRs, and exec-plans with ranked `file:line` hits + 3-line context and term highlighting. No AI, no index required. Complementary **`/fp-search`** skill.
- **`fastpace why <path>[:line]`** — trace a file (or line) back to the PRDs / ERDs / ADRs / exec-plans that reference it, plus the introducing commit and recent touches. `git blame` on steroids, grounded in the fastpace brain. Complementary **`/fp-why`** skill.
- **`fastpace resume [slug]`** — one-liner that prints a watch card's state: phase chip strip + progress bar, branch diff vs base, next approval required, and the exact `/fp-new-feature <slug>` command to paste into Claude Code. Auto-picks the most recently updated in-flight card when no slug is given. Complementary **`/fp-resume`** skill.
- **`fastpace validate`** — lints PRDs / ERDs / plans against conventions: required sections, non-empty Security in ERDs, dead ADR links, stories > 16h, stories missing acceptance criteria, glossary-casing drift. Exit 1 on errors so CI can gate merges. Complementary **`/fp-validate`** skill.
- **`fastpace snapshot`** — bundles `fastpace/` into a reproducible `.tar.gz` with the git SHA + branch in the filename. Excludes `fastpace/.integrations.local.json` and promoted/rejected learning archives. For bug-hunting + handoff.
- **`fastpace pr-summary [slug|.]`** — drafts a PR body (Summary · Linked artifacts · Acceptance · Security · Rollout · Changes · Test plan) from the linked ERD + `git log <base>..<head>`. Prints to stdout so `gh pr create --body "$(fastpace pr-summary)"` works. Suggested conventional-commit title printed to stderr so it doesn't pollute the body. Complementary **`/fp-pr-summary`** skill.

### Changed
- `fastpace help` lists the new commands; `/fp-*` roster expanded with the six new skills.

## 0.1.0 — initial release

### Added
- **CLI** — `fastpace` (alias `fp`) with `init`, `update`, `ui`, `status`, `uninstall`, `help`.
- **Skills** — 14 skills loaded into `.claude/skills/`:
  `fp-init`, `fp-discover`, `fp-ask`, `fp-write-prd`, `fp-prd-to-erd`,
  `fp-erd-to-execplan`, `fp-new-feature`, `fp-review-pr`, `fp-remember`,
  `fp-write-adr`, `fp-teach`, `fp-customize`, `fp-status-report`,
  `fp-extract-learnings`.
- **Agents** — `planner`, `reviewer`, `prd-guru`, `erd-guru`, `execution-planner`, `doc-writer`.
- **Hooks** — `secret_scanner`, `push_guard`, `dangerous_command_guard`,
  `commit_validator`, `branch_guard`, `dependency_alert`, `audit_logger`.
- **Guardrails** — 9 config switches covering tests, review, security, branches, push, PRs.
- **Phases & approval gates** — per-phase role routing (`developer`, `team_lead`, `architect`, `skip`).
- **Context level** — L1–L5 ladder tracked in `fastpace.config.yaml`.
- **Local dashboard** — `fastpace ui` on `http://localhost:7777`. Views:
  Dashboard, In-flight, Config, Hooks, Phases & gates, Context,
  PRDs / ERDs / ADRs / Status reports, Execution plans, Integrations,
  Metrics, DORA & engineering, Learnings inbox, Install health.
- **Dashboard features** — cmd+K palette, persisted view, sidebar search + collapse,
  watch-card resume, per-plan inline sync, rendered markdown preview with source tab.
- **Execution plans** — waves / epics / stories with critical path, per-assignee workload,
  progress rings, collapse-all / expand-all, Jira / Linear sync.
- **Jira + Linear integrations** — per-repo config stored in `fastpace.config.yaml`,
  secrets in `fastpace/.integrations.local.json` (gitignored).
  Push epics + stories from fastpace to your PM tool; optionally parent under an
  initiative (Jira) or project (Linear).
- **DORA & engineering metrics** — computed from git history: deployment frequency,
  lead time for changes, change-failure rate, MTTR (proxy), plus token usage
  from `audit.log`.
- **Learnings inbox** — `/fp-extract-learnings` drafts candidates after a feature ships;
  dashboard Approve / Reject before they land in the append-only `learnings.md`.
- **Install health** — `fastpace status` + dashboard view to see what's installed.
- **Uninstall** — `fastpace uninstall` removes `.claude/`; `--all` also removes `fastpace/`.

### Notes
- Zero runtime npm dependencies in the CLI (hand-rolled YAML parser, native `http`).
- Works on Darwin / Linux / Windows · Node 18+.
- Your context, decisions, ADRs, and watch cards are **never touched** by upgrades.
