fix(triage-bot): remaining V1 launch fixes off the V2 doc stack (PP-4886 + redaction CI gate) - #1365
Conversation
When the bot recognised a problem already fixed in a later release, it offered the patron a "Notify me" option. Tapping it produced a friendly confirmation and did nothing else: no notification was ever scheduled and no part of the app could have delivered one. It was a promise we had no way to keep, so the affordance is hidden rather than shown. The rule lives in a pure KBMatchActionPolicy in Core, following the existing HelpEntryPointPolicy pattern, so the decision is testable without a SwiftUI host. The reducer's handler stays behind it with its existing coverage, which makes restoring the option a one-line change once real delivery exists. The test pins the case that used to render the chip, so a regression that restores the old entry.fixedInVersion != nil rule fails rather than shipping a false promise. Mutation-verified: flipping the policy to return entryHasFixVersion fails the suite. **Scope:** one new pure policy type, its test, and the call site in the match card. No behavior change to the reducer or the classifier. **Not done:** actual notification delivery. Deciding what "notify me" should mean, local reminder, push, or dropping it entirely, is a product call tracked by PP-4886. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
scripts/triage-corpus-check.sh describes itself as a release-time credential-leak gate, and RedactionCorpusTests already runs inside the package suite. The script itself had no caller: not verify-pr.sh, not release-gates.yml, not any workflow, despite three files describing it as running at release time. The part that was therefore never running is --self-test, which disables redaction to prove the guard goes red on an un-redacted corpus. That is the check that catches a guard which has silently stopped guarding, and the suite alone cannot catch it. Wired into both places an engineer actually runs: the CI job, immediately after the package tests so build products are warm, and verify-pr.sh as a triage_redaction_gate check. Costs seconds. Dry-run clean on the current tree: guard passes, and the self-test correctly goes red when redaction is disabled. **Scope:** two call sites. The gate script and the tests it runs are unchanged. **Not done:** release-gates.yml still does not run it. That workflow is ubuntu-only and the gate needs a Swift toolchain, so adding it there means either a macOS runner or a container, which is a bigger change than this. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
🏗️ CodeAtlas Ledger Analysis✅ All Checks Passed♿ Accessibility (via AccessLint)
✅ No accessibility issues detected 🏛️ Architecture Analysis
🔄 Dependency CyclesSee full report for cycle details. 📋 Architecture FindingsSee full report for detailed findings. 🔍 Reachability Analysis
ℹ️ No architecture-relevant files in this diff — reachability not evaluated. 📊 0 files analyzed | 📦 Download Full Report Powered by CodeAtlas Ledger |
🧪 Unit Test Results📊 View Full Interactive Report ❌ 1 TEST FAILED8194 tests | 8053 passed | 1 failed | 138 skipped | ⏱️ 9m 38s | 📊 98.3% | 📈 45.0% coverage All 945 classes — 1 with failures (full matrix)
📊 Full interactive matrix: report ❌ Failed testsNames only — open the interactive report above for messages + stack frames. 📊 Testing Coverage BreakdownUnit Test Line Coverage (testable surfaces): 45.0% Total coverage incl. UI/lifecycle: 44.0% (17 files excluded from testable denominator — see
🔗 Interactive HTML Report | CI Run Details Counts above were produced by this CI run's xcresult parse — reproduce via the run link. 📦 Downloadable Artifacts
|
What
Relocates the remaining V1 iOS triage-bot fixes that were stuck behind the V2 documentation PR #1355 (
docs/pp-4858-triage-bot-architecture). The #1355 stack mixes V2 design docs (the Android/server shared-architecture proposal) with V1 code/CI fixes; those fixes need to ship in V1 iOS, which goes out soon, so they belong ondevelopnow — not gated on a V2 doc review.Companion to #1364 (PP-4882 launch gates). Together they move every V1 code/CI fix off the V2 doc stack, leaving #1355 as docs-only.
KBMatchActionPolicy(new, pure Core) decides which actions are offerable so the UI can't surface an undeliverable one. Pinned byKBMatchActionPolicyTests.scripts/triage-corpus-check.sh(with its--self-test) intounit-testing.yml+verify-pr.sh, so the deny-list guard runs on every PR and is proven to go RED when redaction is disabled.Verification
swift test(TriageBotCore): 285 passed, 0 failures (includes the newKBMatchActionPolicyTests).bash -n scripts/verify-pr.shclean;unit-testing.ymlparses;triage-corpus-check.sh --self-testpasses locally (guard correctly goes RED with redaction off).0e53b6e98,935089a49) ontodevelop; zero conflicts.Scope
V1 code/CI only. The V2 shared-architecture proposal + as-built reference docs stay with #1355 (which becomes docs-only). Non-code product/legal sign-offs (privacy review, telemetry destination) remain open on PP-4884/PP-4885.
🤖 Generated with Claude Code