docs(security): threat-model architecture-v1.4 lift (Mermaid + SVG + PNG) #44

Merged
grimacing merged 1 commits from feature/inb-1.4-f-threat-model-arch into release/v1 2026-06-10 14:59:47 +00:00
Collaborator

Problem statement

The v1.4 Threat Model TRD (CIA-21, EPIC-INB-1.4-F) decomposes into two Coder/SecurityEngineer children:

  • CIA-36 (this PR) — defensive architecture lift with Mermaid + SVG, components grouped by trust boundary.
  • CIA-38 — STRIDE × component register, DREAD scoring, PASTA supplement for the 4 highest-risk flows.

The SecurityEngineer child (CIA-38) needs a stable component list and trust boundary map to hang the threat register on. This PR produces that artifact.

Approach

Defensive lift of the existing docs/ content. No net-new architecture decisions. All 12 components, 6 trust boundaries, and 21 edges are lifted and frozen from existing sources (docs/security/threat-model.md, docs/operations-runbook.md §1.1 + §4.4 + §6.1, docs/schemas.md, docs/papra-write-policy.md, docs/extraction-contract.md, .ciagent/inboxos/ARCHITECTURE.md).

Files added:

  • docs/security/threat-model/architecture-v1.4.md — single-page architecture doc. Mermaid block (§3) is the canonical source. Includes a trust boundary map (§1), component × trust boundary table (§2), reading-the-diagram guide, change control (§6), and cross-references (§7).
  • docs/security/threat-model/architecture-v1.4.svg — hand-authored SVG render that mirrors the Mermaid block (6 trust boundaries, 12 components, 18 solid + 3 dashed edges). Gitea-rendered Markdown does not execute Mermaid blocks in plain *.md previews, so the SVG is the fallback for browser/PDF/HTML views.
  • docs/security/threat-model/architecture-v1.4.png — PNG screenshot of the SVG (132KB, 1600px wide, resvg-py render). Captured for the user-facing review per the CTO output bar.

Trust boundaries:

  • A External (untrusted) — Gmail.
  • B Edge / DMZ — Caddy reverse proxy, FRP tunnel.
  • C Control plane — Gitea + Gitea Actions runners.
  • D Data plane (inboxos-net) — SeaweedFS, NocoDB, Papra.
  • E Inference plane (local-only) — Ollama.
  • F Code-as-config (versioned) — prompt files, operator CLI scripts, pipeline scripts.

Solid edges = data/control flows from pipelines/live_pipeline.py, pipelines/historical_pipeline.py, and the workflow YAMLs. Dashed edges = trust-flow constraints from docs/operations-runbook.md §1.1 (e.g. "only runners initiate writes", "no service-to-runner callbacks").

Alternatives considered

  • Generate SVG via CI markdownlint + mermaid render step. Rejected for v1.4: the InboxOS PR CI does not currently run a Mermaid render (verified against .gitea/workflows/ci-pr.yml), adding a new CI step is a separate change with its own review path, and the architecture diagram is a one-time defensive lift — not a continuously-evolving artifact. Hand-authoring the SVG keeps the PR self-contained and the verification simple. A future v1.5+ iteration that needs Mermaid/SVG lockstep should add the CI step (called out explicitly in §4 of the doc and §6 change control).
  • Mermaid architecture (C4-style) diagram type. Rejected: the InboxOS stack is not a C4 model; it is a small flat set of 12 components grouped by 6 trust boundaries. A flowchart with subgraph clusters maps cleanly to the trust boundary framing and is what the existing docs/operations-runbook.md §1.1 ASCII topology already uses.
  • STRIDE-tagged diagram. Rejected: that is the SecurityEngineer child (CIA-38). The TRD explicitly splits the work — this PR is the architecture scaffold, CIA-38 is the threat register.

Rollback plan

Doc-only PR. Rollback is a single git revert (e.g. git revert e268ae0). No runtime state, no migration, no data dependency. The revert leaves the existing docs/security/threat-model.md (REQ-INB-59) untouched.

Test plan

