fix(client-vue): green the FeedIntelligence tests - #402
Merged
Conversation
Two pre-existing failures on master: - FeedIntelligenceAdapters: every adapter.disabledReason must contain 'No live', but the BearBrowser one read 'No native browser bridge...'. Aligned it to 'No live native browser bridge...'. - FeedIntelligence.smoke: expects the BearBrowser handoff fixture's claims (browser-handoff-is-local-fixture / capture-is-not-publication) in the stream. Claims only rendered for the selected item (the ticker); now the ticker rail (which iterates all items) renders each item's claims, surfacing the handoff's. Full client-vue suite now 174/174 (was 172/174); typecheck clean.
…tion
Scoreboard T-18 + T-19 — see WORKSPACE_ONE_SCOREBOARD.md for the full deltas.
T-18 — Mail compose/reply:
- mail.ts store gains replyToCurrent/sendNew/draftReply over the existing
mailApi contract; Compose modal, functional reply bar, AI-draft button,
Escape/C keyboard chords.
- First app-vue test suite: Vitest + @vue/test-utils + happy-dom, 10/10.
T-19 — Firebase → Socbase (Supabase), full swap not just auth:
- Shell auth (app-vue): firebase.ts → socbase.ts, stores/auth.ts rewired to
Supabase's session/OAuth API.
- API middleware (server): verifies via socbaseAdmin.auth.getUser().
- Firestore → Postgres: db/socbase-schema.sql (profiles/builds/devices/
device_claims/boot_proofs/notification_outbox); every Firestore call in
events.ts, bootServer.ts, builds-route.ts, fleet-route.ts rewritten.
Quoted camelCase columns preserve every existing JSON field name — zero
changes needed in contracts.ts validators, the Vue frontend, or the
nlboot device wire contract. Added .eq("uid", ...) ownership filters
everywhere Firestore's nested paths used to provide that implicitly.
- GCS/GCP creds: buildOrchestrator.ts/bootServer.ts off firebase-admin onto
google-auth-library + @google-cloud/storage directly (storage stays on
GCS — only the SDK changed).
- firebase/firebase-admin fully removed from both package.json's.
Verified: typecheck + test + build clean on both app-vue and server (server's
7 pre-existing baseline errors, all in untouched files, unchanged).
Not yet integration-tested against a live Supabase/Socbase instance — the
deploy side (prophet-platform, self-hosted GoTrue+PostgREST) lands separately.
…410) Converges the SocioProphet client-vue cockpit into a complete, keyboard-first product where every nav cell is a real, working, fixture-backed surface. Highlights: - Two-axis cockpit (DOMAIN mega-menu x CAPABILITY rail), ported from Will's reference shell, dark calm-token design. - Every DOMAIN sub-domain lands on its flagship surface (News, Markets, Economy, People x2, Law, Weather, Maps); Law/People filter their corpus per sub-domain. - CAPABILITY rail fully wired: Operator Dashboard (home) + 5 capabilities reusing existing surfaces + 5 new (Algorithmic Trading, NLP/Information Extraction, Experiments & Simulations, Behavioral Analytics, Mobile & App Dev). - Maps & Analytics trio via one Analytics Studio charting existing fixtures. - Universal Cmd-K command palette, Quake operator terminal, live Noetica chat (/api/chat), full keyboard navigation, a11y labels. - Agent-machine cockpit (8 live /api/* surfaces), capture-on-close research list. - 193/193 tests, tsc + build clean. Verified: zero nav cells hit a placeholder.
…age handoff consoles (#412) * feat(client-vue): Markets — real per-asset-class slices per sub-domain Cockpit depth (Michael: make shared boards real slices). The 8 Capital & Markets sub-domains were one shared watchlist under a lens; now each renders its own asset class from a real instrument universe: indices-funds → indices + index ETFs equities-preferreds → equities + prefs debt-fixed-income → rates + bond funds options-derivatives → futures + options currency-fx → FX pairs crypto-digital → majors real-assets → commodities + REIT/agri alternative-investments → hedge/PC/MFut marketsFixture: expanded AssetClass (11), ~60 instruments across all classes, SUBDOMAIN_CLASSES map + instrumentsForPath(); indices/watchlist derived (palette + dashboard unchanged). MarketMonitor filters by the active sub-domain, adapts its class-filter chips (hidden when a sub-domain has one class), resets selection on nav; tape + ?sym deep-link still span the full universe. marketsDepth.test.ts (slicing per sub-domain, full coverage, fallback, crypto-renders-not-equities). Suite 197/197, tsc + build clean. * feat(client-vue): Economy — real per-sub-domain KPI sets Cockpit depth, domain 2/4. The 10 Economy & Industry sub-domains were one shared indicator strip; now each production-stage sub-domain has its own authored KPI set (5 each): macro (GDP/CPI/unemployment…), micro (margins/HHI/capacity), labor (payrolls/earnings/JOLTS), industry-commerce, farming-agriculture, mining- extraction, processing-refinement, manufacturing-assembly, technology-information (semis/DC-capex/cloud), logistics-transport (freight/containers/rail). economyFixture: EcoGroup tag on Indicator + ~55 indicators + SUBDOMAIN_GROUP map + indicatorsForPath() (defaults macro). indicators export stays macro-first so dashboard/palette defaults are unchanged. EconomySectorBoard KPI strip filters by the active sub-domain and re-anchors selection on nav; the sector-breadth grid stays as shared market context. economyDepth.test.ts (group slicing, full coverage, macro fallback, labor-renders-not-macro). Suite 201/201, tsc + build clean. * feat(client-vue): News — real Recent + Calendar sub-domain views Cockpit depth, domain 3/4. The News & Events sub-domains were one shared feed under a lens; now each is a real view: /news → the magazine feed (unchanged) /news/recent → Recent Events, recency-ordered /news/calendar → Event Calendar, an agenda grouped by day (sticky day headers, time + title + source), reader opens as overlay Spread the fixture timestamps across 5 days (2026-06-29 → 07-03) so the calendar and recency views are meaningful. mode derived from route.path; items sort by publishedAt for recent/calendar; byDay grouping for the agenda; the view toggle hides in calendar mode. newsDepth.test.ts (calendar day-grouping + date range, recent newest-first, default magazine). Suite 204/204, tsc + build clean. Remaining shared-board domain: Weather (climate-environment / natural-resources need new data models). * feat(client-vue): supply-chain spine — first-class cross-domain integration Answers the ask: link Markets/Economy (and Weather/News) into the graph, map, and digital-twin models via a shared supply-chain entity graph. The supply chain is its OWN model that integrates with — but isn't — HellGraph / GAIA / economic- prophet. - supplyChainFixture: nodes (commodity/facility/port/route/company) each carrying a HellGraph ref (hg:…), geo (lat/lon for GAIA), a twin handle, and cross-domain tags (market symbols, economy sectors/indicators, weather regions, news keywords) + directed edges. Two chains end-to-end: Copper (mine→smelter→port→ route→buyer) and Semiconductors (silicon→fab→port→route→OEM). Resolvers: nodesForChain/edgesForChain/nodesForMarketSymbol/nodesForSector/nodesForIndicator. - SupplyChainMap surface (/analytics/supply-chain, in the Maps & Analytics menu): chain flow of nodes + node detail with FIRST-CLASS outbound links — Open in Graph (/knowledge/graph?root=<hg id>, KnowledgeGraph now re-roots on ?root), Show on Map (/map?focus=lat,lon), Digital Twin (/capability/economic-prophet), plus cross-domain chips into Markets / Economy / News / Weather. - Reciprocal: Market Monitor + Economy board detail panels now show a Supply chain link when the instrument/sector/indicator sits on a modeled chain (COPPER, NVDA, Materials, semis…) → /analytics/supply-chain?node=. Fixture-backed; identities are shaped so live HellGraph + GAIA + economic-prophet resolve the same nodes. supplyChain.test (resolvers, surface, graph re-root, Markets→chain reciprocal). Suite 208/208, tsc + build clean. Stage 1 of the graph/twin integration; live wiring is next. * feat(client-vue): close the supply-chain loop across Weather + News Extends the supply-chain spine so all four domains Michael named — supply chains, logistics, weather, news — link both ways, without touching HellGraph (the graph link stays a clean deep-link seam; the page-index-RAG-over-HellGraph spec another agent owns resolves the hg: identities). - weatherFixture: added 3 supply-chain-relevant regions (Antofagasta CL, Hsinchu/ Taipei TW, Shanghai CN) so weather ties to the chains; tagged chain nodes with their weather regions (routes → Singapore chokepoint). - Resolvers nodesForWeatherRegion + nodesForNews (keyword join on title/entities). - Reciprocal links: Weather region detail shows 'Supply-chain exposure' when a mine/fab/port sits in that region; News reader shows 'Supply chain' when the article touches a chain node. Both → /analytics/supply-chain?node=. Now: Markets/Economy/Weather/News ⇄ Supply Chain ⇄ Graph/Map/Twin. supplyChain.test extended (weather-region + news resolvers). 209/209, tsc + build clean. * feat(client-vue): Layer 0 — Land & Natural Resources (build from the ground up) Per Michael: build the economic model from the ground up — natural resources + land first, then up through commodities/markets/mercantilism. This lays the BASE layer under the supply-chain spine. - landResourceFixture: resource endowments (land/soil/mineral/water/energy/ forest/fishery) with reserves, flow, grade, renewability, depletion horizon, and TENURE/rights (sovereign/private/concession/commons/contested) — each geo-anchored + HellGraph ref (hg:) + twin handle. 12 endowments incl. the resource base under the copper + semis chains (Escondida orebody, Atacama water — the binding constraint, Atacama solar, high-purity quartz, Hsinchu water, Taiwan energy, rare earths) + foundational commons (grain belt, Ogallala aquifer, boreal forest, North Sea wind, Humboldt fishery). - LandResources surface at /weather/natural-resources (also makes the Weather domain's Natural Resources sub-domain real): endowments by kind, detail with reserves/renewability/tenure + 'value chain up' (resource → extraction node → commodity market) + Open-in-Graph / Map / Twin + economy links. - Bidirectional: Supply Chain node detail now shows its 'Resource base' (the endowments a facility draws on) → /weather/natural-resources. Stack now: Land & Resources (L0) → Supply Chain / extraction (L1) → Markets (L2) ⇄ Graph/Map/Twin. Mercantilism (L3) is next up. landResources.test (resolvers, value-chain-up routing, resource-base down-link). 212/212, tsc + build clean. Graph link stays a clean hg: deep-link seam — no HellGraph calls. * feat(client-vue): human spine — labor/capital/supply across every layer Per Michael: across every layer there must be a notion of human labor and human networks, whether capital, labor, or supply. Built as a CROSS-CUTTING spine that intersects every economic layer, not a screen of its own. - laborFixture: human networks tagged role capital|labor|supply, each binding to entities at ANY layer (resource endowment L0 / extraction facility+route L1 / market symbol+sector L2) and back to People. 11 networks: labor (Atacama miners, fab technicians, longshore unions, grain coops, fishery communities), capital (copper syndicate, semis capital, sovereign resource fund), supply (freight operators, equipment suppliers, water utilities) — with headcount, skills, wage index, organized %, and peopleRefs. - HumanNetworks.vue: one reusable component (networksForEntity(entityId)) that renders the attached capital/labor/supply networks and links to the People domain; renders nothing when nothing attaches, so it drops safely into any layer. - Wired into every layer's detail: Land & Resources (L0), Supply Chain (L1), Market Monitor + Economy board (L2). So the human dimension is present whether you're looking at a water right, a mine, a copper contract, or a sector. laborSpine.test (cross-layer attachment, all three roles, People link, empty-safe). 215/215, tsc + build clean. hg: refs stay a clean seam — no HellGraph calls. * feat(client-vue): Agentic Operating System console (VA capture, built in) First of the 5 specs Michael handed off — the VA OIT Portfolio Operating System, generalized as the agentic OS OVER the stack. Agent pods pursue objectives across the estate under a governed capture cadence, delta-control SLAs, shared libraries, and a 12-dimension readiness scorecard. - agenticOsFixture: the object model (Opportunity, AgentPod ×9, SharedLibrary ×7, ReadinessScore 12-dim/0-36, CaptureCadence W0-W8, DeltaControl) — the draft of the canonical sourceos-spec contract; typed so the schema maps 1:1. 8 objectives across Health/Digital-Platforms/Cyber/Infra/CX/Network, each anchored to real estate repos + shared libraries. - AgenticOS surface at /agentic-os (Operating System group in the Agent Cockpit): objective portfolio (RAG + readiness%), capture-cadence strip (current week), objective detail with readiness scorecard, agent-pod coverage, shared libraries, reuse-repos → estate graph, and delta control. Cockpit side of Stage 1; the sourceos-spec contract (Opportunity/AgentPod/…, and AgentPod fills the existing urn:srcos:agent-pod: ref in AgentMachineReceipt) lands next as a separate platform PR. agenticOs.test. 218/218, tsc + build clean. * fix(client-vue): rework News into Lobsters × Feedly (was an email inbox) The /news surface read like an email inbox — read/unread + recency lists, magazine covers, a ticker — with none of the community layer. Re-center it on the Lobsters model over the existing Feedly source model, keeping the source rail + reader: - Score-ranked story stream (Hot / Newest / Active) instead of unread/recency. - Community layer per story: upvote + score, slashtag chips, submitter + verified hat, comment count, and a truth/quality signal derived from the membrane decision. New presentation-only derive in feed-intelligence/community.ts — the shared FeedItem contract is untouched; tags come from topicScope, quality from membraneDecision. - SP hard rule honored: stories are never downvoted (upvote/tag/flag-with-reason only); the reason-required downvote (off-topic/incorrect/me-too/troll/spam) lives on comments in the reader's discussion. - Event Calendar lens retained as a by-day view. Verify: vue-tsc clean; vite build ok; vitest 217/218 (the one fail is the pre-existing research/localStorage env test, unrelated). newsDepth.test.ts updated to the corrected design. * feat(client-vue): Marketplace — governed triparty netting (Stage 2 console) Cockpit surface for the governed-triparty marketplace (Stage 2 of the 5 specs). Netting cells that clear trades by coupling value + proof + authority + disclosure, disposed by policy not confidence. - marketplaceFixture: netting cells mirroring the sourceos-spec NettingCell / TripartyBundle contract — 3 legs each (A/B counterparties, C clearing/verifier with value/authority/proof kept distinct), lifecycle stage, truth class (PROVEN⊐ATTESTED⊐INFERRED⊐REPUTED), admissibility lattice (evidence⊇admit⊇ release⊇export), and typed proof-carrying bundles (intent→…→export). 4 cells across the lifecycle, each clearing a supply-chain trade. - Marketplace surface at /marketplace (Marketplace group in the Agent Cockpit): cell list + detail with the three legs, lifecycle progress, admissibility lattice, bundles (attested = carries a Truth Record), and a cross-link into the supply chain (a cell clears a chain node). Pairs with sourceos-spec#192 (the NettingCell/TripartyBundle contract). marketplace.test. Suite green. * feat(client-vue): Labor Market — request-centric (Stage 3 console) Cockpit surface for the Labor Network Charter (Stage 3). Reframes the human/labor spine as a request+fulfillment market: labor = request + response + evidence + fulfillment + trust, NOT identity + feed + attention. - laborMarketFixture: structured requests (review/RFP/role/apprenticeship) each mirroring the sourceos-spec LaborRequest/LaborResponse/FitScore/LaborAward/ TrustEvent contract — compensation transparency, per-response fit rubric (request↔response only), award + milestones, trust events. Requesters/responders reference the human-spine networks + People. - LaborMarket surface at /people/labor-market (People & Society menu): request list + detail with objective/outcome, transparent compensation, responses each scored by a fit rubric (NEVER a global human-worth score), award/work-ledger, and fulfillment-based trust events. Responders link into People. Pairs with sourceos-spec#193. laborMarket.test (fit is request-scoped, no global score; compensation transparency). Suite 224. * feat(client-vue): supply-chain operational-risk lens (Stage 4, BIAN/FICO on the spine) Adds a bank-style operational-risk lens over the supply-chain spine, mirroring the sourceos-spec RiskNode/RiskPath/RiskCluster contract: - per-node inherent factors (K/P/E/O/C/V) -> inherent score, controls -> residual score + rating, with control gaps - chain-level accumulated path risk + tolerance, and common-mode/HHI cluster risk - risk dot on each flow node + an Operational-risk detail block (inherent vs residual bars, six inherent factors, control gaps) + chain path/common-mode line Node risk stays an overlay keyed by node id; no HellGraph API calls (hg: refs remain opaque deep-link seams). 4 tests; full suite 228 green, build clean.
#413) Surfaces the value-driver-tree model in the cockpit under Economy & Industry (/economy/value-drivers) — the ecosystem side of the economic-prophet `--mode vdt` engine. Runs the SAME model in the UI (src/data/vdtFixture.ts mirrors the engine's tensor + KPI-lever math): - Driver x capability-domain value-attribution heatmap (36 cells, weights sum to 100% of EV; KPI-lever cells outlined). - Uplift-by-driver bars + KPI-lever cards (delta, polarity, $ contribution). - Headline metrics: EV baseline, projected uplift (+$10.20M / +1.02%), projected EV. GICS45 Software & Platforms on a $1B synthetic baseline; the fixture's computeVdt matches the canonical engine within rounding (test asserts it). Wired into main.ts route + cockpitNav + domainRoutes. Verify: vue-tsc clean; vite build ok; vitest 229/230 (the one fail is the pre-existing research/localStorage env test, unrelated).
…nce page (wires to dashboard-bff) (#403) Lands the #2 intelligence-superiority benchmark in the REAL current UI — the Vue 3 client-vue app — after verifying the design dossier's "Next.js shell" premise was wrong (no Next.js app exists anywhere in the monorepo; the real UI is this Vue app, and ProfessionalIntelligence.vue already existed, fixture-fed). No new framework scaffolded; extends what's there, per the dossier's own "read the code first / don't reinvent". - src/api/intelligenceSuperiorityApi.ts: API client for dashboard-bff GET /v1/intelligence-superiority, mirroring the personGraphApi.ts/gaiaMap.ts pattern exactly (env base VITE_DASHBOARD_BFF_BASE || '/api', getJson wrapper, *WithFallback returning a deterministic fixture with mode:'live'|'fixture' so the SPA renders even when the backend is absent). Fixture = the same honest numbers the producer emits. - ProfessionalIntelligence.vue: a new "Comparative intelligence benchmark" section loaded onMounted, kept SEPARATE from the existing fixture workstream-completion state. Renders per-metric ours-vs-cited with the honesty carried to the DOM: reproduced facts badged 'reproduced', cited badged 'cited', a live/fixture ModeBadge, the headline claim (MMLU-STEM verified-compute vs baseline +10pp p=0.0002) and the provenance disclaimer. head-to-head badge shows ONLY where comparison_valid — never today (disjoint metrics), so no false cross-provider bar renders. Reuses the existing ModeBadge component. vue-tsc typecheck clean; 4 smoke tests pass (fixture mode, live mode, honesty invariants in the DOM, no false head-to-head). The 2 pre-existing FeedIntelligence test failures are unrelated (confirmed identical with these changes stashed). Branch feat/pi-live-comparative-benchmark.
…orm UI surface (#401) Surfaces the person-graph in the canonical SPA, the integration target for prophet-workspace + prophet-platform. Mirrors the gaiaMap.ts/MapPage pattern: env-configured API base + getJson + a *WithFallback that renders a deterministic fixture when the backend is absent (fixture mode). - src/api/personGraphApi.ts: fetchPersonGraphSnapshot(+WithFallback) against /api/person-graph/snapshot (proxied to the memory-mesh workspace_ingestion runtime); reuses the SPA's KG node/edge/summary types; demo fixture = the person-graph the runtime produces (Self + Mom/Jamie/Acme/practice/setlist, every element carrying its workspace-source provenance). - src/pages/PersonGraph.vue: Self-centred ego SVG + entities grouped by kind + a provenance ledger; BoundaryNotice/RouteStatePanel show live-vs-fixture mode. - route /person-graph in main.ts. typecheck clean, build clean, 159/161 client-vue tests pass (the 2 failures are pre-existing FeedIntelligence tests, unrelated — verified failing on clean tree).
…o integ/feed-intel-tests # Conflicts: # socioprophet-web/client-vue/src/features/feed-intelligence/adapters.ts
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
What
Fixes the two pre-existing
FeedIntelligencetest failures onmaster(surfaced while shipping the person-graph view #401).FeedIntelligenceAdapters— the test requires everyadapter.disabledReasonto contain"No live"; the four others do, but the BearBrowser adapter read"No native browser bridge…". Aligned to"No live native browser bridge…".FeedIntelligence.smoke— expects the BearBrowser handoff fixture's claims (browser-handoff-is-local-fixture,capture-is-not-publication) to appear in the stream. Claims only rendered for the selected item (the ticker, by default), so the handoff's never showed. The ticker rail iterates all items — it now renders each item's claims, surfacing the handoff's.Verification
Full
client-vuesuite 174/174 (was 172/174);vue-tsctypecheck clean.Two-file change; no behavior change beyond rendering per-item claims in the ticker rail.