2443909362
---ci--- project: nova-platform milestone: v1.0 status: complete requirements: covered: [REQ-01,REQ-02,REQ-03,REQ-04,REQ-05,REQ-06,REQ-07,REQ-08,REQ-09,REQ-10,REQ-11,REQ-12,REQ-13,REQ-14,REQ-15,REQ-16,REQ-17,REQ-18,REQ-19,REQ-20,REQ-21,REQ-22,REQ-23,REQ-24,REQ-25,REQ-26,REQ-27,REQ-28,REQ-29,REQ-30,REQ-31,REQ-32,REQ-33,REQ-34,REQ-35,REQ-36,REQ-37,REQ-38] partial: [] ---/ci--- v1.0 milestone complete: simplified infrastructure-delivery platform derived from Nova (acdl). 6 phases (P0-P5 + P6 final). 38 REQ-IDs. 38 decisions (D-001..D-038). 76 tests pass. Engine boundary holds. Happy paths green (check-only + CI). 13 L1 + 2 L2 modules. 5 terraform roots. Shell reproducibility. Zero OOS files. Tags: v0.1.0 (P0) → v0.1.1..v0.1.5 (P1..P5) → v0.1.6 (P6 = milestone release on v0.1 patch line).
115 lines
5.2 KiB
Markdown
115 lines
5.2 KiB
Markdown
# GRILL — Nova Platform v1.0 (Phase 0)
|
||
|
||
> Adversarial red-team of the v1.0 plan. 9 axes reviewed against the
|
||
> reference at `/home/opencode/acdl/` + locked decisions.
|
||
|
||
## Verdict: PROCEED-WITH-CONDITIONS — Confidence 0.82 → PROCEED (all conditions resolved)
|
||
|
||
One **blocking** architectural contradiction (C-1) + 5 non-binding
|
||
conditions. **All resolved under supervised autonomy:**
|
||
- C-1 (BLOCKING): D-037 locked — adapter loads registry, no `source`
|
||
in stack. REQ-04 + REQ-07 updated.
|
||
- C-2 (High): D-038 locked — L2 compositions = ARCHITECTURE.md's.
|
||
- C-3 (Medium): AC-8 now mechanically checkable (docs OOS grep).
|
||
- C-4 (Medium): Wave graph reordered — P3-W1 before P2-W1.
|
||
- C-5 (Low): Concurrency note added to PLAN.md.
|
||
- C-6 (Low): "without deviation" → "with 9 locked deviations" in
|
||
PROJECT.md + PERSONAS.md.
|
||
|
||
## Binding conditions
|
||
|
||
### C-1 (BLOCKING) — resolver-source / engine-boundary / adapter-signature contradiction
|
||
|
||
**The kill shot.** Three locked decisions are mutually unsatisfiable:
|
||
|
||
| Decision | Requires | Location |
|
||
|----------|----------|----------|
|
||
| REQ-04 + D-012 | Stack resource carries `source` field (Terraform path) | `core/contract_resolver.py` populates it |
|
||
| REQ-09 + D-034 | No `.py` in `core/` may contain `terraform` | `tests/test_engine_boundary.py` greps |
|
||
| REQ-07 | `adapt(stack, modules_dir) -> str` — no registry param | adapter can't resolve `source` |
|
||
|
||
**Verified against reference:** `acdl/schemas/stack.schema.json` has NO
|
||
`source` field. `acdl/adapters/terraform/adapter.py:19` loads
|
||
`registry.json` itself (`_load_registry`). The reference resolver never
|
||
writes a `terraform_dir` path into the stack. nova-platform's design
|
||
inverts this — putting `source` in the stack (resolver's job) while
|
||
keeping the adapter signature registry-less. The resolver must write
|
||
`"modules/l1/s3/terraform"` (contains forbidden `terraform`) → **AC-5
|
||
+ AC-10 will fail.**
|
||
|
||
**Fix (recommended — matches reference):**
|
||
- Drop `source` from `stack.schema.json` (REQ-04).
|
||
- Change `adapt(stack, modules_dir)` → `adapt(stack, repo_root)` (REQ-07).
|
||
- Adapter loads `registry.json` internally (inside the boundary — it's
|
||
the engine-specific code, permitted to read `terraform_dir`).
|
||
- L2 `terraform_dir` in registry (D-013) consumed by adapter, not resolver.
|
||
|
||
**Side effect (C-4):** if adopted, P2 (adapter) gains a dependency on
|
||
P3-W1 (registry.json). Reorder: P3-W1 before P2-W1, or split P3.
|
||
|
||
### C-2 (High) — L2 child set underspecified
|
||
|
||
ARCHITECTURE.md:114-115 describes L2 compositions:
|
||
- `microservice = vpc + ecs-cluster + ecs-service + iam-role + ecr + alb`
|
||
- `static-assets = s3 + cloudfront + kms-key`
|
||
|
||
But the reference `microservice` children = cluster, ecr, roles, alb,
|
||
service, kms (no vpc); `static-assets` = s3, cloudfront, **waf**, kms.
|
||
Nova drops waf from static-assets (consistent — waf L1 kept but not in
|
||
the L2). These are fresh-authored under D-012 (opaque L2), so not a
|
||
reference-mirror violation, but the composition is underspecified — no
|
||
decision locks the L2 child set.
|
||
|
||
**Fix:** Lock D-036 before P4-W2 specifying exactly which L1 modules
|
||
each L2 composes. Reconcile ARCHITECTURE.md.
|
||
|
||
### C-3 (Medium) — AC-8 not mechanically checkable
|
||
|
||
AC-8 ("docs... no OOS sections") is subjective. P6-W3 greps for OOS
|
||
*file names* but not OOS *content* inside allowed docs. A doc could
|
||
contain a "Security" section and pass.
|
||
|
||
**Fix:** Add grep check for OOS section headings ("Security",
|
||
"Compliance", "OIDC", "Attestation", "ABAC") inside `docs/*.md` +
|
||
`modules/*/README.md`. Make AC-8 mechanically checkable.
|
||
|
||
### C-4 (Medium) — missing dep if C-1(a) adopted
|
||
|
||
If C-1's recommended fix is adopted (adapter loads registry), P2 gains
|
||
a dependency on P3-W1 (registry.json). Current graph runs P2 + P3 in
|
||
parallel after P1.
|
||
|
||
**Fix:** Reorder P3-W1 before P2-W1, or split P3 into "registry first"
|
||
+ "L1 terraform second". Update the wave dependency graph.
|
||
|
||
### C-5 (Low) — concurrency cap violation
|
||
|
||
PLAN claims "No wave has >5 parallel tasks" but P3-W1 has 13, P3-W2 has
|
||
13, P4-W1 has 8. `max_concurrent_agents=5` → these batch-serialize into
|
||
3-5 rounds, inflating P3 wall-clock ~2-3×.
|
||
|
||
**Fix:** Either raise the cap for these waves or restate the schedule
|
||
estimate to reflect batching. Non-blocking.
|
||
|
||
### C-6 (Low) — "without deviation" claim is false
|
||
|
||
PROJECT.md:11 + PERSONAS.md:17,148 claim "structural conventions
|
||
preserved **without deviation**." RESEARCH.md itself lists **9 locked
|
||
deviations** (D-012, D-013, D-015, D-017, D-018, D-019, D-022, D-023,
|
||
D-025, D-027). An implementer may reject the needed C-1 fix as
|
||
"violating conventions."
|
||
|
||
**Fix:** Rewrite the claim to "structural conventions preserved except
|
||
the 9 locked deviations in CLARIFY.md."
|
||
|
||
## Additional notes (non-binding)
|
||
|
||
- **ARCHITECTURE.md:32 example bug:** `id: my-static-site` (14 chars)
|
||
fails the locked pattern `^[a-z][a-z0-9-]{2,5}$` (max 6). Fix to
|
||
`id: stsi` or `id: assets`.
|
||
- **D-014 (0.72), D-017 (0.70), D-030 (0.68):** marked below threshold
|
||
in CLARIFY.md but D-017/D-030 show no human-lock record (unlike D-025).
|
||
These WERE escalated + answered in the clarify stage question round —
|
||
confirmed locked. No action needed.
|
||
- **moto pinned but unused (D-030):** harmless. Keep or drop; not
|
||
blocking. |