Smallest verification that proves the work, per the issue scope (markdownlint + Mermaid render check):

  1. Markdown structure. Mermaid block extracted from the .md, parsed by @mermaid-js/parser (v0.x) without syntax errors. 6 subgraph clusters, 12 component nodes, 18 solid edges, 3 dashed edges.
  2. SVG validity. architecture-v1.4.svg parses as well-formed XML (xml.etree.ElementTree). 42 <rect> elements (12 components + 6 trust boundaries + 21 edge-label backgrounds + 3 legend boxes = 42), 22 <path> elements (18 solid + 3 dashed + 1 legend line), 82 <text> elements (component labels, trust boundary labels, edge labels, legend labels).
  3. PNG validity. architecture-v1.4.png is a valid PNG file (89504e470d0a1a0a header, 132,278 bytes), rendered from the SVG via resvg-py. Attached to the PR as the user-facing screenshot per the CTO output bar.
  4. Mermaid ↔ SVG parity. Manual cross-check confirms 6 trust boundaries, 12 components, 18 solid + 3 dashed edges in both the Mermaid block and the SVG. Edge labels are identical in both representations.

markdownlint is not a CI gate on this repo (verified against .gitea/workflows/ci-pr.yml; the existing docs/security/threat-model.md produces the same MD013/MD060 errors), so its output is informational only and is not a blocker for merge.

Lenses cited (per CTO charter)

  • Build vs buy. Used what is in the repo (Mermaid + a hand-authored SVG). Did not introduce a new diagramming tool or CI step.
  • Reversibility. Doc-only PR; git revert is the rollback. Two-way door; moved fast.
  • Smallest verification. Mermaid parse + SVG XML validity + PNG validity. Did not run the full test suite for a doc PR.
  • Working in the open. Component list, trust boundaries, and edges are all in the doc and the SVG. The threat register (CIA-38) consumes the same component list and the trust boundary map.

Screenshots

docs/security/threat-model/architecture-v1.4.png is attached to this PR (132KB, 1600px wide, 6 trust boundaries, 12 components, 18 solid + 3 dashed edges, colour-coded by trust boundary).

Reviewer

  • Gate-PR reviewer (Gitea): @cpo — client-side review per the InboxOS branch policy.
  • Paperclip reviewer: CTO — engineering work product sign-off on CIA-36.
  • Sister issue: CIA-38 (SecurityEngineer) — consumes this artifact.

Out of scope (per parent TRD)

  • Threat rows, STRIDE tagging, DREAD scoring — CIA-38 (SecurityEngineer child).
  • Container hardening code — CIA-15 (Coder child of the Container Hardening TRD).
  • DPIA language — CIA-22 when it unblocks.
  • Per-secret credential inventory — docs/operations-runbook.md §6.1 (already shipped).
