0404988465
8 findings (all confidence >= 0.8): - F1 (VERY HIGH): theme CSS has zero section padding (/* @theme */ is a comment, not the directive; no @import of Marp default). - F2 (VERY HIGH): overflow:hidden silently clips dense content (8/19 slides overflow). - F3 (HIGH): image aspect-ratio catastrophe (platform-pipeline 13.52x, telemetry-live-ops 0.63x). - F4 (HIGH): header+footer chrome on every slide (~70px lost). - F5 (MEDIUM-HIGH): render_deck.sh omits --theme (unthemed output). - F6 (HIGH): render_slides.sh missing -s 2 -b transparent (1x PNGs). - F7 (LOW): P5 marp-cli version bump — NOT the cause (theme CSS byte- identical P3->P5). - F8 (VERY HIGH): test coverage gaps — no layout/overflow/aspect-ratio tests; static-file-property tests only. Persona roster (v1.22): lead-developer (theme CSS + deck markdown + mermaid + .ciagent), backend-engineer (render scripts + tests). frontend-engineer + data-engineer deactivated. D-148 (theme CSS is lead-developer, not frontend), D-149 (no new personas). ---ci--- project: acdl phase: 0 milestone: v1.22 status: research ---/ci---
232 lines
13 KiB
Markdown
232 lines
13 KiB
Markdown
---
|
||
project: acdl
|
||
milestone: v1.22
|
||
generated_at: 2026-08-11
|
||
generator: lead-developer
|
||
verification_toolchain:
|
||
typecheck: "python3 -m py_compile tests/test_slides_pipeline.py"
|
||
test: "pytest tests/test_slides_pipeline.py # REQ-254..262"
|
||
build: "bash scripts/render_slides.sh nova-autonomous-cloud-delivery # HTML + PPTX"
|
||
note: |
|
||
v1.22 is the Nova Deck Layout Fix — a docs-only NFR milestone. Two
|
||
active personas: lead-developer (theme CSS + deck markdown + talking
|
||
points + README + .ciagent metadata), backend-engineer (render scripts
|
||
+ tests). frontend-engineer stays deactivated (decks are markdown =
|
||
lead-developer territory, per v1.17/v1.18 precedent). No data-engineer
|
||
(no schema/DB changes). No new personas (the work is CSS + bash +
|
||
markdown + pytest, all within the two active personas' range).
|
||
---
|
||
|
||
# ACDL — Persona Roster (v1.22 Nova Deck Layout Fix)
|
||
|
||
> v1.22 roster. Two active personas + one deactivated. This is a docs-
|
||
> only NFR milestone: the work is theme CSS, render scripts, mermaid
|
||
> diagrams, deck markdown, and tests. frontend-engineer stays
|
||
> deactivated (decks are markdown = lead-developer territory, per
|
||
> v1.17/v1.18 precedent). No data-engineer (no schema/DB changes).
|
||
|
||
## Active personas
|
||
|
||
### lead-developer
|
||
- **Domain:** coordination + deck content
|
||
- **Active:** true
|
||
- **Phase-specific:** false
|
||
- **Frameworks:** [] (no framework — owns process + narrative + CSS + markdown)
|
||
- **Constraints:** ["pragmatic", "battle-tested defaults", "no fabrication (NORTH_STAR honesty model)", "do not change the 4-beat arc", "do not re-introduce badges/version/internal citations"]
|
||
- **Territory:**
|
||
- `docs/presentations/assets/nova-sp-theme.css` (REQ-254,255,256 — theme CSS)
|
||
- `docs/presentations/nova-autonomous-cloud-delivery-marp.md` (REQ-261 — deck content)
|
||
- `docs/presentations/nova-autonomous-cloud-delivery.md` (REQ-261 — source of truth)
|
||
- `docs/presentations/nova-autonomous-cloud-delivery-talking-points.md` (REQ-261)
|
||
- `docs/presentations/README.md` (REQ-261 — slide-count convention)
|
||
- `docs/presentations/assets/mmd/*.mmd` (REQ-259,260 — mermaid re-layout)
|
||
- `.ciagent/**` (PROJECT, ROADMAP, REQUIREMENTS, RESEARCH, PLAN, GRILL, PERSONAS, REVIEW, CHECKPOINT)
|
||
- **Reason:** Owns the theme CSS (the root cause), the deck markdown
|
||
(trim/split overflowing slides), the mermaid re-layout, the talking
|
||
points, the README, and all CIAgent metadata. Is the only persona
|
||
that touches `.ciagent/**` and the deck markdown/CSS.
|
||
- **Phase-specific flag:** none (active for all of P0–P6).
|
||
|
||
### backend-engineer
|
||
- **Domain:** render scripts + tests
|
||
- **Active:** true
|
||
- **Phase-specific:** false
|
||
- **Frameworks:** ["bash", "pytest", "marp-cli", "mermaid-cli"]
|
||
- **Constraints:** ["pin CLI versions (no @latest)", "2x scale + transparent bg for mermaid", "tests must catch layout regressions", "no raw curl with shell-env tokens"]
|
||
- **Territory:**
|
||
- `scripts/render_slides.sh` (REQ-257,258 — pin versions, 2x scale)
|
||
- `scripts/render_deck.sh` (REQ-257 — DELETE)
|
||
- `tests/test_slides_pipeline.py` (REQ-262 — layout/aspect-ratio/theme-structural tests)
|
||
- `.github/workflows/slides.yml` (if references to render_deck.sh need removal)
|
||
- **Reason:** Owns the render pipeline (bash scripts) and the test
|
||
suite. The layout/aspect-ratio/theme-structural tests (REQ-262) are
|
||
the gap that let this regression through — backend-engineer owns
|
||
closing that gap. Pinning CLI versions and adding 2x scale are
|
||
backend/scripting tasks.
|
||
- **Phase-specific flag:** none (active for P2, P5; light touch on P0/P6).
|
||
|
||
## Deactivated personas
|
||
|
||
### frontend-engineer
|
||
- **Active:** false
|
||
- **Domain:** frontend
|
||
- **Frameworks:** ["react", "next.js"] (inert — no territory)
|
||
- **Constraints:** ["component-first", "server-components", "minimal-client-js"] (inert)
|
||
- **Territory:** [] (no territory in v1.22)
|
||
- **Reason:** v1.22 has no frontend; decks are markdown (lead-developer
|
||
territory); deactivated per PERSONAS.md v1.17/v1.18 precedent. The
|
||
theme CSS is a Marp stylesheet, not a React/Next.js component system
|
||
— it stays lead-developer territory. No reactivation trigger.
|
||
|
||
### data-engineer
|
||
- **Active:** false
|
||
- **Domain:** data
|
||
- **Frameworks:** [] (inert)
|
||
- **Constraints:** [] (inert)
|
||
- **Territory:** [] (no territory in v1.22)
|
||
- **Reason:** v1.22 has no schema/DB/ORM changes. The milestone is
|
||
docs + scripts + tests only. No reactivation trigger.
|
||
|
||
## Roster decisions
|
||
|
||
### D-148 (0.95): Theme CSS is lead-developer territory, not frontend-engineer
|
||
The `nova-sp-theme.css` is a Marp stylesheet (CSS for a markdown-to-
|
||
slide renderer), not a React/Next.js component system. The v1.17/v1.18
|
||
precedent (decks are markdown = lead-developer territory) extends to
|
||
the deck's CSS theme. frontend-engineer's frameworks (react, next.js)
|
||
are irrelevant to Marp CSS. **Decision:** theme CSS stays lead-developer
|
||
territory. Confidence 0.95 — the only counter-argument is that CSS is
|
||
"frontend," but Marp CSS is a static stylesheet, not a component system.
|
||
|
||
### D-149 (0.9): No new personas for v1.22
|
||
The work is CSS + bash + markdown + mermaid + pytest. All of this is
|
||
within the two active personas' range (lead-developer: CSS + markdown +
|
||
mermaid; backend-engineer: bash + pytest). Creating a separate "css-
|
||
engineer" or "slides-engineer" persona would fragment ownership of the
|
||
theme CSS + deck markdown (both lead-developer) and the render scripts
|
||
+ tests (both backend-engineer). **Decision:** no new personas.
|
||
Confidence 0.9.
|
||
|
||
### Territory-overlap resolution (co-ownership)
|
||
|
||
| Path | Primary | Co-owner | Why |
|
||
|------|---------|----------|-----|
|
||
| `docs/presentations/assets/mmd/*.mmd` | lead-developer (mermaid re-layout) | backend-engineer (re-render via render_slides.sh) | The .mmd content is lead-developer (diagram narrative); the PNG re-render is backend-engineer (script invocation). |
|
||
| `tests/test_slides_pipeline.py` | backend-engineer (test code) | lead-developer (assertions reflect deck structure) | The test code is backend; the assertions (slide count, theme rules, aspect ratios) reflect lead-developer's deck/theme decisions. |
|
||
|
||
---
|
||
|
||
## Historical rosters
|
||
|
||
<details>
|
||
<summary>v1.18 roster (Citizen Developer & Production-Grade Guidance) — superseded by v1.22</summary>
|
||
|
||
### Active personas (v1.18)
|
||
|
||
### lead-developer
|
||
- **Domain:** coordination
|
||
- **Active:** true
|
||
- **Phase-specific:** false
|
||
- **Frameworks:** [] (no framework — owns process + narrative, not code)
|
||
- **Constraints:** ["pragmatic", "battle-tested defaults", "no fabrication (NORTH_STAR honesty model)"]
|
||
- **Territory:**
|
||
- `docs/presentations/**` (Step 1/2/4 markdown + the deck automation trigger)
|
||
- `.ciagent/**` (PROJECT, ROADMAP, REQUIREMENTS, RESEARCH, PLAN, GRILL, PERSONAS, REVIEW, CHECKPOINT)
|
||
- `PROJECT.md` (RACI matrix + PDLC-scope statement, REQ-215/216)
|
||
- `ROADMAP.md`
|
||
- `REQUIREMENTS.md`
|
||
- `docs/raci.md` (REQ-215)
|
||
- `docs/scope.md` (REQ-216)
|
||
- `docs/skills.md` (REQ-222 — the index page, not the skill files themselves)
|
||
- `docs/submission-readiness.md` (REQ-219 — citizen-developer-facing copy; co-owned with backend-engineer for the reason-code catalog)
|
||
- **Reason:** Owns CIAgent metadata, the milestone narrative, the RACI +
|
||
PDLC-scope statements (REQ-215/216), the deck (21 slides, S&P theme
|
||
regression check vs P1, CAP-024), the skills index page (REQ-222), and
|
||
the citizen-developer-facing submission-readiness doc (REQ-219). Is
|
||
the only persona that touches `.ciagent/**` and the deck markdown.
|
||
- **Phase-specific flag:** none (active for all of P0–P7).
|
||
|
||
### backend-engineer
|
||
- **Domain:** backend
|
||
- **Active:** true
|
||
- **Phase-specific:** false
|
||
- **Frameworks:** ["mcp (Python SDK v2)", "pydantic", "jsonschema", "urllib"]
|
||
- **Constraints:** ["api-first", "strict-typing", "plugin-registry extensible (D-140)", "stdio now / HTTP-ready (D-135)", "no stack traces to citizen developers (REQ-218)"]
|
||
- **Territory:**
|
||
- `mcp/atelier/server.py` (REQ-223)
|
||
- `mcp/atelier/plugins/**/*.py` (REQ-223 — principles.py, validation.py)
|
||
- `mcp/atelier/vendor/**` (REQ-224 — vendored Atelier snapshot)
|
||
- `mcp/atelier/VERSION.md` + `mcp/atelier/README.md` (REQ-224)
|
||
- `scripts/update_atelier_vendor.sh` (REQ-224)
|
||
- `core/submission_readiness.py` (REQ-218 — the validator, invoked as `contract_ingestor.py --check-readiness`)
|
||
- `scripts/render_deck.sh` (REQ-228 — HTML + PPTX render)
|
||
- `scripts/attach_release_asset.py` (REQ-228 — Gitea release asset upload)
|
||
- `tests/test_atelier_mcp.py` (REQ-225)
|
||
- `tests/test_submission_readiness.py` (REQ-220)
|
||
- `docs/submission-readiness.md` (REQ-219 — reason-code catalog section; co-owned with lead-developer for the narrative)
|
||
- **Reason:** Owns the MCP server (plugin-registry, stdio, vendored
|
||
Atelier), the submission-readiness validator (extends
|
||
`contract_ingestor.py --check-readiness`, D-133), the render/attach
|
||
scripts (D-142 trigger), and the two new test files. The MCP
|
||
plugin-registry (D-140) is a backend pattern — no separate
|
||
mcp-engineer persona is created; backend-engineer owns it.
|
||
- **Phase-specific flag:** none (active for P1 deck-render, P3 validator,
|
||
P5 MCP server, P6 scripts).
|
||
|
||
### data-engineer
|
||
- **Domain:** data
|
||
- **Active:** true
|
||
- **Phase-specific:** false
|
||
- **Frameworks:** ["jsonschema", "dynamodb (item shape)"]
|
||
- **Constraints:** ["schema-first", "superset-gate NOT duplicate (PROJECT.md hard constraint)", "W3.E per-env mandatory table is the source of truth"]
|
||
- **Territory:**
|
||
- `schemas/**` (REQ-217 — `submission-readiness.schema.json` is the new schema; existing schemas untouched)
|
||
- `core/lambda/contract_ingestor.py` (the `--check-readiness` subcommand wiring, D-133 — the validator is in `core/submission_readiness.py` but the ingestor dispatches to it; co-owned with backend-engineer)
|
||
- **Reason:** Owns the submission-readiness JSON Schema (REQ-217) — it
|
||
is a schema artifact, data-engineer territory. The schema is a
|
||
*superset gate above* `contract.schema.json`, not a duplicate (it
|
||
references contract fields, does not redefine them). The
|
||
per-env-mandatory table comes from W3.E (the locked decision). The
|
||
ingestor wiring is co-owned with backend-engineer (the dispatch point
|
||
is backend; the schema it validates against is data).
|
||
- **Phase-specific flag:** none (active for P3 schema + ingestor wiring).
|
||
|
||
### Deactivated personas (v1.18)
|
||
|
||
### frontend-engineer
|
||
- **Active:** false
|
||
- **Domain:** frontend
|
||
- **Frameworks:** ["react", "next.js"] (inert — no territory)
|
||
- **Constraints:** ["component-first", "server-components", "minimal-client-js"] (inert)
|
||
- **Territory:** [] (no territory in v1.18)
|
||
- **Reason:** v1.18 has no frontend; decks are markdown (lead-developer
|
||
territory); deactivated per PERSONAS.md v1.17 precedent. v1.18's
|
||
observability stays PowerBI / external (Out of Scope: "A Nova-built
|
||
frontend / dashboard"). The MCP server exposes tools to an AI agent,
|
||
not a web UI. No reactivation trigger in this milestone.
|
||
|
||
### Roster decisions (v1.18)
|
||
|
||
### D-143 (0.90): Fold mcp-engineer into backend-engineer
|
||
The MCP plugin-registry (D-140: `plugins/<name>.py register(mcp)`) is a
|
||
backend code pattern — Python modules, type hints, stdio transport,
|
||
urllib for the Gitea asset API. It shares nothing with the data domain
|
||
(schemas/DynamoDB) and is not a new engineering discipline. Creating a
|
||
separate `mcp-engineer` persona would fragment ownership of the server +
|
||
its tests + the render/attach scripts (all backend). **Decision:** fold
|
||
into backend-engineer. backend-engineer's `frameworks` list gains
|
||
`mcp (Python SDK v2)`. Confidence 0.90 — the only counter-argument is
|
||
that MCP is a distinct protocol skill, but the SDK v2 API surface
|
||
(`@mcp.tool()` + type hints) is small and well within backend-engineer's
|
||
range (it's the same Pydantic/FastAPI-style pattern the persona already
|
||
knows).
|
||
|
||
### Territory-overlap resolution (v1.18)
|
||
|
||
| Path | Primary | Co-owner | Why |
|
||
|------|---------|----------|-----|
|
||
| `docs/submission-readiness.md` | lead-developer (narrative + examples) | backend-engineer (reason-code catalog, REQ-218 codes) | The doc is citizen-developer-facing copy (lead) but the reason-code catalog (MISSING_TAGS, ENV_MISSING_MANDATORY, AGENTIC_MISSING_INTENT, MISSING_APP_SOURCE, POLICY_PRECONDITION_MISSING) is backend (it mirrors the validator's return codes). |
|
||
| `core/lambda/contract_ingestor.py` | backend-engineer (dispatch wiring) | data-engineer (the schema it validates against) | D-133 places the `--check-readiness` subcommand on the ingestor (backend dispatch), but the readiness schema it loads is data-engineer territory. |
|
||
| `schemas/submission-readiness.schema.json` | data-engineer (schema artifact) | backend-engineer (the validator must match it) | The schema is data-engineer's; the validator (REQ-218) is backend-engineer's and must stay in sync with it. |
|
||
|
||
</details> |