docs(P00): personas + plan — v1.27 (lead-developer only, 3 phases)
PERSONAS: lead-developer active (docs/chore milestone); 5 others inactive. Territory: .ciagent/, docs/. PLAN: 3 phases (P1 author-archive, P2 fix-stale-wire, P3 final-review-ship). Tags on v1.26.x; v1.26.3 = milestone release. Archive-list correction (D-219 refinement): the 4 pre-execution files (CLARIFY/GRILL/IDEATE/RESEARCH) were rewritten in P0 with v1.27 content — the v1.26-era content lives in git history. The v1.27 P0 versions stay active through v1.27 (current pre-execution record); they archive at v1.28 P1 if v1.28 happens. Final archive list: 7 platform files (CAPABILITY_INVENTORY, REVIEW-AUDIT-P05, VERIFY-P03, VERIFY-P04, P4-PILOT-RUN-EVIDENCE, AUTONOMY_THESIS, COST) + 1 consumer file (nova-blockchain-exchange/ROADMAP) = 8 files. ---ci--- project: acdl phase: 0 milestone: v1.27 status: plan ---ci---
This commit is contained in:
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"phase": 0,
|
||||
"stage": "clarify",
|
||||
"stage": "research",
|
||||
"milestone": "v1.27",
|
||||
"phase_role": "pre_execution",
|
||||
"attempts": 0,
|
||||
|
||||
+51
-143
@@ -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).
|
||||
- **Mode:** `warn` (the milestone is `.ciagent/`-only; the lead-
|
||||
developer owns all writes; no cross-territory collisions expected).
|
||||
+203
-462
@@ -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).
|
||||
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.
|
||||
Reference in New Issue
Block a user