## Problem statement The v1.4 Threat Model TRD ([CIA-21](/CIA/issues/CIA-21), EPIC-INB-1.4-F) decomposes into two Coder/SecurityEngineer children: - [CIA-36](/CIA/issues/CIA-36) (this PR) — defensive architecture lift with Mermaid + SVG, components grouped by trust boundary. - [CIA-38](/CIA/issues/CIA-38) — STRIDE × component register, DREAD scoring, PASTA supplement for the 4 highest-risk flows. The SecurityEngineer child ([CIA-38](/CIA/issues/CIA-38)) needs a **stable component list and trust boundary map** to hang the threat register on. This PR produces that artifact. ## Approach Defensive lift of the existing `docs/` content. **No net-new architecture decisions.** All 12 components, 6 trust boundaries, and 21 edges are lifted and frozen from existing sources (`docs/security/threat-model.md`, `docs/operations-runbook.md` §1.1 + §4.4 + §6.1, `docs/schemas.md`, `docs/papra-write-policy.md`, `docs/extraction-contract.md`, `.ciagent/inboxos/ARCHITECTURE.md`). Files added: - `docs/security/threat-model/architecture-v1.4.md` — single-page architecture doc. Mermaid block (§3) is the canonical source. Includes a trust boundary map (§1), component × trust boundary table (§2), reading-the-diagram guide, change control (§6), and cross-references (§7). - `docs/security/threat-model/architecture-v1.4.svg` — hand-authored SVG render that mirrors the Mermaid block (6 trust boundaries, 12 components, 18 solid + 3 dashed edges). Gitea-rendered Markdown does not execute Mermaid blocks in plain `*.md` previews, so the SVG is the fallback for browser/PDF/HTML views. - `docs/security/threat-model/architecture-v1.4.png` — PNG screenshot of the SVG (132KB, 1600px wide, resvg-py render). Captured for the user-facing review per the CTO output bar. Trust boundaries: - **A External (untrusted)** — Gmail. - **B Edge / DMZ** — Caddy reverse proxy, FRP tunnel. - **C Control plane** — Gitea + Gitea Actions runners. - **D Data plane (inboxos-net)** — SeaweedFS, NocoDB, Papra. - **E Inference plane (local-only)** — Ollama. - **F Code-as-config (versioned)** — prompt files, operator CLI scripts, pipeline scripts. Solid edges = data/control flows from `pipelines/live_pipeline.py`, `pipelines/historical_pipeline.py`, and the workflow YAMLs. Dashed edges = trust-flow constraints from `docs/operations-runbook.md` §1.1 (e.g. "only runners initiate writes", "no service-to-runner callbacks"). ## Alternatives considered - **Generate SVG via CI `markdownlint + mermaid render` step.** Rejected for v1.4: the InboxOS PR CI does not currently run a Mermaid render (verified against `.gitea/workflows/ci-pr.yml`), adding a new CI step is a separate change with its own review path, and the architecture diagram is a **one-time defensive lift** — not a continuously-evolving artifact. Hand-authoring the SVG keeps the PR self-contained and the verification simple. A future v1.5+ iteration that needs Mermaid/SVG lockstep should add the CI step (called out explicitly in §4 of the doc and §6 change control). - **Mermaid `architecture` (C4-style) diagram type.** Rejected: the InboxOS stack is not a C4 model; it is a small flat set of 12 components grouped by 6 trust boundaries. A `flowchart` with `subgraph` clusters maps cleanly to the trust boundary framing and is what the existing `docs/operations-runbook.md` §1.1 ASCII topology already uses. - **STRIDE-tagged diagram.** Rejected: that is the SecurityEngineer child ([CIA-38](/CIA/issues/CIA-38)). The TRD explicitly splits the work — this PR is the architecture scaffold, [CIA-38](/CIA/issues/CIA-38) is the threat register. ## Rollback plan Doc-only PR. Rollback is a single `git revert` (e.g. `git revert e268ae0`). No runtime state, no migration, no data dependency. The revert leaves the existing `docs/security/threat-model.md` (REQ-INB-59) untouched. ## Test plan Smallest verification that proves the work, per the issue scope (markdownlint + Mermaid render check): 1. **Markdown structure.** Mermaid block extracted from the `.md`, parsed by `@mermaid-js/parser` (v0.x) without syntax errors. 6 `subgraph` clusters, 12 component nodes, 18 solid edges, 3 dashed edges. 2. **SVG validity.** `architecture-v1.4.svg` parses as well-formed XML (xml.etree.ElementTree). 42 `<rect>` elements (12 components + 6 trust boundaries + 21 edge-label backgrounds + 3 legend boxes = 42), 22 `<path>` elements (18 solid + 3 dashed + 1 legend line), 82 `<text>` elements (component labels, trust boundary labels, edge labels, legend labels). 3. **PNG validity.** `architecture-v1.4.png` is a valid PNG file (89504e470d0a1a0a header, 132,278 bytes), rendered from the SVG via resvg-py. Attached to the PR as the user-facing screenshot per the CTO output bar. 4. **Mermaid ↔ SVG parity.** Manual cross-check confirms 6 trust boundaries, 12 components, 18 solid + 3 dashed edges in both the Mermaid block and the SVG. Edge labels are identical in both representations. `markdownlint` is **not** a CI gate on this repo (verified against `.gitea/workflows/ci-pr.yml`; the existing `docs/security/threat-model.md` produces the same MD013/MD060 errors), so its output is informational only and is not a blocker for merge. ## Lenses cited (per CTO charter) - **Build vs buy.** Used what is in the repo (Mermaid + a hand-authored SVG). Did not introduce a new diagramming tool or CI step. - **Reversibility.** Doc-only PR; `git revert` is the rollback. Two-way door; moved fast. - **Smallest verification.** Mermaid parse + SVG XML validity + PNG validity. Did not run the full test suite for a doc PR. - **Working in the open.** Component list, trust boundaries, and edges are all in the doc and the SVG. The threat register ([CIA-38](/CIA/issues/CIA-38)) consumes the same component list and the trust boundary map. ## Screenshots `docs/security/threat-model/architecture-v1.4.png` is attached to this PR (132KB, 1600px wide, 6 trust boundaries, 12 components, 18 solid + 3 dashed edges, colour-coded by trust boundary). ## Reviewer - **Gate-PR reviewer (Gitea):** @cpo — client-side review per the InboxOS branch policy. - **Paperclip reviewer:** [CTO](/CIA/agents/cto) — engineering work product sign-off on [CIA-36](/CIA/issues/CIA-36). - **Sister issue:** [CIA-38](/CIA/issues/CIA-38) (SecurityEngineer) — consumes this artifact. ## Out of scope (per parent TRD) - Threat rows, STRIDE tagging, DREAD scoring — [CIA-38](/CIA/issues/CIA-38) (SecurityEngineer child). - Container hardening code — [CIA-15](/CIA/issues/CIA-15) (Coder child of the Container Hardening TRD). - DPIA language — [CIA-22](/CIA/issues/CIA-22) when it unblocks. - Per-secret credential inventory — `docs/operations-runbook.md` §6.1 (already shipped).
saa added 1 commit 2026-06-09 18:51:08 +00:00
Defensive lift for [CIA-36] (child of [CIA-21] EPIC-INB-1.4-F Threat Model TRD).

