---ci---
project: acdl
phase: 9
milestone: v1.1
status: verify
verdict: VERIFIED
---/ci---
Four-layer verification of Phase 09 (v1-spike-ir-and-l1-and-adapter):
- Layer 1 Structural: PASS (9/9 deliverables; interface/instance/registry/adapter/TF/gitignore/tags/history all correct)
- Layer 2 Behavioral: PASS (verify_phase09.sh exit 0; typecheck; adapter reproducible; IR schema validates; unsupported IR type -> ValueError; terraform validate)
- Layer 3 Security: PASS (no secret pairs leaked; spike key gitignored + holds spike user key not root; no creds in TF/adapter; plan-only no apply)
- Layer 4 Quality: PASS (README layout accurate; all P09 commits carry ---ci--- blocks; ROADMAP/REQUIREMENTS traceability updated; D-P09-1..4 respected; versioning warning non-blocking)
P0: none. P1: (P1-1) two AWS access key IDs (public identifiers, not secret pairs) appear in the Phase 08 verify narrative at .ciagent/VERIFY.md commit 6d27dad which falls in the v1.1.3..v1.1.4 range — recommend redacting to placeholders in a future hygiene pass (the Phase 09 gate's AKIA scan correctly excludes .ciagent/). P1-2: terraform/spike/.terraform.lock.hcl is untracked and NOT covered by .gitignore (the PLAN's gitignore list missed it) — recommend adding it to .gitignore in a future hygiene pass.
Real terraform plan against AWS succeeded (rotated spike key, plan-only, -lock=false per D-P09-1).
---ci---
project: acdl
phase: 6
milestone: v1.1
status: verify
verdict: VERIFIED
---ci---
All four verification layers pass for Phase 06 (v1.1.1):
- Structural: demo/ contains the full v1.0 demo (history preserved via
git mv); new v1.1 top-level dirs scaffolded with .gitkeep; no stray
v1.0 dirs at root; v1.0.1..v1.0.5 + v1.1.0 + v1.1.1 tags present.
- Behavioral: typecheck gate green; scripts/verify_phase06.sh exits 0
with "Phase 06: ALL CHECKS PASS"; demo/scripts/run_demo.sh --no-upload
produces a non-empty, hash-chained audit.json in /tmp/acdl_demo_run/.
- Security: no .env/tfstate/_key/secret files in v1.1.0..v1.1.1 diff;
the only content authored in the phase was the move commit, README,
.gitignore, and the verify script. LSP error on
demo/scripts/finalize_evidence.py:46 is pre-existing v1.0 demo code
(authored at v1.0.4, Phase 06 only git-mv'd it) — not a regression.
- Quality: all README link targets exist (docs/vision.md,
docs/architecture.md, .ciagent/{PROJECT,ARCHITECTURE,ROADMAP}.md,
demo/ACDL_DEMO.md); every phase commit carries a ---ci--- block with
the required fields; ROADMAP §Phase 06 status = complete (v1.1.1).
P1 (post-hoc, non-blocking): scripts/verify_phase06.sh does not
programmatically assert runner-data/ is in .gitignore. The must-have
is satisfied structurally (file content verified); only the assertion
is missing. Recommend adding `grep -q '^runner-data/$' .gitignore` in
a future touch-up.
No P0 issues. Phase 06 has no new REQ (repo hygiene).
---ci---
project: acdl
phase: 0
milestone: v1.1
status: research
research_targets: 10
top_finding:
- TARGET 1 (conf 0.95): Gitea Actions does NOT support id-token: write / OIDC.
Real OIDC deferred to v1.2 (blocked on go-gitea/gitea#36988).
Spike adopts D-039: per-run-rotated long-lived key waiver.
decisions_adopted: [D-039, D-040, D-041, D-042, D-043, D-044, D-045, D-046]
risks:
- R-1 (highest): OIDC gap -> key-rotation waiver (mitigated by D-039)
- R-2: Checkov terraform_plan edge cases (mitigated by ACDL_TAG_NAMING skipped record)
- R-3: 6 confidence inputs are a recommendation (D-040 adopted in PROJECT.md)
---/ci---
RESEARCH.md (1330 lines) authored by ci-researcher. Key findings:
- TARGET 1: Gitea Actions does NOT support emitting an OIDC id-token
(Gitea docs list id-token as unsupported; go-gitea/gitea#33681 open;
draft PR #36988 unmerged; Gitea's own CI still uses long-lived keys
per #37980). Real-AWS OIDC is unachievable in this environment for v1.1.
- TARGETS 2-10: Terraform/Checkov install steps, IR prior art, Checkov
adapter, DynamoDB outbox, 6-input confidence signal, tiered ledger
(Object Lock deferred), HITL/SoD, contract schema, archive strategy
— all resolved with concrete sketches in RESEARCH.md.
Adopted D-039..D-046 in PROJECT.md. Re-scoped Phase 08 (ROADMAP) and
REQ-23 (REQUIREMENTS) to reflect the OIDC blocker: the spike uses a
per-run-rotated long-lived key (D-039) instead of OIDC; real OIDC is a
v1.2 deliverable. ARCHITECTURE.md Gitea API surface table updated with
the OIDC verdict.
---ci---
project: acdl
phase: 0
milestone: v1.1
status: clarify
clarifications:
resolved: 12 operational parameters (AWS region, state bucket/lock names, OIDC role + trust subject, spike L1/L2/contract inputs, terraform command scope, Checkov ruleset, tag preservation, next ship tag)
mode: accept-recommendations + decide-rest (D-038)
deferred_to_research: [gitea/act_runner OIDC support, terraform/checkov runner availability, configure-aws-credentials action availability]
user_blocking_questions: 0
---/ci---
At full autonomy, the 11 architecture open decisions were already
recorded in PROJECT.md during SPECIFY (D-038). CLARIFY resolves the 12
operational parameters needed to unblock planning (AWS region, state
backend names, OIDC role, spike L1/L2/contract inputs, terraform command
scope, Checkov ruleset). The one genuinely unknown item — Gitea/act_runner
OIDC support — is not a clarification (no user preference can resolve it);
it is the highest-priority RESEARCH target.
Squash merge of phase/05-evidence-ui-and-demo-dry-run; evidence-ui/index.html + run_demo.sh 4-act simulation + verify_phase05.sh; demo live at acdl-evidence raw URL.
---ci---
phase: 1
milestone: v1.0
status: research
research:
gitea_capabilities:
pages: not_supported
environments_api: not_supported
repository_dispatch: not_supported
workflow_call: supported
workflow_dispatch: supported
issues_opened: supported
workarounds:
- D-012 raw file URLs in place of Pages
- D-013 workflow_dispatch approval inputs in place of environments
- D-014 workflow_dispatch API in place of repository_dispatch
verification_toolchain:
typecheck: bash -n + python -m py_compile (no package.json)
test: per-phase scripts/verify_phaseNN.sh
build: no-op
---/ci---
ARCHITECTURE.md gains a Gitea API surface table and a branch-pinning rule.
PERSONAS.md is the canonical project-level persona roster: lead-developer
and backend-engineer always active; infra-stub-engineer custom persona owns
L1 stubs; data-engineer deactivated (no DB); frontend-engineer deactivated
until Phase 05.
---ci---
phase: 1
milestone: v1.0
status: clarify
decisions:
- id: D-011
decision: Single-project mode explicitly enforced via config.json mode=single
rationale: run.md Step 0 reads projects[] length as multi-project trigger; explicit flag disambiguates from D-010
confidence: 0.95
alternatives: [move acdl into .ciagent/acdl/ subdirectory and adopt multi-project paths]
- id: D-012
decision: Gitea has no native Pages; serve acdl-evidence via raw file URLs + CORS note
rationale: Research confirms Gitea has no [pages] section; raw URLs work without server config
confidence: 0.85
alternatives: [sidecar static server, external Pages host]
- id: D-013
decision: QA/Prod gates modeled as workflow_dispatch approval inputs (D-004 fallback) instead of Gitea environments
rationale: Research confirms Gitea ignores environment: blocks and exposes no environments API
confidence: 0.90
alternatives: [external approval bot, drop approval gates entirely]
- id: D-014
decision: Cross-repo triggering uses workflow_dispatch API from inside a step (no repository_dispatch)
rationale: Gitea Actions does not support repository_dispatch
confidence: 0.85
alternatives: [push-based trigger with a sentinel file, polling]
- id: D-015
decision: New repos acdl-contracts and acdl-evidence use default_branch=main with auto_init=true
rationale: Matches Gitea DEFAULT_BRANCH=main; required for the default branch to exist before any push
confidence: 0.95
alternatives: [use milestone/v1.0-initial as default_branch]
- id: D-016
decision: Pages placeholder for Phase 01 is a minimal HTML stub; full timeline UI deferred to Phase 05
rationale: Phase 01 success criterion is the URL returns 200 with placeholder; full UI is Phase 05
confidence: 0.90
alternatives: [build a minimal timeline now]
---/ci---
Clarifications accepted at full autonomy per clarify.md Step 4. Three requirements
re-stated: REQ-09 (new repos default_branch=main), REQ-10 Pages (raw-URL 200
substitute), REQ-10 environments (workflow_dispatch inputs + qa/prod branches).
See .ciagent/REQUIREMENTS.md Clarifications table.
---ci---
phase: 0
milestone: v1.0
status: specify
security:
- id: SEC-001
type: info_disclosure
disposition: mitigated
summary: Literal API token was committed in config.json gitea.api_token_env field
fix: Replaced literal with env var name 'ACDL_GITEA_TOKEN'; token supplied via shell env at runtime
severity: high
stride: Information Disclosure
---/ci---
The 40-char value previously stored in .ciagent/config.json was a live Gitea
API token. Per the spec constraint 'no secrets in repo', the field now holds
an env var name. The token itself is exported in the shell session at runtime
and is never written to disk. Treat the prior value as already-leaked and
rotate it via the Gitea UI before any external disclosure.