GRILL (ci-griller): 9 axes, 8 findings G-103..G-110, verdict proceed-with-conditions (conf 0.82). 3 binding mitigations incorporated: - G-104 (scope/technical, conf 0.90): re-tag Major milestone on its OWN minor line (v1.15.x), not the v1.14.x patch line (NFR convention). Precedent: v1.10.2→v1.11.0, v1.9.x→v1.10.0. Updated PLAN/ROADMAP/ PROJECT/REQUIREMENTS/ARCHITECTURE tag refs: v1.15.0(P0)→v1.15.4(P5). - G-106 (risk/technical, conf 0.88): .env.secrets direct-read paths (run_platform.sh:288-289 + regression_verify.py:309-312) bypass the core/env.py helper — P2 MUST dual-read these (NOVA_* first, ACDL_* fallback) or AWS creds vanish mid-rename. Bound in PLAN.md P2 task 2. - G-108 (security, conf 0.80): CI workflow secrets: refs (deploy.yml + modules-lifecycle.yml, .gitea + .github) reference secrets.ACDL_* — P2 MUST update to secrets.NOVA_* in lockstep with Gitea secret creation. Bound in PLAN.md P2 task 3 (hard gate). 5 accepted-as-is findings (G-103/105/107/109/110), 0 open escalations. ---ci--- project: acdl phase: 0 milestone: v1.15 status: grill ---/ci---
19 KiB
phase, name, milestone, requirements, wave, depends_on
| phase | name | milestone | requirements | wave | depends_on | ||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| P0 | pre-execution | v1.15 |
|
0 |
v1.15 — Nova Rebrand Plan (4 execution phases + 1 final)
Milestone: v1.15 (Nova Rebrand — Major/breaking)
Type: Major (breaking — consumer path, env vars, SSM path, tag keys,
AWS resource names all change). Per the branch-strategy precedent
(v1.10.2 → v1.11.0, v1.9.x → v1.10.0 — breaking/feature milestones tag
on their OWN minor line, not the previous minor's patch line), v1.15
tags run on the v1.15.x minor line: v1.15.0 (P0) →
v1.15.1..v1.15.4 (P1–P4) → v1.15.4 (P5 = milestone release). (G-104
binding: the v1.14.x patch line is the NFR convention; a Major
milestone ships on its own minor.)
Branch: milestone/v1.15-nova → phase/NN-<slug>
Wave ordering (D-098 v1.15 analogue)
- Wave 1 (P1): docs/decks/prose — no runtime impact; establishes the Nova vocabulary + ships the consumer migration guide. REQ-155, REQ-156, REQ-157. Independent (first phase).
- Wave 2 (P2): code + env vars (dual-read) + consumer path — deployments don't break during the transition window. REQ-158, REQ-159, REQ-160. Depends on P1 (docs establish the guide P2 changes are announced in).
- Wave 3 (P3): SSM path + tag keys — SSM copy/read/delete; tag keys parallel-tag → policy swap → remove old. REQ-161, REQ-162. Depends on P2 (env var dual-read + nova_tagging.py warn mode must land first).
- Wave 4 (P4): AWS resource names — staged terraform migration. REQ-163. Depends on P3 (tag keys nova:* enforced hard before resource recreation; nova_tagging.py hard mode).
- Wave 5 (P5): final-review-ship — remove dual-read fallback, review, audit, milestone ship. REQ-164. Depends on P1–P4.
Execution approach
Each phase: EXECUTE (persona-assigned task groups) → VERIFY (4 layers + regression gate stays 16/16) → SHIP (patch tag on v1.14.x line). Phase boundary checkpoint resets context. The execute workflow reads this PLAN.md + ROADMAP.md §v1.15 + PERSONAS.md §v1.15 for task decomposition.
Binding constraint (capability gate): the regression gate
(CAP-001..CAP-016, scripts/run_regression.sh) MUST stay 16/16 Verified
throughout the rebrand. Each phase updates test fixtures that reference
ACDL/acdl so the gate stays green. No capability is added, removed,
or reclassified — the rebrand is nomenclature + identifiers, not
behavior.
Wave 1 — Docs / Decks / Prose (P1)
P1 — docs-decks-prose (REQ-155, REQ-156, REQ-157)
Persona: lead-developer
Territory: README.md, docs/**, .ciagent/*.md, deck
.md/-marp.md/-talking-points.md/.html,
docs/presentations/assets/mmd/*.mmd (+ PNG re-export), pyproject.toml,
schemas/*.schema.json $id (D-110), docs/NOVA_MIGRATION.md (NEW),
.github/workflows/release.yml title, .gitea/workflows/release.yml
(if present), modules/STANDARDS.md, contracts/** prose
Tasks:
- Prose rebrand (REQ-155). Find/replace across all docs + .ciagent
markdown:
ACDL→Nova,Agentic Cloud Delivery Platform→Nova(full phrase). Preserve historical narrative (e.g. "formerly ACDL" in any changelog-style section is acceptable; otherwise full swap). Updatepyproject.tomlname→nova,description→ Nova. Updaterelease.ymlrelease-title prefixACDL→Nova. Update illustrative URLs in docs:github.com/acdl/...→github.com/nova/...,git.cloudinit.dev/continuous-intelligence/acdl*→.../nova*(prose only; config.jsonrelease.gitea.repostaysacdlper D-105). - Schema $id rebrand (D-110, REQ-155). Update
$idin allschemas/*.schema.json+schemas/tagging-standard.json:https://acdl.cloudinit.dev/schemas/...→https://nova.cloudinit.dev/schemas/.... Update test fixtures that assert the$idvalue. - Deck + mermaid rebrand (REQ-156). Edit both deck markdown
sources (
docs/presentations/how-the-platform-works.md,the-developer-experience.md+ their-marp.md+-talking-points.mdvariants):ACDL→Novain slide content + mermaid cluster labels (["ACDL — infrastructure only"]→["Nova — infrastructure only"]). Edit the 5.mmdsources (docs/presentations/assets/mmd/*.mmd):ACDL→Nova. Re-export the PNG diagrams from the edited.mmdsources so the committed PNGs match the new labels (use the deck README's documented process: mmdc CLI or the render script). - Nova tagline insertion (REQ-157). Add the tagline "The New Dawn
of DevSecOps — security as a seamless enabler of fast deployments" to:
the README header (below the title), both deck title slides (as the
subtitle, replacing "Agentic Cloud Delivery Platform"), and
docs/vision.md(top of the Vision section). Retain the existing "North Star" / "consumers declare intent" framing — do NOT remove it (D-106). - Consumer migration guide (REQ-155/160). Create
docs/NOVA_MIGRATION.mdannouncing the 5 breaking changes coming in P2–P4: (a).acdl/contract.yml→.nova/contract.yml(P2); (b)ACDL_*env vars →NOVA_*(P2, dual-read fallback); (c) SSM path/acdl/→/nova/(P3); (d) AWS tag keysacdl:*→nova:*(P3); (e) AWS resource namesacdl-*→nova-*(P4, maintenance window). Include the dual-read fallback window (P2–P4) + the cutoff (P5 removes fallback). - HTML re-render (REQ-156). Re-render both deck HTML files from
the updated
-marp.mdsources (self-contained, base64 images, S&P theme unchanged per D-107). Commit the re-rendered HTML. - Regress gate.
bash scripts/run_regression.sh— expect 16/16 Verified (fixtures referencingACDL/acdlin paths are updated in P2; P1 only touches prose/decks/schema-$id, so the gate should stay green. If a test asserts anACDLstring in a doc it reads, update the assertion toNova).
Wave 2 — Code / Env Vars / Consumer Path (P2)
P2 — code-envvars-consumer-path (REQ-158, REQ-159, REQ-160)
Persona: backend-engineer (lead) + lead-developer (docs/runbook)
Territory: core/env.py (NEW), core/*.py, scripts/*.py +
*.sh, adapters/**, tests/**, .gitea/workflows/** +
.github/workflows/**, .env + .env.secrets (key rename),
schemas/tagging-standard.json,
adapters/terraform/policy/custom_rules/acdl_tagging.py →
nova_tagging.py
Tasks:
- Dual-read env helper (D-108, REQ-159). Create
core/env.pywithget_env(name, default=None)that readsNOVA_<name>then falls back toACDL_<name>, returningdefaultif neither. Add unit tests intests/test_env_helper.pycovering: both set (NOVA wins), only NOVA set, only ACDL set (fallback), neither set (default). - Env var rename (REQ-159). Migrate all 21
ACDL_*env var references →NOVA_*acrosscore/*.py,scripts/*.py+*.sh,adapters/**,tests/**,.gitea/workflows/**,.github/workflows/**. Use thecore/env.pyhelper at Python call sites (replaceos.environ.get("ACDL_X")→env.get_env("X")); for shell scripts, use${NOVA_X:-$ACDL_X}dual-read inline. Rename keys in.env+.env.secrets(KEY names only — VALUES/secret material stay). Leave a comment in.env.secretsnoting the legacyACDL_*keys are the dual-read fallback source until P5. G-106 binding: the.env.secretsdirect-read paths (scripts/run_platform.sh:288-289export AWS_ACCESS_KEY_ID="$ACDL_AWS_ACCESS_KEY_ID"core/regression_verify.py:309-312if k == "ACDL_AWS_ACCESS_KEY_ID") bypass the helper and MUST be updated to dual-readNOVA_*first,ACDL_*fallback (shell:${NOVA_AWS_ACCESS_KEY_ID:-$ACDL_AWS_ACCESS_KEY_ID}; Python: matchk == "NOVA_AWS_ACCESS_KEY_ID" or k == "ACDL_AWS_ACCESS_KEY_ID") — otherwise AWS creds vanish mid-rename and CAP-013/014/015 fail.
- Gitea secrets rotation + workflow refs (G-108 binding, REQ-159).
Use the Gitea API (
scripts/rotate_spike_key.shpattern or a newscripts/rename_gitea_secrets.py) to createNOVA_*secrets mirroring theACDL_*values (idempotent + retry-on-failure), then (after P5) delete the oldACDL_*secrets. For P2, just create theNOVA_*aliases; deletion is P5. G-108 binding: whenNOVA_*secrets are created, the CI workflowsecrets:references (.gitea/workflows/deploy.yml:105,107,108,148,.gitea/workflows/modules-lifecycle.yml:63,64,103,104,111,112,117,118,123,124,161,162,169,170,.github/workflows/*mirrored) MUST be updated fromsecrets.ACDL_*→secrets.NOVA_*in the SAME phase, with graceful degrade + theacdl-deploy-role name in deploy.yml:105 →nova-deploy-(P4 renames the IAM role). Until both secrets + refs are updated, CI breaks — this is a hard gate, not a silent skip. - Checkov rule rename (D-109 warn mode, REQ-158). Rename
adapters/terraform/policy/custom_rules/acdl_tagging.py→nova_tagging.py. Update the Checkov registration inschemas/tagging-standard.json(line 5 + thedescription) and the adapter config (adapters/terraform/policy/checkov_adapter.py). The rule enforcesnova:*tag keys BUT in warn mode for P2 (existing resources still carryacdl:*until P3) — log a warning, don't fail the check. UpdateACDL_TAG_NAMING→NOVA_TAG_NAMING. - Consumer path rename (REQ-160). Rename the consumer on-disk
contract path
.acdl/contract.yml→.nova/contract.ymlacross:core/contract_resolver.py(any default path), the deploy workflowdefault:field (.gitea/workflows/deploy.yml+.github/workflows/deploy.ymlline 54),schemas/contract.schema.jsondescription,tests/test_pipeline_contract.py:313assertion, and consumer docs (docs/consumer-guide.md,docs/modules/index.md). Also.acdl/static-assets.*.yml→.nova/...+.acdl/contract.yaml→.nova/contract.yaml. - Test fixture update (binding). Update all test fixtures in
tests/**that referenceACDL/acdl(env var names, paths, table names, tag keys) to the newNOVA/novavalues — EXCEPT fixtures that assert the dual-read fallback behavior (those keepACDL_*as the fallback source).pytestmust pass. - Regress gate.
bash scripts/run_regression.sh— 16/16 Verified.
Wave 3 — SSM Path + Tag Keys (P3)
P3 — ssm-tagkeys (REQ-161, REQ-162)
Persona: data-engineer (lead) + backend-engineer (readers)
Territory: core/output_publisher.py, core/contract_resolver.py,
scripts/migrate_ssm_paths.py (NEW), terraform/** (tag keys),
adapters/terraform/policy/custom_rules/nova_tagging.py (hard mode),
ABAC session-policy terraform
Tasks:
- SSM path migration (REQ-161). Update
core/output_publisher.py: the SSM parameter path prefix/acdl/{env}/{contractId}/{output}→/nova/{env}/{contractId}/{output}. Updatecore/contract_resolver.pySSM reads. Update consumer docs. Createscripts/migrate_ssm_paths.pythat: (a) lists/acdl/...parameters, (b) copies each to/nova/...(same value/type), (c) verifies the copy, (d) deletes the old/acdl/...parameters. The script is idempotent + dry-run by default (--applyto execute). - Tag keys: parallel-tag (REQ-162). Update terraform tagging
(
terraform/platform/main.tf,terraform/microservice/main.tf,terraform/ci-vpc/main.tf,modules/l1/*/terraform/main.tf,modules/l2/*/composition.jsontag defaults) to emit bothnova:*andacdl:*tag keys during P3 (parallel-tag period). Theacdl:cost-centerdefaultacdl-default→nova-defaultfor thenova:cost-centerkey (keepacdl-defaulton theacdl:cost-centerkey during the parallel period). - Tag keys: ABAC policy swap (REQ-162). Update the ABAC session
policies (the deploy role's inline policy in
terraform/platform/main.tf+terraform/bootstrap/**) to matchnova:*tags (theStringEquals/Resourcetag conditions referencenova:owner/nova:environment/etc.). Keep theacdl:*match as a secondary condition during the parallel period so neither old nor new consumers break. - Checkov rule: hard mode (D-109, REQ-162). Update
nova_tagging.pyfrom warn → hard mode: enforcenova:*tag keys (hard fail on missingnova:*or presence ofacdl:*-only tags). Updateschemas/tagging-standard.jsontag keys →nova:*. - Tag keys: remove old (REQ-162). Once the parallel-tag period is
verified (terraform validate passes; the ABAC policy matches
nova:*), remove theacdl:*tag emissions from terraform. (Live removal ofacdl:*tags from existing AWS resources is a documentation/runbook step — the terraformnull_resourceor a scriptscripts/untag_acdl_keys.pycan do it with live AWS access; without live access, this is documented in the P4 runbook as a runtime step.) - Test fixture + regress gate. Update test fixtures asserting
acdl:*tag keys →nova:*.pytestpasses;bash scripts/run_regression.sh— 16/16 Verified.
Wave 4 — AWS Resource Name Migration (P4)
P4 — aws-resource-migration (REQ-163)
Persona: data-engineer (lead) + lead-developer (runbook)
Territory: terraform/platform/main.tf,
terraform/microservice/main.tf, terraform/ci-vpc/main.tf,
terraform/bootstrap/**, modules/l1/alb/instance.json,
scripts/migrate_dynamodb_data.py (NEW),
docs/NOVA_AWS_MIGRATION.md (NEW runbook),
core/lambda/contract_ingestor.py (default table names, D-111)
Tasks:
- Runbook (REQ-163). Create
docs/NOVA_AWS_MIGRATION.md— the maintenance-window + rollback runbook. Documents each resource rename, the migration command, the verification step, and the rollback procedure. Orders the migration: KMS alias (cheap) → SNS/SG (recreate) → Lambda (recreate) → DynamoDB (scan+copy) → ECR (re-push) → IAM (re-bootstrap) → state bucket (-migrate-state) → ALB (recreate, brief downtime, last). - Terraform resource names (REQ-163). Rename all
acdl-*resource names/labels →nova-*interraform/platform/main.tf,terraform/microservice/main.tf,terraform/ci-vpc/main.tf,terraform/bootstrap/**,modules/l1/alb/instance.json:- DynamoDB:
acdl-contracts→nova-contracts,acdl-change-requests→nova-change-requests - Secrets Manager:
acdl/github-token→nova/github-token - Lambda:
acdl-contract-ingestor(role/policy/function) →nova-contract-ingestor - SNS:
acdl-sod-halt→nova-sod-halt - SG:
acdl-ecs-sg→nova-ecs-sg - KMS:
alias/acdl-platform→alias/nova-platform - ECS:
acdl-microservice(cluster/service/task/role) →nova-microservice - ECR:
acdl-microservice→nova-microservice - IAM:
acdl-spike-runner(+policy) →nova-spike-runner - S3 state bucket:
acdl-tfstate-581513795199-us-east-1→nova-tfstate-581513795199-us-east-1 - ALB:
acdl-alb→nova-alb
- DynamoDB:
- Lambda default table names (D-111, REQ-163). Update
core/lambda/contract_ingestor.pydefault env-var values:CONTRACTS_TABLEdefaultacdl-contracts→nova-contracts,CHANGE_REQUESTS_TABLEacdl-change-requests→nova-change-requests,GITHUB_TOKEN_SECRET_IDacdl/github-token→nova/github-token,PLATFORM_REPOacdl/acdl→nova/acdl(prose consistency; real repo unchanged). - State bucket migration (REQ-63). Update the terraform backend
config (
terraform/{platform,microservice,ci-vpc}/terraform.tf+bootstrap/create_state_backend.py+bootstrap/.bootstrap_state.json) to the newnova-tfstate-...bucket. Document theterraform init -migrate-statecommand in the runbook (back up the state JSON first). - DynamoDB data-migration script (REQ-163). Create
scripts/migrate_dynamodb_data.py— scan+copy all items fromacdl-contracts→nova-contracts+acdl-change-requests→nova-change-requests. Verify row counts match. Keep old tables until verified (deletion is a manual post-verification step, documented in the runbook). - terraform validate + regress gate.
terraform validatepasses for platform/microservice/ci-vpc.grep -rn "acdl-" terraform/returns 0 hits.pytestpasses;bash scripts/run_regression.sh— 16/16 Verified.
Wave 5 — Final Review + Ship (P5)
P5 — final-review-ship (REQ-164)
Persona: lead-developer (lead) + all active (review)
Territory: .ciagent/**, core/env.py (remove fallback),
nova_tagging.py (hard-fail acdl:*), review + audit
Tasks:
- Remove dual-read fallback (REQ-164). Update
core/env.pyget_env()to readNOVA_*only (remove theACDL_*fallback). Update shell scripts to${NOVA_X}only (remove:-$ACDL_X). Updatenova_tagging.pyto hard-fail on anyacdl:*tag key (no warn). Delete theACDL_*secrets from Gitea (theNOVA_*aliases created in P2 are now the only source). Remove the legacy comment from.env.secrets. - Multi-persona review. Run
ciagent-reviewacross all v1.15 phases (P1–P4 changes). Auto-apply P0 fixes; flag P1+ for post-hoc. If P1+ found, fix in this phase. - Audit. Run
ciagent-audit— reconstruction test (git log matches.ciagent/files), file discipline, branch hygiene, commit discipline. If critical issues, fix in this phase. - Finalize consumer migration guide (REQ-164). Update
docs/NOVA_MIGRATION.mdto mark the migration complete (cutoff passed;ACDL_*fallback removed). - Complete milestone. Update
REQUIREMENTS.md(REQ-155..164 → complete),ROADMAP.md(v1.15 complete),PROJECT.md. Tagv1.14.5(IS the milestone release). Mergemilestone/v1.15-nova→main. Create Gitea release with full milestone summary.
Success Criteria (milestone gate)
- All 10 REQ-155..REQ-164 marked complete in REQUIREMENTS.md.
- Review: 0 new P0; all P1+ flagged or auto-fixed.
- Audit: clean; reconstruction test passes.
- Regression gate (D-091) 16/16 Verified throughout + at milestone complete.
grep -rni "ACDL\|Agentic Cloud Delivery" README.md docs/ .ciagent/*.mdreturns 0 hits (except explicit "formerly ACDL" historical notes).grep -rn "ACDL_" core/ scripts/ adapters/ tests/ .gitea/ .github/returns 0 hits (except the removed-fallback test in P5 that asserts the fallback is gone).grep -rn "acdl-" terraform/returns 0 hits.pytestpasses;run_ci.shexits 0;terraform validatepasses for platform/microservice/ci-vpc.- Tag
v1.15.4created (IS the milestone release, G-104); milestone merged to main.