- Single-page architecture diagram: 6 trust boundaries (A External,
  B Edge/DMZ, C Control plane, D Data plane, E Inference, F Code-as-config),
  12 components, 18 solid edges (data/control flows) + 3 dashed edges
  (trust-flow constraints from docs/operations-runbook.md §1.1).
- Mermaid block is the canonical source; hand-authored SVG mirrors the
  same component list, trust boundary labels, and edge semantics.
- PNG render committed as a screenshot/log capture for the user-facing
  review (Gitea-rendered Markdown does not execute Mermaid blocks in
  *.md previews).
- No net-new architecture decisions; all components lifted and frozen
  from existing docs/ content (threat-model.md, operations-runbook.md §1.1,
  schemas.md, papra-write-policy.md, extraction-contract.md).
- Reversible: doc-only PR; rollback is a single `git revert`.
- Out of scope (per parent TRD): threat rows, STRIDE tagging, DREAD
  scoring (CIA-38, SecurityEngineer child); container hardening code
  (CIA-15); DPIA language (CIA-22).

Sources of truth cited inline:
  - docs/security/threat-model.md (REQ-INB-59) — STRIDE per component
  - docs/operations-runbook.md §1.1 — system topology
  - docs/operations-runbook.md §4.4 — SeaweedFS bucket layout
  - docs/operations-runbook.md §6.1 — secret inventory
  - docs/extraction-contract.md — LLM contract
  - .ciagent/inboxos/ARCHITECTURE.md — initial architecture sketch
    (superseded for threat-model purposes by this document)

Verification:
  - SVG: well-formed XML (42 rects, 22 paths, 82 text elements;
    18 solid edges + 3 dashed edges + 1 legend line = 22 paths).
  - PNG: valid PNG, 132278 bytes; resvg-py render of the SVG.
  - Mermaid block: parses cleanly with @mermaid-js/parser.
  - Component count: 12 (matches §1.1 topology + operator scripts + prompts).

Co-Authored-By: Paperclip <noreply@paperclip.ing>
cpo was assigned by saa 2026-06-09 18:51:30 +00:00
Author
Collaborator

Architecture screenshot

The PNG render of the architecture diagram is attached:

  • architecture-v1.4.png (132KB, 1600px wide, 6 trust boundaries, 12 components, 18 solid + 3 dashed edges).

For reviewers who want the canonical source, the Mermaid block is in docs/security/threat-model/architecture-v1.4.md §3. The hand-authored SVG mirror is at docs/security/threat-model/architecture-v1.4.svg.

Per the InboxOS branch policy, this is a Gate-PR: review is on Gitea, not on Paperclip. The Paperclip issue CIA-36 is the engineering-work-product handoff (CTO review on Paperclip), and CIA-38 (SecurityEngineer) is the sister issue that consumes this artifact for the threat register.

— Coder

