PRAMAAN Walkthroughs
Rendered engineering walkthroughs published from merged PRs.
- Story-3564 - The brain's contracts stop being typed twice
- Story-3563 - Story-3563 — the contracts nobody was holding
- Story-3557 - Story-3557 — typing the one wire door
- Story-3529 - Admit the billing_renewal route in the shared worker registry
- Story-3469 - The index stops being evidence nobody delivers
- Story-3445 - Story-3445 Walkthrough
- Story-3443 - Story-3443 — boundary evidence and a deterministic combiner
- Story-3442 - The index localizes 21/21 ranges exactly
- Story-3406 - Publish one candidate, connect no product source
- Story-3404 - One shell, eighteen product doors
- Story-3392 - The matter nobody can reach
- Story-3391 - A staffed member writes matter content — on their matter, and never a delete
- Story-3390 - Destructive matter operations are classified before they ship
- Story-3389 - A suspended lead stops holding the seat
- Story-3388 - Removal now means one thing, and leaving is its own action.
- Story-3387 - The lead seat has one lock and no invisible successor
- Story-3386 - A creator can no longer open a matter they cannot enter
- Story-3385 - Authority now follows the matter, not the firm
- Story-3372 - The code that passed CI must be the code AWS receives
- Story-3325 - The letter arrived. Nobody opened it.
- Story-3306 - Story-3306 Walkthrough
- Story-3301 - Story-3301 — the P5 progress UI: the living index on the matter screen
- Story-3300 - Sixteen rows, sixteen ticks.
- Story-3297 - Story-3297 Walkthrough
- Story-3296 - Story-3296 Walkthrough
- Story-3295 - Sixteen documents, sixteen clerks, and one of them goes first
- Story-3294 - An annexure stops being a page range
- Story-3292 - Ship the field empty, and make the emptiness say so
- Story-3291 - Story-3291 Walkthrough
- Story-3290 - Delivery order is not semantic order
- Story-3289 - Nothing was asking Blake to carve
- Story-3287 - One presigned URL becomes N, and nothing else changes
- Story-3278 - Story-3278 — Agent intro videos on the cast listing (Zoya first)
- Story-3275 - Story-3275 — India cast across the app
- Story-3273 - Story-3273 — Agents cast pages
- Story-3272 - Story-3272 Walkthrough
- Story-3270 - A fallback that fires has to say it fired
- Story-3191 - The front door shrinks to seven exact tokens
- Story-3189 - Story-3189 Walkthrough
- Story-3183 - Which matter does counsel mean?
- Story-3181 - Story-3181 Walkthrough
- Story-3169 - Find a matter by the name of a party in it
- Story-3162 - Story-3162 Walkthrough
- Story-3159 - Story-3159: Curation editor Save/Cancel commit flow + pills-from-preview
- Story-3158 - Story-3158: batch reconcile matter-type participant labels + list preview
- Story-3149 - Vani's welcome video — outbound media plus a lazy media-ID re-upload
- Story-3141 - Story-3141 Walkthrough
- Story-3137 - Keep asks only when evidence says they work
- Story-3136 - Story-3136: Vani terminal-turn telemetry
- Story-3133 - Citation checking through Indian Kanoon
- Story-3132 - WhatsApp answers that read at a glance
- Story-3131 - Story-3131 Walkthrough
- Story-3130 - Vani reads the record, and hands the Brief to Vega
- Story-3129 - Story-3129: Drive onboarding ask
- Story-3128 - Suggest Drive only while it remains undiscovered
- Story-3127 - Story-3127: Declare document intake origin
- Story-3117 - Story-3117 Walkthrough
- Story-3115 - Story-3115 Walkthrough
- Story-3112 - Story-3112 Walkthrough
- Story-3104 - Self-healing WhatsApp business number from observed webhook metadata
- Story-3103 - Remember which door a document entered through
- Story-3101 - Story-3101 Walkthrough
- Story-3100 - Story-3100: Onboarding hello bar
- Story-3099 - First-run nudges derived from live workspace state
- Story-3095 - Personalisation is a roster, not a preferences screen
- Story-3094 - One counsel-owned personalisation document for each agent
- Story-3085 - Counsel’s WhatsApp turns now show in the app panel — and we prove it
- Story-3084 - Story-3084: Rename Mira to Vani in the app agent panel
- Story-3069 - Firm register: full numbers, one toolbar, kebab disconnect
- Story-3068 - Story-3068: consent-required states (admin + member)
- Story-3067 - Story-3067: enrolment — QR, one-time code, countdown, expiry
- Story-3066 - My connection: connected, history, empty, loading, error
- Story-3065 - Routed My connection / Firm register shell
- Story-3062 - The QR can’t lie if the browser never holds the number.
- Story-3061 - Route-inventory guard for ChannelBindingView scope
- Story-3056 - The matter menu leads with your working set, not the firm’s oldest matters
- Story-3055 - Matter-create mints and attaches the participant label at Create
- Story-3051 - A spinner, not a sentence
- Story-3050 - Story-3050 Walkthrough
- Story-3047 - One Vani command vocabulary, now available to the app
- Story-3044 - Story-3044: Show full channel phone numbers
- Story-3038 - Channel keywords, with or without a leading slash
- Story-3037 - Colleagues see the number. Strangers stay masked.
- Story-3036 - A newly bound number now hears from Mira
- Story-3028 - Story-3028 Walkthrough
- Story-3018 - Every Mira turn is archived to S3 as the firm’s own record
- Story-3016 - Mira's converse history is bounded — trim, floor, budget
- Story-3011 - Matter access-contacts read — who to ask for access
- Story-3009 - A locked door, not a broken page
- Story-2992 - Story-2992 Walkthrough
- Story-2985 - Story-2985 Walkthrough
- Story-2984 - Story-2984 Walkthrough
- Story-2982 - Story-2982: the results consumer — verify, then make the artifact terminal truth
- Story-2981 - Story-2981: the broker presigns one key, writes the pending row, and returns
- Story-2980 - Story-2980: two clocks + a liveness sweeper that checks the bucket before failing
- Story-2976 - Story-2976: WhatsApp click-to-send enrollment
- Story-2971 - The channel-consent gate now has a door
- Story-2969 - Story-2969 Walkthrough
- Story-2960 - Story-2960: backfill run_origin, contract the agent-run predicates
- Story-2959 - Story-2959: expand agent-run delivery truth safely
- Story-2958 - Story-2958: artifact contract + result delivery
- Story-2948 - Mira conversation operability and spend
- Story-2925 - Story-2925 Walkthrough
- Story-2923 - Archive & delete lifecycle surfaces
- Story-2922 - Story-2922: curation-safe seed + split where-used counts
- Story-2921 - Story-2921: lifecycle guards — archive-only labels + cascade-on-type-delete
- Story-2920 - Participant-label curation editor
- Story-2919 - The list teaches itself
- Story-2918 - Story-2918: participant-label mapping write API + name-resolution dedup
- Story-2917 - Story-2917: Grouped search-select as permanent Q2
- Story-2916 - Uncurated matter types no longer dead-end create
- Story-2896 - Story 2896: HTTP launch socket attach — server-derived
- Story-2895 - Story 2895: HTTP launch beyond mira-converse — all four app rail builders
- Story-2882 - Periodic number re-attestation: the SIM-swap residual control
- Story-2881 - Story-2881: Admin channel register page + live thread refresh UI
- Story-2880 - Thread sync protocol — channel turns land in the open app thread
- Story-2879 - Story 2879: admin channel register API — live bindings + metadata-only activity
- Story-2878 - Story-2878: Session-lifetime config + remote logout entry point (RFD-AGT-013 T2c-b)
- Story-2877 - Story-2877: Settings → Channels — connect/disconnect a channel + binding status
- Story-2876 - Story-2876 Walkthrough
- Story-2875 - chat_turn channel-origin + restriction provenance
- Story-2873 - Story 2873: compaction orchestration — trigger + queue + fold persist
- Story-2872 - One lifecycle event now closes every W3 door
- Story-2870 - Story-2870 — poisoned channel documents stay data
- Story-2869 - Hostile channel input stops before Blake
- Story-2867 - A WhatsApp document cannot file itself
- Story-2866 - Story-2866 — Command broker: translator + own-access gate + origin tag
- Story-2865 - WhatsApp media survives the provider URL
- Story-2864 - Story-2864 Walkthrough
- Story-2863 - The stolen-phone switch kills every outstanding channel link
- Story-2862 - Disambiguation: ambiguity-only asks + firm-scoped sticky
- Story-2861 - Every authorized open gets its own traceable PDF
- Story-2860 - Refused-sender backoff + burst anomaly + alert transport
- Story-2859 - Wrapper-token mint + session+matter-gated open
- Story-2858 - Per-identity spend/rate caps for bound identities
- Story-2857 - Story-2857 Walkthrough
- Story-2856 - Terminal notice + attempt ledger + W2 wave smoke
- Story-2855 - resolve_matter_document: the channel document-fetch leash
- Story-2854 - Live membership + binding revocation + revocation epoch
- Story-2853 - Sensitivity gate — restricted = teaser + app-only at mint time
- Story-2851 - Durable delivery records + WhatsApp outbound sender
- Story-2850 - Zero-amp shield: static refusal of unregistered senders
- Story-2849 - Verified Meta ingress: HMAC fail-closed on the raw body + SQS
- Story-2848 - Channel identity service + enrollment + unbind + revoke
- Story-2847 - SCHEMA-SEED: channel tables + ORM + RLS + indexes
- Story-2846 - Versioned channel consent + current-version enrollment gate
- Story-2842 - Story-2842: App rail rewire — HTTP launch for all 4 builders; WS bidirectional for query/replay
- Story-2841 - Story 2841: canonical clear/reset
- Story-2840 - The app can launch Mira over HTTP and reuse the durable clerk rail
- Story-2839 - Story 2839: shared matter-turn session resolver
- Story-2802 - Every model call now says what it cost, and whose it was
- Story-2795 - A matter-type change cannot carry the old represented party
- Story-2794 - Two honest questions replace one ambiguous dropdown
- Story-2791 - Matter posture and the represented participant now agree
- Story-2790 - Matter intake can load the right participant roles
- Story-2789 - Matter intake now starts with the right role vocabulary
- Story-2788 - Matter types can now name their participant-label options
- Story-2787 - Story-2787 — Representing-side posture migration
- Story-2778 - Story 2778: framer_trigger sends client_name + representing_side + participant label
- Story-2777 - Story-2777 Walkthrough
- Story-2749 - Story 2749: Admin grant-code management + payment/mandate read views
- Story-2737 - Indigo read this.
- Story-2734 - Story 2734: Expose the Indigo understanding envelope on the app-api read model
- Story-2731 - Story 2731: Indigo functions rails - packet producer, broker invoke, envelope persistence
- Story-2730 - Story-2730 Walkthrough
- Story-2726 - Blake's quick analysis, and Blake's name on every record
- Story-2723 - Story 2723: Billing authority, and the seat / admin lifecycle refusals
- Story-2722 - Campaign grant-code management and firm payment/mandate read views
- Story-2721 - Story 2721: The monthly renewal rail
- Story-2719 - Story 2719: Firm month-one checkout, eMandate registration, and the mandate lifecycle
- Story-2716 - Buy pages, and never pay twice.
- Story-2715 - Story 2715: Customer-redeemable grant codes
- Story-2714 - Story 2714: Razorpay payment core — the money rail
- Story-2711 - Story 2711: Self-serve provisioning API
- Story-2702 - Blake's card is visible before the Deep Read
- Story-2700 - “Blake read this” — the card drawer
- Story-2689 - The clients list now uses the prominent shared empty state
- Story-2688 - Client detail now shows the client's related matters
- Story-2682 - The Record now reads Blake's real card and carve family
- Story-2681 - Story-2681 Walkthrough
- Story-2678 - No lead is visible only to firm admins.
- Story-2677 - Server-side matter-detail entry gate
- Story-2676 - Firm member changes warn before they affect led matters
- Story-2674 - Add Matter now requires a lead counsel pick
- Story-2673 - The Team drawer is where matter responsibility becomes visible.
- Story-2670 - Story 2670: Firm membership vacancy hooks
- Story-2669 - Story 2669: Matter team HTTP endpoints
- Story-2666 - Team now has an entry in the Matter Action Rail
- Story-2664 - Story 2664: Matter team DB invariants and create-only seed
- Story-2656 - Story-2656 Walkthrough
- Story-2646 - Story-2646 Walkthrough
- Story-2631 - Story 2631: Capture who we represent at matter creation
- Story-2629 - Story-2629 — Matter representing_side orientation input
- Story-2607 - Story-2607 Walkthrough
- Story-2600 - Story 2600: Honest Text and Original extraction states
- Story-2596 - Story 2596: Gate Insights until Deep Read is ready
- Story-2583 - Story 2583: Maximal disclosure
- Story-2570 - Story-2570 — Deep Read worker deployment and durable pass nudges
- Story-2562 - Deploy workflow for the storage-allocation worker Lambda
- Story-2559 - Story 2559: attention that cannot quietly misdirect counsel
- Story-2555 - Table anchors now carry the grid, not a guess
- Story-2548 - Story 2548: Replace Credits with Billing & Usage
- Story-2547 - Story-2547 — Textract Cost from Completed Extraction Receipts
- Story-2546 - Story-2546 — persist inference receipts and remove customer AI-credit rails
- Story-2545 - Story 2545: Firm-safe customer Billing & Usage API
- Story-2544 - Rate cards and the firm page ledger replace flat admin pricing
- Story-2543 - Story-2543 — Private Vendor-Cost Ledger & Staff Unit-Economics API
- Story-2541 - Story-2541 — S3 Storage Allocation & Monthly AWS Reconciliation
- Story-2539 - Story 2539: page commercial contract and ledger projection
- Story-2538 - Story 2538: CREATE preflight authorization and page charge
- Story-2531 - Story 2531: waitlist leads — simple Postgres table + key-authed webhook
- Story-2515 - Story 2515: Family + twin surfaces
- Story-2513 - Story-2513 Walkthrough
- Story-2512 - Family carving without silent evidence loss
- Story-2511 - Story 2511: Findings lifecycle + SIDE CHECK
- Story-2510 - Story 2510: Attention surfaces
- Story-2509 - Story 2509: Anchored margins v1
- Story-2508 - Story 2508: INTAKE billing emission
- Story-2505 - A chronology that admits what it has not read
- Story-2504 - Judge every admitted pair, account for every dropped pair
- Story-2503 - Story-2503: Comparator JUDGMENT
- Story-2502 - One claim, every occurrence, no graph double
- Story-2501 - Story 2501: Insights opens the Deep Read envelope
- Story-2500 - Mira reads the whole room; exports do not
- Story-2499 - Privilege is a membrane, not a wall
- Story-2498 - A model score cannot overrule document bytes
- Story-2496 - Story 2496: one document read, one serving envelope
- Story-2495 - Counsel's verdict survives the machine's next read
- Story-2494 - Story-2494 Walkthrough
- Story-2493 - Deep Read has one durable authority
- Story-2492 - Story-2492 Walkthrough
- Story-2491 - Story-2491 Walkthrough
- Story-2490 - The registrar now reads the Extraction Record
- Story-2488 - Story-2488: Text and Original now read Extraction Record views
- Story-2487 - One extraction record, three useful views
- Story-2486 - Story 2486: zero-silent-move anchor remaps
- Story-2485 - Story 2485: page billing ledger guards
- Story-2483 - Story 2483: addressable document pages v2
- Story-2482 - Story 2482: one extraction job
- Story-2456 - Story 2456: expose the stored DocumentCard
- Story-2450 - Story 2450: THE READ announces itself on the domain bus
- Story-2435 - Every citation gets one door back to the exact page.
- Story-2415 - The refusal names an action counsel can take today.
- Story-2402 - Colour is a claim. Space is a priority.
- Story-2401 - The ring belongs to the keyboard
- Story-2400 - The instruction never dims, and never moves
- Story-2399 - The page box learns to open.
- Story-2398 - Story-2398: keyboard zoom — the keys every reader already has
- Story-2395 - The second door
- Story-2393 - The drawer stops making counsel guess
- Story-2386 - Choose from Drive
- Story-2377 - Story 2377: one Re-read, and the machine decides how deep to repair
- Story-2367 - Story-2367: fit-relative zoom — 100% is the reading column
- Story-2361 - Story-2361: Value at stake becomes editable — and the surface learns to say no
- Story-2360 - Story-2360: three more Brief lists become editable
- Story-2359 - Story-2359: Governing law becomes editable
- Story-2358 - Story-2358: Forum as catalog-backed EditableChoice
- Story-2357 - Story-2357: Issues for determination — the first COMPOUND row
- Story-2355 - Story-2355: EditableList — the list kind, and Key Instruments as its first consumer
- Story-2353 - Re-read and Delete
- Story-2348 - Story-2348: F toggles focus mode
- Story-2343 - Story-2343: the Text lens reads in a reading column
- Story-2342 - Story-2342: the shortcuts overlay — ? tells counsel what this page listens for
- Story-2330 - Story-2330: EditableChoice (single|multiple) + EditableStatusPill convergence
- Story-2328 - Story-2328 Walkthrough
- Story-2318 - Story-2318: Keyboard navigation in the Reading Room (Epic-2317)
- Story-2309 - Story-2309: Continuous-scroll Original lens (EPIC-2270)
- Story-2296 - Story-2296: Import drawer v2 states (B, EPIC-2270 — final link)
- Story-2295 - Story-2295: the Record register — saveable views (B, EPIC-2270)
- Story-2294 - Story-2294: the document permalink v2 (B5b, EPIC-2270)
- Story-2288 - Story 2288: a section kind is a ROLE, never a TOPIC
- Story-2287 - Story-2287 Walkthrough
- Story-2285 - Story 2285: BP — the source's own typography survives extraction
- Story-2283 - Story-2283: the CCB chassis (B5a, EPIC-2270)
- Story-2282 - Story 2282: B5f — the section layer travels
- Story-2281 - Story-2281: the section reading surface (B4, EPIC-2270)
- Story-2280 - Story 2280: B3 Consumers re-anchor — the section layer starts paying rent
- Story-2278 - Story 2278: the Collation machine — verified bundle split, logical children, undo
- Story-2276 - Story 2276: the wire between the brain and the border — B2b segmentation wiring
- Story-2275 - Story 2275: the one-line change that wasn't — bold/italic on the Matter Brief
- Story-2274 - Story 2274: the asterisk that ate the citation — Brief content_format
- Story-2272 - Story-2272 Walkthrough
- Story-2271 - Story 2271: the land before the border was drawn — section foundation
- Story-2269 - Story 2269: the courier who waited for the hour to strike — immediate outbox dispatch
- Story-2267 - Story-2267: optimistic matter create on the matters register
- Story-2264 - Story-2264: standard keyboard shortcuts across editable content blocks
- Story-2253 - Firm record loading states now match the tabbed layout
- Story-2252 - Firm Billing tab now uses the design reorg
- Story-2251 - Firm support access now renders as four stacked sections
- Story-2250 - Members tab marks PRAMAAN staff as staff, not as a warning
- Story-2249 - Overview now carries the operational snapshot for a firm
- Story-2248 - OnboardingStepper now renders as a vertical timeline
- Story-2247 - The firm record now has a persistent masthead and tabbed shell
- Story-2229 - Story 2229: the translator who was never paid — swapping the embedding model without moving the map
- Story-2228 - Story 2228: the trapeze with no net — giving the rail deploy something to fall back to
- Story-2223 - Story-2223: Mira panel hydrates the persisted thread on mount
- Story-2219 - Story 2219: the stamp said “filed”, the shelf was empty — rescuing the documents the Context Engine never learned
- Story-2213 - Story-2213 Walkthrough
- Story-2199 - EntityRow now owns the avatar card-list row shape
- Story-2198 - Standardized table chrome now comes from the shared primitive
- Story-2196 - Story-2196: Audit log timestamp right alignment
- Story-2194 - Story-2194: Razorpay egress moves to the Next.js BFF
- Story-2193 - Story 2193: quote the price, let someone with a phone line place the order — the Razorpay buy-side goes egress-free
- Story-2192 - Story-2192: Wire Razorpay Checkout for credit top-up
- Story-2184 - Story-2184 Walkthrough
- Story-2183 - Story 2183: an error is allowed to say what broke — and the suite refuses to ship one that won’t
- Story-2181 - Story-2181: ACP honest-failure — a rejection must never render as thinking
- Story-2179 - Story 2179: resolve_agent_runtime() — SSM registry resolver + consumer migration
- Story-2176 - Story 2176: open the till — exactly once, and know how to give the money back
- Story-2174 - Staff can grant or correct a firm’s AI credits from the admin billing page
- Story-2173 - Staff can retune every commercial number from the admin pricing page
- Story-2172 - Story 2172: a firm can only spend so much before we stop the meter — and only staff can lift the brake
- Story-2171 - Story 2171: two welded doors — the blocks nobody could read, and the orientation the wire threw away
- Story-2170 - Story-2170: Wave B app sender — the ACP stamps where counsel is standing
- Story-2169 - Story 2169: teach the enrichment chain to interpret a document, not summarize it
- Story-2168 - Story-2168: The Document Page v2 — Original · Insights, live
- Story-2167 - Story 2167: quote the price and check the receipt — the Razorpay buy-side, minus the money move
- Story-2166 - The Record page redesign — RegisterView
- Story-2165 - Story 2165: teach the credit ledger the word “provider” before Razorpay arrives
- Story-2164 - Story 2164: staff can grant a firm credits — once, on the record, and never twice
- Story-2163 - Story 2163: the dial gets a knob — staff turn pricing without a deploy
- Story-2162 - Story 2162: Station 4 gets a running engine — and a wired fuel line
- Story-2160 - Story 2160: the low-fuel light that won't let you start the drive
- Story-2159 - Story 2159: every commercial number moves out of the code and into a row you can edit
- Story-2157 - Story 2157: CE-18 — the backfill worker gets a door to production
- Story-2152 - Story 2152: Wave B — surface_context stamping
- Story-2141 - Story-2141: Vega proposal panel — collapsed presentation
- Story-2140 - Story-2140 Walkthrough
- Story-2128 - Story-2128: IB-5 Triage tab v1
- Story-2127 - Story 2127: IB-4 — the Vocabulary fold-in (two doors, one decision)
- Story-2126 - Story 2126: IB-3 — the registration producers (the first asks the Inbox ever mints)
- Story-2125 - Story 2125: IB-2 — the Inbox read + resolve routes (working the queue, safely)
- Story-2124 - Story 2124: IB-1 — the Inbox substrate (the HITL rail's foundation)
- Story-2121 - Story-2121: Strategy tab — the strategy-documents shelf
- Story-2120 - Story-2120: Import drawer — the Strategy chip
- Story-2119 - Story 2119: document home class (record|strategy) — storage, reclassify, structural exclusions
- Story-2117 - Story-2117: Document permalink page — PDF viewer + card rail + paragraph hover-bar + notes
- Story-2116 - Story 2116: Document annotations substrate - span-anchored notes (counsel + agent-proposed)
- Story-2114 - Story-2114 Walkthrough
- Story-2111 - Story-2111: Import drawer v2, live — armed source, privileged fail-safe, rail entry, rail fixes
- Story-2110 - Story 2110: declared_side at import (client/opponent/other) + privileged fail-safe rejection
- Story-2101 - Story 2101: Memory Engine ME-7 — broker ingest stamping + explicit remember path
- Story-2100 - Story 2100: Memory Engine ME-6 — memory contracts + pack assembly
- Story-2099 - Story 2099: Memory Engine ME-5 — the memory stores
- Story-2098 - Story 2098: Memory Engine ME-4 — form_id → matter_id re-key at promotion
- Story-2097 - Story-2097: Memory Engine ME-3 — the ACP session dropdown
- Story-2096 - Story 2096: Memory Engine ME-2 — session lifecycle service + routes
- Story-2095 - Story 2095: Memory Engine ME-1 — session identity + lifecycle
- Story-2093 - Story 2093: turn credit metering ON, seed every firm $50
- Story-2092 - Story 2092: the broker bills the real provider cost
- Story-2089 - Story-2089 Walkthrough
- Story-2084 - Story-2084 Walkthrough
- Story-2083 - Story-2083 Walkthrough
- Story-2082 - Story-2082 Walkthrough
- Story-2081 - Story-2081 Walkthrough
- Story-2080 - Story-2080 Walkthrough
- Story-2079 - Story-2079 Walkthrough
- Story-2078 - Story-2078 Walkthrough
- Story-2075 - Story-2075 Walkthrough
- Story-2074 - Story-2074 Walkthrough
- Story-2073 - Story 2073: Context Engine CE-21 — FramerInput.context_bundle (strictly additive)
- Story-2072 - Story 2072: Context Engine CE-14 — broker pre-fetch
- Story-2071 - Story 2071: CE-13 — the ONE bundle builder (folding five stores into one pack a brain can read)
- Story-2070 - Story 2070: CE-18 — the backfill worker (re-drive, never re-implement)
- Story-2069 - Story 2069: Turning scattered dates into a timeline you can walk
- Story-2067 - Story 2067: CE-12 graph read tools
- Story-2065 - Story 2065: Turning what a document says into facts you can reason over
- Story-2064 - Story 2064: CE-5 L2 retrieval - hybrid RRF → Cohere Rerank 3.5 → search_evidence
- Story-2063 - Story 2063: The graph of record's substrate — one door, fail-closed, self-healing
- Story-2062 - Story 2062: The turnstile a card must pass before it becomes evidence
- Story-2061 - Story 2061: Proving a citation still points where it says — at click time
- Story-2060 - Story 2060 (CE-3): pgvector + context.chunks + structure-aware chunker + embed worker
- Story-2059 - Story-2059 Walkthrough
- Story-2058 - Story-2058 Walkthrough
- Story-2057 - Story 2057: Where the Context Engine's facts live — and the gate that keeps them honest
- Story-2054 - Context Engine ADR set
- Story-2053 - Story 2053: the embedding retrieval eval (CE-4)
- Story-2052 - Story 2052: The Context Engine's contracts — one seam, span-carrying, versioned, pure
- Story-2048 - Story-2048 Walkthrough
- Story-2047 - Story-2047 Walkthrough
- Story-2041 - Story-2041: Mira's entry points — gutter avatar → CCB; conversation in the pinned Agent Dock
- Story-2040 - Story-2040: Mira in the app — the CCB + matter conversation panel
- Story-2038 - Story 2038: Broker lands a Mira command as a proposed frame version
- Story-2037 - One brain, two doors, one keyhole
- Story-2036 - Story-2036: markdown-aware shared gutter rail
- Story-2035 - Story-2035: light + full presets + toolbar + per-preset round-trip
- Story-2033 - Story-2033: Split Hearings into routed subpages — Sessions / Orders
- Story-2032 - Story-2032: Split Filings into routed subpages — Main / Annexures / Exhibits
- Story-2030 - Story-2030: Route the placeholder modes — Inbox, Strategy, Chronology, Proof
- Story-2029 - Story-2029: Brief becomes its own route + bare matter redirects to Brief
- Story-2027 - Mira learns to "do"
- Story-2026 - Mira gets her voice
- Story-2025 - Story-2025: wire the Brief field-history timeline to frame/versions
- Story-2024 - Story-2024: Markdown serialization core + plain preset (substrate keystone)
- Story-2022 - Mira gets a body — but not yet a voice
- Story-2020 - Story 2020: the frame versions read endpoint
- Story-2019 - Story-2019: Fat matter layout + Worknav-as-Link (route-per-mode keystone)
- Story-2017 - The frame learns to name the case
- Story-2011 - Story 2011: real Vega invoke
- Story-2000 - Story-2000: Matter Brief page
- Story-1999 - Matter Frame run-input manifest
- Story-1998 - Matter Frame counsel edit, lock, and ratify API
- Story-1997 - Story 1997: the Brief read DTO
- Story-1996 - Story 1996: frame-ingest boundary
- Story-1995 - Story 1995: the envelope DTO — one frame contract, pinned across two repos
- Story-1994 - EditableSurface — the edit-in-place primitive (TipTap)
- Story-1993 - Vega answers the phone — for real
- Story-1992 - One contract, two repos, zero hand-mirrors
- Story-1991 - Story 1991: structured Brief storage — matter_frames + matter_frame_field_locks
- Story-1984 - Story 1984: the frame-status read seam — the matter page's window into the framer rail
- Story-1977 - Story 1977: the framer trigger — first bus subscriber + the frame-job claim table
- Story-1976 - Story 1976: the domain-event relay — EventBridge adapter, freshness horizon, reconcile sweep
- Story-1975 - Story 1975: domain-events contract, transactional outbox, and the matter.created producer
- Story-1972 - Invite member uses a name-only Team role dropdown
- Story-1963 - Pending, expired, members, and deactivated rows show team role names
- Story-1962 - Invite by team role, not raw capability
- Story-1961 - Story 1961: membership creation derives designation and capability from the invited team role
- Story-1946 - Settings billing now shows live AI credits and opens checkout
- Story-1927 - Story 1927: the firm detail composite contract
- Story-1926 - Story 1926: one staff profile contract — the backend now carries the grant detail
- Story-1901 - Mark a document as an exhibit
- Story-1899 - Story 1899: the door no one could open — the create-exhibit-marking write
- Story-1895 - Inline exhibit renumber + the two-identity row
- Story-1891 - Story 1891: counsel picks up the pen — the exhibit-marking renumber write & the two-identity row
- Story-1889 - Blake review surface in the Exhibit Register
- Story-1888 - Index of Annexures, one click
- Story-1887 - Hearings tab: events, not documents
- Story-1886 - Filings tab: every document, one home
- Story-1884 - Blake learns to take it all back — safely
- Story-1883 - Blake learns to label the record
- Story-1882 - Story 1882: opening the ledger — the Exhibit & Annexure register reads
- Story-1881 - Story-1881 — Wiring the render producer edge
- Story-1878 - Story 1878: one document, many marks — the exhibit marking junction
- Story-1877 - Story 1877: the label and the identity are two different things — annexure columns + freeing exhibit_label
- Story-1873 - Segment-aware citation UX
- Story-1872 - Story 1872: privilege follows the file into every copy we make of it
- Story-1871 - Story 1871: making search speak every language — and never silently lose half a document
- Story-1870 - Story 1870: tabular extraction — teaching the pipeline to cite “Sheet ‘Damages’, row 247”
- Story-1869 - Story 1869: the quote that cannot lie — one canonical text + the V-CITE invariant
- Story-1868 - Per-page native→OCR, the render-completeness gate & the OCR-page budget
- Story-1867 - Story 1867: the hardened render stage — a DOCX/PPTX becomes an immutable, page-numbered PDF that citations anchor to, without ever running a macro, opening unscanned bytes, or letting a zip-bomb reach LibreOffice
- Story-1866 - Story 1866: page → segment — teaching the citation model to say “slide 3” without lying
- Story-1862 - Firm profile: rename your firm from a single field
- Story-1861 - Story 1861: a firm admin can rename their firm without re-typing an address they never gave us
- Story-1859 - The Record view: real columns, readability status & privilege-off-Record
- Story-1858 - Import into <matter> — drop your whole case into the Record
- Story-1857 - Story 1857: the ZIP-expansion worker — a bundle becomes N first-class documents without ever bypassing the malware scanner or escaping its own folder
- Story-1856 - Story 1856: a document we cannot read becomes honestly unreadable — never a silent dead-end
- Story-1855 - Story 1855: the import ledger — making “100% of your files were captured” a falsifiable claim
- Story-1854 - Counsel marks a document “Privileged” on the Record
- Story-1853 - Story 1853: quarantine download gate — a file the scanner flagged as malware can never be handed back as bytes
- Story-1851 - Proving the upload can't escape its matter
- Story-1846 - One span tree, two exporters
- Story-1843 - One trace_id, both lanes
- Story-1839 - The floor that says: invent nothing
- Story-1838 - Story 1838: excessive-agency regression family — a standing tripwire on the four ways an agent could overreach
- Story-1837 - The attacker writes the test, on a corpus the model never sees twice
- Story-1836 - Story 1836: graded server-set trust tier on tool-results — firm data can never claim the principal’s voice
- Story-1831 - Story 1831: the spend perimeter — a turnstile, a parcel scale, and a breaker box in front of the brain
- Story-1830 - The prompt holds no secrets — and never spills them
- Story-1829 - Story 1829: deterministic output egress strip — neutralise the beacon before it leaves the broker
- Story-1828 - Lock the safe agent-output renderer
- Story-1825 - One un-fenced voice — everything else is data
- Story-1808 - Two clients named Sharma — Atlas asks instead of guessing
- Story-1805 - Story 1805: D14 ask-on-ambiguity carrier — clarify, never auto-pick
- Story-1803 - Atlas learns the whole search vocabulary — and learns to distrust the rows
- Story-1802 - Story 1802: query_matters v2 — the real matter search
- Story-1800 - Replay-on-rehydrate: re-run the bound render selection on page reload
- Story-1799 - Story 1799: a missed render frame is re-bound on reconnect, never replayed stale
- Story-1798 - 2nd-component-shape proof: client_card (catalog genericity)
- Story-1797 - Story 1797: the broker emits the render frame on the turn it already owns
- Story-1796 - Atlas learns to point at a component, not paint the rows
- Story-1795 - 003-components: matter_table + matter_card behind the render-substrate
- Story-1794 - App render-substrate: consume the broker's RenderDataFrame
- Story-1793 - Story 1793: the broker authors the render data, and re-checks RLS at bind
- Story-1791 - Surface-card components + dto_bindings + gen:catalog validation (S-D3)
- Story-1785 - gen:catalog — the Page Card authority generator + check:catalog gate
- Story-1783 - Story 1783: a surface-generic broker read substrate
- Story-1780 - Consume the team + record bootstrap endpoints
- Story-1779 - Story 1779: one-trip page bootstrap for the team and record pages
- Story-1778 - Atlas dock: pin-by-default, drag-resize to 50vw, cookie persist
- Story-1756 - Atlas reshapes the register and proposes catalog writes — applied in the browser, confirm-first, no fabrication
- Story-1751 - Expired invitations can now be resent without offering revoke
- Story-1750 - Expired invitations now have a visible home without changing pending counts
- Story-1748 - Forums create/archive scenarios are authored, bound, and parked
- Story-1747 - Refusal-coverage matrix
- Story-1746 - Story 1746: BDD Living Doc
- Story-1745 - Story 1745: Firm-level RLS isolation BDD
- Story-1744 - Flake detection before browser tests can silently green
- Story-1743 - Playwright e2e now runs in CI
- Story-1741 - Atlas learns to answer from the data
- Story-1740 - Story 1740: seed_test_firms for BDD and integration tests
- Story-1739 - Story 1739: Atlas Answer — dock_chat server-plane tool routing + query_matters client_id
- Story-1737 - Scenario id uniqueness gate
- Story-1736 - check:features gate
- Story-1735 - BDD quality gates
- Story-1734 - pytest-bdd wiring
- Story-1733 - Playwright now accepts BDD features without losing the existing admin E2E suite
- Story-1732 - Playwright now has a BDD entry path without losing the existing E2E suite
- Story-1726 - Story-1726 AgentCore Memory wiring — 4 sealed ledgers + forgetting
- Story-1723 - Story-1723 — Full eval harness (refusal coverage + bilingual + red-team)
- Story-1722 - Story-1722 Command Vocabulary — 5 typed intent classes
- Story-1721 - Counsel keeps more than one conversation with Atlas — and names them without leaking a single privileged word
- Story-1720 - Story-1720 Sessions (a/2) — container: per-user+agent, resume-revalidate, scope-drop
- Story-1719 - Story-1719 Recovery (b/2) — fail-honest · undo-as-write · never-fake-success
- Story-1718 - Story 1718: Broker recovery contract (Recovery a/2, Lane functions)
- Story-1717 - Story 1717: Dispatcher per-session intent budget + trailing-edge debounce (Transport-A)
- Story-1716 - Story-1716 Cost (a/2) — cached role-agnostic prefix + serialization + version-check
- Story-1715 - Lock the Surface Operator vocabulary: glossary.md
- Story-1714 - check:catalog + check:terms CI gates
- Story-1713 - Story-1713 — Minimal eval gate for the slice (authz + injected-instruction)
- Story-1712 - Atlas filters the matters board by client — and only sees its own firm
- Story-1711 - Atlas adds and archives a forum — confirm-first, with an undo, on the real backend
- Story-1710 - Story 1710: Forums create + archive behind authz + RLS
- Story-1697 - The converged admin type layer now has a regression guard
- Story-1696 - The old src/types hub is gone
- Story-1695 - The central types hub is no longer a consumer import path
- Story-1694 - Admin presentation types now live beside their owning features
- Story-1693 - Admin removes hand-written mirrors of generated API contracts
- Story-1683 - Firm detail now shows the actual firm membership roster
- Story-1681 - Accepted invitations no longer vanish between Pending and Members
- Story-1680 - Story 1680: Clerk/Postgres Membership Reconciliation
- Story-1679 - Story 1679: Clerk membership webhook observability
- Story-1677 - The live admin lists stay URL-addressable without nuqs
- Story-1676 - Admin removes the final nuqs scaffolding
- Story-1675 - Admin drops the orphaned matter and filing type Storybook surfaces
- Story-1674 - Server-backed list side params now mirror URLs without nuqs
- Story-1673 - DataTable keeps TanStack and drops hook-owned nuqs state
- Story-1665 - Story-1665 — Dock WS streaming: real Atlas dock_chat turn
- Story-1664 - Atlas gets a Dock voice
- Story-1660 - Story 1660: Broker dock_chat routing (Lane B)
- Story-1659 - The composer finally talks to the backend
- Story-1658 - The brain proposes, the browser disposes — under guard
- Story-1657 - The reasoning pill stops guessing — it speaks the contract
- Story-1656 - How every page tells Atlas what it is — with no hand-kept list
- Story-1655 - The chat that doesn't die when you change pages
- Story-1653 - The Atlas descriptor & route-intent
- Story-1652 - Consume the canonical reasoning-level contract
- Story-1651 - Story 1651: Server-plane tool executor
- Story-1650 - Story 1650: the egress half of a thinking level — send the effort, pin the route, never silently cheat
- Story-1649 - One substrate, any agent — the chat surface that isn't Atlas
- Story-1648 - Story 1648: one yaml owns the reasoning ladder — the migration that ends migrations
- Story-1647 - Story 1647: AgentSessionContext provider-bag + typed tool-intent contract
- Story-1643 - Support access keeps the monitor and moves the data path under it
- Story-1642 - Firm detail grant create and revoke now use generated hooks
- Story-1619 - Story 1619: document.* — putting the business question onto the trace
- Story-1618 - Story 1618: gen_ai.* — speaking the observability tools' native LLM language
- Story-1609 - Story 1609: The Dispatcher Who Hands Blake the File (the registrar broker-consumer, Blake-seam P3b)
- Story-1608 - Story 1608: The Runner Who Picks Up the Baton (the registration relay, Blake-seam hop 3)
- Story-1607 - Story 1607: read_document_markdown — the broker reads the markdown Blake can't
- Story-1606 - Story 1606: derived/document.md — the markdown the Registrar seam reads
- Story-1599 - Story 1599: catalog list endpoints — finish the 1+N → 1+k sweep
- Story-1598 - Story 1598: bulk usage-counts — kill the worst row-scaled query fanouts
- Story-1584 - Story 1584: the native-extraction adapter — LiteParse default, pypdfium2 fallback, paragraph bbox on both paths
- Story-1567 - Story 1567: Teeth on the Leash (eval gates for the runtime rails)
- Story-1566 - Story 1566: Who governs the agent when nobody is watching
- Story-1565 - Counsel gets a steering wheel for the agent
- Story-1564 - Atlas adopts the runtime rails — thin
- Story-1563 - Blake adopts the runtime rails — auto + interactive
- Story-1562 - Story 1562: The Leash, Made of Code (runtime rails for every agent)
- Story-1561 - Runtime-capability contract extensions
- Story-1548 - Blake batch registration run — summary, exceptions & undo
- Story-1544 - Blake evals — deterministic safety gates + the gate-rule
- Story-1543 - Story 1543: The Relay Baton (the Mode-1 → Mode-2 registration trigger)
- Story-1542 - Story 1542: The Notary's Register (the effect ledger — registrar guardrails)
- Story-1541 - Blake's Mode-3 vocabulary approval workflow
- Story-1540 - Story 1540: The bonded teller window (the registrar tool broker)
- Story-1539 - Blake Govern — the closest-match 3-lens vocabulary gate
- Story-1538 - Blake Classify — per-document typed proposal
- Story-1537 - Blake — the Document Registrar agent (scaffold)
- Story-1535 - The Record learns to count pages, not just files
- Story-1534 - The Documents Register learns whose filing it is
- Story-1532 - Story 1532: Whose Filing Is This? (FN-2 — extend the document→filing derive)
- Story-1531 - The Record now knows whose filing it is — participant.side + filing.filed_by_participant_id
- Story-1528 - Story 1528: DOCTYPES follow-ups — case-insensitive unique(firm_id, name) + seed defaults
- Story-1527 - The register, actually on the route
- Story-1525 - Revert the premature 9-value filings.current_state — the register derives the live 3-value status
- Story-1520 - The Documents Register slice navigator
- Story-1519 - Document Types catalog UI — Settings → Matter Configuration
- Story-1518 - Action Rail intake upload sheet
- Story-1517 - Saved views, actually saved
- Story-1516 - The Documents Register bulk bar — select many, act once
- Story-1515 - The Documents Register drawer — the whole truth behind one row
- Story-1514 - The Documents Register row — derived filing, hierarchy, flags, scale
- Story-1513 - Reshaping the register from the column itself
- Story-1511 - The Documents Register ⚙ View popover + Save split
- Story-1510 - The Documents Register view-state engine
- Story-1509 - Documents Work Mode shell — the option-J chrome
- Story-1505 - Story 1505: soft-delete + retention + legal-hold (FN-RETENTION)
- Story-1504 - Story 1504: copied_from_document_id + S3 CopyObject (FN-LINEAGE)
- Story-1503 - Story 1503: document_ingest_outbox — transactional outbox + relay (FN-OUTBOX)
- Story-1502 - Story 1502: The Documents↔Filings Derive API (FN-FILING-LINK)
- Story-1501 - Story 1501: FN-PRIVILEGE — a hard privilege_flag + an index gate, never a tag
- Story-1500 - Story 1500: OcrPort — an engine-neutral OCR seam (Textract impl)
- Story-1499 - Story 1499: document_status_events — append-only transitions + observability proof gate
- Story-1498 - Documents Register saved views
- Story-1497 - Story 1497: document_types — firm-wide document type catalog (FN-DOCTYPES)
- Story-1490 - Three navigations, one matter
- Story-1485 - Admin reusable chrome now has a shared home
- Story-1483 - Firm detail moves to generated hooks without touching grant work
- Story-1482 - Staff keeps its mature table and changes the data source underneath
- Story-1481 - Firms list/create now uses hydrated generated hooks.
- Story-1480 - Admin now has the TanStack Query runtime shell.
- Story-1479 - Generated firms browser calls now land on a server-owned proxy.
- Story-1478 - Admin now has the generated Kubb client foundation.
- Story-1477 - Admin local development now starts on webpack
- Story-1475 - Cross-repo registry drift guard
- Story-1471 - Forward the @vercel/otel X-Ray trace context to the backend — connect app → functions
- Story-1464 - Story 1464: Non-Fatal Metrics Emission in Request/Worker Paths
- Story-1463 - No-parent & malformed traceparent mint X-Ray-format roots, not W3C-random ones
- Story-1459 - Rewrite the living observability docs off the legacy request id
- Story-1457 - APP-RIP: delete the homegrown correlation_id (cid) from pramaan-app
- Story-1456 - Story 1456: FN-RIP — delete the correlation_id machinery (R7d)
- Story-1455 - One id for the request, not two
- Story-1454 - Repoint correlation_id → trace_id across the app's browser + server consumers, and regenerate src/gen
- Story-1453 - Story 1453: ErrorResponse.correlation_id → trace_id (R7a)
- Story-1449 - The browser can finally name the trace it lives in
- Story-1448 - The admin surface gets a real tracer, and exactly one place owns it
- Story-1447 - Surface the request trace_id to the RSC tree + an app manual-span helper
- Story-1446 - Adopt @vercel/otel — the Phase-B TracerProvider owner
- Story-1445 - Story 1445: Functions RED Metrics
- Story-1444 - Story 1444: Functions Domain Spans
- Story-1442 - Story-1442: Atlas Logfire content gate
- Story-1441 - Atlas's reasoning passes become INTERNAL children of one invoke span
- Story-1440 - Atlas emits aggregatable GenAI token and cost metrics
- Story-1439 - Atlas joins the broker trace before the brain thread starts
- Story-1438 - Story 1438: Carry Trace Context Into agent_invoke.v1
- Story-1437 - Story 1437: ws_pusher continues the run trace
- Story-1436 - Story 1436: Projection Outbox Trace Links
- Story-1435 - Story 1435: HTTP to SQS to clerk worker stays one trace
- Story-1434 - HTTP root-span attrs + log id remap
- Story-1417 - A gate that can't be sweet-talked
- Story-1414 - Story 1414: R12 Baggage Posture Gate + MeterProvider Ban
- Story-1399 - Revoke-all grants now require a reason and wait for the server
- Story-1398 - The grant dialog now says what the backend does
- Story-1395 - Support-access oversight that stays correct past the first 200 grants
- Story-1394 - The roster and pickers stop pretending and start talking to the backend
- Story-1392 - Story-1392: Staff Grant Detail Contract
- Story-1391 - Story-1391: Active Support Grants Contract
- Story-1383 - Wire the matter-shell chrome into the live /matters/[id]
- Story-1382 - Matter detail header + right rail — Storybook-first
- Story-1380 - Finish the Add-Matter stepper: the editable Step-5 frame drives matter create
- Story-1374 - Story 1374: Measure What Users Actually Get From the Atlas Rail
- Story-1373 - Agent rail resilient to mount churn (StrictMode / remount) + reconnect-refetch
- Story-1361 - Story 1361: Sync the Broker to the Flat Atlas Proposal Contract
- Story-1360 - Mirror the flat Atlas contract in app — prayers[] + approximate value
- Story-1359 - Flatten the Atlas generation contract — flat DTO + prayers[] + approximate value
- Story-1353 - Brand the Clerk auth surface to PRAMAAN
- Story-1351 - A firm admin can no longer be a PRAMAAN employee
- Story-1350 - D2 front door: reject internal-domain invites
- Story-1347 - Story 1347: Identity-hat invariant — platform_staff ⊥ firm_membership
- Story-1337 - KB image zoom lightbox
- Story-1336 - Story 1336: Externalize the Atlas runtime ARN
- Story-1330 - Team Deactivated tab
- Story-1318 - Atlas runs OpenRouter + DeepSeek only — and the model lives in model.json
- Story-1317 - Atlas: the entrypoint reads its own secrets at cold start
- Story-1313 - The firm AI-inference policy page — where a firm sees and sets where AI processing runs
- Story-1311 - The Global-tier AI inference path
- Story-1308 - Atlas: complete the Logfire onboarding — add system metrics
- Story-1292 - Atlas grounding: send matter_type + forum into the intake input — closing #1292 (app half)
- Story-1291 - Atlas: Pydantic Logfire (US) for the LLM lane
- Story-1289 - Add-Matter forum picker + step-2 two-column row + modal +100px — closing #1289
- Story-1288 - Atlas: BAML → Pydantic AI
- Story-1287 - Atlas Reflection — AtlasReflect walkthrough
- Story-1283 - Matter Types settings catalog — Storybook-first mock scaffold
- Story-1282 - Atlas consumes matter_type — walkthrough
- Story-1281 - Add-Matter matter-type picker + inline-create — closing #1281
- Story-1279 - Wire matter type into matter creation
- Story-1278 - Matter Types catalog
- Story-1277 - Matter Preset relabel + matter_type package move
- Story-1272 - Matters search now uses the backend result set
- Story-1271 - Story 1271: Matter List Search
- Story-1267 - Atlas Step-5 review UX — found & fixed live
- Story-1266 - One header was welding the stream shut
- Story-1254 - Member avatars carry a real photo — imageUrl joined live from identity
- Story-1249 - Audit Log — interface pass
- Story-1245 - Capability is derived from the firm role
- Story-1244 - Firm role carries capability — designation is the only thing you assign
- Story-1242 - Team roles UI
- Story-1241 - Firm roles catalog — decouple role from capability
- Story-1229 - [Bug-1229] WS handler: persistent event loop per container
- Story-1228 - [Bug-1228] Clerk worker claim: anchor on run_step ledger (composite agent_run PK)
- Story-1225 - [Bug-1225] Fix team invitation Clerk roles
- Story-1223 - Step-5 wizard binds the live WebSocket rail
- Story-1221 - [Story-1221] Clerk worker — SQS→AgentCore→truth→WS push, idempotent claim + in-stream cost cap (ADR-110 T6+T14)
- Story-1220 - [Story-1220] WS launch path for atlas_intake_review — clerk-rail routing + run.accepted frame (ADR-110 T8)
- Story-1218 - [Story-1218] Shared agent contracts package (pramaan-docs ADR-110 T4)
- Story-1217 - Atlas emits agent_event_stream.v1 — walkthrough
- Story-1216 - Story 1216: Matter List Numbered Pagination
- Story-1210 - fix(atlas): fail-closed on missing input, real token cost, remove dev scaffolding [Bug-1210]
- Story-1209 - feat(agents): Atlas broker — POST /agents/atlas SSE stream [Story-1209]
- Story-1203 - Story-1203 — AgentCore networking: resolve networkMode: "PUBLIC", decide + spec VPC mode
- Story-1201 - [Story-1201] Seed participant label defaults and linkage
- Story-1200 - Bug-1200: Unblock Add Matter participant labels
- Story-1197 - Bug-1197: hide archived catalog entries in matter template pickers
- Story-1196 - [Story-1196] Implement Team settings page
- Story-1195 - [Story-1195] Team directory accepted-member contract
- Story-1192 - [Chore-1192] Fix dev CSS root cause: webpack (not turbopack) + matters pagination
- Story-1190 - Matters list adopts shared chrome
- Story-1188 - [Chore-1188] Matters register v3: render fix + drop template + SegmentedFilter + Storybook-first rule
- Story-1186 - [Story-1186] Matters register: v3 contract + nav icon swap
- Story-1185 - Chore-1185: sync app-api mirror + regen src/gen to v3 matter contract
- Story-1182 - [Story-1182] Phase B: Add-Matter Team + Review + Atlas substrate + real create
- Story-1179 - docs: add ADR-106 matter data model [ADR-1179]
- Story-1178 - feat(atlas): Matter Frame agent on official AgentCore structure [Story-1178]
- Story-1177 - [Story-1177] Matter data-model v3 refactor + staging purge
- Story-1170 - [Story-1170] Gap-fill Add Matter wizard backend
- Story-1169 - k6 Lambda+Postgres load drill [Chore-1169]
- Story-1166 - [ADR-1166] ADR-105: audit log model — locks D1–D10
- Story-1164 - [Story-1164] Audit Log UI — Humans + Agents pages, snapshot renderers, scope filters
- Story-1163 - Story 1163: audit query API — two surfaces, scope timelines, seq cursors (S4)
- Story-1162 - Story-1162: audit emit coverage + completeness harness (S3)
- Story-1161 - Story-1161: audit vocabulary registry + typed audit.emit single stamping point
- Story-1160 - Audit schema evolution: scope chain, category, seq, partition-ready PK [Story-1160]
- Story-1158 - WS ContextVar token reset; case-insensitive traceparent [Bug-1158]
- Story-1157 - Record consumer span failures; context + redaction hardening [Bug-1157]
- Story-1152 - [Spike-1152] Audit log design — human + agent logs, taxonomy, schema, capture point, mockups
- Story-1151 - ADR-104 Amendment 1: wrapper override + propagator order + agents env rows [Chore-1151]
- Story-1150 - Continue incoming traceparent past the ADOT layer wrapper [Bug-1150]
- Story-1149 - [Chore-1149] Update matter template KB screenshots
- Story-1148 - [Chore-1148] Replace participant labels KB screenshots
- Story-1147 - [Chore-1147] Merge redirect logging into request completion
- Story-1142 - Observability infra enablement: Transaction Search workflow + alarms [Chore-1142]
- Story-1141 - Minimal trace bridge: mint + forward traceparent [Story-1141]
- Story-1140 - Centralized trace-header bridge: mint + forward traceparent [Story-1140]
- Story-1139 - Story-1139 — Continue the trace from SQS through Bedrock
- Story-1138 - Decommission to one tracing system + ADR-104 trace bridge [Story-1138]
- Story-1137 - ADR-104: unified instrumentation OTLP/X-Ray across four surfaces [Spike-1137]
- Story-1134 - [Bug-1134] Sign-in redirect loses public origin behind tunnel
- Story-1133 - [Story-1133] No-nav drawer for New Matter Template (warm cache)
- Story-1132 - [Story-1132] Consume bootstrap endpoint; replace 5-call fan-out
- Story-1131 - [Story-1131] Enforce ADR-102 lazy app API startup
- Story-1130 - [Story-1130] Add cacheable matter config bootstrap aggregate
- Story-1129 - [Chore-1129] Persist app API Lambda memory
- Story-1126 - ADR-103 config-screen bootstrap read pattern
- Story-1125 - Add ADR-102 and ADR-103 cold-start doctrine
- Story-1124 - [Bug-1124] Reduce Matter Templates create route latency
- Story-1123 - [Chore-1123] Matter templates Knowledge Base section
- Story-1122 - [Bug-1122] Fix /help RSC server→client boundary crash
- Story-1121 - [Spike-1121] Add admin structure alignment design note
- Story-1120 - [Story-1120] Matter Templates settings — list + detail (create/edit, 3-catalog multi-select)
- Story-1119 - [Chore-1119] Participant labels Knowledge Base section
- Story-1118 - [Chore-1118] Surface duplicate client email inline error
- Story-1117 - Story-1117: Client Email Unique Per Firm
- Story-1115 - [Story-1115] Name + bold the affected item in every settings-catalog toast
- Story-1114 - [Chore-1114] Name affected entities in settings toasts
- Story-1112 - [Chore-1112] Refresh forum KB screenshots
- Story-1111 - [Chore-1111] Humanize Matters KB screenshots
- Story-1110 - [Chore-1110] Simplify Getting started KB articles
- Story-1107 - [Chore-1107] Document shared-factory pitfalls in tests/AGENTS.md
- Story-1106 - ci: doc-only PRs skip heavy checks but report green
- Story-1105 - [Chore-1105] Migrate integration tests to shared fixtures
- Story-1102 - [Chore-1102] Make local test DB one command
- Story-1100 - [Chore-1100] ADR-100 app catch-up: matter templates composition
- Story-1099 - [Story-1099] Participant Labels settings page
- Story-1098 - [Story-1098] Restyle KB in Settings shell
- Story-1097 - [Story-1097] KB search and tags
- Story-1095 - [Spike-1095] Legacy schema audit
- Story-1094 - [Story-1094] Contextual KB help drawer rollout
- Story-1093 - [Story-1093] Proceeding Types settings page
- Story-1092 - Story-1092: KB getting started and members access content
- Story-1091 - [Story-1091] Add Forums KB content
- Story-1090 - [Story-1090] KB: Matters help content
- Story-1089 - [Chore-1089] Filing types: decouple from matter types (ADR-100 app catch-up)
- Story-1088 - [Story-1088] Rebuild matter templates catalog composition
- Story-1087 - Clients UI polish + drop Display Name (Chore-1087)
- Story-1086 - [Spike-1086] Prototype YAML-driven KB help center
- Story-1085 - [Bug-1085] Decouple filing types from matter types
- Story-1084 - Participant Labels become a firm-owned catalog
- Story-1083 - [Story-1083] Add proceeding types catalog
- Story-1082 - [Story-1082] Clients catalog + detail → forum gold-standard parity
- Story-1081 - [Story-1081] Filing Types catalog → forum gold-standard parity
- Story-1080 - [Story-1080] Client delete guard parity
- Story-1079 - [Story-1079] Filing type forum parity
- Story-1078 - [Story-1078] Add forum human-readable numbers
- Story-1077 - [Bug-1077] Delete only unused forum catalog items
- Story-1076 - [Bug-1076] Fix archive-aware management lists
- Story-1075 - Bug-1075: repair updated_at trigger-coverage drift + drift guard
- Story-1074 - [Chore-1074] Remove dead admin matters affordance
- Story-1073 - [Story-1073] Record-level access UI: hide unassigned, 404 deep links, gate clients + creation
- Story-1072 - [Story-1072] Record-level matter and client RLS
- Story-1070 - Spike-1070: record-level access design for matters and clients
- Story-1065 - [Story-1065] Support on-duty session: On-duty banner + capability-gated nav
- Story-1064 - Story-1064: support staff app-surface on-duty grant-scoped session (ADR-098)
- Story-1060 - [Story-1060] Gate settings UI on settings:write
- Story-1059 - [Story-1059] Resolve firm permissions from Postgres
- Story-1058 - [ADR-1058] Add pramaan-docs ADR-097 internal authorization
- Story-1055 - [Chore-1055] Enforce OpenAPI mirror drift guard
- Story-1054 - [Spike-1054] Decide proxy-layer codegen approach
- Story-1053 - Chore-1053: amend ADR-095 TanStack data pattern
- Story-1052 - [Story-1052] Settings: List/Detail naming + matter-detail unify + calm loading + Account-group cleanup
- Story-1051 - [Bug-1051] Ungate forum settings actions after source removal
- Story-1050 - [Story-1050] Remove system forums
- Story-1048 - Chore-1048: sync forum OpenAPI codegen
- Story-1047 - [Story-1047] Add forum CRUD backend
- Story-1046 - [Chore-1046] Default Playwright e2e to WebKit + axe/argos
- Story-1045 - [Story-1045] Clients client-cache pilot
- Story-1044 - [Story-1044] Add generated query invalidation helper
- Story-1043 - docs(adrs): ratify cache ownership [ADR-1043]
- Story-1042 - Story-1042: Forum settings functional + app-wide button motion system
- Story-1040 - [Spike-1040] Add codegen invalidation findings
- Story-1038 - [Bug-1038] Align app forums contract
- Story-1032 - [Story-1032] Align Forums catalog schema with source-discriminated pattern
- Story-1030 - [Story-1030] Add forums source catalog
- Story-1029 - [Story-1029] Forums catalog and forum_type cut
- Story-1025 - [Story-1025] Improve Matter Templates setup recovery
- Story-1011 - Story-1011: MatterChatAgent v1 guardrails + golden evals (756-C)
- Story-1010 - Story-1010: implement MatterChat deterministic tools
- Story-1009 - Story-1009: MatterChatAgent v1 prompt and tool wiring
- Story-1008 - [Story-1008] Add proceeding stage and related matter flows
- Story-1007 - [Story-1007] Create matters from template snapshots
- Story-1006 - [Story-1006] Redesign Matter Configuration around Matter Templates
- Story-1005 - [Story-1005] Regenerate Matter Redesign contracts
- Story-1004 - [Story-1004] Expose Matter Redesign API contracts
- Story-1003 - [Story-1003] Add Matter Redesign schema foundation
- Story-1001 - [Story-1001] accept ADR-090 matter redesign
- Story-1000 - Story-1000: Align terminal run statuses
- Story-994 - [Story-994] Add Phase-0 agent schema prerequisites
- Story-993 - Story-993: structured failure envelope
- Story-988 - Story-988: resume held HITL run with one-time allowlist
- Story-924 - [Story-924] Replace default skeletons with PRAMAAN loading states
- Story-909 - [Story-909] Build Atlas intake review Step 3 Storybook UI
- Story-869 - chore(graphify): install per-repo graph support [Story-869]
- Story-840 - ci(admin): enforce ADR namespace custody [Story-840]
- Story-817 - feat(scripts): DX-001 debug bundle CLI [Story-817]
- Story-807 - feat(app): add report bug diagnostics [Story-807]
- Story-806 - feat(app): expose diagnostics global [Story-806]
- Story-783 - [Story-783] feat(tokens): migrate app UI to universal token space
- Story-781 - [Story-781] test: validate every-merge walkthrough trigger
- Story-780 - pramaan-docs can publish walkthroughs automatically
- Story-779 - Admin walkthroughs publish themselves after merge
- Story-778 - Walkthrough auto-publishing for pramaan-app
- Story-777 - Slack notification on walkthrough publish
- Story-776 - Restore walkthrough workflow YAML
- Story-775 - Activate walkthrough auto-publishing
- Story-774 - Flat walkthrough publishing keys
- Story-773 - Walkthrough S3 and CloudFront publishing
- Story-754 - [Story-754] SQS consumer + Strands harness
- Story-753 - [Story-753] WebSocket agent bridge handlers
- Story-752 - [Story-752] Provision agents streaming infrastructure
- Story-751 - [Story-751] Add agents schema foundation
- Story-748 - [Story-748] Add ADR-070 pramaan-agents architecture
- Story-738 - [Story-738] Clerk-direct invitations and unified members list
- Story-736 - [Story-736] ADR-068 invitation doctrine cleanup
- Story-735 - [Story-735] Support access grants frontend list + revoke
- Story-730 - [Story-730] Filing Types frontend list + edit drawer
- Story-722 - [Story-722] Matter Types V1 backend read API
- Story-666 - docs(rules): clarify acceptance ceremony coordinator shape [Story-666]
- Story-622 - ci(app): accept Refs as a linking keyword in pr-closes-check [Bug-622]
- Story-524 - Story 524: OCR fallback for scanned documents
- Story-523 - Story 523 + 524: the document extraction worker
- Story-522 - Story 522: Upload endpoint — presigned PUT, malware scan gate, server-computed hash & MIME