2026-05-17 → 2026-06-16 · LIFE Research · 1,014 commits across 14 repos · proposal only
Shipped, distinct from the team's existing process tasks. Several overlap AMA tasks still marked TO DO — those should be updated/closed, not duplicated (see each card's dedup note).
Fixed and shipped the Data Lab training-export pipeline (life-app packages/server/src/data-lab/exports). Adopted capture-by-default eligibility (select→SFT, edit→corrected SFT, rank→DPO pair, commit→trajectory; manual gate only for the exclude case). A 2026-06-06 format audit found computeEligibility had zero callers (every export returned 0 rows) and non-conformant SFT/DPO formats; fixed in life-app #73 + review-ui #103 (merged+deployed 2026-06-06). SFT now splits OpenAI vs Anthropic shapes, DPO is TRL conversational, provenance to aligned metadata sidecars.
Modernized golden-prompt-tests: routed the Wisdom runner + 22 judge rubrics through the hub Models Registry pointer and unified prompt registry (resolver loaders, prompts-pointer.json, promote-prompt workflow), subsumed the standalone results-api, dropped the rubrics D1 table, and folded the guided tour into the benchmark report. Also recovered the CANONICAL report generator (generate_report.py) from a stash-only state back into version control (PR #17), resolving long-standing confusion about which generator produces deployed reports.
Closed a live authz hole by enforcing golden_questions permissions server-side, added a machine-auth path (X-Service-Token + X-On-Behalf-Of-Email, lowercased on-behalf) so the Slack bot/services can call it, subsumed the old golden-bot into golden-questions-manager (migrating its prompt), wired question/tag/export telemetry to the hub action log, and resolved all 47 open Dependabot alerts.
Renamed 'Wheel of Life Benchmark' → SOME across code/infra/GitHub/subdomain/hub registry with a legacy-redirect worker, migrated it to Cloudflare Workers via OpenNext, replaced Supabase Auth with Cloudflare Access + hub identity (server-gated /api/data JSON-RPC routes, ES256 JWKS), removed the in-app wiki, fixed a javascript: URL XSS + PostgREST .or() injection, added guided tours, and connected the resource-ai-suggest prompt to the registry.
Re-platformed the Data Lab review-ui so the browser no longer talks to Supabase directly: all data flows through typed CF Pages Functions /api routes with CF Access JWT verification, hub identity/role resolution, service-token-or-JWT dual-mode reviewer auth, same-origin SSE, and an RLS audit. Reviewers are now keyed by email (auth.users FKs dropped). Large multi-day effort (~30 commits 2026-05-22) underpinning every later Data Lab feature.
Extracted the judge orchestrator out of life-server into its own Railway service (data-lab-evaluator) so bursty multi-minute judge fan-out no longer shares an event loop / crash surface / deploy unit with steady-state Wisdom chat; routes via OpenRouter and the hub Models Registry pointer; the review-ui frontend dual-targets life-server (non-judge) + evaluator (judge). Built live per-judge progress on the Judge Panel (SSE), a per-candidate 'Judge candidate' button, per-scenario suggested-judge surfacing, and KB-vendored judge rubrics, plus verdict-JSON parsing, scenario UUID→public-id routing, and cost-guard/health fixes.
Built, deployed, and e2e-verified the Predictive-Profile Testbed across life-app (#69/#70) and review-ui (#98), live in the Data Lab: an LLM reaction-predictor over 6 seeded personas (profile-conditioned vs no-profile baseline vs opt-in matched_wrong), three-layer persona leakage discipline (hidden disposition → simulated history → derived inferred-profile snapshot), reaction prediction/label/target schema (RLS service-role-only), persona chip, auto-predict-every-turn toggle, and a non-circular auto-labeler that reads the committed reaction text independently of the prediction. The predict→label→reveal loop works e2e; the individuation verdict awaits a labeled campaign (scorer reports INSUFFICIENT DATA until ≥4 labeled personas).
Ran a 34-agent audit of the whole predictive-profiling program; 20/20 critical-high findings adversarially confirmed (committed testbed report was a synthetic 'INDIVIDUATION CONFIRMED +3.83 bits' FIXTURE, predict-after-reveal contamination, judge-anchored labels, degenerate n=4 verdict). Fionn then executed the redesign (life-app PR #79): testbed re-pointed as a reviewer-facing prediction display, synthetic verdict + fixture reports deleted, L1 next-token prediction dropped, profiler prompt fixed to embed the real transcript, null-bootstrap 400 fixed, scorer provenance gate added.
Implemented the unified prompt registry: every runtime prompt across LIFE Labs resolves through a shared resolver with git-tracked pointers + bundled fallback + hash verification, surfaced at hub.life-labs.dev/admin/prompts. Audited every hub surface, wired the gaps (7 PRs), promoted wisdom-system v0.8.3 to prod, and backfilled all 24 new registry rows hash-verified. Solves invisible prompt drift and the broken Docker rubric loader; underpins AMA-30 (prompt version history).
Built the KB auto-ingestion engineering: a bytes-first drag-drop upload endpoint, a unified publish path with a universal classifier + secret-scan review gate, a quarantine/review queue surfaced in kb-reader, a PDF/doc→markdown conversion worker, an env-gated fail-closed /api/ingest/event push endpoint, and upload/ingest telemetry to the hub. This is the completed build behind the OPS ingestion intake tasks; drag-drop + classifier gate are live but Drive/Slack auto-ingest is inert end-to-end (Drive SA org-blocked, Slack token unset).
Built and activated a unified action-events pipeline so the hub answers 'what has everyone done, including uploads' across all connected apps. Extended D1 action_events with category/actor_type, added a server-to-server ingest sink (X-Service-Token) + browser logAction sink, metadata-only enforcement (ALLOWED_ACTION_KEYS + PII sink), a hub.activity_read permission, per-category retention (90d–1095d), and an /admin/activity viewer with an Uploads filter. All ~10 app PRs merged and deployed; backend verified live e2e. Meditation/end-user life-app events excluded (GDPR Art.9).
Designed and shipped a hybrid role-bucket + per-user-grant permission system extending the hub perms.ts/BUCKET_DEFAULTS machinery (no parallel system, no schema migration). Added a datalab_curator bucket for senior reviewers (Alex Shatra), hub-admin read/write split, KB authorship/activity gates, and golden-questions enforcement, with HMAC identity signing active end-to-end. ~30 security holes closed. Triggered by Alex hitting a 403 on the Data Lab Personas page.
A launchd monitor (com.life.infra-autofix) polls CI, Railway and Supabase every 30 min, triages issues with a cheaper model (sonnet) and dispatches an opus fixer agent to auto-resolve them, and runs an automated security review on every migration/diff before ship. Live LIFE operational automation keeping the estate green without hand-fixing; currently invisible to the team. Classifier-gated so Fionn must arm/allowlist it.
Cross-repo ops/security-posture change (2026-06-10): every GitHub-Actions deploy-on-push workflow deleted and the life-server Railway auto-trigger disabled, so merging a PR now deploys nothing — production is reached only via explicit CLI deploy (/fix-and-deploy). Closes an accidental-deploy blast-radius hole and establishes a clean two-stage local→prod model across ~7 repos. Audited to zero auto paths.
Built the Research Radar v1→v3 backend in kb-service: radar tables + research corpus + paper identity, OpenAlex ingest, a weekly 3-signal ranking job with relevance decay + quiet-week floor, an OpenRouter LLM ranker, reader API endpoints with per-user feedback (important/dismiss/read), an inbox-first research.html reader in life-hub, send-to-KB full-text ingestion, and a weekly Slack digest. The weekly cron cycle (daily ingest → rank Mon → digest Mon) is provisioned and live.
Shipped a transcription app at hub.life-labs.dev/transcripts: drag-drop audio upload → provider-agnostic transcribe engine (AssemblyAI universal-3-pro EU, chosen via a 14-discriminator A/B over ElevenLabs/Speechmatics/Voxtral/Whisper) → markdown with speaker turns → published KB doc (content_type=meeting-transcript), plus MediaRecorder voice enrollment via Speechmatics. Privacy: Dublin endpoint, auto no-training, audio+transcript deleted after fetch. This is the non-Zoom upload path of the OPS-74 capability.
The substantial security/integration work behind the now-live LIFE-bot (OPS-83): a three-layer auth chain that lets the bot read the KB as the asking user — per-bot service-account bearer mint, a dedicated CF Access service token on every kb-service call, and per-user permission forwarding via X-On-Behalf-Of-Email so fine-grained gates (e.g. research_radar.view) still apply — plus a parallel fail-closed machine-auth path to golden-questions-manager (constant-time X-Service-Token + lowercased on-behalf) and a surface-based KB ceiling (confidential only in DMs). All four data sources (KB, research radar, benchmark, golden questions) verified e2e through Slack by 2026-06-12. Logging this updates OPS-83 with the shipped-impl record; the bot itself is already tracked there.
Built out kb-service into the production Company KB backbone and migrated it off the Railway Postgres plugin onto Supabase (kb-prod, eu-central-1) on 2026-05-22, with KB_AUTH_MODE=hub deriving all identity from hub.life-labs.dev, CF Access service-token support, and corpus tagging (company/contemplative/benchmark). Also built the agent-facing access layer: an MCP-over-HTTPS endpoint at kb.life-labs.dev/mcp with DB-backed OAuth (RFC 7591 Dynamic Client Registration, client_credentials grant, service_accounts table), per-request bearer-slug resolution via the hub, tool filtering by bearer scopes, and a Phase-1 latency/cache overhaul. Registered as the life-kb MCP server. None of this engineering was tracked in Jira; OPS-87/88/89/90/91 cover KB taxonomy/formatting/content as an org process, not the platform build.
Shipped a Vite + React 19 reader/editor SPA for the Company KB at kb-reader.life-labs.dev (2026-05-25), replacing the basic Go+htmx UI: sidebar/home, reader with markdown pipeline+outline, split-pane editor with conflict UX, cmd-k palette + wikilink resolver, backlinks panel, inline image upload, guided per-route tour, quarantine/review queue view, and KB permission UI gates. Required a new exact-match CORS middleware in kb-service (PR #35) plus CF Access JWT fallback on /api/ai/* (#36).
Implemented the AI-native KB wiki model: source pages / canonical topic pages / append-only claim ledger (claim/tension/question blocks, monotonic ids, chunk locator triples). Shipped as a kb-service Go linter (internal/wiki) wired into Publish before the classifier gate and re-linted at review approval (migration 0049 adds documents.page_type + wiki_id), plus a matching Python wiki_lint/assemble/append-claims toolchain in the kb-ingest skill whose fixtures cross-validate against the Go gate. Auto-ingest title derivation (H1→enrichment→filename) shipped alongside.
After the Supabase migration kb_search returned {results:null} for every query despite 87 published docs — the post-publish search-index worker was never wired, so document_search had 0 rows. PR #22 added an optional docs.Indexer to docs.Service and review.Service so every direct-publish and review-approve path indexes, plus a kbd reindex-all backfill. Restores KB search end-to-end; high-impact because KB search was silently dead.
Seeded the post-migration empty company corpus with 20 curated docs from a Notion LIFE HQ export via a new kbd notion-bulk-import (idempotent, system_scheduled actor), and migrated the contemplative wiki content (Bodhicharyāvatāra, 56 docs) into the KB as corpus=contemplative while retiring the standalone wheel-wiki-local app (Vercel project deleted, repo archived). Concluded Jira should NOT be ingested into the KB (use Atlassian Rovo MCP) — kbd jira-bootstrap/jira-sync flagged as dead code.
Built-locally-not-shipped, spec-only, or blocked on an external action. Many attach as subtasks/updates to existing OPS tickets rather than new tickets.
Stage 1 of the judge v0.3 redesign is built and 24-agent-workflow-verified locally: 11 v0.3 expert rubrics on a byte-identical shared chassis, relevance removed end-to-end, unweighted ≥8 gate + 0.8 coverage quorum, tradition-RED out of gate, monitors + template-overlap detector, panel_version v0.3, chassis/calibration lints. PENDING explicit ship: merge → KB-publish rubrics → review-ui pull + railway up → prompts-pointer promotion → Stage 3 A/B re-grade of frozen v0.8.62–68 eval sets → ledger restart → Stage 4 effort/simplification A/Bs.
The profiling spec's 'build-first, non-negotiable' outcome instrumentation still does not exist, so neither the harness nor the testbed can produce the binding objective (Δ log-loss on a wellbeing/dropout outcome). The audit's top recommendation is to ship Phase 0 now: a lightweight in-app mood/check-in (WHO-5/PSS-4 candidates) plus zero-build 7-day-dropout labels from existing telemetry, then re-point the binding objective at outcomes and demote reaction prediction to a diagnostic. life-app currently captures NO wellbeing outcome.
Offline Phase A harness built at life-app/app-v0.2/research/profile-harness (PR #68): on a leak-free AI-action→reaction event set, tests whether a user's own history beats the strongest cheap baseline and a matched-wrong profile. Synthetic backbone validated (signal→GO, null→null, leak→flagged; 34 tests). The real run is gated on three of Fionn's calls: authorized production reads of the life-app Postgres (sensitive mental-health data, classifier-blocked), a research_data_sharing=true consent cohort as lawful basis, and a human L3-label validation pass. Audit also requires freezing at the synthetic milestone and pre-registering a quantified GO bar before any real run.
Reviewer-owned Wisdom system-prompt authoring + AI steering inside the Data Lab branch view: per-reviewer evolving prompt forked from production, hand-edit or AI-steer with lab-context injection, content-addressed immutable system_prompts versions, per-candidate prompt pinning, diversity signal, and full export provenance/lineage. Built TDD (1477+939 passing), adversarially + thermo-nuclear reviewed, green locally on feat/reviewer-system-prompt-steering in both repos — but NOT pushed/deployed and the review-ui Supabase migration is NOT applied. Directly serves AMA-29 (custom prompt selection in review UI) and AMA-30 (prompt version history).
The KB auto-ingestion pipeline is built and /api/ingest/event is live, but real Drive→KB and Slack→KB flow is inert. Migrating the GCP service account under fionn@lifelabs.ai is blocked by the org policy iam.disableServiceAccountKeyCreation (Fionn must self-grant orgpolicy.policyAdmin via Console as Workspace super admin); no Drive changes.watch channel is registered (needs push-notification domain verification + ~7-day renewal cron); and SLACK_KNOWLEDGE_CHANNEL_ID / KB_SLACK_BOT_TOKEN are unset. There is also an open OpenTofu drift tripwire on the manually-created CF Access bypass app.
The action-events telemetry pipeline is live but staff-monitoring activation is legally gated on publishing the staff notice. Claude drafted the DPIA and staff-notice for David Attwood (CFO) to finalize — the single open legal gate before telemetry can be used for staff visibility. Drafts live in life-hub/docs/agent-notes/.
Automatic Zoom meeting ingestion via an account-level Server-to-Server OAuth app + recording.completed webhook into kbd, joining Zoom's TIMELINE artifact (real display names) with ASR timestamps to get named speakers without voice enrollment. Not built — blocked on purchasing a LIFE Zoom workspace (per-user OAuth on personal accounts is not viable; needs Marketplace review).
Research Radar is live but several quality/ops items remain: the research-ranker role is NOT assigned in the hub Models Registry so ranking silently falls back to claude-haiku-4-5 (and drops items on malformed tool-JSON); the FTS-vs-pgvector shortlist decision deferred pgvector to v1.x and needs a re-run of kbd research-eval on accumulated real abstracts; an optional NCBI/PubMed key; and reaction re-poll for digest feedback stays deferred by design.
life-bot replaces the legacy golden-bot. Reversible cleanup is done (removed from hub config, repo archived, Railway service downed), but irreversible teardown needs explicit go: uninstall the golden-bot Slack app + archive #golden-bot, delete the model_assignments (golden-bot, function-call) row from life-hub-roles D1, and rotate goldenbot-api-key. Do NOT drop the results-api golden-bot-results D1 — life-bot still reads it. Pre-step: register the life-bot model role in the hub Models Registry (currently on BOT_MODEL fallback, /healthz/models roles={}).
The native Slack Assistant ('Agents & AI Apps') layer is built and merged but shipped dormant. Activating it requires enabling the Slack 'Agents & AI Apps' toggle in the app config and reinstalling the app to the workspace — a manual Slack-admin step Fionn must perform. Until then the bot only does classic @mention/DM and ingest.
A detailed spec exists for a collaborative dashboard letting the core team build a phenomenological assessment benchmark: define each tradition's internal path/stages, map them to the 10-stage Wheel of Life, catalog multi-dimensional phenomenological markers per stage×tradition, upload+tag source material, visualize coverage gaps via heatmap, and eventually generate assessment criteria. The shipped SOME app is only the renamed eval surface; this much larger curation/research tool is NOT built. May map under AMA-11 (SOM wiki) or warrant its own epic.
Folded into a parent, duplicates an existing ticket, or personal tooling — kept out to keep the set high-signal.