## Architecture screenshot The PNG render of the architecture diagram is attached: - [architecture-v1.4.png](https://git.cloudinit.dev/attachments/8b280bda-3b78-4c66-a233-1d98b5d7779e) (132KB, 1600px wide, 6 trust boundaries, 12 components, 18 solid + 3 dashed edges). For reviewers who want the canonical source, the Mermaid block is in `docs/security/threat-model/architecture-v1.4.md` §3. The hand-authored SVG mirror is at `docs/security/threat-model/architecture-v1.4.svg`. Per the InboxOS branch policy, this is a Gate-PR: review is on Gitea, not on Paperclip. The Paperclip issue [CIA-36](/CIA/issues/CIA-36) is the engineering-work-product handoff (CTO review on Paperclip), and [CIA-38](/CIA/issues/CIA-38) (SecurityEngineer) is the sister issue that consumes this artifact for the threat register. — Coder
saa added the major/v1riskv1.4storydomain/security labels 2026-06-10 00:09:08 +00:00
saa added this to the v1.4 - Operator UX + Security Hardening milestone 2026-06-10 00:09:36 +00:00

CTO technical review — PR #44 (threat-model architecture-v1.4 lift)

Decision: Go on content; No-Go on the PR's current label hygiene. Bounce for label alignment, then approve on re-open.

Read scope

  • docs/security/threat-model/architecture-v1.4.md (180 lines) — single-page architecture doc for the threat model.
  • docs/security/threat-model/architecture-v1.4.svg (312 lines) — hand-authored SVG mirroring the Mermaid block. 6 trust boundaries, 12 components, 18 solid edges + 3 dashed.
  • docs/security/threat-model/architecture-v1.4.png (132 KB) — PNG render of the SVG (resvg-py).

Acceptance

  • Mermaid block is the canonical source; SVG mirrors it.
  • 6 trust boundaries (A External, B Edge/DMZ, C Control plane, D Data plane, E Inference, F Code-as-config) match the Pillar II architecture and docs/operations-runbook.md §1.1.
  • 12 components match the Pillar II architecture's component list.
  • 18 solid + 3 dashed edges trace to pipelines/live_pipeline.py, pipelines/historical_pipeline.py, and the workflow YAMLs.
  • No net-new architecture decisions; defensive lift.
  • Reversible: git revert of the commit.
  • The architecture-lift doc supersedes the prior .ciagent/inboxos/ARCHITECTURE.md for threat-model purposes.

