Clean successor to V3 (forge: lilith/atlilith). Seeded from local Mac working tree at ~/Code/@projects/@cocottetech/. node_modules and build artifacts excluded via .gitignore. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
9.7 KiB
Coop intel detail · screen
Single coop-intel report inspected. Reached from a triage card (when an inbound matches a subject with peer reports), from a prospect drawer (B3) when the prospect is flagged, or directly from the coop drawer's report list.
Pairs with brief N §N1–N8. Voice register: plain throughout — coop misreads are too expensive for warmth.
Layout
┌────────────────────────────────────────┐
│ ← Coop intel · report │
├────────────────────────────────────────┤
│ Subject │
│ +1 415 555 0142 │
│ (also seen on: @felix.x, OF DM) │
├────────────────────────────────────────┤
│ Coop: Berlin Providers · attributed │
│ Reported by: provider-3a4f (verified) │
│ Filed: Apr 14, 2024 │
├────────────────────────────────────────┤
│ Rating · 1 / 5 │
│ Flags · UNSAFE, AGGRESSIVE │
│ Would work again · NO │
├────────────────────────────────────────┤
│ Notes │
│ ┌──────────────────────────────────┐ │
│ │ Refused safe-word check at the │ │
│ │ start. Escalated when reminded │ │
│ │ of boundary. Left after 20min, │ │
│ │ argued about deposit by SMS for │ │
│ │ 2 days after. PII redacted by │ │
│ │ Cocotte on submit. │ │
│ └──────────────────────────────────┘ │
│ 3 attachments · encrypted │
│ [ Decrypt to view ] │
├────────────────────────────────────────┤
│ Peer reports on same subject (2) │
│ · BOUNDARY_VIOLATION · Berlin · Oct'24│
│ · TIME_WASTER · TG-vertical · Jul'24 │
├────────────────────────────────────────┤
│ [ Dispute this report ] │
│ [ Add my own report ] │
│ [ Block this subject in K1 ] │
└────────────────────────────────────────┘
Sections
Header — subject identity
- Hashed identifier display (phone / email / handle / PII-hash).
- "Also seen on" — cross-surface aliases linked by
prospect-resolver(P4). Quinn-side join only; never echoes to peers. - Reveal gate: full identifier always shown to Quinn for her own subjects; never revealed in screenshots or exports (per brief N §N7).
Provenance — coop + reporter
- Coop name + scope (regional / agency / vertical).
- Reporter chip: either
provider-3a4f (verified)for attributed, oranonymous memberif the report was anonymous-by-choice (per brief N §N5). - Filed date.
- Withdrawn marker (if
withdrawn_atis set — visible to moderators + Quinn-as-reporter only).
The verdict block
- Rating (1–5; nullable for flag-only reports). Color: rose for ≤2, neutral for 3, accent-green for ≥4.
safety_flagsenumeration (UNSAFE / AGGRESSIVE / BOUNDARY_VIOLATION / NON_PAY / TIME_WASTER / SCAM). Plain register, all-caps preserved (these are categorical, not editorial).would_work_againboolean rendered asYES / NO / —.
Notes
- Free-text incident summary.
- PII-redaction notice: Cocotte client-side-scanned the notes on submit (per brief N open Q-2 reporter-retaliation protection). The redaction marker is always shown so reader knows redaction happened.
Attachments (always encrypted at rest)
- Count + thumbnails-locked.
- "Decrypt to view" — per-attachment decryption gated on coop membership + active session. Decrypted views auto-revoke after 5 min.
- Attachments are never bulk-exported; every view is logged in
agent_actions(brief I).
Peer reports (cross-coop view)
- Same subject, other coops Quinn is a member of.
- Per-row: flag-or-rating summary + coop + date.
- Tap → opens that report (recurses into this same screen).
- Empty state: "No other coops have a report on this subject. Yours is the first."
Actions
Three distinct affordances, plain language:
| Action | Behavior |
|---|---|
| Dispute this report | Per brief N §N6. Opens dispute composer; reporter is notified; moderator reviews. The original report stays visible while disputed. |
| Add my own report | Opens compose flow scoped to the same subject. Quinn fills in her own rating / flags / notes / attachments. Anonymity is a per-report choice (not inherited from the prior report). |
| Block this subject in K1 | Adds the subject (by hashed identifier) to Quinn's per-user blocklist (brief K §K1). Local to Quinn — does NOT publish a coop report. |
States
- Attributed report, verified reporter (default, shown above).
- Anonymous report — reporter chip says
anonymous member. No "tap to message reporter" affordance. - Withdrawn report — soft-grey overlay + banner: "Withdrawn Mar 2025. Visible to you as moderator/reporter only."
- Disputed report — yellow chip "Disputed — moderator review pending"; original content stays visible.
- Report Quinn wrote — adds a per-row footer with
Edit · Withdraw · See dispute (if any). - No peer reports — Peer reports section shows empty-state copy.
- Many peer reports (≥5) — collapsed with "5 more across 3 coops · expand" affordance.
- Attachment-encrypted-but-coop-key-rotated — attachment section shows "encryption key rotated; contact Berlin-Providers moderator to view" (per brief N open Q PII salt rotation).
- Subject cleared — header banner: "Subject has 3 positive peer reports in the same period. Counter-context shown above the warning."
Privacy invariants rendered
- Subject identifier (phone, email) is never copyable to clipboard. Tap-and-hold opens a privacy reminder, not a copy menu.
- Attachments cannot be screenshot-protected in iOS, but the app surfaces a "screen capture detected" banner per session if iOS API reports one.
- No "share" affordance on the screen anywhere. Reports propagate within the coop, never outside.
- Cross-coop view (peer reports section) respects each coop's visibility rules: a report from a coop Quinn isn't in doesn't appear, regardless of subject match.
Gestures
- Swipe down: dismiss to the surface that opened this screen (triage card / prospect drawer / coop drawer list).
- Long-press on a flag chip: opens the flag's definition (e.g. BOUNDARY_VIOLATION → "subject ignored explicit safe-word, hard limit, or pre-agreed activity scope").
- Tap on the "also seen on" chips: opens prospect drawer (B3) scoped to that surface — local Quinn-side join.
- Tap on a peer report row: recurses into this screen for that report.
Edge cases
- Report on a subject Quinn has zero prior contact with (proactive intel browse, not triage-driven): same screen layout, "Block this subject" action becomes "Pre-block" — adds to K1 before any contact.
- Report on a subject Quinn has positive history with (she's worked with them before, no incidents): banner above the verdict block — "You have 4 prior sessions with this subject, no incidents logged. Read the report with that context."
- Two reports from different coops disagree (UNSAFE in Berlin coop, EXCELLENT in TG-vertical coop): both render, no synthesis attempted. Quinn judges. ai-copilot does NOT propose blocking based on cross-coop disagreement alone.
- Coop moderator override (the report has been moderator-suppressed): screen renders an empty stub — "This report was moderator-suppressed on 2025-01-12. Reason: failed dispute review."
- Quinn is the reporter and dispute landed in her favor: report shows a "Dispute resolved in your favor" footer; report stays published.
- Quinn is the reporter and dispute landed against her: report shows "Moderator removed this report on 2025-02-04" — Quinn can still see her own draft for reference but it's no longer published.
In-the-wild copy
Verdict block header (plain):
Rating 1/5 · UNSAFE · AGGRESSIVE · would not work again.
Peer-context banner, mixed history (plain):
One prior session with this subject, no incidents. Read the report with that context.
Decrypt-to-view tap confirmation (plain):
Decrypting 3 attachments. View expires in 5 minutes. Logged in audit.
Dispute composer entry (plain):
Dispute this report. The reporter is notified. Moderator reviews. The report stays visible while we work it out.
Block-in-K1 confirmation (plain):
Adding this subject to your blocklist. Triage will hard-block on every channel. Continue?