Let the design documents catch up with the code (#194, #195) - #203
Merged
icebergai-review-bot[bot] merged 1 commit intoAug 20, 2026
Merged
Conversation
Two documents that describe themselves as authoritative had fallen behind what shipped, in ways that matter differently. **The threat model did not know hand-over existed (#194).** security.md § Outbound requests opened with "two features deliberately send traffic out of the deployment"; hand-over targets were a third, carrying more than an announcement does — the owning team, the due date, up to ten remediation actions. And POST /handoff/callback, which takes no session and no CSRF token and is authenticated only by the target's own signing secret, was a trust boundary the numbered list did not contain at all: the only inbound one that is neither a browser nor an engine. Both are written up, including what a verified receiver may drive (its own work item's state, id and URL) and what it may not (the finding). "External ticket creation" comes off the out-of-scope list whose own instruction was that adding it must revisit this document. ADR 0014 records the decisions that until now lived only as prose: one target type and why vendor clients were rejected, the notification wire format reused deliberately, dedup by both a unique constraint and a never-regenerated idempotency key, admins-decide-where/analysts-decide-which, and the reply recorded beside the finding rather than written onto it. **ARCHITECTURE.md was roughly six milestones behind (#195).** The §5 table stopped at ADR 0009 and now runs through 0014. §4's scan flow predated checkpoints, so it drew a fetch that reports only when it ends; it now covers batched progress submission, per-scope cursors, coverage manifests, and the two gates on auto-resolution. §9 listed M0-M4 and named SMB connectors, incremental scanning and external ticket creation as non-goals, all three of which ship. §1 still called file shares post-MVP. Refs ADR 0013, ADR 0014. Claude-Session: https://claude.ai/code/session_012sohE85sRDt6t2w3936rGJ Co-authored-by: Claude <noreply@anthropic.com>
There was a problem hiding this comment.
Verdict
APPROVE
Completed bounded review across 1 immutable scope(s). No actionable findings in the supplied change.
Scope health
Convergence: healthy. Review mode: initial.
Recommended action: CONTINUE_INCREMENTAL.
- No escalation signals.
Prior findings
| Finding | Status |
|---|---|
| — | No prior finding state |
New findings
No new findings.
Fix-induced regressions
- None evidenced.
Uncertainty
- No material uncertainty recorded.
Validation
- Reviewed the supplied immutable diff only; no prior findings were provided for recheck.
Residual risks
- None identified.
icebergai-review-bot
Bot
deleted the
claude/codebase-review-cleanup-ovlli4
branch
August 20, 2026 00:55
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Closes #194. Closes #195.
Two issues in one PR because they are one change: #195 wants ARCHITECTURE.md's decision table to run through the hand-over ADR, and its §8 points at the threat model that #194 fixes. Shipping them apart would mean landing an architecture doc that references a security doc only correct in another open branch.
#194 — the threat model did not know hand-over existed
docs/security.md§ Outbound requests opened with "Two features deliberately send traffic out of the deployment". Hand-over targets are a third, and they carry more than an announcement does — the owning team, the due date, up to ten remediation actions — because the person picking up the ticket is not looking at this console.POST /handoff/callbackwas worse: no session, no CSRF token, authenticated only by the target's own signing secret, and absent from the numbered trust-boundary list entirely. It is the only inbound boundary that is neither a browser session nor an engine token.Added:
401for every failure mode. And the part that bounds the damage: a verified receiver writes its own work item's state, id and URL, and nothing else. It cannot move a finding; where the two disagree the console shows the disagreement. The worst a compromised receiver achieves is a wrong claim about its own ticket.ADR 0014 records the decisions that until now lived only as prose in
docs/handoff.mdand migration docstrings: one target type and why vendor clients were rejected, the notification wire format reused deliberately, dedup by both a unique constraint and a never-regenerated idempotency key, admins-decide-where/analysts-decide-which, and §6 — the reply is recorded beside the finding, never applied to it, because a receiver is not a person and applying it would mean inventing an actor for the audit trail or bypassing the evidence policy.Two docstrings in
iceberg_api/handoff/that pointed at "§ Notification egress" now point at the ADR and the right section.#195 — ARCHITECTURE.md was ~six milestones behind
docs/backlog.mdas the live list.Validation
Documentation only — no behaviour change.
make checkgreen: ruff, mypy,scripts/check_docs.py(43 documents, link andmake-target checks), 1956 passed / 2 skipped.tests/test_docs_invariants.pycovers the new ADR being indexed and linked.Generated by Claude Code