Skip to content

fix(client-vue): green the FeedIntelligence tests - #402

Merged
mdheller merged 8 commits into
masterfrom
fix/feed-intelligence-tests
Jul 5, 2026
Merged

fix(client-vue): green the FeedIntelligence tests#402
mdheller merged 8 commits into
masterfrom
fix/feed-intelligence-tests

Conversation

@mdheller

@mdheller mdheller commented Jul 2, 2026

Copy link
Copy Markdown
Member

What

Fixes the two pre-existing FeedIntelligence test failures on master (surfaced while shipping the person-graph view #401).

  • FeedIntelligenceAdapters — the test requires every adapter.disabledReason to 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-vue suite 174/174 (was 172/174); vue-tsc typecheck clean.

Two-file change; no behavior change beyond rendering per-item claims in the ticker rail.

mdheller added 8 commits July 1, 2026 23:53
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
@mdheller
mdheller merged commit 177b0c7 into master Jul 5, 2026
12 of 14 checks passed
@mdheller
mdheller deleted the fix/feed-intelligence-tests branch July 5, 2026 20:03
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant