Commit 7b217fe
feat(128): add executive threat architecture infographic with early-page PDF positioning (#131)
* feat(128): add executive threat architecture infographic with early-page PDF positioning
Adds the executive-architecture infographic template that produces a layered
architecture diagram with Critical/High threat callouts for non-technical
executives, positioned immediately after the Executive Summary in the security
report PDF.
User Stories delivered (spec.md):
- US-1 (P1): extract an executive-architecture payload from threat model output
- US-2 (P1): render the page between Executive Summary and Attack Path Analysis
- US-3 (P2): include in the `all` shorthand; add `exec` alias
- US-4 (P2): graceful skip when no Critical/High findings exist
Implementation touches:
- `scripts/extract-infographic-data.py` - 4 new helpers + dispatch branch
- `scripts/extract-report-data.py` - detect_images + Typst writers
- `templates/tachi/security-report/main.typ` - conditional page block
- `schemas/infographic.yaml` - template enumeration
- `.claude/agents/tachi/threat-infographic.md`, report-assembler.md
- `.claude/commands/tachi.infographic.md` - template list, exec alias, all expansion
- `.claude/skills/tachi-infographics/` - reference doc + SKILL.md index
Pytest harness bootstrapped (Wave 1): tests/, conftest.py with importlib shim,
pyproject.toml pytest config, requirements-dev.txt, Makefile test target.
39 tests total, all green.
Scope-bleed bundled into this PR (see decisions.md Decision 4):
- `scripts/extract-report-data.py` - attack-tree H1 heading fallback and
component/title enrichment (required to parse mermaid-agentic-app)
- `templates/tachi/security-report/attack-path.typ` - defensive string->array
coercion for `remediation` (prevents character-by-character iteration bug)
Known post-merge follow-up: portrait infographic images (such as the generated
executive architecture JPEG) produce extra blank pages in `infographic-page()`
because the function was tuned for landscape aspect ratios. Fix is either
Gemini prompt tuning (generate landscape) or a Typst template refinement
(max-height constraint). Tracked in code-review.md INFO-1.
Governance: PM + Architect + Team-Lead signed-off tasks.md. P0 APPROVED_WITH_CONCERNS
(0 blocking). P1 APPROVED_WITH_CONCERNS (0 blocking). T035 code-review
APPROVED_WITH_CONCERNS (0 blocking, 4 INFO). T036 architect-checkpoint
APPROVED_WITH_CONCERNS (cites P1). T037 security-review APPROVED_WITH_CONCERNS
(0 blocking, 1 INFO). T038 usability deferred to post-merge per 5-day SLA.
Refs: closes #128
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
* security(128): run security scan [01d3e85]
SAST: 12 code files scanned (2 production scripts + 10 test files).
Zero OWASP P0 findings. No SQL injection, command injection, hardcoded
secrets, weak crypto, path traversal, or insecure randomness patterns.
Both production scripts are CLI tools that parse markdown files — no
network I/O, no shell execution, no cryptographic primitives.
SCA: 2 manifests audited (pyproject.toml, requirements-dev.txt).
Zero findings. Packages: setuptools>=61 (build-system), pytest>=8.0
and pytest-cov>=4.1 (dev-only). No production runtime dependencies
added by F-128. No known CVEs at declared versions.
Artifacts written:
- .security/scan-log.jsonl (chain_hash 540fc7a6a4...)
- .security/reports/01d3e8587191.sarif (empty results array)
- .security/reports/sca-2026-04-10.cdx.json (CycloneDX SBOM, 3 components)
- specs/128-prd-128-executive/security-scan.md
Scan status: PASSED
Scan ID: ba390e43-68fd-4627-b3c4-92e79c24141a
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
* docs(128): mark T035-T039 complete in tasks.md
Updates tasks.md to reflect that Wave 6 Phase 7 tasks are complete:
- T035 code-reviewer APPROVED_WITH_CONCERNS
- T036 architect-checkpoint APPROVED_WITH_CONCERNS (cites P1)
- T037 security-analyst APPROVED_WITH_CONCERNS
- T038 PM usability DEFERRED per post-merge SLA
- T039 PR #131 created
All 51 F-128 tasks now marked [X]. Wave 6 complete.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
* docs(128): add architecture section, PRD INDEX entry, regenerate BACKLOG
Document Feature 128 (Executive Threat Architecture Infographic) in the
system design architecture doc, register it in the PRD INDEX, and
refresh BACKLOG.md to reflect current GitHub Issue state.
Co-Authored-By: Claude <noreply@anthropic.com>
---------
Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>1 parent 3276a46 commit 7b217fe
File tree
81 files changed
+100987
-21
lines changed- .claude
- agents/tachi
- commands
- skills/tachi-infographics
- references
- .security
- reports
- docs
- architecture/01_system_design
- product
- 02_PRD
- _backlog
- examples
- agentic-app/sample-report
- ascii-web-api
- free-text-microservice
- mermaid-agentic-app
- microservices
- web-app
- schemas
- scripts
- specs/128-prd-128-executive
- checklists
- contracts
- templates/tachi/security-report
- tests
- scripts
- fixtures
- exec_arch
- agentic_app
- mixed_case_components
- multiple_per_layer
- no_critical_high
- no_scope_data
- no_trust_zones
- orphaned_finding
- golden
- report_data
- image_absent
- image_present
- image_zero_size
Some content is hidden
Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.
81 files changed
+100987
-21
lines changed| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
229 | 229 | | |
230 | 230 | | |
231 | 231 | | |
| 232 | + | |
| 233 | + | |
| 234 | + | |
| 235 | + | |
| 236 | + | |
| 237 | + | |
| 238 | + | |
| 239 | + | |
| 240 | + | |
| 241 | + | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
68 | 68 | | |
69 | 69 | | |
70 | 70 | | |
71 | | - | |
| 71 | + | |
| 72 | + | |
72 | 73 | | |
73 | | - | |
| 74 | + | |
74 | 75 | | |
75 | | - | |
| 76 | + | |
| 77 | + | |
| 78 | + | |
| 79 | + | |
| 80 | + | |
| 81 | + | |
| 82 | + | |
| 83 | + | |
| 84 | + | |
| 85 | + | |
| 86 | + | |
| 87 | + | |
| 88 | + | |
| 89 | + | |
76 | 90 | | |
77 | 91 | | |
78 | 92 | | |
| |||
199 | 213 | | |
200 | 214 | | |
201 | 215 | | |
| 216 | + | |
| 217 | + | |
| 218 | + | |
| 219 | + | |
| 220 | + | |
| 221 | + | |
| 222 | + | |
| 223 | + | |
| 224 | + | |
| 225 | + | |
| 226 | + | |
| 227 | + | |
| 228 | + | |
| 229 | + | |
| 230 | + | |
| 231 | + | |
| 232 | + | |
| 233 | + | |
| 234 | + | |
| 235 | + | |
| 236 | + | |
| 237 | + | |
| 238 | + | |
| 239 | + | |
| 240 | + | |
202 | 241 | | |
203 | 242 | | |
204 | 243 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
14 | 14 | | |
15 | 15 | | |
16 | 16 | | |
17 | | - | |
| 17 | + | |
18 | 18 | | |
| 19 | + | |
19 | 20 | | |
20 | 21 | | |
21 | 22 | | |
22 | 23 | | |
23 | | - | |
24 | | - | |
| 24 | + | |
| 25 | + | |
25 | 26 | | |
26 | 27 | | |
27 | 28 | | |
| |||
160 | 161 | | |
161 | 162 | | |
162 | 163 | | |
163 | | - | |
| 164 | + | |
164 | 165 | | |
165 | | - | |
| 166 | + | |
| 167 | + | |
166 | 168 | | |
167 | 169 | | |
168 | 170 | | |
| |||
235 | 237 | | |
236 | 238 | | |
237 | 239 | | |
| 240 | + | |
| 241 | + | |
| 242 | + | |
| 243 | + | |
238 | 244 | | |
239 | 245 | | |
240 | 246 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
14 | 14 | | |
15 | 15 | | |
16 | 16 | | |
17 | | - | |
| 17 | + | |
18 | 18 | | |
19 | 19 | | |
20 | 20 | | |
| |||
23 | 23 | | |
24 | 24 | | |
25 | 25 | | |
| 26 | + | |
26 | 27 | | |
27 | | - | |
| 28 | + | |
28 | 29 | | |
29 | 30 | | |
30 | 31 | | |
31 | 32 | | |
32 | 33 | | |
33 | | - | |
| 34 | + | |
34 | 35 | | |
| 36 | + | |
35 | 37 | | |
36 | 38 | | |
37 | 39 | | |
38 | 40 | | |
| 41 | + | |
| 42 | + | |
39 | 43 | | |
40 | 44 | | |
41 | 45 | | |
| |||
52 | 56 | | |
53 | 57 | | |
54 | 58 | | |
55 | | - | |
56 | | - | |
| 59 | + | |
| 60 | + | |
| 61 | + | |
57 | 62 | | |
58 | | - | |
| 63 | + | |
0 commit comments