| 2026-04-17 |
F-001..F-030 captured |
(not yet committed — Steps 1+2 working tree) |
|
| 2026-04-17 |
F-031..F-037 captured |
logged to Phase-4-Execution-Map §9 |
|
| 2026-04-17 |
F-038 captured (Al-Futtaim fabrication) |
logged |
|
| 2026-04-17 |
F-038 strengthened (PcComponentes unlinked) |
logged |
|
| 2026-04-17 |
F-039 captured (stale blogs) |
logged |
|
| 2026-04-17 |
F-031 FIX — normalizeLinkLabelSuffix() in audit.ts; wired into InlineStreamAuditor |
Step 3 working tree |
10 tests in auditor-label-suffix.test.ts pass |
| 2026-04-17 |
F-032 FIX — PERSONAS.md line 33 NAMEDROP label renamed to behavioral prose; defensive scrubber stripPromptInstructionLeaks() in audit.ts |
Step 3 working tree |
10 tests in auditor-namedrop-scrubber.test.ts pass |
| 2026-04-17 |
F-035 FIX — relaxed qualification thresholds in discovery_analyzer.ts: early path (6 signals + turn ≥ 2 + pain) + near-saturation (7 of 8) + standard (turn ≥ 3 was 4) |
Step 3 working tree |
9 tests in discovery-qualification.test.ts pass; 1 pre-existing discovery-bypass test updated |
| 2026-04-17 |
F-026 FIX — new lib/search/pushback_detector.ts; wired into orchestrator.igniteMaverick BEFORE signal_extract to null contradicted fields |
Step 3 working tree |
12 tests in pushback-detector.test.ts pass |
| 2026-04-17 |
F-038 FIX — validateCustomerClaim() in audit.ts; wired into InlineStreamAuditor.auditGrounding; InlineStreamAuditor instantiated in adaptAgentStudioStream for specialist audit |
Step 3 working tree |
10 tests in auditor-customer-claim.test.ts pass |
| 2026-04-17 |
F-040 FIX — classifyLink Q3 tightened to exact root path; Q4 requires URL in curated TECHNICAL_FALLBACK_URL_MAP |
Step 3.5 working tree |
9 tests in auditor-path-tightening.test.ts pass, incl. exact Shopify 404 case |
| 2026-04-17 |
F-041 REVERTED — qualification short-circuit was misguided. Stripping Maverick's value was wrong. Real root causes = F-044 (retrieval context) + F-029 (persona enforcement). |
Step 3.5 working tree |
code reverted, flow restored |
| 2026-04-17 |
F-042 FIX — history filter at Gemini chat boundary drops leading non-user messages |
Step 3.5 working tree |
TSC clean; will validate in next live run |
| 2026-04-17 |
Q3 ANSWERED — signalResult.filters is Maverick-only architecture-drift override; specialists never consume it. Vestigial for case_study/policy/news, harmful for doc on chip turns. Decision: remove override, keep field for telemetry. Full trace in rc3-phoenix/testing/Q3-Brain-Filter-Investigation.md. |
Step 3.6 investigation |
N/A — investigation only |
| 2026-04-17 |
F-044 FIX — new lib/search/retrieval_context.ts with shouldInheritContext + buildAccumulatedQuery. Wired into orchestrator.igniteMaverick before retrieval. Removed signalResult.filters override (Q3 decision). Removed .slice(-6) history truncation in signal_extractor.ts. Added SHORT-TURN RULE to prompts/brain.ts STEP 2. |
Step 3.6 working tree |
11 tests in retrieval-context-inheritance.test.ts pass; TSC clean |
| 2026-04-17 |
F-045 FIX (write path) — extended SessionState with conversation_turns: ConversationTurn[]. Added appendTurnsPure + appendConversationTurns helpers in redis.ts. Wired into orchestrator.igniteMaverick after turn_count bump and into orchestrator.igniteSpecialist before final event. Readers still use frontend-passed history (incremental migration). |
Step 3.6 working tree |
10 tests in redis-conversation-turns.test.ts pass; TSC clean |
| 2026-04-17 |
F-029 PARTIAL FIX (advisory gate) — new validateMaverickVoice() in persona_loader.ts with real voice markers (code-block ban, doc-bot opener regex, word count bounds, substantive-only requirement for algolia.com link + customer/product anchor). Wired into stream_processor as logging + [F-029 VOICE] audit_trace emission. Regeneration NOT wired — per SESSION.md brief, prompt trimming is forbidden and regen UX needs user review. Activation deferred. |
Step 3.6 working tree |
11 tests in persona-voice-gate.test.ts pass; TSC clean |
| 2026-04-17 |
F-046 FIX — Add-More-Context was routing to Maverick's sendMessage (re-qualifying + second handoff). Extracted pure buildSpecialistRequestBody in src/hooks/chat/specialist_request.ts. Extended triggerSpecialist/onSpecialistTrigger with optional additionalContext param. ChatMessage.tsx:412 now routes onAddContext through the specialist execute path with consent=true + inserts a user bubble. |
Step 3.7 working tree |
8 tests in specialist_request.test.ts pass; TSC clean |
| 2026-04-17 |
F-047 FIX — new validateQuoteAttribution in audit.ts catches unsourced quote+attribution blocks (em-dash pattern) that F-038 missed because quotes lack metric tokens. Paragraph-level pass in content_auditor.auditGrounding emits [AUDIT] STRIP QUOTE for fabricated "VP of E-commerce, Global Retailer"-style attributions. Accept paths: quote text present in sources OR algolia.com/customers |
blog/ link in block. |
Step 3.7 working tree |
| 2026-04-17 |
F-048 FIX — extractCandidateCompanyNames was stripping legitimate sentences because common capitalized words ("English", "French", "Price Range", "Okay") matched the candidate regex. Added NON_COMPANY_DENYLIST (languages, regions, bullet labels), extended stop-word guard with interjections/discourse markers, and added bold-header-colon skip (pattern: **Label**: never flags). F-038 primary guardrail preserved. |
Step 3.7 working tree |
6 new false-positive tests pass; existing F-038 suite (10 tests) unchanged |
| 2026-04-17 |
F-049 FIX — new reflowInlineNumberedList in lib/agent-studio/reflow.ts post-processes specialist paragraphs before emit, injecting \n\n before inline N. items (N=1-20) following sentence terminators. Wired into adaptAgentStudioStream.flushParagraphs. Elena's execution plans now render as actual markdown lists instead of one collapsed blob. Idempotent; preserves version strings like "API 2.0". |
Step 3.7 working tree |
10 tests in reflow-numbered-lists.test.ts pass |
| 2026-04-17 |
F-050 FIX — new detectVerbatimPaste + collapseVerbatimPaste in audit.ts. 6-word shingle-overlap detector against sources[].chunk_text. When a paragraph ≥ 200 chars overlaps ≥ 60% with a single chunk, replaces the block with {hook}. Full breakdown in [Title](url).. Wired as the first cleanup step in InlineStreamAuditor.auditParagraph. Fixes live regression where healthcare-SaaS user received a verbatim-copied Shopify ecommerce blog chunk. |
Step 3.8 working tree |
9 tests in auditor-verbatim-paste.test.ts pass; TSC clean |
| 2026-04-17 |
UX-01 — new SpecialistProgress.tsx mounts in SpecialistDeepDive when isLoading && !hasAnyContent. Shows live seconds counter + rotating step labels (Elena/Bruno-specific) + pulse dot while Agent Studio's 30-60s execute tool chain runs. Replaces the previous blank specialist panel during the verification-gate→first-chunk gap. Client-side only; no backend change. |
Step 3.8 working tree |
TSC clean; visual verification required |
| 2026-04-17 |
F-051 FIX (wired) — fixLinkBoundarySpacing in audit.ts wired into InlineStreamAuditor.auditParagraph (applies to Maverick + specialist paths via shared auditor). Inserts a space when markdown link ](url) is adjacent to alphanumeric. Resolves "ofdollars" / "boostrevenue" joined-word artifacts. |
Commit eb02e56b |
TSC clean |
| 2026-04-17 |
F-052 FIX (wired) — stripEmptyMarkdownHeadings in audit.ts wired into InlineStreamAuditor.auditParagraph. Removes ^#+\s*$ lines that would otherwise render as empty colored accent bars via MessageMarkdown's h2 renderer. |
Commit eb02e56b |
TSC clean |
| 2026-04-17 |
UX-01 v2 (in-gate progress + auto-stop) — InlineProgress added to VerificationGate.tsx so the progress bar shows where the user is already looking (no below-fold scroll problem). New specialistStreamingStarted flag computed in ChatPanel.tsx from messages[i+1].specialist.artifact.content.length > 0, plumbed through ChatMessage → VerificationGate. When true, timer is replaced with a static "Response incoming — rendering below" line. |
Commit eb02e56b |
Live-verified timer stop |
| 2026-04-17 |
UX-02 — Discovery Dossier click-to-expand — EntityExtractionCard.tsx pill was cursor-default with no onClick and capped at 3 signals + +N overflow. Now a <button> with aria-expanded, chevron, and a popover panel (absolute right-0 mt-2 z-50) listing EVERY captured signal as a labeled <dl> (industry, pain, stack, etc.). Keyboard and screen-reader accessible. |
Commit eb02e56b |
Live-verified |
| 2026-04-17 |
UX-03 — Specialist render fixes — SpecialistDeepDive.tsx scrubber at line 291 no longer strips a leading ** without its closing pair (fixes "Tenancy**:" orphan-bold regression). Added hierarchy promotion pass: * **Label**: bullets with no trailing content are rewritten to #### Label for visual section grouping. New h4 renderer in MessageMarkdown.tsx with persona-accent color. |
Commit eb02e56b |
Live-verified |
| 2026-04-17 |
UX-04 — CustomerQuote parses and auto-links attribution — CustomerQuote.tsx now (a) parses explicit [Walgreens](https://...) markdown links in the attribution and renders as anchor tags instead of literal uppercase text, (b) falls back to an auto-link pass: if attribution ends in AT {Company} and sources include a /customers/<slug> matching the company, wraps the company name in a link to that URL. Sources are threaded from SpecialistDeepDive via specialist.sources || sources for both Elena and Bruno. |
Commit eb02e56b |
Live-verified for explicit links; auto-link needs next live run with Gymshark/Walgreens in sources |