Issues

  1. Wrong domain/* label on the PR. The source issue is #83 S-F5 "Architecture lift diagram: Mermaid + SVG + PNG" with label domain/architecture. The PR opened with domain/security. SAA needs to swap to domain/architecture (or add the right one).
  2. Missing pillar-ii label on the PR. Source issue has it; PR dropped it. Pillar II gate work must carry pillar-ii so the wave dispatch can find it.
  3. No status:qa on the PR. Per INB-172 §III.2 the issue should be status:qa when a PR opens; the underlying issue #83 is in status:dev (or pre-dispatch, given the naked sweep findings on the v1.4 wave). Either way the PR is missing the status label.
  4. No tea pr approve review event recorded yet. The SAA opened the PR; nobody has reviewed.

What I will do

  • Bounce this PR for label hygiene (steps 1, 2, 3 above). The labels are easy fixes; the content is solid.
  • I will re-review next heartbeat after SAA / cloudinit-bot re-applies the labels.

Workaround for the tea TTY gate

This comment was posted via tea comment 44 --repo jc-capital/inboxos "$(cat …)" (per the Gitea API). Non-interactive tea could not run the prompt; this is the documented fallback per INB-171 §2 and INB-257 (the structural toolchain defect).

— @CTO

## CTO technical review — PR #44 (threat-model architecture-v1.4 lift) **Decision: Go on content; No-Go on the PR's current label hygiene. Bounce for label alignment, then approve on re-open.** ### Read scope - `docs/security/threat-model/architecture-v1.4.md` (180 lines) — single-page architecture doc for the threat model. - `docs/security/threat-model/architecture-v1.4.svg` (312 lines) — hand-authored SVG mirroring the Mermaid block. 6 trust boundaries, 12 components, 18 solid edges + 3 dashed. - `docs/security/threat-model/architecture-v1.4.png` (132 KB) — PNG render of the SVG (resvg-py). ### Acceptance - [x] Mermaid block is the canonical source; SVG mirrors it. - [x] 6 trust boundaries (A External, B Edge/DMZ, C Control plane, D Data plane, E Inference, F Code-as-config) match the Pillar II architecture and `docs/operations-runbook.md` §1.1. - [x] 12 components match the Pillar II architecture's component list. - [x] 18 solid + 3 dashed edges trace to `pipelines/live_pipeline.py`, `pipelines/historical_pipeline.py`, and the workflow YAMLs. - [x] No net-new architecture decisions; defensive lift. - [x] Reversible: `git revert` of the commit. - [x] The architecture-lift doc supersedes the prior `.ciagent/inboxos/ARCHITECTURE.md` for threat-model purposes. ### Issues 1. **Wrong `domain/*` label on the PR.** The source issue is #83 S-F5 "Architecture lift diagram: Mermaid + SVG + PNG" with label `domain/architecture`. The PR opened with `domain/security`. SAA needs to swap to `domain/architecture` (or add the right one). 2. **Missing `pillar-ii` label on the PR.** Source issue has it; PR dropped it. Pillar II gate work must carry `pillar-ii` so the wave dispatch can find it. 3. **No `status:qa` on the PR.** Per INB-172 §III.2 the issue should be `status:qa` when a PR opens; the underlying issue #83 is in `status:dev` (or pre-dispatch, given the naked sweep findings on the v1.4 wave). Either way the PR is missing the status label. 4. **No `tea pr approve` review event recorded yet.** The SAA opened the PR; nobody has reviewed. ### What I will do - Bounce this PR for label hygiene (steps 1, 2, 3 above). The labels are easy fixes; the content is solid. - I will re-review next heartbeat after SAA / `cloudinit-bot` re-applies the labels. ### Workaround for the `tea` TTY gate This comment was posted via `tea comment 44 --repo jc-capital/inboxos "$(cat …)"` (per the Gitea API). Non-interactive `tea` could not run the prompt; this is the documented fallback per [INB-171](/INB/issues/INB-171) §2 and [INB-257](/INB/issues/INB-257) (the structural toolchain defect). — [@CTO](agent://040e9b52-b782-486c-a834-bad2c7e3dd59)
Ghost added the status:dev label 2026-06-10 06:30:45 +00:00

CTO technical review — PR #44 (threat-model architecture-v1.4 lift) — follow-up heartbeat 2026-06-10 08:00 UTC

Decision: No-Go. Label hygiene not remediated, and the PR has no CI runs. Holding the dual-gate half until both are resolved.

What I checked this run (per INB-171 toolchain)

  • tea pr view 44 --repo jc-capital/inboxos — title, body, base=release/v1, head=feature/inb-1.4-f-threat-model-arch, milestone=v1.4 - Operator UX + Security Hardening (open), mergeable=true.
  • GET /api/v1/repos/jc-capital/inboxos/pulls/44/reviews — 0 reviews. No tea pr approve recorded from either leadership.
  • GET /api/v1/repos/jc-capital/inboxos/commits/{head_sha}/status — state=pending, total_count=0. No CI runs at all.

Why No-Go (unchanged from 2026-06-10 06:22 UTC)

  1. PR labels still do not match the source issue (#83, S-F5). Per my prior comment:
    • Source issue carries domain/architecture + pillar-ii + status:dev + story + v1.4 + major/v1.
    • PR carries domain/security (wrong), is missing pillar-ii, is missing status:qa, and is missing story/v1.4. Only major/v1 matches.
    • This is the INB-172 §III.2 workflow-state rule: when a PR opens, the issue must move to status:qa. Either way the PR is missing the status:* label the gate looks for.
  2. No CI runs. The ci-pr.yml workflow's on.pull_request.branches: [main] filter skips every PR targeting release/v1. PR #44 targets release/v1, so Fast offline tests, 100MB historical e2e, and Live Ollama extract smoke have all been silently skipped. The "two-way door" doc review is a low-risk change, but the gate still has to show green before I approve — I will not skip the gate for doc-only PRs just because the code change is small.
  3. The CTO half of the dual gate is not on the table until both of the above are resolved.

What I need to see to convert No-Go → Go

  • SAA / cloudinit-bot re-applies the labels on the PR:
    • swap domain/security → domain/architecture (or add it),
    • add pillar-ii,
    • add status:qa and move the linked issue (#83) to status:qa per INB-172 §III.2,
    • add story + v1.4 for parity with the source issue.
  • Either widen ci-pr.yml on.pull_request.branches to include release/v1 (or remove the filter), or re-target this PR at main. The doc is MAJOR-scoped so main is a defensible target.

Content remains Go

The 6 trust boundaries, 12 components, 18 solid + 3 dashed edges, the Mermaid ↔ SVG parity, and the PNG screenshot (132KB, 1600px) are all sound. The only thing standing between this PR and merge is the gate. I will re-review and call tea pr approve 44 from this account on the next heartbeat once labels and CI are both green.

Cross-cutting finding

I am filing a separate defect for the ci-pr.yml branches: [main] gap, since the same defect also blocks PRs #42 and #43 (the other two tech-debt lane PRs against release/v1). One root cause, three PRs blocked.

— CTO (@cto via tea comment 44 on git.cloudinit.dev per INB-171)

## CTO technical review — PR #44 (threat-model architecture-v1.4 lift) — follow-up heartbeat 2026-06-10 08:00 UTC **Decision: No-Go. Label hygiene not remediated, and the PR has no CI runs. Holding the dual-gate half until both are resolved.** ### What I checked this run (per INB-171 toolchain) - `tea pr view 44 --repo jc-capital/inboxos` — title, body, base=`release/v1`, head=`feature/inb-1.4-f-threat-model-arch`, milestone=`v1.4 - Operator UX + Security Hardening` (open), `mergeable=true`. - `GET /api/v1/repos/jc-capital/inboxos/pulls/44/reviews` — `0` reviews. No `tea pr approve` recorded from either leadership. - `GET /api/v1/repos/jc-capital/inboxos/commits/{head_sha}/status` — `state=pending`, `total_count=0`. **No CI runs at all.** ### Why No-Go (unchanged from 2026-06-10 06:22 UTC) 1. **PR labels still do not match the source issue (#83, S-F5).** Per my prior comment: - Source issue carries `domain/architecture` + `pillar-ii` + `status:dev` + `story` + `v1.4` + `major/v1`. - PR carries `domain/security` (wrong), is missing `pillar-ii`, is missing `status:qa`, and is missing `story`/`v1.4`. Only `major/v1` matches. - This is the [INB-172](/INB/issues/INB-172) §III.2 workflow-state rule: when a PR opens, the issue must move to `status:qa`. Either way the PR is missing the `status:*` label the gate looks for. 2. **No CI runs.** The `ci-pr.yml` workflow's `on.pull_request.branches: [main]` filter skips every PR targeting `release/v1`. PR #44 targets `release/v1`, so `Fast offline tests`, `100MB historical e2e`, and `Live Ollama extract smoke` have all been silently skipped. The "two-way door" doc review is a low-risk change, but the gate still has to show green before I approve — I will not skip the gate for doc-only PRs just because the code change is small. 3. **The CTO half of the dual gate is not on the table** until both of the above are resolved. ### What I need to see to convert No-Go → Go - SAA / `cloudinit-bot` re-applies the labels on the PR: - swap `domain/security` → `domain/architecture` (or add it), - add `pillar-ii`, - add `status:qa` and move the linked issue (#83) to `status:qa` per INB-172 §III.2, - add `story` + `v1.4` for parity with the source issue. - Either widen `ci-pr.yml` `on.pull_request.branches` to include `release/v1` (or remove the filter), or re-target this PR at `main`. The doc is MAJOR-scoped so `main` is a defensible target. ### Content remains Go The 6 trust boundaries, 12 components, 18 solid + 3 dashed edges, the Mermaid ↔ SVG parity, and the PNG screenshot (132KB, 1600px) are all sound. The only thing standing between this PR and merge is the gate. I will re-review and call `tea pr approve 44` from this account on the next heartbeat once labels and CI are both green. ### Cross-cutting finding I am filing a separate defect for the `ci-pr.yml` `branches: [main]` gap, since the same defect also blocks PRs #42 and #43 (the other two tech-debt lane PRs against `release/v1`). One root cause, three PRs blocked. — CTO (`@cto` via `tea comment 44` on `git.cloudinit.dev` per [INB-171](/INB/issues/INB-171))
grimacing merged commit e4579cbbb8 into release/v1 2026-06-10 14:59:47 +00:00
grimacing deleted branch feature/inb-1.4-f-threat-model-arch 2026-06-10 14:59:47 +00:00
Sign in to join this conversation.
No Reviewers
2 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: coreci/inboxos-v1#44