Skip to content

fix: reconcile the four untracked findings in the security audit#40

Merged
enricopiovesan merged 1 commit into
mainfrom
claude/audit-reconciliation
Jul 21, 2026
Merged

fix: reconcile the four untracked findings in the security audit#40
enricopiovesan merged 1 commit into
mainfrom
claude/audit-reconciliation

Conversation

@enricopiovesan

Copy link
Copy Markdown
Collaborator

Summary

Follow-up to #39, same day. All four rows previously marked "Not filed" are now either ticketed or explicitly resolved.

Every factual claim in the request that prompted this was independently verified against a fresh clone of traverse-framework/traverse at current main (9c2806c) before being written into a public audit page — none of it was taken on trust. Specifics below.

1. Bearer-token impersonation → redirected to #782 (Open)

Read http_api.rs's subject_from_request directly. Confirmed:

  • The dev-mode arbitrary-bearer-as-subject_id path is exactly :1168-1211 as claimed, and is the same root cause as #782 (is_admin granted when the token equals the literal "system_admin").
  • The original claim's other half is genuinely stale — the loopback + --allow-unauthenticated path at :1214-1219 returns a hardcoded, non-admin "local" identity, not attacker-controlled input.

2. Data-store durability → new ticket #788 (Open)

Confirmed MemoryDataStore sits inside #[cfg(test)] mod tests (verified the module boundary, not just a keyword match). Grepped every LocalFileDataStore reference in the workspace — all of them are its own definition or inside that same test module. Zero production call sites, zero integrity-hash code in the file.

3. Trace-store durability → new ticket #789 (Open)

Read trace/store.rsTraceStore is exactly a HashMap<String, ...> at the claimed lines, structurally distinct from the event-broker fix already closed in #593.

4. Spec 022 governance drift → Resolved, no ticket

Read spec 022's own file: **Status**: Superseded (2026-07-18 — see decision-log.md Decision 25...), word-for-word matching the claim. Confirmed Decision 25 exists at that date, specs 057/058/059 are all Approved in approved-specs.json, their claimed implementation files exist (traverse-embedder, runtime/workflows.rs, cli/http_api.rs), and grepped every .github/workflows/*.yml for "mcp" — zero matches, confirming the old "CI-required" claim no longer holds.

Also

  • "Not filed" count in the register: 4 → 0.
  • Added a Resolved status (green, same visual treatment as Closed) alongside Open/Closed.
  • Fixed the Ticket-cell fallback: a resolved row with no ticket now reads "No ticket needed" instead of the now-inaccurate "Not filed".
  • Rewrote the section note above the table — it used to assert four findings were untracked, which is no longer true.
  • Sanity-checked the six 2026-07-20 findings against live issue state: #781 already correctly showed Closed on this page (a follow-on fix, #787, merged after that original pass); #782–786 remain Open. No changes needed there.

Test plan

  • npm run build clean
  • Verified in browser: 21 total rows, 0 "Not filed", 1 "Resolved", #782 correctly linked from both its original row and the reconciled row, status pills render correctly in both themes
  • No console errors
  • Every code-level and governance-level claim checked against a fresh clone of the real repo before writing, not the relayed description alone

🤖 Generated with Claude Code

…gister

Follow-up pass, same-day as the last update (2026-07-20). Every claim
below was independently verified against a fresh clone of
traverse-framework/traverse at current main (9c2806c) before writing
it — not taken on trust from the request that prompted this.

- Bearer-impersonation finding (http_api.rs) now points at #782
  instead of "Not filed": confirmed the same root cause (dev-mode
  arbitrary-bearer-as-subject_id, http_api.rs:1168-1211) and corrected
  the stale half of the original claim — the loopback+
  --allow-unauthenticated path (:1214-1219) returns a hardcoded,
  non-admin "local" identity, not an attacker-controlled one.
- Data-store finding gets new ticket #788: verified MemoryDataStore is
  #[cfg(test)]-only, and the real gap is that the one production
  adapter, LocalFileDataStore, has zero call sites anywhere in the
  workspace outside its own tests.
- Trace-store finding gets new ticket #789: confirmed TraceStore
  (trace/store.rs:8-11) is a plain in-memory HashMap, distinct from
  the already-fixed event-broker durability gap (#593).
- Spec-022 governance finding is marked Resolved with no ticket:
  confirmed spec 022 is formally Superseded (decision-log Decision 25,
  2026-07-18), specs 057/058/059 are Approved with real implementations
  (traverse-embedder, runtime/workflows.rs, cli/http_api.rs command
  dispatch), and MCP is no longer referenced in any CI workflow.

"Not filed" count in the register drops from 4 to 0. Added a
"Resolved" status (green, same as Closed) alongside the existing
Open/Closed states, and fixed the Ticket-cell fallback so a resolved
row with no ticket reads "No ticket needed" instead of the now-wrong
"Not filed". Updated the section note above the table to describe the
reconciliation instead of the stale four-untracked-findings claim.
Sanity-checked the six 2026-07-20 findings against live issue state:
#781 already correctly showed Closed (a follow-on fix, #787, merged
after that pass), #782-786 remain Open — no changes needed there.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
@enricopiovesan
enricopiovesan merged commit 404e73e into main Jul 21, 2026
2 checks passed
@enricopiovesan
enricopiovesan deleted the claude/audit-reconciliation branch July 21, 2026 04:26
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant