Skip to content

feat: multi-domain console vNext (workbench, self-hosted review, Kubernetes/Terraform replay) - #48

Merged
wonkwonlee merged 127 commits into
mainfrom
codex/multidomain-console-vnext
Jul 30, 2026
Merged

feat: multi-domain console vNext (workbench, self-hosted review, Kubernetes/Terraform replay)#48
wonkwonlee merged 127 commits into
mainfrom
codex/multidomain-console-vnext

Conversation

@wonkwonlee

Copy link
Copy Markdown
Owner

Summary

  • Cuts over to the vNext network workbench: static + interactive review canvas, accessible topology tables, WCAG contrast fixes, and responsive baselines.
  • Adds an authenticated self-hosted review workbench: durable review record store, OIDC-backed review resolution, receipt proof issuance, and durable recovery/authorship checks.
  • Adds Kubernetes and Terraform public replay workbenches with parity tests against their respective domains, plus replay examples.
  • Adds domain policy coverage exposure and runtime policy coverage validation.
  • Retires the legacy local review authority and the retired live rate limiter; hardens public/self-hosted client bundle verification and telemetry privacy.
  • Refreshes the shipped CLI bundle and public bundle baselines; adds Playwright e2e baselines for the workbench.

124 commits ahead of main. This branch previously carried PR #43 (docs-only, merged); this PR covers the full vNext implementation that has accumulated since.

Test plan

  • CI: full gate (lint, typecheck, test, build)
  • CI: Playwright e2e (workbench baselines)
  • CI: Action self-test
  • CI: corpus + gallery currency
  • CI: client-bundle secret check
  • Manual review of the authenticated self-hosted review path against the safety invariants in CLAUDE.md (no execution path, LLM never decides approval, append-only ledger)

🤖 Generated with Claude Code

@vercel

