docs(23-02): complete Review UI USER_AWARENESS + acknowledge_user support plan
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01W6RuWdiUiXrPK6FLBHjtpY
This commit is contained in:
parent
9ae834f5e6
commit
44bbe90ae0
1 changed files with 100 additions and 0 deletions
|
|
@ -0,0 +1,100 @@
|
|||
---
|
||||
phase: 23-classification-disposition-per-client-automation-gate
|
||||
plan: 02
|
||||
subsystem: ui
|
||||
tags: [react, typescript, phishing, tailwind, classification]
|
||||
|
||||
# Dependency graph
|
||||
requires:
|
||||
- phase: 22-approval-ui-livelink-addressable-campaign-review-and-approve
|
||||
provides: ClassificationCard, ActionAreaCard, TimelineCard components and the campaign review page they render on
|
||||
provides:
|
||||
- USER_AWARENESS verdict rendered with a distinct emerald badge in ClassificationCard
|
||||
- acknowledge_user action label + no-params ActionParamsForm case in ClassificationCard and ActionAreaCard
|
||||
- USER_AWARENESS verdict tint (emerald) in TimelineCard plus a defensive fallback on both `.split(' ')` tint sites
|
||||
affects: [23-classification-disposition-per-client-automation-gate, review-ui]
|
||||
|
||||
# Tech tracking
|
||||
tech-stack:
|
||||
added: []
|
||||
patterns:
|
||||
- "New verdict/action literal added to a component: extend the union type, the Record<union,...> lookup table, and the ACTION_LABEL map together — TypeScript's exhaustive-Record-key check on Record<Verdict,...> is what catches a forgotten entry"
|
||||
|
||||
key-files:
|
||||
created: []
|
||||
modified:
|
||||
- components/phishing/classification-card.tsx
|
||||
- components/phishing/action-area-card.tsx
|
||||
- components/phishing/timeline-card.tsx
|
||||
|
||||
key-decisions:
|
||||
- "Used emerald (bg-emerald-500/15 text-emerald-600 in ClassificationCard; bg-emerald-500 text-emerald-600 dot+text format in TimelineCard) for USER_AWARENESS — distinct from UNWANTED's amber and THREAT's destructive red, signalling a positive/benign disposition (D-01 discretion, plan's own suggestion)"
|
||||
- "acknowledge_user renders as a normal manual checkbox+Approve action in ActionAreaCard with zero automation-gate/per-company logic — the auto-approval carve-out lives only in the webhook path (Plan 05), confirmed via grep for automation_gate/auto_report/auto_parse/auto_classify returning no matches"
|
||||
- "TimelineCard's VERDICT_TINT lookup was made defensive with a fallback (?? / || 'bg-muted-foreground text-muted-foreground') on both .split(' ') call sites, because the underlying phishing-timeline.ts service emits verdict as an unvalidated runtime string — any future/unrecognized verdict can never crash the review page again (T-23-12 mitigation)"
|
||||
|
||||
patterns-established:
|
||||
- "Verdict-keyed Record lookups (VERDICT_VARIANT_CLASS, VERDICT_TINT) must add a defensive fallback wherever the source data crossing the type boundary is a validated-at-the-type-level-only runtime string"
|
||||
|
||||
requirements-completed: [CLASSDISP-03]
|
||||
|
||||
# Metrics
|
||||
duration: 8min
|
||||
completed: 2026-07-16
|
||||
---
|
||||
|
||||
# Phase 23 Plan 02: Review UI USER_AWARENESS + acknowledge_user Support Summary
|
||||
|
||||
**Extended ClassificationCard, ActionAreaCard, and TimelineCard with a distinct emerald USER_AWARENESS verdict, an acknowledge_user manual action, and a defensive VERDICT_TINT fallback that prevents the review page from crashing on the new verdict.**
|
||||
|
||||
## Performance
|
||||
|
||||
- **Duration:** 8 min
|
||||
- **Started:** 2026-07-16T23:28:00Z
|
||||
- **Completed:** 2026-07-16T23:36:22Z
|
||||
- **Tasks:** 3 completed
|
||||
- **Files modified:** 3
|
||||
|
||||
## Accomplishments
|
||||
- ClassificationCard now renders `USER_AWARENESS` with a distinct emerald badge (`bg-emerald-500/15 text-emerald-600`) and labels `acknowledge_user` as "Acknowledge user"
|
||||
- ActionAreaCard renders `acknowledge_user` as a normal recommended-action checkbox + Approve flow (no-params form), with zero gate-check/automation-gate logic added to the manual review UI
|
||||
- TimelineCard renders a `USER_AWARENESS` classification or `campaign_classified` audit entry with a matching emerald tint, and both `.split(' ')` tint-derivation sites now fall back to a neutral muted-foreground tint instead of throwing on any unrecognized runtime verdict string
|
||||
|
||||
## Task Commits
|
||||
|
||||
Each task was committed atomically:
|
||||
|
||||
1. **Task 1: Add USER_AWARENESS badge variant + acknowledge_user label to ClassificationCard** - `af8a5bd` (feat)
|
||||
2. **Task 2: Add acknowledge_user manual action case to ActionAreaCard** - `547372e` (feat)
|
||||
3. **Task 3: Add USER_AWARENESS support to TimelineCard (prevents review-page crash)** - `9ae834f` (feat)
|
||||
|
||||
**Plan metadata:** committed with this SUMMARY.md (worktree mode — orchestrator merges and records final metadata commit)
|
||||
|
||||
## Files Created/Modified
|
||||
- `components/phishing/classification-card.tsx` - Added USER_AWARENESS to verdict union + VERDICT_VARIANT_CLASS (emerald); added acknowledge_user to ACTION_LABEL
|
||||
- `components/phishing/action-area-card.tsx` - Added acknowledge_user to ACTION_LABEL; added `case 'acknowledge_user'` to ActionParamsForm (no-params, mirrors no_action)
|
||||
- `components/phishing/timeline-card.tsx` - Added USER_AWARENESS to classification-entry verdict union + VERDICT_TINT (emerald); widened campaign_classified audit-case cast; added defensive `?? '...' ` / `|| '...'` fallback on both `.split(' ')` tint sites
|
||||
|
||||
## Decisions Made
|
||||
- Emerald was chosen for USER_AWARENESS in both cards to keep a consistent visual language for the new disposition across the review page (matches the plan's own suggested color).
|
||||
- No architectural changes were needed — all three tasks were additive Record-entry/union-literal extensions plus one defensive-programming fix (TimelineCard fallback), all within Rule 1/Rule 2 deviation bounds implied by the plan itself (the plan explicitly calls out the crash risk and fallback as part of the task, not a deviation).
|
||||
|
||||
## Deviations from Plan
|
||||
|
||||
None - plan executed exactly as written. The TimelineCard defensive fallback was explicitly specified in the plan's task 3 action text, not an executor-discovered deviation.
|
||||
|
||||
## Issues Encountered
|
||||
|
||||
None. `npx tsc --noEmit --pretty` passed with zero errors after each task, and all specified `grep` acceptance criteria (USER_AWARENESS presence, acknowledge_user label, absence of gate-related terms in action-area-card.tsx, presence of the fallback pattern) were verified directly.
|
||||
|
||||
## User Setup Required
|
||||
|
||||
None - no external service configuration required.
|
||||
|
||||
## Next Phase Readiness
|
||||
- The review UI can now render every verdict and action introduced by Plan 01's classification/action schema without risk of a runtime crash.
|
||||
- Plan 05 (webhook auto-approval carve-out) can proceed independently — this plan intentionally added no automation-gate logic to the manual UI, per D-04.
|
||||
- No blockers for downstream plans in this phase.
|
||||
|
||||
---
|
||||
*Phase: 23-classification-disposition-per-client-automation-gate*
|
||||
*Completed: 2026-07-16*
|
||||
Loading…
Add table
Add a link
Reference in a new issue