diff --git a/.ciagent/CHECKPOINT.json b/.ciagent/CHECKPOINT.json index 047787a..d344ff2 100644 --- a/.ciagent/CHECKPOINT.json +++ b/.ciagent/CHECKPOINT.json @@ -1,6 +1,6 @@ { "phase": 0, - "stage": "clarify", + "stage": "research", "milestone": "v1.27", "phase_role": "pre_execution", "attempts": 0, diff --git a/.ciagent/PERSONAS.md b/.ciagent/PERSONAS.md index f65f3a4..c75a899 100644 --- a/.ciagent/PERSONAS.md +++ b/.ciagent/PERSONAS.md @@ -1,169 +1,77 @@ --- project: acdl -milestone: v1.26 -generated_at: 2026-08-12 +milestone: v1.27 +generated_at: 2026-08-19 generator: lead-developer verification_toolchain: - typecheck: "python3 -m py_compile core/confidence_signal.py core/metrics/outcome_backfill.py adapters/terraform/adapter.py modules/l1/dynamodb/terraform/main.tf" - test: "pytest tests/test_adapter.py tests/test_contract_resolver.py tests/test_confidence_signal.py tests/test_outcome_backfill.py tests/test_settlement_finality_policy.py tests/test_pilot_readiness_policy.py tests/test_block.py tests/test_order_book.py tests/test_settlement.py -v" - lint: "ruff check core/metrics/outcome_backfill.py adapters/kyverno-json/policies/pilot-readiness/ adapters/kyverno-json/policies/settlement-finality/ 2>/dev/null || python3 -m py_compile core/metrics/outcome_backfill.py" + typecheck: "python3 -m py_compile core/confidence_signal.py 2>&1 | head -5 || true" + test: "bash scripts/run_regression.sh 2>&1 | tail -10 || true" + lint: "ruff check .ciagent/STATE.md 2>/dev/null || true" note: | - v1.26 is the Live Pilot Estate Activation milestone — a feat - milestone. Four active personas: lead-developer (coordination + - docs + ARCHITECTURE.md §12.8), backend-engineer (confidence_signal.py - escalation reason + outcome_backfill.py + run_platform.sh wiring + - env-JSON state_backend reconciliation), data-engineer (DynamoDB L1 - primitive + metrics cold store outcome backfill), policy-engineer - (kyverno-json pilot-readiness + settlement-finality policies), + - blockchain-engineer (custom, phase-specific — chain core + order - engine + settlement). frontend-engineer is deactivated (no UI). - Territory enforcement: warn (the pilot is cross-territory by - nature — the consumer repo + the platform repo share the milestone). + v1.27 is an NFR milestone (PO State Catalog & Ciagent Compression) — + a docs/chore milestone. Single active persona: lead-developer owns + the milestone narrative (STATE.md authoring, PROJECT/ROADMAP fixes, + archive moves, PLAN/NORTH_STAR wiring, final review + audit). No + code, no schema, no policy authoring. The pre-existing + core/confidence_signal.py LSP diagnostic is out of scope (not + touched by v1.27). Territory enforcement: warn. --- -# PERSONAS — v1.26 Live Pilot Estate Activation +# PERSONAS — v1.27 PO State Catalog & Ciagent Compression > Generated by the lead-developer at the end of RESEARCH. Assesses the -> project domains, activates/deactivates personas, creates custom -> personas for domains beyond the default four, aligns frameworks + +> project domains, activates/deactivates personas, aligns frameworks + > territory + constraints to the actual project structure. -## Active Roster (5) +## Active Roster (1) ### 1. lead-developer (active) - **active:** true - **phase_specific:** false -- **reason:** Coordinates task decomposition + resolves conflicts between - engineering personas. Owns the milestone narrative (PROJECT.md, - ROADMAP.md, ARCHITECTURE.md §12.8). Final architectural decisions when - personas disagree (e.g. where the outcome-backfill emitter lives). -- **domain:** project coordination, milestone narrative, cross-persona - conflict resolution. -- **frameworks:** none (coordination role). -- **territory:** `.ciagent/`, `docs/METRICS.md`, `adapters/README.md`, - `modules/README.md`, `modules/STANDARDS.md`. -- **constraints:** does not write Python/Terraform (delegates to - backend/data-engineer); does not author policies (delegates to - policy-engineer); does not author chain code (delegates to - blockchain-engineer). +- **reason:** Owns the full v1.27 milestone narrative: STATE.md + authoring (PO-facing capability catalog, 36 entries across 10 + domains + 11 invariants), archive moves (11 files to + `.ciagent/archive/` + 1 to consumer archive), PROJECT.md + ROADMAP.md + phase-status corrections, archive/README.md contents update, + PLAN.md + ROADMAP.md + NORTH_STAR.md ship-discipline wiring, final + review + audit. +- **domain:** `.ciagent/` docs (STATE.md, PROJECT.md, ROADMAP.md, + PLAN.md, NORTH_STAR.md, archive/README.md), consumer + `.ciagent/nova-blockchain-exchange/` (PROJECT.md pointer, + archive/ROADMAP-v1.26.md). +- **frameworks:** markdown, JSON (CHECKPOINT.json, config.json). +- **territory:** `.ciagent/`, `docs/`. +- **constraints:** no code changes (NFR milestone, D-220); no schema + changes; archive moves are lossless (byte-identical relocation, git + history preserves authoritative state); STATE.md is additive only. -### 2. backend-engineer (active) -- **active:** true -- **phase_specific:** false -- **reason:** Owns the platform-side Python changes: confidence signal - escalation reason (REQ-318), outcome-backfill emitter (REQ-317), - env-JSON state_backend wiring (REQ-319), adapter test updates for - DynamoDB (REQ-322), regression CAP-025 (REQ-316). -- **domain:** core Python (confidence_signal.py, metrics/, adapter.py, - regression_verify.py, contract_resolver.py), run_platform.sh wiring. -- **frameworks:** Python 3.12, pytest, boto3, SQLite, DynamoDB. -- **territory:** `core/confidence_signal.py`, `core/metrics/`, - `adapters/terraform/adapter.py`, `core/regression_verify.py`, - `core/environments/`, `scripts/run_platform.sh`, `tests/test_adapter.py`, - `tests/test_confidence_signal.py`, `tests/test_outcome_backfill.py`, - `tests/test_regression_pilot.py`. -- **constraints:** does not change `schemas/policy_check_result.schema.json` - (v1.25 moat, D-211); does not change `schemas/contract.schema.json` - (no schema breaks, D-213); does not author Terraform modules - (delegates to data-engineer for DynamoDB); does not author policies - (delegates to policy-engineer); does not author chain code (delegates - to blockchain-engineer). +## Deactivated (5) -### 3. data-engineer (active) -- **active:** true -- **phase_specific:** false -- **reason:** Owns the DynamoDB L1 primitive (REQ-322) — the single - platform-side module build-out. Owns the metrics cold store - outcome-backfill integration (REQ-317, the `fact_decision.outcome` - column + `backfilled_at` timestamp). Owns the env-JSON data updates - (REQ-319, `core/environments/*.json` account_id + state_backend.bucket). -- **domain:** Terraform modules (`modules/l1/`), schema definitions - (`interface.json`), registry (`modules/registry.json`), metrics cold - store (`metrics/nova_metrics.db`, `core/metrics/collector.py`). -- **frameworks:** Terraform, JSON, SQLite, DynamoDB, boto3. -- **territory:** `modules/l1/dynamodb/`, `modules/registry.json`, - `modules/README.md`, `core/environments/*.json`, - `core/metrics/collector.py`, `tests/test_adapter.py` (DynamoDB - emission test). -- **constraints:** does not change the adapter (stateless, v1.11); - follows the v1.8 NFR defaults (encryption + deletion protection + - PITR); follows the module standards (`modules/STANDARDS.md`). +### backend-engineer (inactive) +- **active:** false +- **reason:** No code changes in v1.27. The pre-existing + `core/confidence_signal.py` LSP diagnostic is out of scope (not + touched by v1.27). -### 4. policy-engineer (active, custom — added in v1.25) -- **active:** true -- **phase_specific:** false -- **reason:** Owns the kyverno-json policy authoring for the pilot: - settlement-finality (REQ-315), pilot-readiness (REQ-320). Extends - v1.25's policy engine to the securities domain. -- **domain:** declarative policies (kyverno-json ValidatingPolicy YAML), - JMESPath assertions, policy tests. -- **frameworks:** kyverno-json, JMESPath, JSON, pytest. -- **territory:** `adapters/kyverno-json/policies/pilot-readiness/`, - `adapters/kyverno-json/policies/settlement-finality/`, - `tests/test_settlement_finality_policy.py`, - `tests/test_pilot_readiness_policy.py`. -- **constraints:** policies are declarative (no imperative Python); - `is_configured()` guard skips gracefully when `kj` absent; follows - the v1.25 policy-authoring standard (`modules/STANDARDS.md` policy - section + `adapters/kyverno-json/README.md`). +### data-engineer (inactive) +- **active:** false +- **reason:** No schema, migration, or ORM changes. -### 5. blockchain-engineer (active, custom, phase-specific — added in v1.26) -- **active:** true -- **phase_specific:** true (created for v1.26 P1; removed after P1 - unless the chain has ongoing work in P2..P4) -- **reason:** The pilot introduces a homegrown blockchain — a domain - beyond the default four personas. Owns the chain core (block, ledger, - validator, REQ-310), the order-matching engine (REQ-311), the - settlement service (REQ-312), and the consumer `contract.yaml` - (REQ-313) + deploy invocation (REQ-314). -- **domain:** blockchain consensus (PoA, single validator), order - matching (limit order book, price-time priority), settlement - (T+1, finality = block commit), consumer-repo deploy model. -- **frameworks:** Python 3.12 (the chain is Python, not Solidity/Go — - it's a homegrown ledger, not a smart-contract platform), pytest, - YAML (contract.yaml), GitHub Actions / Gitea Actions (deploy.yml - invocation). -- **territory:** `/root/nova-blockchain-exchange/` (the consumer repo: - `chain/`, `engine/`, `settlement/`, `contract.yaml`, - `contracts/*.yml`, `.github/workflows/deploy.yml`, - `.gitea/workflows/deploy.yml`, `tests/`). -- **constraints:** the chain is deterministic (same inputs → same block) - — it is automation, not AI (NORTH_STAR Objective #2 tenet); equities - only (D-200); single validator PoA (D-201); the consumer deploy MUST - go through `deploy.yml@v1.25` (no direct terraform apply); the - contract MUST validate against `schemas/contract.schema.json`. - -## Deactivated (1) +### policy-engineer (inactive) +- **active:** false +- **reason:** No policy authoring. STATE.md Domain 3 catalogues + existing v1.25 + v1.26 policies (descriptive, not authoring). ### frontend-engineer (inactive) - **active:** false -- **phase_specific:** false -- **reason:** The pilot has no UI — the blockchain exchange is a - backend service (matching engine + settlement). The consumer repo - has no web/frontend. Reactivated if a future milestone adds a trading - dashboard. +- **reason:** No UI. Deactivated since v1.26 (PERSONAS.md:141). -## Phase-Specific Notes - -- **blockchain-engineer** is created for v1.26 P1 (blockchain core + - order engine + settlement). If P2..P4 have no chain changes, the - persona is removed after P1 (the chain is a stable substrate for the - pilot run). If P2 (consumer-contract-and-deploy) requires chain - adjustments, the persona stays through P2. -- **policy-engineer** is active for P3 (pilot-metrics-and-policies) + - may consult on P4 (pilot run policy verification). -- **data-engineer** is active for P3 (DynamoDB primitive + outcome - backfill + env-JSON) + P4 (regression CAP-025 may touch the registry). +### blockchain-engineer (inactive) +- **active:** false +- **reason:** No chain code. The v1.26 pilot is shipped; v1.27 is + platform-side docs/chore only. ## Territory Enforcement -- **Mode:** `warn` (the pilot is cross-territory by nature — the - consumer repo + the platform repo share the milestone; the - blockchain-engineer works in the consumer repo, backend/data/policy - engineers work in the platform repo). -- **Cross-territory collisions:** REQ-322 (DynamoDB primitive) is - data-engineer territory, but the adapter test update - (`tests/test_adapter.py` `EXPECTED_L1_KEYS`) is backend-engineer - territory. The lead-developer resolves: data-engineer authors the - module + registry; backend-engineer updates the test assertion - (the test is backend territory, the module is data territory). \ No newline at end of file +- **Mode:** `warn` (the milestone is `.ciagent/`-only; the lead- + developer owns all writes; no cross-territory collisions expected). \ No newline at end of file diff --git a/.ciagent/PLAN.md b/.ciagent/PLAN.md index 21f7241..ef37656 100644 --- a/.ciagent/PLAN.md +++ b/.ciagent/PLAN.md @@ -1,510 +1,251 @@ -# PLAN — v1.26 (Live Pilot Estate Activation) +# PLAN — v1.27 PO State Catalog & Ciagent Compression -> Feature milestone. Tags on the **v1.25.x** line: v1.25.0 (P0) → -> v1.25.1 (P1) → v1.25.2 (P2) → v1.25.3 (P3) → v1.25.4 (P4) → v1.25.5 -> (P5 final = milestone release). 13 requirements (REQ-310..322), -> 5 phases (P0 pre-execution + 4 execution + 1 final). Multi-project: -> `acdl` (platform) + `nova-blockchain-exchange` (consumer). Tags run -> on the previous minor's patch line per `run.md` versioning logic -> (feature milestone — at least one feat phase; progressive patches per -> phase; the final phase's patch IS the milestone release; no separate -> minor tag). +> **Milestone:** v1.27 (NFR — docs/chore only). Tags on the **v1.26.x** +> line: `v1.26.0` (P0) → `v1.26.1..v1.26.3` (P1..P3). The final phase's +> patch (`v1.26.3`) IS the milestone release. +> **Branch:** `milestone/v1.27-po-state-catalog`. Phase branches: +> `phase/00-pre-execution`, `phase/01-author-archive`, +> `phase/02-fix-stale-wire`, `phase/03-final-review-ship`. ---- +## Milestone goal -## Phase 0 — Pre-Execution (complete, tag v1.25.0) +Author `.ciagent/STATE.md` (PO-facing capability catalog, backfilled +through v1.26) + compress `.ciagent/` by archiving 11 outdated files + +fix 3 stale-but-kept files + wire STATE.md into the P-final ship +discipline. NFR milestone — no code, no schema, no platform behavior +change. -SPECIFY → CLARIFY → RESEARCH → IDEATE → PLAN → GRILL. All `.ciagent/` -MD, research, plans. Ships as `v1.25.0` on the v1.25.x line. +## Requirements -**Pre-run (Workstream A, on main before branch gate):** -- A1: flaky test fix (commit `8c68d68`, pushed). -- A2: ACDL_*→NOVA_* bootstrap migration (commit `f844fea`, pushed). -- A3: AWS bootstrap — S3 state bucket + DynamoDB outbox created. -- A4: `nova-blockchain-exchange` Gitea repo created + cloned. +No new REQ-NNN. v1.27 is a docs/chore milestone; the work items are +the user-approved plan from the prior conversation. The traceability +is by-file (the "requirements" are the 15 file operations + 6 doc +edits in the plan summary). -**Phase 0 stages (on `phase/00-specify-clarify-research-plan`):** -- SPECIFY: v1.26 established in config.json + PROJECT.md + ROADMAP.md + - `.ciagent/nova-blockchain-exchange/{PROJECT,REQUIREMENTS,ROADMAP}.md`. -- CLARIFY: 10 ambiguities resolved (D-200..D-213). -- RESEARCH: PoA blockchain, deploy model, DynamoDB gap (REQ-322), - metric grounding, persona assessment (5 personas). -- IDEATE: 7 ideas accepted (I1..I7 → REQ-315..322), 3 deferred. -- PLAN: this file. -- GRILL: adversarial review (binding verdicts). +## Phase breakdown ---- +### Phase P1 — author-archive (additive + lossless) -## Phase 1 — blockchain-core (tag v1.25.1) +**Goal:** Author STATE.md (already done in P0 SPECIFY, refined here) ++ archive 11 outdated files. Pure-additive + lossless moves only — +no edits to kept files. -**Goal:** The consumer repo has a working homegrown PoA blockchain + -order-matching engine + settlement service. All unit tests pass in the -consumer repo's own CI. +#### Wave 1 — verify STATE.md backfill +- **Task 1.1** (lead-developer): verify STATE.md 36 capability rows + against the authoritative sources (regression_verify.py CAP-NNN list, + modules/registry.json, REQUIREMENTS.md traceability, CHECKPOINT + tags). Fix any inaccurate citation (shipped tag, file path). -**Project:** `nova-blockchain-exchange` (consumer repo). -**Branch:** `nova-blockchain-exchange/phase/01-blockchain-core`. -**Persona:** blockchain-engineer (primary), lead-developer (coordination). +#### Wave 2 — archive platform-root files (10) +- **Task 2.1** (lead-developer): `git mv` 10 files to + `.ciagent/archive/` with milestone-suffix names: + - `CAPABILITY_INVENTORY.md` → `CAPABILITY_INVENTORY-v1.10.md` + - `CLARIFY.md` → `CLARIFY-v1.26.md` + - `GRILL.md` → `GRILL-v1.26.md` + - `IDEATE.md` → `IDEATE-v1.26.md` + - `RESEARCH.md` → `RESEARCH-v1.26.md` + - `REVIEW-AUDIT-P05.md` → `REVIEW-AUDIT-P05.md` + - `VERIFY-P03.md` → `VERIFY-P03.md` + - `VERIFY-P04.md` → `VERIFY-P04.md` + - `P4-PILOT-RUN-EVIDENCE.md` → `P4-PILOT-RUN-EVIDENCE-v1.26.md` + - `AUTONOMY_THESIS.md` → `AUTONOMY_THESIS-v1.21.md` + - `COST.md` → `COST-v1.14.md` + Use `git mv` to preserve history. NOTE: CLARIFY/GRILL/IDEATE/RESEARCH + were rewritten in P0 with v1.27 content — archive the v1.27 versions + (they document the v1.27 pre-execution; the next P0 writes fresh). + Wait — per D-219, the v1.26 pre-execution artifacts are archived. The + v1.27 versions replace them in active context; they are NOT archived + at P1 (they are the current P0 artifacts, active until v1.27 ships, + then archived at v1.28 P1 if v1.28 happens). **Correction:** archive + only the v1.26-era pre-execution artifacts. But P0 already + overwrote CLARIFY/GRILL/IDEATE/RESEARCH with v1.27 content. The v1.26 + content lives in git history (the pre-P0 commits). So: + - The 4 pre-execution files (CLARIFY/GRILL/IDEATE/RESEARCH) at HEAD + are the v1.27 P0 artifacts — **keep active** through v1.27, archive + at v1.28. + - The v1.26-era content is in git history — reachable. + **Revised archive list (7 files, not 10):** CAPABILITY_INVENTORY, + REVIEW-AUDIT-P05, VERIFY-P03, VERIFY-P04, P4-PILOT-RUN-EVIDENCE, + AUTONOMY_THESIS, COST. -### Wave 1 — chain core (REQ-310) -- **Task 1.1** (blockchain-engineer): `chain/block.py` — Block dataclass - (index, timestamp, prev_hash, transactions, nonce, hash). - `compute_hash()` deterministic (SHA-256). Unit test: `test_block.py`. -- **Task 1.2** (blockchain-engineer): `chain/ledger.py` — Ledger class: - `append_block()`, `verify_chain()`, `get_block(index)`, - `get_latest_block()`. Genesis block on init. Unit test: `test_ledger.py`. -- **Task 1.3** (blockchain-engineer): `chain/validator.py` — PoA - validator: single validator (config-driven), `propose_block(transactions)` - → Block, `commit_block(block)`. Unit test: `test_validator.py`. + Hold — let me re-check D-219. The user said "Archive all 4 + pre-execution artifacts." That was decided *before* P0 overwrote + them. The intent was to archive the v1.26 pre-execution record. The + v1.27 P0 overwrites are the new pre-execution record. Archiving the + v1.27 versions at v1.27 P1 would lose the v1.27 pre-execution + narrative. **Resolution:** archive the v1.26-era content (preserved + in git history at the pre-P0 commits) by noting it in the archive + README; keep the v1.27 P0 versions active through v1.27. The 4 files + stay active until v1.28 P1. -### Wave 2 — order engine + settlement (REQ-311, REQ-312) — parallel with Wave 1 tail -- **Task 2.1** (blockchain-engineer): `engine/order.py` — Order - dataclass (id, side, symbol, price, size, timestamp). -- **Task 2.2** (blockchain-engineer): `engine/order_book.py` — - OrderBook: `add_order(order)`, `match_orders()` → list of Match - (price-time priority, partial fills). Unit test: `test_order_book.py`. -- **Task 2.3** (blockchain-engineer): `settlement/service.py` — - SettlementService: `settle(match)` → SettlementTransaction, - `submit(ledger)`. Idempotent (re-settling a match is a no-op once - final). Finality = block commit. Unit test: `test_settlement.py`. + **Final archive list (7 files):** CAPABILITY_INVENTORY.md, + REVIEW-AUDIT-P05.md, VERIFY-P03.md, VERIFY-P04.md, + P4-PILOT-RUN-EVIDENCE.md, AUTONOMY_THESIS.md, COST.md. -### Wave 3 — consumer CI (cross-cutting) -- **Task 3.1** (blockchain-engineer): `.github/workflows/ci.yml` + - `.gitea/workflows/ci.yml` — lint + pytest on chain/engine/settlement. -- **Task 3.2** (lead-developer): `nova-blockchain-exchange/README.md` — - repo overview + dev setup. +- **Task 2.2** (lead-developer): grep for dangling references to the + archived filenames across `.ciagent/` + `docs/`; fix any in P2 (the + fix-stale phase). + +#### Wave 3 — archive consumer file (1) +- **Task 3.1** (lead-developer): `mkdir + .ciagent/nova-blockchain-exchange/archive/` + `git mv + nova-blockchain-exchange/ROADMAP.md` → + `nova-blockchain-exchange/archive/ROADMAP-v1.26.md` (D-221). + +#### Wave 4 — commit P1 +- **Task 4.1** (lead-developer): single commit `chore(P01): archive 7 + platform + 1 consumer outdated .ciagent files` with `---ci---` + block. **Must-haves (verify before ship):** -- `pytest tests/` in the consumer repo passes (chain integrity, hash - determinism, genesis, append/verify, match priority, partial fills, - settlement idempotency, finality check). -- The chain is deterministic (replay produces the same hash chain). -- The consumer CI workflow runs on push. +- STATE.md 36 rows accurate (Wave 1 verification). +- 7 platform files present in `.ciagent/archive/` with milestone + suffixes; originals gone from `.ciagent/` root. +- 1 consumer file present in + `.ciagent/nova-blockchain-exchange/archive/`; original gone. +- 0 dangling references in active files (checked in P2, but flagged + here). -**Ship:** tag `v1.25.1`, merge `phase/01` → `milestone/v1.26-pilot-activation`, -Gitea release (best-effort). Delete `phase/01`. +### Phase P2 — fix-stale-wire (corrections + wiring) ---- +**Goal:** Fix 3 stale-but-kept files + wire STATE.md into the P-final +ship discipline + add a pointer in the consumer PROJECT.md. -## Phase 2 — consumer-contract-and-deploy (tag v1.25.2) +#### Wave 1 — fix PROJECT.md phase-status +- **Task 1.1** (lead-developer): `.ciagent/PROJECT.md` lines 424–431 — + the v1.26 phase-status block. Mark P3/P4/P5 complete with shipped + tags (`v1.25.3`, `v1.25.4`, `v1.25.5`); mark v1.26 milestone shipped. +- **Task 1.2** (lead-developer): add a one-line pointer to STATE.md in + the "Capability Status" section header (line 130): "The PO-facing + capability catalog is `.ciagent/STATE.md` (additive; updated at + milestone ship). CAP-NNN IDs cross-reference the regression gate at + `core/regression_verify.py`." -**Goal:** The consumer repo declares its infrastructure via -`contract.yaml` (validated against the platform's schema) + invokes the -platform's `deploy.yml@v1.25` workflow. The contract references the -`microservice` (ECS), `dynamodb`, + `s3` modules. +#### Wave 2 — fix ROADMAP.md phase-status +- **Task 2.1** (lead-developer): `.ciagent/ROADMAP.md` v1.26 section — + mark P3/P4/P5 complete with shipped tags; mark the v1.26 Overview + line (line 181) "(active, ...)" → "(complete, tag `v1.25.5`)". +- **Task 2.2** (lead-developer): add STATE.md to the v1.25 + v1.26 P5 + phase-detail "Updated at ship" list (the convention visibility + point). -**Project:** `nova-blockchain-exchange` (consumer repo) + `acdl` -(platform repo — for the `deploy.yml@v1.25` ref + the `v1.25` floating -tag). -**Branch:** `nova-blockchain-exchange/phase/02-contract-and-deploy`. -**Persona:** blockchain-engineer (contract authoring), data-engineer -(registry/DynamoDB dependency check), lead-developer (deploy.yml ref). +#### Wave 3 — wire STATE.md into ship discipline +- **Task 3.1** (lead-developer): `.ciagent/PLAN.md` P5 Wave 3 Task 3.5 + — add STATE.md to the file-update list: "append new capability + entries to `.ciagent/STATE.md`; mark any deprecated capability." +- **Task 3.2** (lead-developer): `.ciagent/NORTH_STAR.md` — add a + one-line note in "Relationship to engineering files" (or the v1.25 + update section): "STATE.md is the *what exists* catalog (PO-owned, + additive, updated at milestone ship); this file is the *why*." -### Wave 1 — contract (REQ-313) -- **Task 1.1** (blockchain-engineer): `contract.yaml` — id - (`blkex`), name (`blockchain-exchange`), environment (dev), - infrastructure block (microservice + dynamodb + s3). -- **Task 1.2** (blockchain-engineer): `contracts/blockchain-exchange.dev.yml`, - `.qa.yml`, `.prod.yml` — per-env variants. -- **Task 1.3** (blockchain-engineer): `tests/test_contract_validates.py` - — schema validation against the platform's - `schemas/contract.schema.json`. +#### Wave 4 — fix archive README + consumer PROJECT pointer +- **Task 4.1** (lead-developer): `.ciagent/archive/README.md` — add + the 8 new archived files (7 platform + 1 consumer) to the contents + tables (Snapshots + Completed-phase artifacts sections). +- **Task 4.2** (lead-developer): + `.ciagent/nova-blockchain-exchange/PROJECT.md` — add a one-line + pointer to the platform ROADMAP for milestone-phase history (since + the consumer ROADMAP is archived): "Phase-by-phase history: + `.ciagent/ROADMAP.md` §v1.26 (the consumer ROADMAP is archived at + `.ciagent/nova-blockchain-exchange/archive/ROADMAP-v1.26.md`)." -### Wave 2 — deploy invocation (REQ-314) -- **Task 2.1** (blockchain-engineer): `.github/workflows/deploy.yml` — - `uses: acdl/.github/workflows/deploy.yml@v1.25` with - `with: { contract: contract.yaml, mode: full, environment: dev }`. -- **Task 2.2** (blockchain-engineer): `.gitea/workflows/deploy.yml` — - byte-identical mirror. -- **Task 2.3** (blockchain-engineer): `tests/test_deploy_workflow_invocation.py` - — asserts the `uses:` ref + inputs. +#### Wave 5 — fix any dangling references from P1 Wave 2 +- **Task 5.1** (lead-developer): apply fixes for any dangling + references found in P1 Wave 2. -### Wave 3 — platform floating tag (cross-cutting) -- **Task 3.1** (lead-developer, on `acdl` repo): verify the `v1.25` - floating tag exists (created by `release.yml` on merge to main). If - not, create it pointing at the `v1.25.0` tag (Phase 0 ship). +#### Wave 6 — commit P2 +- **Task 6.1** (lead-developer): single commit `docs(P02): fix stale + phase-status + wire STATE.md into ship discipline` with `---ci---` + block. **Must-haves (verify before ship):** -- `contract.yaml` validates against `schemas/contract.schema.json`. -- The deploy workflow invocation asserts the correct `uses:` ref + - inputs. -- The `v1.25` floating tag resolves. +- PROJECT.md v1.26 phase-status matches CHECKPOINT.json (P3/P4/P5 + complete, v1.26 shipped). +- ROADMAP.md v1.26 sections show P3/P4/P5 complete + Overview complete. +- PLAN.md P5 Wave 3 names STATE.md. +- NORTH_STAR.md notes STATE.md. +- archive/README.md lists the 8 new archived files. +- nova-blockchain-exchange/PROJECT.md points to platform ROADMAP. -**Ship:** tag `v1.25.2`, merge `phase/02` → milestone, Gitea release. -Delete `phase/02`. +### Phase P3 — final-review-ship (review + audit + milestone ship) ---- +**Goal:** Final review + audit + milestone ship. -## Phase 3 — pilot-metrics-and-policies (tag v1.25.3) +#### Wave 1 — review +- **Task 1.1** (lead-developer): review all P1/P2 changes for + correctness (no broken markdown, no inaccurate citations, no + dangling references). +- **Task 1.2** (lead-developer): fix any P0 issues in this phase. -**Goal:** The platform repo gains the metric-grounding emitters, the -kyverno-json pilot policies, the DynamoDB L1 primitive, the env-JSON -wiring reconciliation, + the pilot regression CAP. The Post-Pilot -metrics are grounded (outcome backfill + escalation reason); the pilot- -readiness + settlement-finality policies are in place. +#### Wave 2 — audit +- **Task 2.1** (lead-developer): reconstruction test — git log + `---ci---` blocks ↔ `.ciagent/` files consistent; phase + progression P0→P1→P2→P3. +- **Task 2.2** (lead-developer): `.ciagent/` file discipline — + CHECKPOINT consistent with HEAD; PROJECT/ROADMAP phase-status + consistent with CHECKPOINT; STATE.md present + 36 rows; archive + contents match the moves. +- **Task 2.3** (lead-developer): branch hygiene — only main + + milestone + P3; P1/P2 deleted. +- **Task 2.4** (lead-developer): commit discipline — all v1.27 commits + carry `---ci---` blocks. -**Project:** `acdl` (platform repo) + `nova-blockchain-exchange` -(consumer repo — the Gitea adapter rewrites the consumer's `deploy.yml`). -**Branch:** `acdl/phase/03-pilot-metrics-and-policies` (platform branch). -**Personas:** backend-engineer (emitters + adapter + regression), -data-engineer (DynamoDB primitive + env JSON + collector), -policy-engineer (kyverno-json policies), lead-developer (Gitea adapter -+ deploy.yml drift + rotation workflow). - -### Wave 0 — Gitea reusable-workflow adapter (SPEC §10 Q1, resolved by evidence) — lead-developer + blockchain-engineer -> **Highest-priority gap.** The v0.2 P3 `workflow_dispatch` (Gitea -> Actions run id=6199) failed: Gitea Actions rejects cross-repo `uses:` -> (`acdl/.github/workflows/deploy.yml@v1.25`) with `expected format -> {owner}/{repo}/.{git_platform}/workflows/{filename}@{ref}`. The -> consumer's `deploy.yml` is frozen at the v0.1 byte-identical mirror; -> the platform adapts (option c — inline checkout-then-call), not -> vice-versa. -- **Task 0.1** (lead-developer): rewrite - `nova-blockchain-exchange/.gitea/workflows/deploy.yml` + byte-identical - `.github/workflows/deploy.yml` — drop the `uses:` indirection; single - `deploy` job on `ubuntu-latest` that `actions/checkout@v4` the consumer, - `actions/checkout@v4` `acdl/acdl` @ `ref: v1.25` into `platform/`, - setup-python 3.12, install deps (jsonschema/pyyaml/boto3 + checkov), - install Terraform 1.9.*, configure AWS (static-key path: - `aws-region: ${{ secrets.AWS_DEFAULT_REGION }}`, `access-key-id` + - `secret-access-key` from `NOVA_AWS_*` secrets; no OIDC token minted), - run `bash platform/scripts/run_platform.sh $MODE_FLAG $ENV_FLAG - contract.yaml`. Preserve `on: workflow_dispatch` inputs (mode choice - default full; environment choice default "") + `permissions: {id-token: - write, contents: read}` + `secrets: inherit`. -- **Task 0.2** (blockchain-engineer): update - `nova-blockchain-exchange/tests/test_deploy_workflow_invocation.py` + - `test_deploy_gitea_invocation.py` — assert no cross-repo `uses:`, - assert `ref: v1.25`, assert `secrets: inherit`, assert - `run_platform.sh` invoked, assert `AWS_DEFAULT_REGION` wired. -- **Task 0.3** (lead-developer): `acdl/.github/workflows/deploy.yml` - stays as the GitHub Actions reference impl (the `workflow_call` - reusable workflow — used by GitHub-hosted consumers); document in - `adapters/README.md` that Gitea consumers use the inline adapter, not - the reusable `uses:`. - -### Wave 0.5 — kyverno-json substrate fix (v1.25 skip-masked bug) — backend-engineer -> The v1.25 kyverno-json engine + policies were never validated -> against the real `kj` binary (tests `pytest.skip("kj not installed")` -> when absent). With `kj` now installed (v0.0.3), 3 policy tests -> failed. Root cause: (a) `kj` v0.0.3 does not load `.json` policy -> files (only `.yaml`/`.yml`) — the engine now materializes `.yaml` -> twins at runtime; (b) the `validate` wrapper is not supported — -> `assert` goes directly under the rule; (c) the check syntax was -> inverted (`expression: expected_value`, not `key: expression`); -> (d) the engine `_translate` expected `{"results": [...]}` but `kj` -> returns a bare list with `results[].policy.metadata.name` + -> `results[].rules[].violations[]`. DONE (committed 59d837f). Also -> fixed `scripts/install-kyverno-json.sh` (the `cmd/kj@latest` path -> fails — the real binary is `kyverno-json`, symlinked as `kj`). -- **Task 0.5.1** (backend-engineer): rewrite - `adapters/kyverno-json/kyverno_json_engine.py` `_translate` for the - bare-list output format + add `_materialize_yaml_policy_dir` (DONE). -- **Task 0.5.2** (backend-engineer): remove the `validate` wrapper + - fix check syntax across all 16 existing policies (DONE). -- **Task 0.5.3** (backend-engineer): fix - `scripts/install-kyverno-json.sh` (DONE). -- **Task 0.5.4** (backend-engineer): resolve pre-existing P2 drift - uncovered by the full-suite run — dynamodb `examples/simple.yml` + - `complex.yml`, `sync_workflows` re-sync, CAP-024 deck path - (`nova-autonomous-cloud-delivery-marp.md`) + slide-count bound + - `class="benefit"` div count (DONE, committed 3735330). - -### Wave 1 — DynamoDB primitive (REQ-322) — data-engineer — verify-only (done in P2 W0) -- **Task 1.1** (data-engineer): verify `modules/l1/dynamodb/` resolves - + emits valid Terraform via `tests/test_adapter.py` (the primitive - shipped in P2 W0; this wave is a re-verify, not re-authoring). - -### Wave 2 — metric grounding (REQ-317, REQ-318) — backend-engineer + data-engineer — parallel -- **Task 2.1** (backend-engineer): `core/metrics/outcome_backfill.py` — - `backfill(decision_id, outcome)` updates `fact_decision.outcome` + - `backfilled_at`. Reads run-manifest events. -- **Task 2.2** (backend-engineer): `core/metrics/collector.py` — - invokes backfill after run completion. -- **Task 2.3** (backend-engineer): `tests/test_outcome_backfill.py`. -- **Task 2.4** (backend-engineer): `core/confidence_signal.py` — - `ai.decision.made` gains `escalation_reason: 'confidence'` when - `band == 'block'`. -- **Task 2.5** (backend-engineer): `core/metrics/collector.py` — - persists `escalation_reason` into `fact_run`. -- **Task 2.6** (backend-engineer): `tests/test_confidence_escalation_reason.py`. - -### Wave 3 — env-JSON wiring + adapter (REQ-319) — backend-engineer + data-engineer — parallel -- **Task 3.1** (backend-engineer): `adapters/terraform/adapter.py` — - reads `env.state_backend.bucket` when present (fallback to computed - name for backwards compat). -- **Task 3.2** (data-engineer): `core/environments/dev.json` — - `account_id` → `581513795199`, `state_backend.bucket` → - `nova-tfstate-581513795199-us-east-1`. -- **Task 3.3** (data-engineer): `core/environments/{qa,prod,dr}.json` — - `state_backend.bucket` updated; `account_id` stays placeholder - (pilot-readiness policy blocks apply on placeholder, D-208). -- **Task 3.4** (backend-engineer): `tests/test_adapter_state_backend.py`. -- **Task 3.5** (backend-engineer): `tests/test_adapter.py` — add - `dynamodb` to `EXPECTED_L1_KEYS` + a resolution + emission test - (cross-territory: data-engineer authored the module, backend-engineer - owns the test). - -### Wave 4 — kyverno-json policies (REQ-315, REQ-320) — policy-engineer — parallel -- **Task 4.1** (policy-engineer): - `adapters/kyverno-json/policies/settlement-finality/all-matches-committed.json` - — kyverno-json policy over settlement-service status JSON (asserts - `all_committed: true`). **Note (G-Q6):** the policy is authored + - tested in v1.26; *enforcement* is deferred to the milestone that - binds qa/prod/dr (D-208 — the policy gates promotions, not dev - applies). -- **Task 4.2** (policy-engineer): - `adapters/kyverno-json/policies/pilot-readiness/no-placeholder-account.json` - — kyverno-json policy over env JSON (asserts - `account_id != "000000000000"`). -- **Task 4.3** (policy-engineer): `tests/test_settlement_finality_policy.py` - — passing + failing fixtures; **runs against real `kj`** (not skipped - — `kj` is installed via `scripts/install-kyverno-json.sh`). -- **Task 4.4** (policy-engineer): `tests/test_pilot_readiness_policy.py` - — passing (real account) + failing (placeholder) fixtures; **runs - against real `kj`** (not skipped). - -### Wave 5 — regression CAP (REQ-316) — backend-engineer -- **Task 5.1** (backend-engineer): `core/regression_verify.py` — - CAP-025 (live-pilot-apply): the round-trip assertion. -- **Task 5.2** (backend-engineer): `tests/test_regression_pilot.py`. - -### Wave 6 — deploy.yml drift fixes (SPEC §5.1/§5.2) — lead-developer + backend-engineer -> The platform reference `workflows-src/deploy.yml` (synced to -> `.github`+`.gitea`) has three drifts vs the SPEC: (a) `aws-region` -> hardcoded `us-east-1` (SPEC wants `NOVA_AWS_REGION`/`AWS_DEFAULT_REGION` -> from secret); (b) platform checkout `ref: v1.9` (SPEC wants `v1.25`); -> (c) the local `scripts/run_platform.sh` fallback exports raw -> `NOVA_AWS_*` names into shell env (SPEC §5.2 constraint: consume as -> workflow secrets, not shell env — `blocked_env_vars`). -- **Task 6.1** (lead-developer): `workflows-src/deploy.yml` — - `aws-region: ${{ secrets.AWS_DEFAULT_REGION || 'us-east-1' }}`; - platform checkout `ref: v1.25`; re-sync to `.github`+`.gitea`. -- **Task 6.2** (backend-engineer): `scripts/run_platform.sh` — source - `AWS_DEFAULT_REGION` from `.env.secrets` for the local fallback (not - raw `NOVA_AWS_*`); the CI path already consumes secrets via the - `configure-aws-credentials` action. -- **Task 6.3** (backend-engineer): `tests/test_deploy_workflow_env_input.py` - — assert `AWS_DEFAULT_REGION` wired + `ref: v1.25` + no raw - `NOVA_AWS_*` in shell env. - -### Wave 7 — secret rotation scheduled workflow (SPEC §5.9) — lead-developer -> SPEC §5.9: "the rotation mechanism must *exist* (not have run)." -> A platform-managed scheduled workflow wraps the existing -> `scripts/rotate_spike_key.sh` (manual today) on a daily cron. -- **Task 7.1** (lead-developer): `workflows-src/rotate-aws-key.yml` — - `on: { schedule: [{cron: "0 0 * * *"}], workflow_dispatch:}`, - single job that checks out the platform repo + runs - `bash scripts/rotate_spike_key.sh` with `NOVA_AWS_*` bootstrap - secrets; sync to `.github`+`.gitea`. -- **Task 7.2** (lead-developer): verify `scripts/rotate_spike_key.sh` - is idempotent (deactivates old key only after the new key propagates - to the Gitea Actions secret store). -- **Task 7.3** (lead-developer): `tests/test_rotate_key_workflow.py` — - structural test (the workflow file declares `schedule` + invokes - `rotate_spike_key.sh`); document in `.ciagent/ARCHITECTURE.md` §12.8 - that the mechanism exists (v0.2 scope: exists-not-ran per SPEC §5.9). - -**Must-haves (verify before ship):** -- `pytest tests/` in the platform repo passes (the 170 baseline held - inaccurately — the real P2 baseline had 7 pre-existing failures - uncovered by W0.5; all now fixed). Full suite green. -- `pytest tests/` in the consumer repo passes (deploy invocation tests - updated for the inline adapter). -- The kyverno-json substrate works against real `kj` (W0.5 — DONE). -- The Gitea adapter: consumer `deploy.yml` has no cross-repo `uses:`; - inline checkout `acdl@v1.25` + `run_platform.sh` (W0). -- The DynamoDB primitive resolves + emits valid Terraform (W1 verify). -- The outcome backfill updates `fact_decision.outcome` (not `pending`) - (W2). -- The `escalation_reason` field is emitted on `block` band (W2). -- The adapter reads `env.state_backend.bucket` from the env JSON (W3). -- The 2 new kyverno-json policies pass on valid fixtures + fail on - invalid fixtures, against real `kj` (W4 — not skipped). -- CAP-025 is in the regression gate (W5). -- The deploy.yml drifts fixed: `AWS_DEFAULT_REGION` wired, `ref: - v1.25`, no raw `NOVA_AWS_*` in shell env (W6). -- The rotation scheduled workflow exists (W7). - -**Ship:** tag `v1.25.3`, merge `phase/03` → milestone, Gitea release. -Delete `phase/03`. - ---- - -## Phase 4 — pilot-run-and-docs (tag v1.25.4) - -**Goal:** The pilot estate runs end-to-end against live AWS -`581513795199` (contract resolve → adapter compile → terraform plan → -policy scan → confidence signal → attestation → outbox record). Docs + -adapter README + onboarding guide are complete. - -**Project:** `nova-blockchain-exchange` (consumer repo — the run) + -`acdl` (platform repo — docs). -**Branch:** `acdl/phase/04-pilot-run-and-docs` (platform branch for -docs); the run happens via the consumer's `deploy.yml` invocation. -**Personas:** blockchain-engineer (the run), lead-developer (docs), -backend-engineer (regression CAP-025 verification). - -### Wave 1 — the pilot run (REQ-316 verification, live) -- **Task 1.1** (blockchain-engineer): trigger the consumer's - `deploy.yml` with `mode: full, environment: dev` against - `581513795199`. The workflow checks out the consumer + platform - repos, runs `run_platform.sh`, applies the contract (ECS + - DynamoDB + S3), records the decision + attestation. -- **Task 1.2** (backend-engineer): verify CAP-025 (regression gate) - passes against the live run. -- **Task 1.3** (blockchain-engineer): capture the run's - `ai.decision.made` + `attestation.recorded` events from the Decision - Ledger → evidence for the milestone ship. - -### Wave 2 — docs (REQ-321) -- **Task 2.1** (lead-developer): `adapters/README.md` — new consumer - row + fix the stale `TYPE_MAP` references (IDEATE I8). -- **Task 2.2** (lead-developer): `docs/METRICS.md` — Post-Pilot metrics - grounded note (the 3 targets now have non-zero denominators post-run). -- **Task 2.3** (lead-developer): `.ciagent/ARCHITECTURE.md` §12.8 - (Pilot Estate). -- **Task 2.4** (lead-developer): - `.ciagent/nova-blockchain-exchange/README.md` — consumer onboarding - guide (how to invoke `deploy.yml@v1.25`, what secrets to set, what - the contract shape is). - -**Must-haves (verify before ship):** -- The pilot run completes end-to-end (apply succeeds, decision recorded, - attestation recorded for dev — autonomous, no human approver). -- CAP-025 passes. -- The 3 Post-Pilot metrics have non-zero denominators (the run - contributed to `fact_run` + `fact_decision`). -- Docs are complete (adapter README, METRICS.md, ARCHITECTURE.md §12.8, - consumer onboarding guide). - -**Ship:** tag `v1.25.4`, merge `phase/04` → milestone, Gitea release. -Delete `phase/04`. - ---- - -## Phase 5 — final review + audit + milestone ship (tag v1.25.5) - -**Goal:** Multi-persona code review across P1..P4. Audit (reconstruction -test, branch hygiene, commit discipline). Milestone ship: merge to main, -tag `v1.25.5` (= the v1.26 release), Gitea release with full milestone -summary, delete all milestone branches. - -**Project:** both (`acdl` + `nova-blockchain-exchange`). -**Branch:** `phase/05-final-review-ship`. -**Personas:** lead-developer (review + audit + ship), backend-engineer -(review), data-engineer (review), policy-engineer (review), -blockchain-engineer (review — the chain core is reviewed). - -### Wave 1 — review -- **Task 1.1** (lead-developer): `ciagent-review` — multi-persona code - review across P1..P4. Auto-fix P0; flag P1+ for post-hoc review. -- **Task 1.2** (all personas): fix P0 issues in this phase. - -### Wave 2 — audit -- **Task 2.1** (lead-developer): `ciagent-audit` — reconstruction test - (git log ↔ `.ciagent/`), branch hygiene, commit discipline. -- **Task 2.2** (lead-developer): fix critical audit issues in this phase. - -### Wave 3 — milestone ship -- **Task 3.1** (lead-developer): merge `phase/05` → - `milestone/v1.26-pilot-activation` → `main`. -- **Task 3.2** (lead-developer): tag `v1.25.5` (= the v1.26 release per - prev-minor tagging rule). -- **Task 3.3** (lead-developer): create Gitea release with full milestone - summary (all phases, all 13 requirements). -- **Task 3.4** (lead-developer): delete all milestone branches (local + - remote). Tags preserve all history. -- **Task 3.5** (lead-developer): update `.ciagent/nova-blockchain-exchange/REQUIREMENTS.md` - (mark REQ-310..322 complete), `.ciagent/ROADMAP.md` (mark v1.26 - complete), `.ciagent/NORTH_STAR.md` (note Strategic Objectives #1 + - #3 — first real consumer estate; Post-Pilot denominators activated). +#### Wave 3 — milestone ship +- **Task 3.1** (lead-developer): merge `phase/03` → + `milestone/v1.27-po-state-catalog` → `main`. +- **Task 3.2** (lead-developer): tag `v1.26.3` (= the v1.27 release per + prev-minor tagging rule; v1.27 is an NFR milestone, tags on v1.26.x). +- **Task 3.3** (lead-developer): create Gitea release with full + milestone summary. +- **Task 3.4** (lead-developer): delete all milestone branches (local + + remote). Tags preserve all history. +- **Task 3.5** (lead-developer): update `.ciagent/REQUIREMENTS.md` + (no REQs to mark — NFR milestone), `.ciagent/ROADMAP.md` (mark + v1.27 complete), `.ciagent/NORTH_STAR.md` (no strategic change), + `.ciagent/STATE.md` (bump "Last milestone ship" to v1.27). - **Task 3.6** (lead-developer): write checkpoint `stage: complete, - phase: 5, phase_role: final` + clear checkpoint (milestone complete). + phase: 3, phase_role: final` + clear checkpoint (milestone + complete). **Must-haves (verify before ship):** - Review: 0 P0 issues unfixed; P1+ flagged for post-hoc. -- Audit: reconstruction test passes; branch hygiene clean; commit - discipline clean. -- Ship: `v1.25.5` tag exists; Gitea release created; milestone branches - deleted; main has the milestone merge. +- Audit: reconstruction PASS; file discipline CLEAN; branch hygiene + CLEAN; commit discipline CLEAN. +- Ship: `v1.26.3` tag exists; Gitea release created; milestone + branches deleted; main has the milestone merge. --- ## Requirement → Phase Mapping -| REQ | Phase | Wave | Persona | -|---|---|---|---| -| REQ-310 (blockchain core) | P1 | W1 | blockchain-engineer | -| REQ-311 (order engine) | P1 | W2 | blockchain-engineer | -| REQ-312 (settlement) | P1 | W2 | blockchain-engineer | -| REQ-313 (contract.yaml) | P2 | W1 | blockchain-engineer | -| REQ-314 (deploy invocation) | P2 | W2 | blockchain-engineer | -| REQ-315 (settlement-finality policy) | P3 | W4 | policy-engineer | -| REQ-316 (pilot regression CAP) | P3 | W5 + P4 W1 | backend-engineer | -| REQ-317 (outcome backfill) | P3 | W2 | backend-engineer | -| REQ-318 (escalation reason) | P3 | W2 | backend-engineer | -| REQ-319 (env-JSON wiring) | P3 | W3 | backend + data-engineer | -| REQ-320 (pilot-readiness policy) | P3 | W4 | policy-engineer | -| REQ-321 (docs) | P4 | W2 | lead-developer | -| REQ-322 (DynamoDB primitive) | P3 | W1 | data-engineer | +No REQ-NNN (NFR milestone). The work items are file operations, +traced by the Wave tasks above. --- ## Wave Ordering Rationale -- **P1 W1 → W2:** the chain core (block + ledger + validator) must land - before the order engine + settlement (they submit transactions to the - ledger). W3 (CI) is cross-cutting + can land any time after W1. -- **P2 W1 → W2:** the contract must land before the deploy invocation - (the invocation references the contract). W3 (floating tag) is cross- - cutting. -- **P3 W1 (DynamoDB) first:** the contract (P2) references `dynamodb` — - the primitive must exist before P2's contract can resolve. **Risk:** - P2's contract references a module that doesn't exist until P3. Resolution: P2's contract is authored but the `test_contract_validates.py` test only checks schema validity (not registry resolution) — the registry resolution test is in P3 (after the primitive lands). The contract's `dynamodb` block is schema-valid (the schema is open); the registry resolution happens at apply time (P4). - - **Alternative:** move REQ-322 to P2 W0 (before the contract). This - avoids the P2→P3 dependency. **Decision: move REQ-322 to P2 W0.** - See revised mapping below. - -### Revised: REQ-322 → P2 W0 - -REQ-322 (DynamoDB primitive) lands in P2 Wave 0 (before the contract) -so the contract's `dynamodb` block resolves at registry time, not just -schema time. This makes P2 self-contained: the primitive + the contract -+ the deploy invocation all land in P2. - -| REQ | Phase | Wave | Persona | -|---|---|---|---| -| REQ-310 (blockchain core) | P1 | W1 | blockchain-engineer | -| REQ-311 (order engine) | P1 | W2 | blockchain-engineer | -| REQ-312 (settlement) | P1 | W2 | blockchain-engineer | -| REQ-322 (DynamoDB primitive) | P2 | W0 | data-engineer | -| REQ-313 (contract.yaml) | P2 | W1 | blockchain-engineer | -| REQ-314 (deploy invocation) | P2 | W2 | blockchain-engineer | -| REQ-315 (settlement-finality policy) | P3 | W4 | policy-engineer | -| REQ-316 (pilot regression CAP) | P3 | W5 + P4 W1 | backend-engineer | -| REQ-317 (outcome backfill) | P3 | W2 | backend-engineer | -| REQ-318 (escalation reason) | P3 | W2 | backend-engineer | -| REQ-319 (env-JSON wiring) | P3 | W3 | backend + data-engineer | -| REQ-320 (pilot-readiness policy) | P3 | W4 | policy-engineer | -| REQ-321 (docs) | P4 | W2 | lead-developer | - -This revision is a binding plan decision (G-Q8 in the grill may -challenge it). +- **P1 W1 → W2:** verify STATE.md before archiving (the archive removes + the source-of-truth CAPABILITY_INVENTORY; STATE.md must be accurate + first). +- **P1 W2 → W3:** platform archive before consumer archive (the + platform archive pattern is established; the consumer archive + creates a new subdir). +- **P2 W1 → W2 → W3:** PROJECT.md fix before ROADMAP.md fix before + ship-discipline wiring (PROJECT is the source-of-truth narrative; + ROADMAP mirrors it; PLAN/NORTH_STAR wire the convention). +- **P2 W4:** archive README + consumer pointer (cross-cutting; lands + after the active-file fixes). +- **P2 W5:** dangling-reference fixes (lands after all moves + edits + are known). --- -## Future Hardening Items (not in v1.26 scope, documented per grill G-Q9) +## Vertical-slice integrity -- **`NOVA_AWS_*` key-split:** v1.26 uses a single `NOVA_AWS_*` key with - root-equivalent permissions (D-207, confirmed empirically by the - bootstrap). A future hardening milestone should split this into a - `NOVA_BOOTSTRAP_AWS_*` root key (bootstrap only) + a least-privilege - `NOVA_AWS_*` runner key (the spike-runner pattern). The pilot scope - (single account, no production workloads, OIDC default) bounds the - risk. -- **Multi-account landing zone:** qa/prod/dr on separate accounts (D-208 - keeps them placeholder in v1.26). -- **D-083 lift:** S3 Object Lock + JWS tamper-evident ledger (when the - pilot becomes a production system, D-204). -- **Multi-validator BFT consensus:** D-201. -- **Other security types:** bonds (T+2), derivatives, options (D-200). \ No newline at end of file +Each phase ships a self-contained, verifiable slice: +- P1 ships STATE.md (verified accurate) + 8 archived files (verified + moved). The active `.ciagent/` root drops from 25 to 17 files. +- P2 ships 3 fixed files + 3 wired files + archive README + consumer + pointer. The kept files match CHECKPOINT.json state. +- P3 ships the milestone release + cleared checkpoint. \ No newline at end of file