vercel Bot commented Jul 30, 2026

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Actions Updated (UTC)
change-safe Ready Ready Preview Jul 30, 2026 6:14pm

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: ca1d53149e

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment thread features/domains/runtime.ts
Comment thread components/SelfHostedReviewWorkbench.tsx
wonkwonlee and others added 3 commits July 30, 2026 14:02
Merging origin/main (#47) renamed ScenarioDefinition.bundle to .input and
scenario.title to .label, and split fixtures out as nullable. Update the
public reviews/analyze route, ReviewWorkbenchShell, and the durable review
store test to the new shape.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
…narios reorg

Merging origin/main pulled in scenarios/index.ts's unified registry, which
resolves every domain (network, terraform, kubernetes) through
scenarios/domains.ts at module scope. Any importer — including
app/page.tsx's Network workbench — therefore pulled in
@changesafe/domain-terraform and @changesafe/domain-kubernetes too,
violating the per-route bundle boundary enforced by
tests/unit/workbench-performance-boundaries.test.ts.

Add scenarios/network.ts as a self-contained, network-only scenario
registry (no dependency on scenarios/domains.ts), have scenarios/index.ts
compose SCENARIOS from it instead of duplicating the definitions, and
repoint the Network route's browser-reachable consumers
(ReviewWorkbenchShell, features/domains/network/examples) at it directly.
Update the remaining test files for the renamed ScenarioDefinition fields
(.bundle -> .input, .title -> .label) and the hardcoded pre-reorg fixture
paths in packages/server/tests/reviews.test.ts.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
@wonkwonlee
wonkwonlee merged commit c128d2d into main Jul 30, 2026
9 checks passed
@wonkwonlee
wonkwonlee deleted the codex/multidomain-console-vnext branch July 30, 2026 18:18
wonkwonlee added a commit that referenced this pull request Jul 31, 2026
…vel depth (#51)

* feat: multi-domain console vNext (workbench, self-hosted review, Kubernetes/Terraform replay) (#48)

* feat: add app review contract schemas

* fix: validate contract version mismatches

* test: pin network regression baseline

* test: probe blocked simulation directly

* test: guard core domain presentation boundaries

* feat(ui): add semantic design tokens

* feat(ui): add static review workbench shell

* test: guard design token regex captures

* fix(ui): ground static shell in replay fixture

* feat(ui): expose public replay workbench route

* test(ui): baseline workbench responsive semantics

* feat(ui): disclose workbench runtime variants

* fix(ui): distinguish queue review-record storage

* test(e2e): baseline public workbench

* test(e2e): harden workbench static boundary

* test(e2e): intercept workbench data requests

* test(e2e): add workbench visual baseline

* test(e2e): make workbench baseline portable

* test(e2e): add platform-specific workbench baselines

* feat: add v1 domain review transport contracts

* fix: enforce review risk and replay fallback contracts

* feat: add closed domain runtime registry

* fix: compose immutable session capabilities

* fix: source durability from transport capability

* feat: add pure review workflow controller

* fix: correlate review controller attempts

* fix: bind review input identity at initialization

* feat: add v1 review analyze API contracts

* feat: add registry-backed review analyze route

* feat: add review controller React hook

* fix: bind hook results to active attempts

* refactor: lazily load domain runtimes

* feat: complete review controller lifecycle

* fix: bind receipts to active review workflow

* fix: bind receipt identity provenance

* feat: expose review hook lifecycle actions

* fix: validate review rebind before abort

* feat: add public replay review transport

* refactor: isolate review API contracts

* feat: add network review examples

* feat: compose network review receipts

* feat: publish network policy version in examples

* fix: bind receipts to session policy version

* fix: version review policy binding contract

* feat: add network workflow compatibility facade

* fix: bind legacy analyses to review session

* fix: bind replay responses to requested fixture

* fix: bind replay provenance to requested fixture

* test: reject authored synthetic fixture substitution

* feat: make network workbench replay interactive

* fix: improve workbench replay accessibility

* fix: mark review canvas busy during replay

* test: prove network review parity

* test: bind parity provenance to fixtures

* test: prove workbench replay provenance

* test: make workbench route assertion order-insensitive

* feat: add Terraform replay examples

* feat: resolve Terraform public replay

* fix: bundle Terraform replay context safely

* feat: add Terraform public replay workbench

* test: prove Terraform replay parity

* fix: keep public replay decision-free

* fix: preserve legacy network review lifecycle

* test: distinguish durable review hook sessions

* feat: add Kubernetes replay examples

* test: prove Kubernetes replay derivation

* fix: isolate Kubernetes YAML parser boundary

* fix: isolate kubernetes offline metadata

* feat: resolve Kubernetes public replays

* fix: load Kubernetes runtime through offline boundary

* feat: add Kubernetes public replay workbench

* fix: match Kubernetes selectors against pod labels

* test: prove Kubernetes public replay parity

* feat: add durable review proof contracts

* fix: bind durable intake and receipt proofs

* fix: verify durable records before persistence

* feat: add durable review record store

* fix: harden durable review store integrity

* fix: block durable review replace conflicts

* fix: guard explicit durable review sequence replacement

* fix: migrate durable review conflict trigger

* feat: split pending durable review resolution

* feat: split durable review pending records

* fix: bind durable resolution to parent at database boundary

* feat: add authenticated durable review endpoints

* fix: scope durable review intake provenance

* fix: isolate durable review owner identities

* fix: migrate ownerless durable review schema

* fix: quarantine ownerless review migrations

* fix: preserve exact durable review migrations

* feat: resolve durable reviews server-side

* fix: serialize durable receipt issuance

* fix: harden durable decision claim lifecycle

* feat: expose durable receipt proof

* fix: verify durable recovery authorship

* fix: expose corrupted receipt proof evidence

* feat: add authenticated self-hosted workbench

* fix: harden self-hosted workbench state

* feat: expose domain policy coverage

* feat: document future domain capability boundary

* fix: validate runtime policy coverage metadata

* feat: add accessible network topology tables

* fix: enforce client telemetry privacy

* fix: close client telemetry bypasses

* feat: harden public workbench accessibility

* fix: meet WCAG contrast for muted text

* fix: harden large workbench evidence

* fix: close public workbench review gaps

* test: close domain route family gaps

* test: enforce public client bundle budgets

* fix: harden public client bundle verification

* fix: scan every emitted client chunk

* fix: guard self-hosted client dependencies

* feat: cut over to vnext network workbench

* docs: align operator guidance with vnext workbench

* chore: remove retired live rate limiter

* docs: correct vnext release references

* refactor: retire legacy local review authority

* build: refresh shipped CLI bundle

* test: keep Action self-test fixtures available

* docs: refresh public bundle baselines

* chore: complete multidomain console ultragoal

* Create 2026-07-29-multidomain-console-vnext-g001.md

* fix: adapt vNext scenario consumers to the reorganized scenarios API

Merging origin/main (#47) renamed ScenarioDefinition.bundle to .input and
scenario.title to .label, and split fixtures out as nullable. Update the
public reviews/analyze route, ReviewWorkbenchShell, and the durable review
store test to the new shape.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>

* fix: restore the Network route's domain bundle boundary after the scenarios reorg

Merging origin/main pulled in scenarios/index.ts's unified registry, which
resolves every domain (network, terraform, kubernetes) through
scenarios/domains.ts at module scope. Any importer — including
app/page.tsx's Network workbench — therefore pulled in
@changesafe/domain-terraform and @changesafe/domain-kubernetes too,
violating the per-route bundle boundary enforced by
tests/unit/workbench-performance-boundaries.test.ts.

Add scenarios/network.ts as a self-contained, network-only scenario
registry (no dependency on scenarios/domains.ts), have scenarios/index.ts
compose SCENARIOS from it instead of duplicating the definitions, and
repoint the Network route's browser-reachable consumers
(ReviewWorkbenchShell, features/domains/network/examples) at it directly.
Update the remaining test files for the renamed ScenarioDefinition fields
(.bundle -> .input, .title -> .label) and the hardcoded pre-reorg fixture
paths in packages/server/tests/reviews.test.ts.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>

---------

Co-authored-by: Claude Sonnet 5 <noreply@anthropic.com>

* fix: restore multidomain workbench navigation

* docs: design spec for scenario corpus expansion (Terraform + Kubernetes parity)

Plans 12 new scenarios to bring Terraform and Kubernetes coverage up to
Network's existing risk-level and policy-surface depth.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>

* docs: implementation plan for scenario corpus expansion

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>

* feat(scenarios): wire terraform context field through the scenario harness

* feat(scenarios): add scenario-n-stateless-replace (terraform, MEDIUM)

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>

* feat(scenarios): add scenario-o-stateful-replace-backed-up (terraform, MEDIUM)

* feat(scenarios): add scenario-p-injected-pr-context (terraform, CRITICAL, adversarial)

* feat(scenarios): add scenario-t-blast-radius-drift (terraform, HIGH)

* feat(scenarios): add scenario-u-unrecorded-prior-state (terraform, CRITICAL, adversarial)

* feat(scenarios): add scenario-q-safe-scale-up (kubernetes, LOW)

* feat(scenarios): add scenario-r-partial-replica-reduction (kubernetes, MEDIUM)

* feat(scenarios): add scenario-s-privileged-injection (kubernetes, CRITICAL, adversarial)

* feat(scenarios): add scenario-v-protected-config-change (kubernetes, CRITICAL)

* feat(scenarios): add scenario-w-mutable-image-tag (kubernetes, HIGH)

* feat(scenarios): add scenario-x-missing-verification (kubernetes, MEDIUM)

* feat(scenarios): add scenario-y-rollback-does-not-restore (kubernetes, CRITICAL, adversarial)

* fix(scenarios): tighten scenario-y teaches narrative to lead with rollback gap

* fix(cli): wire terraform context field through scenario check

checkOne called domain.parseInput with only the raw incident JSON, so the
terraform domain's context (used for UNTRUSTED_INSTRUCTION detection) was
always dropped on the CLI path even though the test-harness registry
already forwarded it, letting scenario-p-injected-pr-context silently pass
CI's corpus-check job with the wrong verdict.

* docs(scenarios): document terraform context field, polish scenario-o narrative

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>

* fix: address PR 51 review feedback

---------

Co-authored-by: Claude Sonnet 5 <noreply@anthropic.com>
wonkwonlee added a commit that referenced this pull request Jul 31, 2026
* feat: multi-domain console vNext (workbench, self-hosted review, Kubernetes/Terraform replay) (#48)

* feat: add app review contract schemas

* fix: validate contract version mismatches

* test: pin network regression baseline

* test: probe blocked simulation directly

* test: guard core domain presentation boundaries

* feat(ui): add semantic design tokens

* feat(ui): add static review workbench shell

* test: guard design token regex captures

* fix(ui): ground static shell in replay fixture

* feat(ui): expose public replay workbench route

* test(ui): baseline workbench responsive semantics

* feat(ui): disclose workbench runtime variants

* fix(ui): distinguish queue review-record storage

* test(e2e): baseline public workbench

* test(e2e): harden workbench static boundary

* test(e2e): intercept workbench data requests

* test(e2e): add workbench visual baseline

* test(e2e): make workbench baseline portable

* test(e2e): add platform-specific workbench baselines

* feat: add v1 domain review transport contracts

* fix: enforce review risk and replay fallback contracts

* feat: add closed domain runtime registry

* fix: compose immutable session capabilities

* fix: source durability from transport capability

* feat: add pure review workflow controller

* fix: correlate review controller attempts

* fix: bind review input identity at initialization

* feat: add v1 review analyze API contracts

* feat: add registry-backed review analyze route

* feat: add review controller React hook

* fix: bind hook results to active attempts

* refactor: lazily load domain runtimes

* feat: complete review controller lifecycle

* fix: bind receipts to active review workflow

* fix: bind receipt identity provenance

* feat: expose review hook lifecycle actions

* fix: validate review rebind before abort

* feat: add public replay review transport

* refactor: isolate review API contracts

* feat: add network review examples

* feat: compose network review receipts

* feat: publish network policy version in examples

* fix: bind receipts to session policy version

* fix: version review policy binding contract

* feat: add network workflow compatibility facade

* fix: bind legacy analyses to review session

* fix: bind replay responses to requested fixture

* fix: bind replay provenance to requested fixture

* test: reject authored synthetic fixture substitution

* feat: make network workbench replay interactive

* fix: improve workbench replay accessibility

* fix: mark review canvas busy during replay

* test: prove network review parity

* test: bind parity provenance to fixtures

* test: prove workbench replay provenance

* test: make workbench route assertion order-insensitive

* feat: add Terraform replay examples

* feat: resolve Terraform public replay

* fix: bundle Terraform replay context safely

* feat: add Terraform public replay workbench

* test: prove Terraform replay parity

* fix: keep public replay decision-free

* fix: preserve legacy network review lifecycle

* test: distinguish durable review hook sessions

* feat: add Kubernetes replay examples

* test: prove Kubernetes replay derivation

* fix: isolate Kubernetes YAML parser boundary

* fix: isolate kubernetes offline metadata

* feat: resolve Kubernetes public replays

* fix: load Kubernetes runtime through offline boundary

* feat: add Kubernetes public replay workbench

* fix: match Kubernetes selectors against pod labels

* test: prove Kubernetes public replay parity

* feat: add durable review proof contracts

* fix: bind durable intake and receipt proofs

* fix: verify durable records before persistence

* feat: add durable review record store

* fix: harden durable review store integrity

* fix: block durable review replace conflicts

* fix: guard explicit durable review sequence replacement

* fix: migrate durable review conflict trigger

* feat: split pending durable review resolution

* feat: split durable review pending records

* fix: bind durable resolution to parent at database boundary

* feat: add authenticated durable review endpoints

* fix: scope durable review intake provenance

* fix: isolate durable review owner identities

* fix: migrate ownerless durable review schema

* fix: quarantine ownerless review migrations

* fix: preserve exact durable review migrations

* feat: resolve durable reviews server-side

* fix: serialize durable receipt issuance

* fix: harden durable decision claim lifecycle

* feat: expose durable receipt proof

* fix: verify durable recovery authorship

* fix: expose corrupted receipt proof evidence

* feat: add authenticated self-hosted workbench

* fix: harden self-hosted workbench state

* feat: expose domain policy coverage

* feat: document future domain capability boundary

* fix: validate runtime policy coverage metadata

* feat: add accessible network topology tables

* fix: enforce client telemetry privacy

* fix: close client telemetry bypasses

* feat: harden public workbench accessibility

* fix: meet WCAG contrast for muted text

* fix: harden large workbench evidence

* fix: close public workbench review gaps

* test: close domain route family gaps

* test: enforce public client bundle budgets

* fix: harden public client bundle verification

* fix: scan every emitted client chunk

* fix: guard self-hosted client dependencies

* feat: cut over to vnext network workbench

* docs: align operator guidance with vnext workbench

* chore: remove retired live rate limiter

* docs: correct vnext release references

* refactor: retire legacy local review authority

* build: refresh shipped CLI bundle

* test: keep Action self-test fixtures available

* docs: refresh public bundle baselines

* chore: complete multidomain console ultragoal

* Create 2026-07-29-multidomain-console-vnext-g001.md

* fix: adapt vNext scenario consumers to the reorganized scenarios API

Merging origin/main (#47) renamed ScenarioDefinition.bundle to .input and
scenario.title to .label, and split fixtures out as nullable. Update the
public reviews/analyze route, ReviewWorkbenchShell, and the durable review
store test to the new shape.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>

* fix: restore the Network route's domain bundle boundary after the scenarios reorg

Merging origin/main pulled in scenarios/index.ts's unified registry, which
resolves every domain (network, terraform, kubernetes) through
scenarios/domains.ts at module scope. Any importer — including
app/page.tsx's Network workbench — therefore pulled in
@changesafe/domain-terraform and @changesafe/domain-kubernetes too,
violating the per-route bundle boundary enforced by
tests/unit/workbench-performance-boundaries.test.ts.

Add scenarios/network.ts as a self-contained, network-only scenario
registry (no dependency on scenarios/domains.ts), have scenarios/index.ts
compose SCENARIOS from it instead of duplicating the definitions, and
repoint the Network route's browser-reachable consumers
(ReviewWorkbenchShell, features/domains/network/examples) at it directly.
Update the remaining test files for the renamed ScenarioDefinition fields
(.bundle -> .input, .title -> .label) and the hardcoded pre-reorg fixture
paths in packages/server/tests/reviews.test.ts.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>

---------

Co-authored-by: Claude Sonnet 5 <noreply@anthropic.com>

* fix: restore multidomain workbench navigation

* docs: design spec for scenario corpus expansion (Terraform + Kubernetes parity)

Plans 12 new scenarios to bring Terraform and Kubernetes coverage up to
Network's existing risk-level and policy-surface depth.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>

* docs: implementation plan for scenario corpus expansion

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>

* feat(scenarios): wire terraform context field through the scenario harness

* feat(scenarios): add scenario-n-stateless-replace (terraform, MEDIUM)

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>

* feat(scenarios): add scenario-o-stateful-replace-backed-up (terraform, MEDIUM)

* feat(scenarios): add scenario-p-injected-pr-context (terraform, CRITICAL, adversarial)

* feat(scenarios): add scenario-t-blast-radius-drift (terraform, HIGH)

* feat(scenarios): add scenario-u-unrecorded-prior-state (terraform, CRITICAL, adversarial)

* feat(scenarios): add scenario-q-safe-scale-up (kubernetes, LOW)

* feat(scenarios): add scenario-r-partial-replica-reduction (kubernetes, MEDIUM)

* feat(scenarios): add scenario-s-privileged-injection (kubernetes, CRITICAL, adversarial)

* feat(scenarios): add scenario-v-protected-config-change (kubernetes, CRITICAL)

* feat(scenarios): add scenario-w-mutable-image-tag (kubernetes, HIGH)

* feat(scenarios): add scenario-x-missing-verification (kubernetes, MEDIUM)

* feat(scenarios): add scenario-y-rollback-does-not-restore (kubernetes, CRITICAL, adversarial)

* fix(scenarios): tighten scenario-y teaches narrative to lead with rollback gap

* fix(cli): wire terraform context field through scenario check

checkOne called domain.parseInput with only the raw incident JSON, so the
terraform domain's context (used for UNTRUSTED_INSTRUCTION detection) was
always dropped on the CLI path even though the test-harness registry
already forwarded it, letting scenario-p-injected-pr-context silently pass
CI's corpus-check job with the wrong verdict.

* docs(scenarios): document terraform context field, polish scenario-o narrative

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>

* docs: design spec for portfolio case studies document

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>

* docs: implementation plan for portfolio case studies document

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>

* docs: add portfolio case studies document

* docs: address PR 52 review feedback

* docs: target terraform scenario checks

---------

Co-authored-by: Claude Sonnet 5 <noreply@anthropic.com>
wonkwonlee added a commit that referenced this pull request Jul 31, 2026
* feat: multi-domain console vNext (workbench, self-hosted review, Kubernetes/Terraform replay) (#48)

* feat: add app review contract schemas

* fix: validate contract version mismatches

* test: pin network regression baseline

* test: probe blocked simulation directly

* test: guard core domain presentation boundaries

* feat(ui): add semantic design tokens

* feat(ui): add static review workbench shell

* test: guard design token regex captures

* fix(ui): ground static shell in replay fixture

* feat(ui): expose public replay workbench route

* test(ui): baseline workbench responsive semantics

* feat(ui): disclose workbench runtime variants

* fix(ui): distinguish queue review-record storage

* test(e2e): baseline public workbench

* test(e2e): harden workbench static boundary

* test(e2e): intercept workbench data requests

* test(e2e): add workbench visual baseline

* test(e2e): make workbench baseline portable

* test(e2e): add platform-specific workbench baselines

* feat: add v1 domain review transport contracts

* fix: enforce review risk and replay fallback contracts

* feat: add closed domain runtime registry

* fix: compose immutable session capabilities

* fix: source durability from transport capability

* feat: add pure review workflow controller

* fix: correlate review controller attempts

* fix: bind review input identity at initialization

* feat: add v1 review analyze API contracts

* feat: add registry-backed review analyze route

* feat: add review controller React hook

* fix: bind hook results to active attempts

* refactor: lazily load domain runtimes

* feat: complete review controller lifecycle

* fix: bind receipts to active review workflow

* fix: bind receipt identity provenance

* feat: expose review hook lifecycle actions

* fix: validate review rebind before abort

* feat: add public replay review transport

* refactor: isolate review API contracts

* feat: add network review examples

* feat: compose network review receipts

* feat: publish network policy version in examples

* fix: bind receipts to session policy version

* fix: version review policy binding contract

* feat: add network workflow compatibility facade

* fix: bind legacy analyses to review session

* fix: bind replay responses to requested fixture

* fix: bind replay provenance to requested fixture

* test: reject authored synthetic fixture substitution

* feat: make network workbench replay interactive

* fix: improve workbench replay accessibility

* fix: mark review canvas busy during replay

* test: prove network review parity

* test: bind parity provenance to fixtures

* test: prove workbench replay provenance

* test: make workbench route assertion order-insensitive

* feat: add Terraform replay examples

* feat: resolve Terraform public replay

* fix: bundle Terraform replay context safely

* feat: add Terraform public replay workbench

* test: prove Terraform replay parity

* fix: keep public replay decision-free

* fix: preserve legacy network review lifecycle

* test: distinguish durable review hook sessions

* feat: add Kubernetes replay examples

* test: prove Kubernetes replay derivation

* fix: isolate Kubernetes YAML parser boundary

* fix: isolate kubernetes offline metadata

* feat: resolve Kubernetes public replays

* fix: load Kubernetes runtime through offline boundary

* feat: add Kubernetes public replay workbench

* fix: match Kubernetes selectors against pod labels

* test: prove Kubernetes public replay parity

* feat: add durable review proof contracts

* fix: bind durable intake and receipt proofs

* fix: verify durable records before persistence

* feat: add durable review record store

* fix: harden durable review store integrity

* fix: block durable review replace conflicts

* fix: guard explicit durable review sequence replacement

* fix: migrate durable review conflict trigger

* feat: split pending durable review resolution

* feat: split durable review pending records

* fix: bind durable resolution to parent at database boundary

* feat: add authenticated durable review endpoints

* fix: scope durable review intake provenance

* fix: isolate durable review owner identities

* fix: migrate ownerless durable review schema

* fix: quarantine ownerless review migrations

* fix: preserve exact durable review migrations

* feat: resolve durable reviews server-side

* fix: serialize durable receipt issuance

* fix: harden durable decision claim lifecycle

* feat: expose durable receipt proof

* fix: verify durable recovery authorship

* fix: expose corrupted receipt proof evidence

* feat: add authenticated self-hosted workbench

* fix: harden self-hosted workbench state

* feat: expose domain policy coverage

* feat: document future domain capability boundary

* fix: validate runtime policy coverage metadata

* feat: add accessible network topology tables

* fix: enforce client telemetry privacy

* fix: close client telemetry bypasses

* feat: harden public workbench accessibility

* fix: meet WCAG contrast for muted text

* fix: harden large workbench evidence

* fix: close public workbench review gaps

* test: close domain route family gaps

* test: enforce public client bundle budgets

* fix: harden public client bundle verification

* fix: scan every emitted client chunk

* fix: guard self-hosted client dependencies

* feat: cut over to vnext network workbench

* docs: align operator guidance with vnext workbench

* chore: remove retired live rate limiter

* docs: correct vnext release references

* refactor: retire legacy local review authority

* build: refresh shipped CLI bundle

* test: keep Action self-test fixtures available

* docs: refresh public bundle baselines

* chore: complete multidomain console ultragoal

* Create 2026-07-29-multidomain-console-vnext-g001.md

* fix: adapt vNext scenario consumers to the reorganized scenarios API

Merging origin/main (#47) renamed ScenarioDefinition.bundle to .input and
scenario.title to .label, and split fixtures out as nullable. Update the
public reviews/analyze route, ReviewWorkbenchShell, and the durable review
store test to the new shape.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>

* fix: restore the Network route's domain bundle boundary after the scenarios reorg

Merging origin/main pulled in scenarios/index.ts's unified registry, which
resolves every domain (network, terraform, kubernetes) through
scenarios/domains.ts at module scope. Any importer — including
app/page.tsx's Network workbench — therefore pulled in
@changesafe/domain-terraform and @changesafe/domain-kubernetes too,
violating the per-route bundle boundary enforced by
tests/unit/workbench-performance-boundaries.test.ts.

Add scenarios/network.ts as a self-contained, network-only scenario
registry (no dependency on scenarios/domains.ts), have scenarios/index.ts
compose SCENARIOS from it instead of duplicating the definitions, and
repoint the Network route's browser-reachable consumers
(ReviewWorkbenchShell, features/domains/network/examples) at it directly.
Update the remaining test files for the renamed ScenarioDefinition fields
(.bundle -> .input, .title -> .label) and the hardcoded pre-reorg fixture
paths in packages/server/tests/reviews.test.ts.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>

---------

Co-authored-by: Claude Sonnet 5 <noreply@anthropic.com>

* fix: restore multidomain workbench navigation

* docs: design spec for scenario corpus expansion (Terraform + Kubernetes parity)

Plans 12 new scenarios to bring Terraform and Kubernetes coverage up to
Network's existing risk-level and policy-surface depth.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>

* docs: implementation plan for scenario corpus expansion

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>

* feat(scenarios): wire terraform context field through the scenario harness

* feat(scenarios): add scenario-n-stateless-replace (terraform, MEDIUM)

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>

* feat(scenarios): add scenario-o-stateful-replace-backed-up (terraform, MEDIUM)

* feat(scenarios): add scenario-p-injected-pr-context (terraform, CRITICAL, adversarial)

* feat(scenarios): add scenario-t-blast-radius-drift (terraform, HIGH)

* feat(scenarios): add scenario-u-unrecorded-prior-state (terraform, CRITICAL, adversarial)

* feat(scenarios): add scenario-q-safe-scale-up (kubernetes, LOW)

* feat(scenarios): add scenario-r-partial-replica-reduction (kubernetes, MEDIUM)

* feat(scenarios): add scenario-s-privileged-injection (kubernetes, CRITICAL, adversarial)

* feat(scenarios): add scenario-v-protected-config-change (kubernetes, CRITICAL)

* feat(scenarios): add scenario-w-mutable-image-tag (kubernetes, HIGH)

* feat(scenarios): add scenario-x-missing-verification (kubernetes, MEDIUM)

* feat(scenarios): add scenario-y-rollback-does-not-restore (kubernetes, CRITICAL, adversarial)

* fix(scenarios): tighten scenario-y teaches narrative to lead with rollback gap

* fix(cli): wire terraform context field through scenario check

checkOne called domain.parseInput with only the raw incident JSON, so the
terraform domain's context (used for UNTRUSTED_INSTRUCTION detection) was
always dropped on the CLI path even though the test-harness registry
already forwarded it, letting scenario-p-injected-pr-context silently pass
CI's corpus-check job with the wrong verdict.

* docs(scenarios): document terraform context field, polish scenario-o narrative

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>

* docs: design spec for portfolio case studies document

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>

* docs: implementation plan for portfolio case studies document

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>

* docs: add portfolio case studies document

* docs: design spec for workbench case-study deep links

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>

* docs: resolve terraform fixture-registry, contract-version, and Suspense questions

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>

* docs: implementation plan for workbench case-study deep links

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>

* feat(workbench): add caseStudy field to review example descriptor

* feat(workbench): add scenario-p-injected-pr-context as a terraform public-replay fixture

* chore(cli): rebuild bundled CLI to pick up caseStudy schema field

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>

* feat(workbench): add useScenarioDeepLink hook, cover components/ in vitest

vitest.config.ts's test.include had no glob for components/**, so the new
hook's unit test (and any future component-colocated test) would silently
never run under `npm test`. Add components/**/*.test.ts alongside the
existing tests/unit, tests/integration, and packages/*/tests entries.

* feat(workbench): add CaseStudyBadge component

* feat(workbench): wire scenario deep links and case-study badges into the Network workbench

* feat(workbench): wire scenario deep links and case-study badges into the Terraform workbench

* feat(workbench): wire scenario deep links into the Kubernetes workbench for consistency

* test(e2e): cover the four case-study deep links and fallback behavior

* fix(workbench): stop useScenarioDeepLink from triggering an RSC fetch per click

useSearchParams() forces the Network/Terraform/Kubernetes workbench pages
into dynamic rendering, so router.replace() in setScenarioInUrl was
issuing a real GET fetch for the route's RSC payload on every scenario
selection, even though the URL update is purely cosmetic (making the
selection copy-able) and nothing server-rendered depends on it. This broke
the three "no data requests" e2e assertions in workbench.spec.ts,
terraform-workbench.spec.ts, and kubernetes-workbench.spec.ts.

Swap router.replace() for window.history.replaceState(): the address bar
still updates and the link is still shareable/deep-linkable, but no
network round trip or re-render is triggered.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>

* docs: add live deep links to the four case studies

* fix(workbench): stop bailing all three public routes to client-side rendering

useSearchParams() inside a Suspense boundary was making Next.js discard the
prerendered subtree at build time (BAILOUT_TO_CLIENT_SIDE_RENDERING), so /,
/workbench/terraform, and /workbench/kubernetes shipped empty HTML. Drop
next/navigation entirely from the deep-link path: useScenarioDeepLink now
exposes a plain readInitialScenarioId(availableIds) that reads
window.location.search from the shells' existing mount effect (client-only,
no SSR interaction), and setScenarioInUrl is wrapped in useCallback and
preserves window.location.hash. Remove the now-unneeded Suspense wrappers
from the three page.tsx files and the 7 next/navigation mocks that were
masking this in unit tests (they stubbed useSearchParams to return null,
which happens to make renderToStaticMarkup render the full tree — a
rendering mode production no longer produces).

Verified: npm run build followed by
grep -c BAILOUT_TO_CLIENT_SIDE_RENDERING on all three route HTML files now
returns 0, and "Review canvas" is present in index.html again.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>

* test(e2e): cover the URL-write path and Kubernetes deep-linking

Two gaps the SSR fix's verification surfaced: no test exercised
setScenarioInUrl actually writing to the address bar (only reads via
?scenario= were covered), and the Kubernetes workbench had zero deep-link
coverage. Add one round-trip test (click a non-default scenario, assert the
URL updates, reload, assert it's still pre-selected) and one Kubernetes
deep-link test against a real fixture id from
features/domains/kubernetes/fixtures.ts.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>

* chore(workbench): relocate deep-link hook test and clarify relative doc links

Move the useScenarioDeepLink unit test from beside its source
(components/hooks/) to tests/unit/, matching this repo's existing
convention of keeping all tests under tests/, and revert the vitest.config.ts
include-glob addition that only existed for the old location. Also clarify
in docs/CASE_STUDIES.md that the "Try it live" paths are relative to
wherever the app is running, not a hosted domain.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>

* fix: make case study deep links clickable as Markdown links

- Convert 'Try it live' URLs from inline code (backticks) to actual Markdown links
- Addresses Codex review feedback: make the advertised deep links clickable when viewing rendered Markdown
- All four case study links now render as proper hyperlinks

Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>

---------

Co-authored-by: Claude Sonnet 5 <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant