disclosure-bureau/web/app/bureau/page.tsx

45 lines
2 KiB
TypeScript
Raw Normal View History

W3.9: surface the Investigation Bureau on the homepage + /bureau hub Closes a UX gap the user surfaced: W3.5-3.8 built 8 detectives, 4 new URL endpoints (/jobs/[id], /h/[id], /c/[slug], /api/h/[id]/red-team) and a chat tool, but the homepage was unchanged — the bureau was invisible unless you knew the URL or asked the chat to invoke request_investigation. Homepage (web/app/page.tsx): - Title `▍ war.gov/ufo — Investigative Wiki` → `▍ The Disclosure Bureau` - Subtitle expanded from "Holmes · Poirot · Dupin · Locard" to all 8 detectives (Holmes · Locard · Dupin · Schneier · Poirot · Taleb · Tetlock · Case-Writer) - New `🔎 bureau` topbar link (gold, between graph/stats and batch) - BureauSnapshot inserted right after the header BureauSnapshot (web/components/bureau-snapshot.tsx) — server component: - 8 detective tiles with role labels (each in its tone color) - 6 clickable counters (evidence / hypotheses / contradictions / witnesses / outliers / case reports) — anchor to /bureau#section - 6 "recent artefacts" columns surfacing the last 3-4 of each kind: hypotheses with prior→posterior + band + ↳reviewed_by marker, contradictions with topic + resolution_status, evidence with Grade badge + verbatim quote, outliers with title + scope.kind, witness analyses with canonical_name + credibility + verdict, case reports with slug + link to /c/<slug> - "Recent jobs" strip linking to /jobs/[id] color-coded by status - Reports read from /data/ufo/case/reports/ via fs.readdir + stat, sorted by mtime — no DB round-trip needed for that section /bureau (web/app/bureau/page.tsx) — full hub: - Header with full counts - 7 sections (anchored to homepage counter links): Case reports, Hypotheses, Evidence, Contradictions, Outliers, Witnesses, Recent jobs table — each rendering up to 100 rows - Reports section parses frontmatter from each .md to surface topic + n_hypotheses + n_evidence on the card Runtime fixes batched in: - Poirot: coerce entity_pk via Number() — node-postgres returns BIGINT as string by default; writer's Number.isFinite() rejected it as "person_entity_pk required" (j-edgar-hoover retry path) - Tetlock: write_calibration rationale cap 600 → 1200 chars. Prompt still asks ≤ 600 but a 2× slack beats failing the job on honest analysis. Observed live: Tetlock emitted ~620 chars on H-0003 and the writer rejected the entire calibration. - Case-Writer: Promise.all of 5 queries × max_parallel=2 jobs demanded up to 10 connections against the investigator role's rolconnlimit=4 → "too many connections for role investigator". Sequentialized — the LLM call is the hot path, not these queries. Smoke results visible now on the homepage: - 3 hypotheses (H-0001/2/3) about green fireballs origin - 3 contradictions (R-0001/2/3) about color, geographic confinement, exclusive-green vs multicolored - 2 evidence cards (E-0002/3) Grade B - 3 outliers (G-0001/2/3) — including Taleb's deliberate meteor-shower-camouflage flag - 1 case report at /c/green-fireballs-sandia (Watson 13.4 KB, five-act narrative, fully cited) Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-24 01:41:28 +00:00
/**
W5.1: enthusiast pivot — strip detective surfacing, magazine homepage User explicit: "1 bilhão de entusiastas pelo mundo ovni" — site is for the UFO-curious public, not for skeptics. The 8-detective scaffolding becomes invisible plumbing; the reader sees stories about what was observed. Reader-facing changes: New homepage (web/app/page.tsx) - SiteHeader: magazine-style top nav (no detective tiles) - HeroBanner: full-bleed editorial opener with declassified-page art background, display-serif headline, live stats row (122 docs, 2047 events, 1861 witnesses, 867 craft catalogued) - FeaturedCase: cover-story treatment of the most recent case_report, uses a real document page as hero image, links to /c/[slug] - PortalGrid: 6 thematic doorways into the archive — Sightings, Witnesses, Craft, Hot spots, Programs, Documents — each tile shows a real entity count and short editorial blurb - GreatestHits: top 9 most-cited events from the corpus (Kenneth Arnold 1947, Mantell 1948, …) as a magazine grid - Doc list kept but reframed as "the primary record" New sub-pages (5) - /sightings → events (2047), magazine grid - /witnesses → people (1861), compact table - /objects → uap_objects (867), magazine grid - /locations → locations (1757), compact table - /operations → organizations (1596), compact table - /documents → full doc list with thumbnails (mirrors homepage section for direct deep-link) All share <EntityListPage> shell with per-page i18n + JSON-LD ItemList Stripped detective surfacing - /jobs/[id]: "Sherlock Holmes / Dr. Watson" → "Investigation in progress" - chat-bubble: detective-named card → neutral "Investigação em andamento" - quick-launch: 7-kind detective dropdown → single "investigar um caso" input (kind=case_report hardcoded) - /bureau: rewritten as the case-file library (no artefact dumps) Typography + design - Fraunces variable serif loaded for display headings (`.font-display` class) - Gold-amber accent (#e0c080) unified as the brand colour - Asymmetric magazine grids (1+2+3 column, generous whitespace) - Hover micro-interactions (image scale on featured case, translateX on portal arrows) SEO + GEO - layout.tsx metadataBase + title.template + per-route Metadata exports - Organization JSON-LD on root layout - WebSite + SearchAction JSON-LD on homepage - CollectionPage + ItemList JSON-LD on every entity list page - openGraph + twitter cards, pt-BR primary + en-US alternate - ai:purpose meta tag for Generative Engine Optimization — declares the site as a citation-linked primary-source archive - robots: index + follow with large image preview The detectives themselves remain alive in the backend (runtime, DB, audit log), but the reader never sees "Holmes / Sun-Tzu / Watson" in the UI. The next phase will reorient case-writer to write as a single best-seller voice synthesising all the internal sources. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-24 17:09:46 +00:00
* /bureau Case file library.
W3.9: surface the Investigation Bureau on the homepage + /bureau hub Closes a UX gap the user surfaced: W3.5-3.8 built 8 detectives, 4 new URL endpoints (/jobs/[id], /h/[id], /c/[slug], /api/h/[id]/red-team) and a chat tool, but the homepage was unchanged — the bureau was invisible unless you knew the URL or asked the chat to invoke request_investigation. Homepage (web/app/page.tsx): - Title `▍ war.gov/ufo — Investigative Wiki` → `▍ The Disclosure Bureau` - Subtitle expanded from "Holmes · Poirot · Dupin · Locard" to all 8 detectives (Holmes · Locard · Dupin · Schneier · Poirot · Taleb · Tetlock · Case-Writer) - New `🔎 bureau` topbar link (gold, between graph/stats and batch) - BureauSnapshot inserted right after the header BureauSnapshot (web/components/bureau-snapshot.tsx) — server component: - 8 detective tiles with role labels (each in its tone color) - 6 clickable counters (evidence / hypotheses / contradictions / witnesses / outliers / case reports) — anchor to /bureau#section - 6 "recent artefacts" columns surfacing the last 3-4 of each kind: hypotheses with prior→posterior + band + ↳reviewed_by marker, contradictions with topic + resolution_status, evidence with Grade badge + verbatim quote, outliers with title + scope.kind, witness analyses with canonical_name + credibility + verdict, case reports with slug + link to /c/<slug> - "Recent jobs" strip linking to /jobs/[id] color-coded by status - Reports read from /data/ufo/case/reports/ via fs.readdir + stat, sorted by mtime — no DB round-trip needed for that section /bureau (web/app/bureau/page.tsx) — full hub: - Header with full counts - 7 sections (anchored to homepage counter links): Case reports, Hypotheses, Evidence, Contradictions, Outliers, Witnesses, Recent jobs table — each rendering up to 100 rows - Reports section parses frontmatter from each .md to surface topic + n_hypotheses + n_evidence on the card Runtime fixes batched in: - Poirot: coerce entity_pk via Number() — node-postgres returns BIGINT as string by default; writer's Number.isFinite() rejected it as "person_entity_pk required" (j-edgar-hoover retry path) - Tetlock: write_calibration rationale cap 600 → 1200 chars. Prompt still asks ≤ 600 but a 2× slack beats failing the job on honest analysis. Observed live: Tetlock emitted ~620 chars on H-0003 and the writer rejected the entire calibration. - Case-Writer: Promise.all of 5 queries × max_parallel=2 jobs demanded up to 10 connections against the investigator role's rolconnlimit=4 → "too many connections for role investigator". Sequentialized — the LLM call is the hot path, not these queries. Smoke results visible now on the homepage: - 3 hypotheses (H-0001/2/3) about green fireballs origin - 3 contradictions (R-0001/2/3) about color, geographic confinement, exclusive-green vs multicolored - 2 evidence cards (E-0002/3) Grade B - 3 outliers (G-0001/2/3) — including Taleb's deliberate meteor-shower-camouflage flag - 1 case report at /c/green-fireballs-sandia (Watson 13.4 KB, five-act narrative, fully cited) Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-24 01:41:28 +00:00
*
* Magazine hero + filterable browser. The previous flat 80-card grid had no
* way to navigate; the new browser carries search, agency chips, decade
* chips, and sort, all URL-synced.
W3.9: surface the Investigation Bureau on the homepage + /bureau hub Closes a UX gap the user surfaced: W3.5-3.8 built 8 detectives, 4 new URL endpoints (/jobs/[id], /h/[id], /c/[slug], /api/h/[id]/red-team) and a chat tool, but the homepage was unchanged — the bureau was invisible unless you knew the URL or asked the chat to invoke request_investigation. Homepage (web/app/page.tsx): - Title `▍ war.gov/ufo — Investigative Wiki` → `▍ The Disclosure Bureau` - Subtitle expanded from "Holmes · Poirot · Dupin · Locard" to all 8 detectives (Holmes · Locard · Dupin · Schneier · Poirot · Taleb · Tetlock · Case-Writer) - New `🔎 bureau` topbar link (gold, between graph/stats and batch) - BureauSnapshot inserted right after the header BureauSnapshot (web/components/bureau-snapshot.tsx) — server component: - 8 detective tiles with role labels (each in its tone color) - 6 clickable counters (evidence / hypotheses / contradictions / witnesses / outliers / case reports) — anchor to /bureau#section - 6 "recent artefacts" columns surfacing the last 3-4 of each kind: hypotheses with prior→posterior + band + ↳reviewed_by marker, contradictions with topic + resolution_status, evidence with Grade badge + verbatim quote, outliers with title + scope.kind, witness analyses with canonical_name + credibility + verdict, case reports with slug + link to /c/<slug> - "Recent jobs" strip linking to /jobs/[id] color-coded by status - Reports read from /data/ufo/case/reports/ via fs.readdir + stat, sorted by mtime — no DB round-trip needed for that section /bureau (web/app/bureau/page.tsx) — full hub: - Header with full counts - 7 sections (anchored to homepage counter links): Case reports, Hypotheses, Evidence, Contradictions, Outliers, Witnesses, Recent jobs table — each rendering up to 100 rows - Reports section parses frontmatter from each .md to surface topic + n_hypotheses + n_evidence on the card Runtime fixes batched in: - Poirot: coerce entity_pk via Number() — node-postgres returns BIGINT as string by default; writer's Number.isFinite() rejected it as "person_entity_pk required" (j-edgar-hoover retry path) - Tetlock: write_calibration rationale cap 600 → 1200 chars. Prompt still asks ≤ 600 but a 2× slack beats failing the job on honest analysis. Observed live: Tetlock emitted ~620 chars on H-0003 and the writer rejected the entire calibration. - Case-Writer: Promise.all of 5 queries × max_parallel=2 jobs demanded up to 10 connections against the investigator role's rolconnlimit=4 → "too many connections for role investigator". Sequentialized — the LLM call is the hot path, not these queries. Smoke results visible now on the homepage: - 3 hypotheses (H-0001/2/3) about green fireballs origin - 3 contradictions (R-0001/2/3) about color, geographic confinement, exclusive-green vs multicolored - 2 evidence cards (E-0002/3) Grade B - 3 outliers (G-0001/2/3) — including Taleb's deliberate meteor-shower-camouflage flag - 1 case report at /c/green-fireballs-sandia (Watson 13.4 KB, five-act narrative, fully cited) Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-24 01:41:28 +00:00
*/
W4.1+W4.2: anti-AI-tics house style + bureau nav (back/home everywhere) Two complaints in one wave: (W4.1) User: "Não pode ter vícios de IA como uso excessivo de '-' que a IA coloca geralmente no lugar de vírgulas por exemplo. Isso deve fazer parte do prompt geral." - New prompts/_house-style.md banning the 9 most common AI prose tells in both EN and PT-BR: 1. Em dashes as comma replacements (—) 2. Rule-of-three lists ("concrete, rigorous, and grounded") 3. Conjunctive openers ("Moreover", "Notably", "Ademais") 4. Superficial -ing analyses ("marking a shift", "destacando") 5. Inflated symbolism + AI vocab (tapestry, navigate, delve, underscore, robust, multifaceted, marco histórico, ...) 6. Negative parallelisms ("Not just X but Y") 7. Vague attribution ("Some scholars say...") 8. Summary closers ("In summary...", "Em suma...") 9. Hedging fluff ("It's important to note...") Verbatim chunk quotes are explicitly exempt; preserve as-is. - claude.ts callClaude() lazily loads _house-style.md once per process and PREPENDS it to every detective's system prompt: composedSystem = houseStyle + "---" + detective.systemPrompt This means all 7 detectives + future ones get the rules without any per-prompt change. (W4.2) User: "Quando entra em uma página da investigação não tem como voltar! UX terrível!" - New <BureauNav> sticky topbar with explicit "← home" + "🔎 bureau" buttons + clickable breadcrumb trail. Always visible at the top of every bureau page so the user can escape in one click. - Wired into /bureau, /h/[hypothesisId], /c/[slug], /jobs/[id]. Each page passes its sensible parent crumb (/bureau#hypotheses, /bureau#reports, /bureau#jobs). - Replaces the previous plain-text "disclosure.top / hypothesis / H-0004" line which had no visual affordance. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-24 16:27:58 +00:00
import { BureauNav } from "@/components/bureau-nav";
import { CaseLibraryBrowser } from "@/components/case-library-browser";
W5.1: enthusiast pivot — strip detective surfacing, magazine homepage User explicit: "1 bilhão de entusiastas pelo mundo ovni" — site is for the UFO-curious public, not for skeptics. The 8-detective scaffolding becomes invisible plumbing; the reader sees stories about what was observed. Reader-facing changes: New homepage (web/app/page.tsx) - SiteHeader: magazine-style top nav (no detective tiles) - HeroBanner: full-bleed editorial opener with declassified-page art background, display-serif headline, live stats row (122 docs, 2047 events, 1861 witnesses, 867 craft catalogued) - FeaturedCase: cover-story treatment of the most recent case_report, uses a real document page as hero image, links to /c/[slug] - PortalGrid: 6 thematic doorways into the archive — Sightings, Witnesses, Craft, Hot spots, Programs, Documents — each tile shows a real entity count and short editorial blurb - GreatestHits: top 9 most-cited events from the corpus (Kenneth Arnold 1947, Mantell 1948, …) as a magazine grid - Doc list kept but reframed as "the primary record" New sub-pages (5) - /sightings → events (2047), magazine grid - /witnesses → people (1861), compact table - /objects → uap_objects (867), magazine grid - /locations → locations (1757), compact table - /operations → organizations (1596), compact table - /documents → full doc list with thumbnails (mirrors homepage section for direct deep-link) All share <EntityListPage> shell with per-page i18n + JSON-LD ItemList Stripped detective surfacing - /jobs/[id]: "Sherlock Holmes / Dr. Watson" → "Investigation in progress" - chat-bubble: detective-named card → neutral "Investigação em andamento" - quick-launch: 7-kind detective dropdown → single "investigar um caso" input (kind=case_report hardcoded) - /bureau: rewritten as the case-file library (no artefact dumps) Typography + design - Fraunces variable serif loaded for display headings (`.font-display` class) - Gold-amber accent (#e0c080) unified as the brand colour - Asymmetric magazine grids (1+2+3 column, generous whitespace) - Hover micro-interactions (image scale on featured case, translateX on portal arrows) SEO + GEO - layout.tsx metadataBase + title.template + per-route Metadata exports - Organization JSON-LD on root layout - WebSite + SearchAction JSON-LD on homepage - CollectionPage + ItemList JSON-LD on every entity list page - openGraph + twitter cards, pt-BR primary + en-US alternate - ai:purpose meta tag for Generative Engine Optimization — declares the site as a citation-linked primary-source archive - robots: index + follow with large image preview The detectives themselves remain alive in the backend (runtime, DB, audit log), but the reader never sees "Holmes / Sun-Tzu / Watson" in the UI. The next phase will reorient case-writer to write as a single best-seller voice synthesising all the internal sources. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-24 17:09:46 +00:00
import { getLocale } from "@/components/locale-toggle";
import { loadCases } from "@/lib/cases";
W3.9: surface the Investigation Bureau on the homepage + /bureau hub Closes a UX gap the user surfaced: W3.5-3.8 built 8 detectives, 4 new URL endpoints (/jobs/[id], /h/[id], /c/[slug], /api/h/[id]/red-team) and a chat tool, but the homepage was unchanged — the bureau was invisible unless you knew the URL or asked the chat to invoke request_investigation. Homepage (web/app/page.tsx): - Title `▍ war.gov/ufo — Investigative Wiki` → `▍ The Disclosure Bureau` - Subtitle expanded from "Holmes · Poirot · Dupin · Locard" to all 8 detectives (Holmes · Locard · Dupin · Schneier · Poirot · Taleb · Tetlock · Case-Writer) - New `🔎 bureau` topbar link (gold, between graph/stats and batch) - BureauSnapshot inserted right after the header BureauSnapshot (web/components/bureau-snapshot.tsx) — server component: - 8 detective tiles with role labels (each in its tone color) - 6 clickable counters (evidence / hypotheses / contradictions / witnesses / outliers / case reports) — anchor to /bureau#section - 6 "recent artefacts" columns surfacing the last 3-4 of each kind: hypotheses with prior→posterior + band + ↳reviewed_by marker, contradictions with topic + resolution_status, evidence with Grade badge + verbatim quote, outliers with title + scope.kind, witness analyses with canonical_name + credibility + verdict, case reports with slug + link to /c/<slug> - "Recent jobs" strip linking to /jobs/[id] color-coded by status - Reports read from /data/ufo/case/reports/ via fs.readdir + stat, sorted by mtime — no DB round-trip needed for that section /bureau (web/app/bureau/page.tsx) — full hub: - Header with full counts - 7 sections (anchored to homepage counter links): Case reports, Hypotheses, Evidence, Contradictions, Outliers, Witnesses, Recent jobs table — each rendering up to 100 rows - Reports section parses frontmatter from each .md to surface topic + n_hypotheses + n_evidence on the card Runtime fixes batched in: - Poirot: coerce entity_pk via Number() — node-postgres returns BIGINT as string by default; writer's Number.isFinite() rejected it as "person_entity_pk required" (j-edgar-hoover retry path) - Tetlock: write_calibration rationale cap 600 → 1200 chars. Prompt still asks ≤ 600 but a 2× slack beats failing the job on honest analysis. Observed live: Tetlock emitted ~620 chars on H-0003 and the writer rejected the entire calibration. - Case-Writer: Promise.all of 5 queries × max_parallel=2 jobs demanded up to 10 connections against the investigator role's rolconnlimit=4 → "too many connections for role investigator". Sequentialized — the LLM call is the hot path, not these queries. Smoke results visible now on the homepage: - 3 hypotheses (H-0001/2/3) about green fireballs origin - 3 contradictions (R-0001/2/3) about color, geographic confinement, exclusive-green vs multicolored - 2 evidence cards (E-0002/3) Grade B - 3 outliers (G-0001/2/3) — including Taleb's deliberate meteor-shower-camouflage flag - 1 case report at /c/green-fireballs-sandia (Watson 13.4 KB, five-act narrative, fully cited) Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-24 01:41:28 +00:00
export const runtime = "nodejs";
export const dynamic = "force-dynamic";
export default async function BureauPage() {
W5.1: enthusiast pivot — strip detective surfacing, magazine homepage User explicit: "1 bilhão de entusiastas pelo mundo ovni" — site is for the UFO-curious public, not for skeptics. The 8-detective scaffolding becomes invisible plumbing; the reader sees stories about what was observed. Reader-facing changes: New homepage (web/app/page.tsx) - SiteHeader: magazine-style top nav (no detective tiles) - HeroBanner: full-bleed editorial opener with declassified-page art background, display-serif headline, live stats row (122 docs, 2047 events, 1861 witnesses, 867 craft catalogued) - FeaturedCase: cover-story treatment of the most recent case_report, uses a real document page as hero image, links to /c/[slug] - PortalGrid: 6 thematic doorways into the archive — Sightings, Witnesses, Craft, Hot spots, Programs, Documents — each tile shows a real entity count and short editorial blurb - GreatestHits: top 9 most-cited events from the corpus (Kenneth Arnold 1947, Mantell 1948, …) as a magazine grid - Doc list kept but reframed as "the primary record" New sub-pages (5) - /sightings → events (2047), magazine grid - /witnesses → people (1861), compact table - /objects → uap_objects (867), magazine grid - /locations → locations (1757), compact table - /operations → organizations (1596), compact table - /documents → full doc list with thumbnails (mirrors homepage section for direct deep-link) All share <EntityListPage> shell with per-page i18n + JSON-LD ItemList Stripped detective surfacing - /jobs/[id]: "Sherlock Holmes / Dr. Watson" → "Investigation in progress" - chat-bubble: detective-named card → neutral "Investigação em andamento" - quick-launch: 7-kind detective dropdown → single "investigar um caso" input (kind=case_report hardcoded) - /bureau: rewritten as the case-file library (no artefact dumps) Typography + design - Fraunces variable serif loaded for display headings (`.font-display` class) - Gold-amber accent (#e0c080) unified as the brand colour - Asymmetric magazine grids (1+2+3 column, generous whitespace) - Hover micro-interactions (image scale on featured case, translateX on portal arrows) SEO + GEO - layout.tsx metadataBase + title.template + per-route Metadata exports - Organization JSON-LD on root layout - WebSite + SearchAction JSON-LD on homepage - CollectionPage + ItemList JSON-LD on every entity list page - openGraph + twitter cards, pt-BR primary + en-US alternate - ai:purpose meta tag for Generative Engine Optimization — declares the site as a citation-linked primary-source archive - robots: index + follow with large image preview The detectives themselves remain alive in the backend (runtime, DB, audit log), but the reader never sees "Holmes / Sun-Tzu / Watson" in the UI. The next phase will reorient case-writer to write as a single best-seller voice synthesising all the internal sources. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-24 17:09:46 +00:00
const locale = (await getLocale()) === "en" ? "en" : "pt-br";
const cases = await loadCases(locale);
W3.9: surface the Investigation Bureau on the homepage + /bureau hub Closes a UX gap the user surfaced: W3.5-3.8 built 8 detectives, 4 new URL endpoints (/jobs/[id], /h/[id], /c/[slug], /api/h/[id]/red-team) and a chat tool, but the homepage was unchanged — the bureau was invisible unless you knew the URL or asked the chat to invoke request_investigation. Homepage (web/app/page.tsx): - Title `▍ war.gov/ufo — Investigative Wiki` → `▍ The Disclosure Bureau` - Subtitle expanded from "Holmes · Poirot · Dupin · Locard" to all 8 detectives (Holmes · Locard · Dupin · Schneier · Poirot · Taleb · Tetlock · Case-Writer) - New `🔎 bureau` topbar link (gold, between graph/stats and batch) - BureauSnapshot inserted right after the header BureauSnapshot (web/components/bureau-snapshot.tsx) — server component: - 8 detective tiles with role labels (each in its tone color) - 6 clickable counters (evidence / hypotheses / contradictions / witnesses / outliers / case reports) — anchor to /bureau#section - 6 "recent artefacts" columns surfacing the last 3-4 of each kind: hypotheses with prior→posterior + band + ↳reviewed_by marker, contradictions with topic + resolution_status, evidence with Grade badge + verbatim quote, outliers with title + scope.kind, witness analyses with canonical_name + credibility + verdict, case reports with slug + link to /c/<slug> - "Recent jobs" strip linking to /jobs/[id] color-coded by status - Reports read from /data/ufo/case/reports/ via fs.readdir + stat, sorted by mtime — no DB round-trip needed for that section /bureau (web/app/bureau/page.tsx) — full hub: - Header with full counts - 7 sections (anchored to homepage counter links): Case reports, Hypotheses, Evidence, Contradictions, Outliers, Witnesses, Recent jobs table — each rendering up to 100 rows - Reports section parses frontmatter from each .md to surface topic + n_hypotheses + n_evidence on the card Runtime fixes batched in: - Poirot: coerce entity_pk via Number() — node-postgres returns BIGINT as string by default; writer's Number.isFinite() rejected it as "person_entity_pk required" (j-edgar-hoover retry path) - Tetlock: write_calibration rationale cap 600 → 1200 chars. Prompt still asks ≤ 600 but a 2× slack beats failing the job on honest analysis. Observed live: Tetlock emitted ~620 chars on H-0003 and the writer rejected the entire calibration. - Case-Writer: Promise.all of 5 queries × max_parallel=2 jobs demanded up to 10 connections against the investigator role's rolconnlimit=4 → "too many connections for role investigator". Sequentialized — the LLM call is the hot path, not these queries. Smoke results visible now on the homepage: - 3 hypotheses (H-0001/2/3) about green fireballs origin - 3 contradictions (R-0001/2/3) about color, geographic confinement, exclusive-green vs multicolored - 2 evidence cards (E-0002/3) Grade B - 3 outliers (G-0001/2/3) — including Taleb's deliberate meteor-shower-camouflage flag - 1 case report at /c/green-fireballs-sandia (Watson 13.4 KB, five-act narrative, fully cited) Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-24 01:41:28 +00:00
return (
<div className="min-h-screen bg-[#0a0e1a] text-[#e7ecf3]">
W5.8: language toggle in the navbar (whole-site PT-BR / EN) User: "quero que o usuário possa escolher o idioma na navbar, e então leia o site todo em seu idioma." The locale infrastructure already existed (cookie + getLocale() + every page renders bilingual). The toggle only lived as a subtle floating control bottom-left. This surfaces it in the navbars where users expect it, and confirms whole-site language switching. locale-toggle-client.tsx - New variant="navbar": gold-amber pill matching the magazine theme (PT | EN, active = solid gold). Retro green variant kept for the floating fallback. - Guard: clicking the already-active language is a no-op. - aria-pressed on each button for a11y. locale-toggle.tsx: LocaleToggle gains variant passthrough. site-header.tsx: <LocaleToggle variant="navbar"> added to the main nav (homepage + /sightings /witnesses /objects /locations /operations /documents). bureau-nav.tsx: optional `locale` prop renders the same toggle pushed to the right (ml-auto) on /bureau, /c/[slug], /h/[id], /jobs/[id]. All four callers now pass locale (getLocale added to h + jobs pages). Cookie-based: switching sets `locale` cookie + router.refresh(); the server re-renders every component through getLocale(), so the entire page — headers, hero, summaries, case narratives, entity cards — flips language in one click. The floating bottom-left toggle stays as a global fallback for pages without a navbar (/d, /e, /search, /graph). Also this session: Sun-Tzu smoke succeeded on the refreshed CLAUDE_CODE_OAUTH_TOKEN — brief B-0001 written for the green fireballs ("bolas de fogo verdes confinadas ao corredor nuclear... cor espectral e trajetória quase horizontal que os próprios analistas consideraram irreconciliáveis com meteoros naturais", 3 pillars). Bulk entity enrichment resumed in the background. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-25 01:54:37 +00:00
<BureauNav locale={locale} crumbs={[{ label: locale === "en" ? "case files" : "casos" }]} />
<main id="main" className="mx-auto max-w-5xl px-4 md:px-8 py-10 md:py-14">
<header className="mb-8 md:mb-10">
<div className="text-[10px] font-mono uppercase tracking-[0.18em] text-[#e0c080] mb-3">
{locale === "en" ? "The case files" : "Os arquivos do caso"}
</div>
<h1 className="font-display text-3xl md:text-5xl font-semibold leading-[1.05] tracking-tight text-[#e7ecf3] mb-4">
{locale === "en"
? `${cases.length} declassified cases, narrated.`
: `${cases.length} casos desclassificados, narrados.`}
W5.1: enthusiast pivot — strip detective surfacing, magazine homepage User explicit: "1 bilhão de entusiastas pelo mundo ovni" — site is for the UFO-curious public, not for skeptics. The 8-detective scaffolding becomes invisible plumbing; the reader sees stories about what was observed. Reader-facing changes: New homepage (web/app/page.tsx) - SiteHeader: magazine-style top nav (no detective tiles) - HeroBanner: full-bleed editorial opener with declassified-page art background, display-serif headline, live stats row (122 docs, 2047 events, 1861 witnesses, 867 craft catalogued) - FeaturedCase: cover-story treatment of the most recent case_report, uses a real document page as hero image, links to /c/[slug] - PortalGrid: 6 thematic doorways into the archive — Sightings, Witnesses, Craft, Hot spots, Programs, Documents — each tile shows a real entity count and short editorial blurb - GreatestHits: top 9 most-cited events from the corpus (Kenneth Arnold 1947, Mantell 1948, …) as a magazine grid - Doc list kept but reframed as "the primary record" New sub-pages (5) - /sightings → events (2047), magazine grid - /witnesses → people (1861), compact table - /objects → uap_objects (867), magazine grid - /locations → locations (1757), compact table - /operations → organizations (1596), compact table - /documents → full doc list with thumbnails (mirrors homepage section for direct deep-link) All share <EntityListPage> shell with per-page i18n + JSON-LD ItemList Stripped detective surfacing - /jobs/[id]: "Sherlock Holmes / Dr. Watson" → "Investigation in progress" - chat-bubble: detective-named card → neutral "Investigação em andamento" - quick-launch: 7-kind detective dropdown → single "investigar um caso" input (kind=case_report hardcoded) - /bureau: rewritten as the case-file library (no artefact dumps) Typography + design - Fraunces variable serif loaded for display headings (`.font-display` class) - Gold-amber accent (#e0c080) unified as the brand colour - Asymmetric magazine grids (1+2+3 column, generous whitespace) - Hover micro-interactions (image scale on featured case, translateX on portal arrows) SEO + GEO - layout.tsx metadataBase + title.template + per-route Metadata exports - Organization JSON-LD on root layout - WebSite + SearchAction JSON-LD on homepage - CollectionPage + ItemList JSON-LD on every entity list page - openGraph + twitter cards, pt-BR primary + en-US alternate - ai:purpose meta tag for Generative Engine Optimization — declares the site as a citation-linked primary-source archive - robots: index + follow with large image preview The detectives themselves remain alive in the backend (runtime, DB, audit log), but the reader never sees "Holmes / Sun-Tzu / Watson" in the UI. The next phase will reorient case-writer to write as a single best-seller voice synthesising all the internal sources. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-24 17:09:46 +00:00
</h1>
<p className="text-[16px] md:text-[17px] text-[#cbd2dd] leading-relaxed font-light max-w-2xl">
W5.1: enthusiast pivot — strip detective surfacing, magazine homepage User explicit: "1 bilhão de entusiastas pelo mundo ovni" — site is for the UFO-curious public, not for skeptics. The 8-detective scaffolding becomes invisible plumbing; the reader sees stories about what was observed. Reader-facing changes: New homepage (web/app/page.tsx) - SiteHeader: magazine-style top nav (no detective tiles) - HeroBanner: full-bleed editorial opener with declassified-page art background, display-serif headline, live stats row (122 docs, 2047 events, 1861 witnesses, 867 craft catalogued) - FeaturedCase: cover-story treatment of the most recent case_report, uses a real document page as hero image, links to /c/[slug] - PortalGrid: 6 thematic doorways into the archive — Sightings, Witnesses, Craft, Hot spots, Programs, Documents — each tile shows a real entity count and short editorial blurb - GreatestHits: top 9 most-cited events from the corpus (Kenneth Arnold 1947, Mantell 1948, …) as a magazine grid - Doc list kept but reframed as "the primary record" New sub-pages (5) - /sightings → events (2047), magazine grid - /witnesses → people (1861), compact table - /objects → uap_objects (867), magazine grid - /locations → locations (1757), compact table - /operations → organizations (1596), compact table - /documents → full doc list with thumbnails (mirrors homepage section for direct deep-link) All share <EntityListPage> shell with per-page i18n + JSON-LD ItemList Stripped detective surfacing - /jobs/[id]: "Sherlock Holmes / Dr. Watson" → "Investigation in progress" - chat-bubble: detective-named card → neutral "Investigação em andamento" - quick-launch: 7-kind detective dropdown → single "investigar um caso" input (kind=case_report hardcoded) - /bureau: rewritten as the case-file library (no artefact dumps) Typography + design - Fraunces variable serif loaded for display headings (`.font-display` class) - Gold-amber accent (#e0c080) unified as the brand colour - Asymmetric magazine grids (1+2+3 column, generous whitespace) - Hover micro-interactions (image scale on featured case, translateX on portal arrows) SEO + GEO - layout.tsx metadataBase + title.template + per-route Metadata exports - Organization JSON-LD on root layout - WebSite + SearchAction JSON-LD on homepage - CollectionPage + ItemList JSON-LD on every entity list page - openGraph + twitter cards, pt-BR primary + en-US alternate - ai:purpose meta tag for Generative Engine Optimization — declares the site as a citation-linked primary-source archive - robots: index + follow with large image preview The detectives themselves remain alive in the backend (runtime, DB, audit log), but the reader never sees "Holmes / Sun-Tzu / Watson" in the UI. The next phase will reorient case-writer to write as a single best-seller voice synthesising all the internal sources. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-24 17:09:46 +00:00
{locale === "en"
? "Stories assembled from primary documents — memos, debriefs, intelligence reports — with every claim linked back to the source page."
: "Histórias montadas a partir de documentos primários — memorandos, debriefings, relatórios de inteligência — com cada afirmação vinculada à página-fonte."}
W3.9: surface the Investigation Bureau on the homepage + /bureau hub Closes a UX gap the user surfaced: W3.5-3.8 built 8 detectives, 4 new URL endpoints (/jobs/[id], /h/[id], /c/[slug], /api/h/[id]/red-team) and a chat tool, but the homepage was unchanged — the bureau was invisible unless you knew the URL or asked the chat to invoke request_investigation. Homepage (web/app/page.tsx): - Title `▍ war.gov/ufo — Investigative Wiki` → `▍ The Disclosure Bureau` - Subtitle expanded from "Holmes · Poirot · Dupin · Locard" to all 8 detectives (Holmes · Locard · Dupin · Schneier · Poirot · Taleb · Tetlock · Case-Writer) - New `🔎 bureau` topbar link (gold, between graph/stats and batch) - BureauSnapshot inserted right after the header BureauSnapshot (web/components/bureau-snapshot.tsx) — server component: - 8 detective tiles with role labels (each in its tone color) - 6 clickable counters (evidence / hypotheses / contradictions / witnesses / outliers / case reports) — anchor to /bureau#section - 6 "recent artefacts" columns surfacing the last 3-4 of each kind: hypotheses with prior→posterior + band + ↳reviewed_by marker, contradictions with topic + resolution_status, evidence with Grade badge + verbatim quote, outliers with title + scope.kind, witness analyses with canonical_name + credibility + verdict, case reports with slug + link to /c/<slug> - "Recent jobs" strip linking to /jobs/[id] color-coded by status - Reports read from /data/ufo/case/reports/ via fs.readdir + stat, sorted by mtime — no DB round-trip needed for that section /bureau (web/app/bureau/page.tsx) — full hub: - Header with full counts - 7 sections (anchored to homepage counter links): Case reports, Hypotheses, Evidence, Contradictions, Outliers, Witnesses, Recent jobs table — each rendering up to 100 rows - Reports section parses frontmatter from each .md to surface topic + n_hypotheses + n_evidence on the card Runtime fixes batched in: - Poirot: coerce entity_pk via Number() — node-postgres returns BIGINT as string by default; writer's Number.isFinite() rejected it as "person_entity_pk required" (j-edgar-hoover retry path) - Tetlock: write_calibration rationale cap 600 → 1200 chars. Prompt still asks ≤ 600 but a 2× slack beats failing the job on honest analysis. Observed live: Tetlock emitted ~620 chars on H-0003 and the writer rejected the entire calibration. - Case-Writer: Promise.all of 5 queries × max_parallel=2 jobs demanded up to 10 connections against the investigator role's rolconnlimit=4 → "too many connections for role investigator". Sequentialized — the LLM call is the hot path, not these queries. Smoke results visible now on the homepage: - 3 hypotheses (H-0001/2/3) about green fireballs origin - 3 contradictions (R-0001/2/3) about color, geographic confinement, exclusive-green vs multicolored - 2 evidence cards (E-0002/3) Grade B - 3 outliers (G-0001/2/3) — including Taleb's deliberate meteor-shower-camouflage flag - 1 case report at /c/green-fireballs-sandia (Watson 13.4 KB, five-act narrative, fully cited) Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-24 01:41:28 +00:00
</p>
</header>
<CaseLibraryBrowser locale={locale} cases={cases} />
</main>
W3.9: surface the Investigation Bureau on the homepage + /bureau hub Closes a UX gap the user surfaced: W3.5-3.8 built 8 detectives, 4 new URL endpoints (/jobs/[id], /h/[id], /c/[slug], /api/h/[id]/red-team) and a chat tool, but the homepage was unchanged — the bureau was invisible unless you knew the URL or asked the chat to invoke request_investigation. Homepage (web/app/page.tsx): - Title `▍ war.gov/ufo — Investigative Wiki` → `▍ The Disclosure Bureau` - Subtitle expanded from "Holmes · Poirot · Dupin · Locard" to all 8 detectives (Holmes · Locard · Dupin · Schneier · Poirot · Taleb · Tetlock · Case-Writer) - New `🔎 bureau` topbar link (gold, between graph/stats and batch) - BureauSnapshot inserted right after the header BureauSnapshot (web/components/bureau-snapshot.tsx) — server component: - 8 detective tiles with role labels (each in its tone color) - 6 clickable counters (evidence / hypotheses / contradictions / witnesses / outliers / case reports) — anchor to /bureau#section - 6 "recent artefacts" columns surfacing the last 3-4 of each kind: hypotheses with prior→posterior + band + ↳reviewed_by marker, contradictions with topic + resolution_status, evidence with Grade badge + verbatim quote, outliers with title + scope.kind, witness analyses with canonical_name + credibility + verdict, case reports with slug + link to /c/<slug> - "Recent jobs" strip linking to /jobs/[id] color-coded by status - Reports read from /data/ufo/case/reports/ via fs.readdir + stat, sorted by mtime — no DB round-trip needed for that section /bureau (web/app/bureau/page.tsx) — full hub: - Header with full counts - 7 sections (anchored to homepage counter links): Case reports, Hypotheses, Evidence, Contradictions, Outliers, Witnesses, Recent jobs table — each rendering up to 100 rows - Reports section parses frontmatter from each .md to surface topic + n_hypotheses + n_evidence on the card Runtime fixes batched in: - Poirot: coerce entity_pk via Number() — node-postgres returns BIGINT as string by default; writer's Number.isFinite() rejected it as "person_entity_pk required" (j-edgar-hoover retry path) - Tetlock: write_calibration rationale cap 600 → 1200 chars. Prompt still asks ≤ 600 but a 2× slack beats failing the job on honest analysis. Observed live: Tetlock emitted ~620 chars on H-0003 and the writer rejected the entire calibration. - Case-Writer: Promise.all of 5 queries × max_parallel=2 jobs demanded up to 10 connections against the investigator role's rolconnlimit=4 → "too many connections for role investigator". Sequentialized — the LLM call is the hot path, not these queries. Smoke results visible now on the homepage: - 3 hypotheses (H-0001/2/3) about green fireballs origin - 3 contradictions (R-0001/2/3) about color, geographic confinement, exclusive-green vs multicolored - 2 evidence cards (E-0002/3) Grade B - 3 outliers (G-0001/2/3) — including Taleb's deliberate meteor-shower-camouflage flag - 1 case report at /c/green-fireballs-sandia (Watson 13.4 KB, five-act narrative, fully cited) Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-24 01:41:28 +00:00
</div>
);
}