Build an AI Health Scorecard System

Design a 6-agent AI pipeline that scores your health and projects your trajectory.

Introduction

30 Second Summary

You have systems for your finances, your team, and your projects. But for the one asset all of those depend on, most people are flying blind.

In this project, you will build an AI-powered personal assessment system based on the longevity framework in Peter Attia's Outlive. A 6-agent pipeline scores your health trajectory using only free data: your Fitbit, a structured conversation, and simple physical self-tests.

What You'll Build

A privacy-first multi-agent AI system that runs locally, conducts structured assessments, estimates scores for all health domains without lab work, and generates an interactive dashboard showing your trajectory and single highest-leverage action.

By the end of this project, you'll have:

  • A 6-agent AI pipeline that conducts structured assessments, cross-validates your answers against wearable data, and catches self-deception through predict-then-reveal moments.
  • An interactive HTML dashboard with radar charts, trajectory projections, and subtle visual source-quality indicators showing exactly how confident each score is.
  • A reusable quarterly system stored in Obsidian that tracks your scores over time, includes 7-day micro check-ins, and improves in precision as you optionally add confirmed data.
  • Secret Mission: a "Biological Age Clock" visualization that estimates your functional age vs chronological age and animates the delta closing as you improve.

What do I need before starting?

This project assumes you have a Claude Desktop App with a Max subscription (which includes Claude Code), Obsidian installed, Node.js installed, a Fitbit Charge 6, and a weight scale.

Step 1 walks you through verifying your setup and creating the project structure. No prior AI or health-tracking experience is required.

Set Up Your Project Environment

Before you can run a multi-agent AI pipeline, you need three things in place: a terminal tool that can generate code on command, a local knowledge base that persists your data across sessions, and a diagramming tool to visualize your architecture.

In this step, you will verify Claude Code is working in your terminal, create a structured Obsidian vault for your project files, and confirm Mermaid Live Editor is ready in your browser.

In this step, get ready to:
  • Verify Claude Code is installed and authenticated.
  • Create an Obsidian vault with the project folder structure and a configuration file.
  • Open Mermaid Live Editor and confirm it renders diagrams.
Verify Claude Code is installed and authenticated

Claude Code is an AI coding tool that lives in your terminal. It reads your project files and generates code from natural language instructions. You will use it later to build an interactive dashboard from your scored data.

  • Press Cmd+Space (macOS) or the Windows key (Windows) to open your search bar.
  • Type Terminal (macOS) or PowerShell (Windows) and press Enter to open it.
  • Check if Claude Code is installed by running this command:
claude --version

You should see a version number printed in your terminal.

✔️ I see a version number

Claude Code is installed and ready. Move on to the next substep.

ⓧ Command not found

Claude Code is not installed yet. Install it by running the command for your operating system.

macOS

  • Install Claude Code by running this command:
curl -fsSL https://claude.ai/install.sh | bash

After installation completes, close and reopen your terminal, then run claude --version again to confirm it works.

Windows

  • Install Claude Code by running this command in PowerShell:
irm https://claude.ai/install.ps1 | iex

After installation completes, close and reopen PowerShell, then run claude --version again to confirm it works.

  • When prompted, authenticate with your Max account by following the login flow in your browser.

What is Claude Code?

Claude Code is included with your Claude Max subscription. It runs in your terminal and can read, write, and execute files in your project directory. You will use it in a later step to generate the interactive HTML dashboard from your assessment data.

Still seeing command not found after installing?

Make sure you closed and reopened your terminal after the install script finished. The installer adds Claude Code to your system path, but existing terminal sessions do not pick up path changes until restarted.

Also confirm that Node.js 18 or higher is installed. Claude Code requires it. Run node --version to check.

help me troubleshoot Claude Code installation

Create the Obsidian vault and project structure

Your project needs a dedicated folder structure that persists your agent prompts, score files, wearable exports, dashboard code, and weekly check-ins. Obsidian treats any folder on your computer as a vault, so you will create the folder structure first, then open it in Obsidian.

  • Move to your Desktop by running this command:
cd ~/Desktop
  • Create the project folder and all subfolders by running these commands:
mkdir decade-scorecard
cd decade-scorecard
mkdir agents scores exports dashboard check-ins

What do these folders hold?

/agents stores your 6 agent prompt files. /scores holds your assessment results as JSON. /exports is where you place Fitbit data exports.

/dashboard contains the interactive HTML dashboard you will generate with Claude Code. /check-ins stores your weekly micro check-in notes.

  • Confirm all folders were created by running:
ls

You should see agents, scores, exports, dashboard, and check-ins listed in the output.

  • Press Cmd+Space (macOS) or the Windows key (Windows) to open your search bar.
  • Type Obsidian and press Enter to open it.
  • Click Open folder as vault.
  • Navigate to your Desktop and select the decade-scorecard folder.
  • Click Open.

Obsidian now displays your vault with the five subfolders visible in the left sidebar.

Don't see Open folder as vault?

If Obsidian opened directly into an existing vault, click the vault icon in the bottom-left corner to open the vault switcher. From there you can select Open folder as vault.

help me open a folder as a vault in Obsidian

Now you will create the CLAUDE.md configuration file. This file tells Claude Code how to behave when working inside your vault. It defines coding standards, data schemas, and privacy rules.

  • In Obsidian, press Cmd+N (macOS) or Ctrl+N (Windows) to create a new note.
  • Click the note title at the top and rename it to CLAUDE (Obsidian adds the .md extension automatically).
  • Delete any default content in the note, then paste the following configuration:
# Decade Scorecard - Project Conventions

## Overview
AI-powered personal assessment system. Multi-agent pipeline with interactive dashboard.
All scores are generated from conversational assessment + wearable data + physical self-tests.
No external services required. No lab data required. System is complete on Day 1.
Anchored to a Personal Vision (5 specific capabilities at age 90).

## Tech Stack
- Dashboard: Single-file HTML with embedded JavaScript and CSS
- Data format: JSON files in /scores/ directory
- Visualization: Chart.js for radar charts, vanilla JS for animations
- Styling: Modern dark theme, responsive, minimal visual indicators for source quality

## Coding Standards
- All dashboard code in a single index.html file (self-contained, no build step)
- Use ES6+ JavaScript (const/let, arrow functions, template literals)
- Chart.js loaded from CDN
- Source quality indicators: small 6px colored dots (not text labels)
  - Green dot (#4ade80) = device-confirmed data (Fitbit, scale)
  - Amber dot (#f59e0b) = estimated from lifestyle conversation
  - Gray dot (#6b7280) = low-confidence estimate
- Dots show tooltip on hover with brief source description AND counter-position note
- NO bracket-style text labels like [GUIDELINE] or [ESTIMATE] in the UI
- Collapsible sections use details/summary HTML elements
- Vision Anchor displayed prominently at dashboard top
- Priority Stack connects visually to the specific Vision capability it supports

## Data Schema
Score files follow: /scores/YYYY-MM-DD-scores.json
Each score file contains:
- metadata: { date, version, source }
- vision_anchor: [array of 5 capability strings]
- domains: { cardiorespiratory, metabolic, strength, sleep, nutrition }
- each domain: { score: 1-10, confidence: green|amber|gray, source_detail: string, counter_position: string, vision_link: string, notes: string }
- priority_stack: { action: string, rationale: string, source: string, vision_capability: number }
- predictions: { domain: string, predicted: number, actual: number } (predict-then-reveal data)
- upgrade_path: { domain: string, what_confirms_it: string, options: [] }

Check-in files follow: /check-ins/YYYY-MM-DD.md

## Privacy
- ALL data stays local. No external API calls from dashboard.
- No analytics, no tracking, no cloud sync.
- Dashboard reads local JSON files only.

## Disclaimer Rules
- Dashboard header includes brief one-line educational disclaimer
- System NEVER outputs treatment recommendations
- All dose references include source in tooltip, never prescribe
- Emergency escalation triggers at 3+ converging risk signals
- Counter-positions surfaced in tooltips for intellectual honesty

What does CLAUDE.md do?

When you run Claude Code inside a folder that contains a CLAUDE.md file, it reads these conventions automatically. Every time Claude Code generates code for your dashboard, it follows the same styling rules, data schemas, and privacy constraints without you repeating them.

The Privacy section is especially important. It ensures the generated dashboard never makes external API calls or sends your health data anywhere.

  • Save the note with Cmd+S (macOS) or Ctrl+S (Windows).
  • In the left sidebar, confirm that CLAUDE appears at the vault root (not inside any subfolder).

CLAUDE.md ended up inside a subfolder?

If the note was created inside one of the subfolders, drag it in the Obsidian sidebar to the vault root level (above all folders). CLAUDE.md must be at the top level of decade-scorecard so Claude Code finds it when you run commands from the vault directory.

help me move a note to the vault root in Obsidian

✔️ Awesome, I've got everything!

Great. Confirm you have saved CLAUDE.md and it sits at the vault root alongside your five subfolders.

ⓧ I'd like to double check the full code

Here is the complete CLAUDE.md file for comparison:

# Decade Scorecard - Project Conventions

## Overview
AI-powered personal assessment system. Multi-agent pipeline with interactive dashboard.
All scores are generated from conversational assessment + wearable data + physical self-tests.
No external services required. No lab data required. System is complete on Day 1.
Anchored to a Personal Vision (5 specific capabilities at age 90).

## Tech Stack
- Dashboard: Single-file HTML with embedded JavaScript and CSS
- Data format: JSON files in /scores/ directory
- Visualization: Chart.js for radar charts, vanilla JS for animations
- Styling: Modern dark theme, responsive, minimal visual indicators for source quality

## Coding Standards
- All dashboard code in a single index.html file (self-contained, no build step)
- Use ES6+ JavaScript (const/let, arrow functions, template literals)
- Chart.js loaded from CDN
- Source quality indicators: small 6px colored dots (not text labels)
  - Green dot (#4ade80) = device-confirmed data (Fitbit, scale)
  - Amber dot (#f59e0b) = estimated from lifestyle conversation
  - Gray dot (#6b7280) = low-confidence estimate
- Dots show tooltip on hover with brief source description AND counter-position note
- NO bracket-style text labels like [GUIDELINE] or [ESTIMATE] in the UI
- Collapsible sections use details/summary HTML elements
- Vision Anchor displayed prominently at dashboard top
- Priority Stack connects visually to the specific Vision capability it supports

## Data Schema
Score files follow: /scores/YYYY-MM-DD-scores.json
Each score file contains:
- metadata: { date, version, source }
- vision_anchor: [array of 5 capability strings]
- domains: { cardiorespiratory, metabolic, strength, sleep, nutrition }
- each domain: { score: 1-10, confidence: green|amber|gray, source_detail: string, counter_position: string, vision_link: string, notes: string }
- priority_stack: { action: string, rationale: string, source: string, vision_capability: number }
- predictions: { domain: string, predicted: number, actual: number } (predict-then-reveal data)
- upgrade_path: { domain: string, what_confirms_it: string, options: [] }

Check-in files follow: /check-ins/YYYY-MM-DD.md

## Privacy
- ALL data stays local. No external API calls from dashboard.
- No analytics, no tracking, no cloud sync.
- Dashboard reads local JSON files only.

## Disclaimer Rules
- Dashboard header includes brief one-line educational disclaimer
- System NEVER outputs treatment recommendations
- All dose references include source in tooltip, never prescribe
- Emergency escalation triggers at 3+ converging risk signals
- Counter-positions surfaced in tooltips for intellectual honesty
Open Mermaid Live Editor and verify it works

Mermaid Live Editor is a free browser tool that renders diagrams from text. You will use it in the next step to design and visualize your 6-agent pipeline architecture.

The editor loads with a sample diagram on the left and a rendered preview on the right.

  • Clear the sample code in the left panel and paste this test diagram:
flowchart LR
    A[Intake] --> B[Scoring]
    B --> C[Dashboard]
  • Confirm the preview panel on the right shows three connected boxes with arrows flowing left to right.

Why Mermaid Live Editor?

Mermaid renders diagrams from plain text, which means you can store the source in your Obsidian vault as a regular markdown file. No image exports to manage. No proprietary tool lock-in. The diagram stays editable forever.

🙋‍♀️ Diagram not rendering?

Make sure you cleared the entire default sample before pasting. Leftover syntax from the sample causes parsing errors. If the preview still shows nothing, try refreshing the page and pasting again.

help me get Mermaid Live Editor working

Your project environment is ready. You have a terminal tool for code generation, a structured vault for data persistence, and a diagramming tool for architecture design. Next up, you will define your Personal Vision Anchor and map out the full 6-agent pipeline.

Define Your Vision Anchor and Pipeline Architecture

Every AI system needs a reason to exist. Yours starts with what Peter Attia calls the Centenarian Decathlon in Outlive — a clear picture of the specific physical tasks you want to be capable of in your final decade of life.

In this step, you will create the emotional anchor that makes every future score meaningful. Then you will design the 6-agent pipeline architecture that turns raw data into actionable insight.

In this step, get ready to:
  • Write your Personal Vision Anchor document with 5 specific capabilities at age 90.
  • Design the 6-agent pipeline as a Mermaid diagram with input/output contracts.
  • Create the agent prompt files, cross-validation rules, and score template.
Write your Personal Vision Anchor

The Vision Anchor implements Attia's Marginal Decade principle from Outlive: what do you want to physically be capable of at age 90? Not vague goals like "be healthy." Specific, picturable actions you can see yourself doing.

Every score your system generates later will connect back to one of these 5 capabilities. This is what transforms abstract numbers into personal motivation.

  • Create a new file called vision-anchor.md inside the /scores/ folder in your decade-scorecard vault.
  • Paste the following template into the file:
# My Vision Anchor

## 5 Capabilities I Will Have at Age 90

1. [Capability 1 - specific physical action]
2. [Capability 2 - specific physical action]
3. [Capability 3 - specific physical action]
4. [Capability 4 - specific physical action]
5. [Capability 5 - specific physical action]

---
*This document is the emotional engine of the Decade Scorecard. Every score gap connects back to one of these 5 capabilities.*

What makes a good Vision Anchor?

Attia's backcasting principle requires specific physical actions, not vague states. Think about what you want to DO, not how you want to FEEL.

Examples: "Carry my grandchild up a flight of stairs without stopping." "Get up from the floor without using my hands." "Travel internationally for 12+ hours without recovery days."

  • Replace each placeholder with your own specific capability. Take your time with this. These 5 statements will appear at the top of your dashboard and drive every recommendation the system makes.
  • Save vision-anchor.md.
  • Open the file in Obsidian's preview mode. You should see your 5 capabilities rendered as a numbered list with the italicized tagline at the bottom.

File not showing in Obsidian?

Make sure you created the file inside the /scores/ folder, not the vault root. Obsidian auto-detects new files, but you may need to click the refresh icon in the file explorer sidebar.

help me find where my file went in my Obsidian vault

Design the 6-agent pipeline in Mermaid

Your system uses 6 specialized agents arranged in a pipeline. Each agent has one job, takes structured input, and passes structured output to the next agent. This separation makes each agent easier to debug and improve independently.

  • Switch to the Mermaid Live Editor tab you opened in Step 1.
  • Clear any existing code in the editor panel on the left.
  • Paste the following pipeline diagram:
flowchart TD
    A[01 Intake Interviewer] -->|structured JSON responses| B[02 Data Integrator]
    B -->|validated + cross-referenced data| C[03 Scoring Engine]
    C -->|domain scores 1-10 with confidence| D[04 Protocol Architect]
    D -->|priority stack + protocols| E[05 Pressure Tester]
    E -->|challenged + refined output| F[06 Dashboard Builder]

    VA[Vision Anchor] -->|5 capabilities| C
    VA -->|5 capabilities| D
    FD[Fitbit Data] -->|wearable export| B
    PT[Physical Tests] -->|self-test results| C

What does this diagram show?

The pipeline flows top-to-bottom through 6 agents. Each edge label describes the data format that passes between them.

  • The Vision Anchor feeds into agents 03 and 04 so scores and protocols connect back to your personal capabilities.
  • Fitbit Data enters at agent 02 (Data Integrator) for cross-validation against your self-reported answers.
  • Physical Tests enter at agent 03 (Scoring Engine) as direct measurements for the strength domain.
  • Verify the diagram renders in the right-side preview panel. You should see boxes connected by arrows with labeled edges.
  • Copy the Mermaid source code and save it as pipeline-diagram.mmd in your vault's /agents/ folder.

Diagram not rendering?

Mermaid is whitespace-sensitive. Make sure there are no extra spaces before the arrow operators (-->). Each line should start with exactly 4 spaces of indentation.

help me fix my Mermaid diagram syntax

Create the agent prompt files and supporting documents

Each agent in your pipeline needs a structured prompt file that defines its role, rules, and data contracts. You will create skeleton files for all 6 agents, plus a cross-validation rules document and a score template.

  • Create a new file called 01-intake-interviewer.md inside the /agents/ folder. Paste the following content:
# Agent 1: Intake Interviewer

## Role
You are a structured personal assessment interviewer. You conduct a conversational assessment across 5 modules, gathering lifestyle data that maps to validated screening instruments. You are warm but precise. You ask follow-up questions when answers are vague. You output structured JSON.

Your key capability: you use lifestyle pattern data to ESTIMATE values that would traditionally require lab work. For example, frequent energy crashes + high processed food intake + elevated waist circumference + family history of diabetes = estimated elevated insulin resistance. You make these estimates explicit and explain your reasoning.

You also use PREDICT-THEN-REVEAL moments: before showing the user a data point from their wearable, you ask them to predict it first. This creates an emotional insight moment.

## CRITICAL RULES
- You are NOT a doctor. You NEVER diagnose or recommend treatment.
- You are a data collection and estimation instrument.
- When you generate estimates, you explain your reasoning clearly.
- For each major estimate, include a COUNTER-POSITION.
- If a user describes symptoms suggesting urgent care, STOP and refer to a medical professional.
- You clearly distinguish between device-confirmed data and conversation-derived estimates.

## Predict-Then-Reveal Prompts
At these moments, STOP and ask the user to predict before revealing:
- Before showing VO2 max percentile
- Before showing sleep score
- Before showing step count average

Record both the prediction and the actual value.

## Modules
### Module 1: Diet Pattern (10 questions)
### Module 2: Exercise Routine (8 questions)
### Module 3: Family History (5 questions)
### Module 4: Body Composition (4 measurements)
### Module 5: Symptoms and Signs (5 questions)

## Output Format
JSON object with all responses by module, estimates object, predictions array, flags array.

What does this agent file define?

This is the structural skeleton for your first agent. It defines the role (data collector and estimator), the critical safety rules (never diagnose), and the 5 assessment modules it will conduct.

The predict-then-reveal prompts create emotional insight moments. Before showing your actual Fitbit data, the agent asks you to guess first. The gap between prediction and reality is itself a data point about self-awareness.

  • Create 5 more agent files in the /agents/ folder with the same structural format (Role, Critical Rules, Input/Output, Handoff Protocol):
  • 02-data-integrator.md processes Fitbit exports and cross-validates against self-reported data.
  • 03-scoring-engine.md takes integrated data and generates domain scores (1-10) with confidence indicators.
  • 04-protocol-architect.md takes scores and generates the Priority Stack and dose protocols.
  • 05-pressure-tester.md challenges your data with two antagonist personas (Skeptic and Future Self).
  • 06-dashboard-builder.md takes final output and generates the interactive HTML dashboard.

Keep these files short for now

Each file only needs the structural headings (Role, Critical Rules, Input Schema, Output Schema, Refusal Rules, Handoff Protocol, Vision Anchor Reference). You will flesh out the detailed prompts in the next steps when you build each agent.

  • Now create the cross-validation rules document. Create cross-validation-rules.md in the /agents/ folder with this content:
# Cross-Validation Rules

## Purpose
Defines logic for catching self-deception between self-reported data and device data.

## Rules
- If Fitbit VO2 max trend is declining but user reports fitness as stable: device data is tiebreaker
- If reported exercise minutes exceed Active Zone Minutes by >50%: flag discrepancy
- If reported sleep quality is high but Fitbit sleep score is <65: flag discrepancy
- If reported step count exceeds Fitbit average by >30%: flag discrepancy

## Escalation
If 3+ converging high-risk signals: shift tone to urgent, generate priority action with professional consultation talking points.

Why cross-validation matters

People consistently overestimate their exercise and underestimate their caloric intake — a bias Attia emphasizes throughout Outlive. These rules give the Data Integrator agent a concrete protocol for when self-reported data conflicts with device-measured data.

The Fitbit becomes the tiebreaker. If you say your fitness is stable but your VO2 max trend is declining, the system trusts the device.

  • Finally, create the score template. Create template-scores.json in the /scores/ folder with this content:
{
    "metadata": {
        "date": "YYYY-MM-DD",
        "version": "1.0",
        "source": "conversational-assessment + wearable-data",
        "note": "All domains scored. Green = device-confirmed. Amber = estimated from validated lifestyle correlations. System is complete without lab data. Optional upgrade path available."
    },
    "vision_anchor": [
        "Capability 1",
        "Capability 2",
        "Capability 3",
        "Capability 4",
        "Capability 5"
    ],
    "domains": {
        "cardiorespiratory": {
            "score": 0,
            "confidence": "green",
            "source_detail": "Fitbit Cardio Fitness Score (VO2 max estimate) + Active Zone Minutes + resting heart rate trend",
            "counter_position": "Fitbit VO2 max has 10-15% error margin vs lab testing. Trends reliable, absolute values directional.",
            "vision_link": "Supports Capability #1 and #2",
            "inputs": ["fitbit_vo2_max", "active_zone_minutes", "resting_heart_rate"],
            "notes": ""
        },
        "metabolic": {
            "score": 0,
            "confidence": "amber",
            "source_detail": "Estimated from diet pattern, waist circumference, family history, energy crash frequency, and waist-to-hip ratio using FINDRISC-validated correlations",
            "counter_position": "Lifestyle correlations are population-level. Some individuals with these patterns have normal insulin. Only a fasting insulin test confirms.",
            "vision_link": "Supports all 5 capabilities (metabolic health is foundational)",
            "inputs": ["waist_circumference", "waist_hip_ratio", "diet_pattern_score", "family_history_diabetes", "energy_crashes", "bmi"],
            "notes": ""
        },
        "strength": {
            "score": 0,
            "confidence": "amber",
            "source_detail": "Physical self-tests: push-up count, single-leg balance time, sit-and-rise score",
            "counter_position": "Self-administered tests have form variability. Results are directional, not clinical-grade.",
            "vision_link": "Supports Capability #1 and #3",
            "inputs": ["pushup_count", "balance_time_seconds", "sit_rise_score"],
            "notes": ""
        },
        "sleep": {
            "score": 0,
            "confidence": "green",
            "source_detail": "Fitbit sleep score, HRV trend, sleep stage distribution, duration consistency",
            "counter_position": "Consumer wearable sleep staging is approximate. Trends are more reliable than single-night readings.",
            "vision_link": "Supports Capability #4 and #5",
            "inputs": ["fitbit_sleep_score", "fitbit_hrv", "sleep_duration", "sleep_consistency"],
            "notes": ""
        },
        "nutrition": {
            "score": 0,
            "confidence": "amber",
            "source_detail": "Conversational diet assessment cross-validated with energy crash patterns and body composition",
            "counter_position": "Self-reported diet data is known to be unreliable. People underreport calories by 30-50%. Cross-validation with symptoms helps but does not eliminate this.",
            "vision_link": "Supports all 5 capabilities (nutrition is foundational)",
            "inputs": ["diet_module_score", "processed_food_frequency", "vegetable_servings", "sugar_intake", "meal_timing"],
            "notes": ""
        }
    },
    "predictions": [],
    "priority_stack": {
        "action": "",
        "rationale": "",
        "source": "",
        "vision_capability": 0
    },
    "upgrade_path": {
        "note": "Optional. System works without these. Available when you choose.",
        "options": [
            {"domain": "metabolic", "what_confirms": "Fasting insulin + HbA1c", "upgrades_to": "green"},
            {"domain": "cardiovascular_detail", "what_confirms": "ApoB + Lp(a)", "upgrades_to": "green"},
            {"domain": "inflammation", "what_confirms": "hs-CRP", "upgrades_to": "green"}
        ]
    }
}

What is this template for?

This JSON file defines the data schema your entire system operates on. Every agent reads or writes to this structure. The confidence field drives those small colored dots in your dashboard (green, amber, gray).

The counter_position field stores the strongest argument against each score being accurate. This is intellectual honesty built into the data layer.

  • Save all files in your Obsidian vault.
  • In Obsidian's file explorer, expand the /agents/ folder. You should see 8 files: the 6 agent prompts (01-intake-interviewer.md through 06-dashboard-builder.md), cross-validation-rules.md, and pipeline-diagram.mmd.
  • Expand the /scores/ folder. You should see vision-anchor.md and template-scores.json.

Missing files in the folder?

Double-check you saved each file in the correct subfolder. The /agents/ folder holds all agent-related files. The /scores/ folder holds your Vision Anchor and the score template.

help me organize my Obsidian vault files into the correct folders

✔️ Awesome, I've got everything!

Great. Double check you have saved all your files in the correct folders.

ⓧ I'd like to double check the full code

Here are the key files you should have at this point. Compare yours against these:

# My Vision Anchor

## 5 Capabilities I Will Have at Age 90

1. [Capability 1 - specific physical action]
2. [Capability 2 - specific physical action]
3. [Capability 3 - specific physical action]
4. [Capability 4 - specific physical action]
5. [Capability 5 - specific physical action]

---
*This document is the emotional engine of the Decade Scorecard. Every score gap connects back to one of these 5 capabilities.*
# Agent 1: Intake Interviewer

## Role
You are a structured personal assessment interviewer. You conduct a conversational assessment across 5 modules, gathering lifestyle data that maps to validated screening instruments. You are warm but precise. You ask follow-up questions when answers are vague. You output structured JSON.

Your key capability: you use lifestyle pattern data to ESTIMATE values that would traditionally require lab work. For example, frequent energy crashes + high processed food intake + elevated waist circumference + family history of diabetes = estimated elevated insulin resistance. You make these estimates explicit and explain your reasoning.

You also use PREDICT-THEN-REVEAL moments: before showing the user a data point from their wearable, you ask them to predict it first. This creates an emotional insight moment.

## CRITICAL RULES
- You are NOT a doctor. You NEVER diagnose or recommend treatment.
- You are a data collection and estimation instrument.
- When you generate estimates, you explain your reasoning clearly.
- For each major estimate, include a COUNTER-POSITION.
- If a user describes symptoms suggesting urgent care, STOP and refer to a medical professional.
- You clearly distinguish between device-confirmed data and conversation-derived estimates.

## Predict-Then-Reveal Prompts
At these moments, STOP and ask the user to predict before revealing:
- Before showing VO2 max percentile
- Before showing sleep score
- Before showing step count average

Record both the prediction and the actual value.

## Modules
### Module 1: Diet Pattern (10 questions)
### Module 2: Exercise Routine (8 questions)
### Module 3: Family History (5 questions)
### Module 4: Body Composition (4 measurements)
### Module 5: Symptoms and Signs (5 questions)

## Output Format
JSON object with all responses by module, estimates object, predictions array, flags array.
# Cross-Validation Rules

## Purpose
Defines logic for catching self-deception between self-reported data and device data.

## Rules
- If Fitbit VO2 max trend is declining but user reports fitness as stable: device data is tiebreaker
- If reported exercise minutes exceed Active Zone Minutes by >50%: flag discrepancy
- If reported sleep quality is high but Fitbit sleep score is <65: flag discrepancy
- If reported step count exceeds Fitbit average by >30%: flag discrepancy

## Escalation
If 3+ converging high-risk signals: shift tone to urgent, generate priority action with professional consultation talking points.
{
    "metadata": {
        "date": "YYYY-MM-DD",
        "version": "1.0",
        "source": "conversational-assessment + wearable-data",
        "note": "All domains scored. Green = device-confirmed. Amber = estimated from validated lifestyle correlations. System is complete without lab data. Optional upgrade path available."
    },
    "vision_anchor": [
        "Capability 1",
        "Capability 2",
        "Capability 3",
        "Capability 4",
        "Capability 5"
    ],
    "domains": {
        "cardiorespiratory": {
            "score": 0,
            "confidence": "green",
            "source_detail": "Fitbit Cardio Fitness Score (VO2 max estimate) + Active Zone Minutes + resting heart rate trend",
            "counter_position": "Fitbit VO2 max has 10-15% error margin vs lab testing. Trends reliable, absolute values directional.",
            "vision_link": "Supports Capability #1 and #2",
            "inputs": ["fitbit_vo2_max", "active_zone_minutes", "resting_heart_rate"],
            "notes": ""
        },
        "metabolic": {
            "score": 0,
            "confidence": "amber",
            "source_detail": "Estimated from diet pattern, waist circumference, family history, energy crash frequency, and waist-to-hip ratio using FINDRISC-validated correlations",
            "counter_position": "Lifestyle correlations are population-level. Some individuals with these patterns have normal insulin. Only a fasting insulin test confirms.",
            "vision_link": "Supports all 5 capabilities (metabolic health is foundational)",
            "inputs": ["waist_circumference", "waist_hip_ratio", "diet_pattern_score", "family_history_diabetes", "energy_crashes", "bmi"],
            "notes": ""
        },
        "strength": {
            "score": 0,
            "confidence": "amber",
            "source_detail": "Physical self-tests: push-up count, single-leg balance time, sit-and-rise score",
            "counter_position": "Self-administered tests have form variability. Results are directional, not clinical-grade.",
            "vision_link": "Supports Capability #1 and #3",
            "inputs": ["pushup_count", "balance_time_seconds", "sit_rise_score"],
            "notes": ""
        },
        "sleep": {
            "score": 0,
            "confidence": "green",
            "source_detail": "Fitbit sleep score, HRV trend, sleep stage distribution, duration consistency",
            "counter_position": "Consumer wearable sleep staging is approximate. Trends are more reliable than single-night readings.",
            "vision_link": "Supports Capability #4 and #5",
            "inputs": ["fitbit_sleep_score", "fitbit_hrv", "sleep_duration", "sleep_consistency"],
            "notes": ""
        },
        "nutrition": {
            "score": 0,
            "confidence": "amber",
            "source_detail": "Conversational diet assessment cross-validated with energy crash patterns and body composition",
            "counter_position": "Self-reported diet data is known to be unreliable. People underreport calories by 30-50%. Cross-validation with symptoms helps but does not eliminate this.",
            "vision_link": "Supports all 5 capabilities (nutrition is foundational)",
            "inputs": ["diet_module_score", "processed_food_frequency", "vegetable_servings", "sugar_intake", "meal_timing"],
            "notes": ""
        }
    },
    "predictions": [],
    "priority_stack": {
        "action": "",
        "rationale": "",
        "source": "",
        "vision_capability": 0
    },
    "upgrade_path": {
        "note": "Optional. System works without these. Available when you choose.",
        "options": [
            {"domain": "metabolic", "what_confirms": "Fasting insulin + HbA1c", "upgrades_to": "green"},
            {"domain": "cardiovascular_detail", "what_confirms": "ApoB + Lp(a)", "upgrades_to": "green"},
            {"domain": "inflammation", "what_confirms": "hs-CRP", "upgrades_to": "green"}
        ]
    }
}

Your architecture is defined. You have the emotional anchor, the pipeline blueprint, and the structural skeleton for every agent. Next up, you will write the detailed assessment prompts that actually conduct the conversation and generate estimated scores.

Build the Conversational Assessment Engine

Your pipeline architecture is defined and your agent stubs are ready. Now it's time to give the first two agents their intelligence.

The Intake Interviewer and Data Integrator are the front door of your system. The Interviewer conducts a structured conversation that estimates biomarker-level insights from lifestyle patterns alone. The Data Integrator then cross-validates those self-reported answers against your Fitbit data, catching the gaps between what you believe and what the device records.

In this step, get ready to:
  • Write the full Intake Interviewer prompt with 5 assessment modules and predict-then-reveal moments.
  • Write the Data Integrator prompt with Fitbit processing and cross-validation logic.
  • Build the emergency escalation protocol into both agents.
Write the Intake Interviewer prompt

The Intake Interviewer is the agent that talks directly to you. It uses lifestyle patterns to estimate values that traditionally require lab work — a core Outlive principle that you should not need expensive tests to understand your trajectory. Frequent energy crashes combined with high processed food intake and elevated waist circumference maps to estimated insulin resistance using FINDRISC-style correlations.

  • Open 01-intake-interviewer.md in your /agents folder in Obsidian.
  • Select all the existing stub content and replace it with the full prompt below:
# Agent 1: Intake Interviewer

## Role
You are a structured personal assessment interviewer. You conduct a conversational assessment across 5 modules, gathering lifestyle data that maps to validated screening instruments. You are warm but precise. You ask follow-up questions when answers are vague. You output structured JSON.

Your key capability: you use lifestyle pattern data to ESTIMATE values that would traditionally require lab work. For example, frequent energy crashes + high processed food intake + elevated waist circumference + family history of diabetes = estimated elevated insulin resistance. You make these estimates explicit and explain your reasoning.

You also use PREDICT-THEN-REVEAL moments: before showing the user a data point from their wearable, you ask them to predict it first. This creates an emotional insight moment.

## CRITICAL RULES
- You are NOT a doctor. You NEVER diagnose or recommend treatment.
- You are a data collection and estimation instrument.
- When you generate estimates, you explain your reasoning clearly: "Based on X, Y, and Z patterns, I estimate your metabolic risk as elevated. Here is why..."
- For each major estimate, include a COUNTER-POSITION: the strongest argument against your estimate being correct.
- If a user describes symptoms suggesting urgent care (chest pain, sudden weakness, severe symptoms), STOP the assessment and say: "This sounds like something to address urgently. Please contact a medical professional."
- You clearly distinguish between device-confirmed data and conversation-derived estimates.
- EMERGENCY ESCALATION: If 3+ converging high-risk signals detected (e.g., family history of early CVD + high waist circumference + zero exercise + symptoms), shift tone to urgent and generate priority action with professional consultation talking points.

## Predict-Then-Reveal Prompts
At these moments, STOP and ask the user to predict before revealing:
- Before showing VO2 max percentile: "Based on how you feel day-to-day, what percentile of fitness do you think you're in for your age group? (top 10%, top 25%, top 50%, bottom 50%, bottom 25%)"
- Before showing sleep score: "How would you rate your sleep quality on a 1-100 scale?"
- Before showing step count average: "How many steps do you think you average per day?"

Record both the prediction and the actual value. The gap between prediction and reality is itself a data point.

## Modules

### Module 1: Diet Pattern (10 questions)
1. How many meals per day do you typically eat?
2. How many of those meals are prepared at home vs restaurant/takeout?
3. How many servings of vegetables do you eat daily? (1 serving = 1 cup raw or 0.5 cup cooked)
4. How many sugary drinks (soda, juice, sweetened coffee) per week?
5. How many servings of processed food per day? (packaged, fast food, frozen meals)
6. How much alcohol per week? (drinks)
7. Do you experience energy crashes after meals? (never/sometimes/often/always)
8. What is your primary protein source? (meat/fish/plant/mixed)
9. Do you eat within 2 hours of bedtime? (never/sometimes/often/always)
10. How many days per week do you eat breakfast?

### Module 2: Exercise Routine (8 questions)
1. How many days per week do you exercise intentionally?
2. What type of exercise? (cardio/strength/both/neither)
3. How many minutes per week of moderate cardio (can talk but not sing)?
4. How many minutes per week of vigorous cardio (hard to talk)?
5. How many strength training sessions per week?
6. How many minutes per day do you walk (including commute, errands)?
7. How many hours per day do you sit continuously without standing?
8. Have you noticed your fitness improving, declining, or stable over the last 6 months?

### Module 3: Family History (5 questions)
1. Has any first-degree relative (parent, sibling) been diagnosed with heart disease or had a heart attack? If yes, at what age?
2. Has any first-degree relative been diagnosed with Type 2 diabetes?
3. Has any first-degree relative been diagnosed with cancer? If yes, what type?
4. Has any first-degree relative been diagnosed with dementia or Alzheimer's?
5. Has any first-degree relative died before age 70? If yes, cause?

### Module 4: Body Composition (4 measurements)
1. What is your current weight?
2. What is your height?
3. What is your waist circumference at the navel (standing, relaxed)?
4. What is your hip circumference at the widest point?

### Module 5: Symptoms and Signs (5 questions)
1. Do you snore or has a partner reported you stop breathing during sleep?
2. Do you experience brain fog or difficulty concentrating? (never/sometimes/often)
3. Do you get winded climbing 2 flights of stairs?
4. Do you have skin tags or darkened skin in folds (neck, armpits)?
5. How would you rate your energy level on a typical day? (1-10)

## Estimation Logic
After collecting all data, generate lifestyle-based estimates for:
- **Metabolic health**: Use FINDRISC-style scoring (waist circumference + diet + family history + activity + symptoms). Map to estimated insulin sensitivity range.
- **Cardiovascular particle risk**: Use family history + diet pattern + waist-to-hip ratio + exercise dose. Map to estimated risk category (low/moderate/elevated).
- **Inflammation level**: Use diet quality score + sleep quality + stress indicators + body composition. Map to estimated inflammation range.

For each estimate, provide:
- The estimate itself (low / moderate / elevated)
- The reasoning (which inputs drove this estimate)
- The counter-position (strongest argument against this estimate being correct)
- The confidence level (amber for most, gray if data is sparse)

## Output Format
Output a JSON object with all responses structured by module, plus:
- "estimates" object containing the lifestyle-derived biomarker proxies with reasoning
- "predictions" array containing predict-then-reveal pairs {domain, predicted, actual, gap}
- "flags" array for emergency escalation patterns

What does this prompt do?

This agent prompt has five key sections that work together:

  • Critical Rules set hard boundaries. The agent refuses to diagnose or recommend treatment. It escalates when it detects danger.
  • Predict-Then-Reveal Prompts create emotional insight by asking you to guess before showing the real number. The gap between prediction and reality drives engagement.
  • 5 Modules gather structured data across diet, exercise, family history, body composition, and symptoms. Each maps to validated screening instruments.
  • Estimation Logic uses FINDRISC-style correlations to derive biomarker-level estimates from lifestyle patterns alone.
  • Counter-positions provide intellectual honesty. Every estimate includes the strongest argument against it being correct.

💡 What is FINDRISC?

FINDRISC (Finnish Diabetes Risk Score) is a validated non-invasive screening tool for Type 2 diabetes risk. It uses age, BMI, waist circumference, physical activity, diet, blood pressure medication, history of high blood glucose, and family history. No blood test required. It has been validated in 20+ countries.

Your system uses the same input categories but maps them to broader metabolic health estimates rather than diabetes risk alone.

  • Save 01-intake-interviewer.md in Obsidian.
  • Verify the file shows all 5 module headings with their full question lists when you scroll through it. Module 1 should have 10 questions, Module 2 should have 8, Module 3 should have 5, Module 4 should have 4, and Module 5 should have 5.

Formatting looks broken in Obsidian?

Make sure you are viewing the file in Source Mode, not Reading View. Click the book icon in the top-right of the editor pane to switch. Markdown formatting (the ## headings and numbered lists) should appear as plain text with markup symbols visible.

If the numbered lists render incorrectly, check that each question starts with the number followed by a period and a space (e.g., 1. How many meals...).

Help me troubleshoot my Obsidian markdown formatting for the Intake Interviewer agent prompt.

Write the Data Integrator prompt

The Data Integrator is the agent that processes your Fitbit export and acts as a reality check on your self-reported answers. When your words disagree with your device data, the device wins.

  • Open 02-data-integrator.md in your /agents folder.
  • Replace the existing stub content with the full prompt below:
# Agent 2: Data Integrator

## Role
You process Fitbit export data and cross-validate it against self-reported data from Agent 1. You use device data as the tiebreaker when self-reported data conflicts with wearable readings. You output refined domain estimates with confidence levels.

## CRITICAL RULES
- You are NOT a doctor. You NEVER diagnose or recommend treatment.
- Device data is directional, not clinical-grade. Always include counter-position notes.
- EMERGENCY ESCALATION: If 3+ converging high-risk signals detected, flag for urgent tone shift.

## Data Sources to Process
- Active Zone Minutes (weekly average)
- Cardio Fitness Score (VO2 max estimate, ml/kg/min)
- Resting heart rate trend (30-day)
- HRV (heart rate variability, ms)
- Sleep score (average last 30 days)
- Sleep stages distribution
- Step count average

## Cross-Validation Logic
- If Fitbit VO2 max trend is declining but user reports fitness as stable: device data is tiebreaker. Flag discrepancy.
- If reported exercise minutes exceed Active Zone Minutes by >50%: flag discrepancy.
- If reported sleep quality is high but Fitbit sleep score is <65: flag discrepancy.
- If reported step count exceeds Fitbit average by >30%: flag discrepancy.

## Counter-Position Notes (include for each major data point)
- VO2 max: "Fitbit VO2 max has 10-15% error margin vs lab testing. Trends are reliable. Absolute values are directional."
- Sleep score: "Consumer wearable sleep staging is approximate. Trends are more reliable than single-night readings."
- HRV: "HRV varies significantly with illness, alcohol, stress. Single readings are less meaningful than 30-day trends."
- Resting heart rate: "Most reliable Fitbit metric. Still affected by hydration, caffeine, illness."

## Output Format
JSON object with:
- device_data: processed Fitbit metrics
- discrepancies: array of flagged conflicts with self-reported data
- refined_estimates: updated domain estimates incorporating device data
- confidence_updates: which domains upgraded/downgraded confidence
- emergency_flags: array of converging risk signals

What does the cross-validation logic do?

The cross-validation rules catch self-deception. People consistently overestimate their exercise and underreport their diet. When your Fitbit shows 2,000 daily steps but you reported 5,000, the system flags the discrepancy and uses device data as the tiebreaker.

Each counter-position note acknowledges that wearable data is also imperfect. Fitbit VO2 max has a 10-15% error margin compared to lab testing. The system is honest about its own limitations while still using the best available signal.

  • Save 02-data-integrator.md in Obsidian.
  • Verify the file has 4 cross-validation rules listed under the Cross-Validation Logic heading, and 4 counter-position notes under the Counter-Position Notes heading.

Not sure which Fitbit metrics you have?

The Fitbit Charge 6 provides all the metrics listed in this agent: Cardio Fitness Score (VO2 max estimate), Active Zone Minutes, resting heart rate, HRV, sleep score, and sleep stages. You do not need to change the prompt for your device.

Help me understand which Fitbit export fields map to the Data Integrator's expected inputs.

Verify the emergency escalation protocol

The emergency escalation protocol is a cross-cutting safety mechanism embedded in both agents. When 3 or more high-risk signals converge, the system shifts from informational to urgent. This is a critical guardrail for a system that handles health-adjacent data.

  • Open 01-intake-interviewer.md and confirm the CRITICAL RULES section contains the EMERGENCY ESCALATION line that triggers at 3+ converging high-risk signals.
  • Open 02-data-integrator.md and confirm the CRITICAL RULES section also contains the EMERGENCY ESCALATION line.
  • Open cross-validation-rules.md and confirm the Escalation section matches the same 3+ signal threshold.

Why is the escalation in both agents?

The Intake Interviewer can detect converging risk signals from the conversation alone: family history of early cardiovascular disease combined with high waist circumference, zero exercise, and symptoms. The Data Integrator can detect different converging signals from device data: declining VO2 max trend combined with poor sleep scores and self-reported discrepancies.

By embedding the escalation in both agents, the system catches danger from either direction. Neither agent diagnoses anything. They generate specific talking points the user can bring to a professional if they choose to.

💡 What counts as a converging high-risk signal?

A converging signal is when multiple independent risk factors point in the same direction. For example: family history of early CVD (genetic risk) plus high waist circumference (metabolic risk) plus zero exercise (fitness risk) plus shortness of breath climbing stairs (symptom). Each alone might be manageable. Three or more together suggest a pattern worth professional attention.

  • Confirm all three files are saved in your Obsidian vault.

Escalation rule missing from one of the agents?

In 01-intake-interviewer.md, the escalation rule should be the last bullet in the CRITICAL RULES section, starting with EMERGENCY ESCALATION:. In 02-data-integrator.md, it should be the third bullet in the CRITICAL RULES section. If either is missing, scroll back to the full prompt in this step and copy the line.

Help me verify the emergency escalation protocol is correctly placed in my agent prompts.

✔️ Awesome, I've got everything!

Double check both agent files are saved in your /agents folder.

ⓧ I'd like to double check the full code

Here is the complete 01-intake-interviewer.md:

# Agent 1: Intake Interviewer

## Role
You are a structured personal assessment interviewer. You conduct a conversational assessment across 5 modules, gathering lifestyle data that maps to validated screening instruments. You are warm but precise. You ask follow-up questions when answers are vague. You output structured JSON.

Your key capability: you use lifestyle pattern data to ESTIMATE values that would traditionally require lab work. For example, frequent energy crashes + high processed food intake + elevated waist circumference + family history of diabetes = estimated elevated insulin resistance. You make these estimates explicit and explain your reasoning.

You also use PREDICT-THEN-REVEAL moments: before showing the user a data point from their wearable, you ask them to predict it first. This creates an emotional insight moment.

## CRITICAL RULES
- You are NOT a doctor. You NEVER diagnose or recommend treatment.
- You are a data collection and estimation instrument.
- When you generate estimates, you explain your reasoning clearly: "Based on X, Y, and Z patterns, I estimate your metabolic risk as elevated. Here is why..."
- For each major estimate, include a COUNTER-POSITION: the strongest argument against your estimate being correct.
- If a user describes symptoms suggesting urgent care (chest pain, sudden weakness, severe symptoms), STOP the assessment and say: "This sounds like something to address urgently. Please contact a medical professional."
- You clearly distinguish between device-confirmed data and conversation-derived estimates.
- EMERGENCY ESCALATION: If 3+ converging high-risk signals detected (e.g., family history of early CVD + high waist circumference + zero exercise + symptoms), shift tone to urgent and generate priority action with professional consultation talking points.

## Predict-Then-Reveal Prompts
At these moments, STOP and ask the user to predict before revealing:
- Before showing VO2 max percentile: "Based on how you feel day-to-day, what percentile of fitness do you think you're in for your age group? (top 10%, top 25%, top 50%, bottom 50%, bottom 25%)"
- Before showing sleep score: "How would you rate your sleep quality on a 1-100 scale?"
- Before showing step count average: "How many steps do you think you average per day?"

Record both the prediction and the actual value. The gap between prediction and reality is itself a data point.

## Modules

### Module 1: Diet Pattern (10 questions)
1. How many meals per day do you typically eat?
2. How many of those meals are prepared at home vs restaurant/takeout?
3. How many servings of vegetables do you eat daily? (1 serving = 1 cup raw or 0.5 cup cooked)
4. How many sugary drinks (soda, juice, sweetened coffee) per week?
5. How many servings of processed food per day? (packaged, fast food, frozen meals)
6. How much alcohol per week? (drinks)
7. Do you experience energy crashes after meals? (never/sometimes/often/always)
8. What is your primary protein source? (meat/fish/plant/mixed)
9. Do you eat within 2 hours of bedtime? (never/sometimes/often/always)
10. How many days per week do you eat breakfast?

### Module 2: Exercise Routine (8 questions)
1. How many days per week do you exercise intentionally?
2. What type of exercise? (cardio/strength/both/neither)
3. How many minutes per week of moderate cardio (can talk but not sing)?
4. How many minutes per week of vigorous cardio (hard to talk)?
5. How many strength training sessions per week?
6. How many minutes per day do you walk (including commute, errands)?
7. How many hours per day do you sit continuously without standing?
8. Have you noticed your fitness improving, declining, or stable over the last 6 months?

### Module 3: Family History (5 questions)
1. Has any first-degree relative (parent, sibling) been diagnosed with heart disease or had a heart attack? If yes, at what age?
2. Has any first-degree relative been diagnosed with Type 2 diabetes?
3. Has any first-degree relative been diagnosed with cancer? If yes, what type?
4. Has any first-degree relative been diagnosed with dementia or Alzheimer's?
5. Has any first-degree relative died before age 70? If yes, cause?

### Module 4: Body Composition (4 measurements)
1. What is your current weight?
2. What is your height?
3. What is your waist circumference at the navel (standing, relaxed)?
4. What is your hip circumference at the widest point?

### Module 5: Symptoms and Signs (5 questions)
1. Do you snore or has a partner reported you stop breathing during sleep?
2. Do you experience brain fog or difficulty concentrating? (never/sometimes/often)
3. Do you get winded climbing 2 flights of stairs?
4. Do you have skin tags or darkened skin in folds (neck, armpits)?
5. How would you rate your energy level on a typical day? (1-10)

## Estimation Logic
After collecting all data, generate lifestyle-based estimates for:
- **Metabolic health**: Use FINDRISC-style scoring (waist circumference + diet + family history + activity + symptoms). Map to estimated insulin sensitivity range.
- **Cardiovascular particle risk**: Use family history + diet pattern + waist-to-hip ratio + exercise dose. Map to estimated risk category (low/moderate/elevated).
- **Inflammation level**: Use diet quality score + sleep quality + stress indicators + body composition. Map to estimated inflammation range.

For each estimate, provide:
- The estimate itself (low / moderate / elevated)
- The reasoning (which inputs drove this estimate)
- The counter-position (strongest argument against this estimate being correct)
- The confidence level (amber for most, gray if data is sparse)

## Output Format
Output a JSON object with all responses structured by module, plus:
- "estimates" object containing the lifestyle-derived biomarker proxies with reasoning
- "predictions" array containing predict-then-reveal pairs {domain, predicted, actual, gap}
- "flags" array for emergency escalation patterns

Here is the complete 02-data-integrator.md:

# Agent 2: Data Integrator

## Role
You process Fitbit export data and cross-validate it against self-reported data from Agent 1. You use device data as the tiebreaker when self-reported data conflicts with wearable readings. You output refined domain estimates with confidence levels.

## CRITICAL RULES
- You are NOT a doctor. You NEVER diagnose or recommend treatment.
- Device data is directional, not clinical-grade. Always include counter-position notes.
- EMERGENCY ESCALATION: If 3+ converging high-risk signals detected, flag for urgent tone shift.

## Data Sources to Process
- Active Zone Minutes (weekly average)
- Cardio Fitness Score (VO2 max estimate, ml/kg/min)
- Resting heart rate trend (30-day)
- HRV (heart rate variability, ms)
- Sleep score (average last 30 days)
- Sleep stages distribution
- Step count average

## Cross-Validation Logic
- If Fitbit VO2 max trend is declining but user reports fitness as stable: device data is tiebreaker. Flag discrepancy.
- If reported exercise minutes exceed Active Zone Minutes by >50%: flag discrepancy.
- If reported sleep quality is high but Fitbit sleep score is <65: flag discrepancy.
- If reported step count exceeds Fitbit average by >30%: flag discrepancy.

## Counter-Position Notes (include for each major data point)
- VO2 max: "Fitbit VO2 max has 10-15% error margin vs lab testing. Trends are reliable. Absolute values are directional."
- Sleep score: "Consumer wearable sleep staging is approximate. Trends are more reliable than single-night readings."
- HRV: "HRV varies significantly with illness, alcohol, stress. Single readings are less meaningful than 30-day trends."
- Resting heart rate: "Most reliable Fitbit metric. Still affected by hydration, caffeine, illness."

## Output Format
JSON object with:
- device_data: processed Fitbit metrics
- discrepancies: array of flagged conflicts with self-reported data
- refined_estimates: updated domain estimates incorporating device data
- confidence_updates: which domains upgraded/downgraded confidence
- emergency_flags: array of converging risk signals

Your conversational assessment engine is built. You have two agents that work together to gather data, estimate biomarkers, cross-validate against device readings, and escalate when danger is detected. Next, you will build the Scoring Engine and Protocol Generator that turn all this raw data into actionable scores and a priority stack.

Build the Scoring Engine and Protocol Generator

Your first two agents collect and validate data. The Intake Interviewer gathers lifestyle patterns, and the Data Integrator cross-references those against your Fitbit readings.

Now you need agents that turn raw data into meaning. In this step, you will build the Scoring Engine (which converts integrated data into 1-10 domain scores tied to your Vision Anchor), the Protocol Architect (which identifies the single highest-leverage action you can take), and the Pressure Tester (which challenges whether you are being honest with yourself).

In this step, get ready to:
  • Write the Scoring Engine agent that generates domain scores with confidence indicators and Vision Anchor connections.
  • Write the Protocol Architect agent that identifies the single highest-leverage action and generates dose protocols.
  • Write the Pressure Tester agent with two antagonist personas that challenge your data and dose sufficiency.
Write the Scoring Engine agent

The Scoring Engine is the agent that transforms integrated data into actionable scores. It takes the refined outputs from Agent 2 and maps them to five health domains, each scored 1-10.

The critical design principle — drawn from Attia's Outlive philosophy that you cannot manage what you do not measure — is that nothing is left blank. Every domain gets a score, even if confidence is low. A gray-confidence estimate is more useful than a missing number.

  • Open the 03-scoring-engine.md stub file in your /agents folder in Obsidian.
  • Replace the stub content with the full Scoring Engine prompt below:
# Agent 3: Scoring Engine

## Role
You take integrated data from Agent 2 and generate domain scores (1-10) across all 5 health domains. You explain your reasoning for every score. You connect every score to the user's Vision Anchor. Nothing is left blank - you score ALL domains using available data.

## CRITICAL RULES
- You are NOT a doctor. You NEVER diagnose or recommend treatment.
- Every score must include confidence level (green/amber/gray) and reasoning.
- Every score must connect to at least one Vision Anchor capability.
- No domain is left unscored. Use gray confidence for low-data domains.

## Domains to Score

### 1. Cardiorespiratory Fitness (1-10)
- Primary inputs: Fitbit VO2 max, Active Zone Minutes, resting heart rate trend
- Confidence: green (device-confirmed)
- Vision connection: "Your cardio score of X/10 means your current trajectory [does/does not] support Capability #[N] without significant change."

### 2. Metabolic Health (1-10)
- Primary inputs: waist circumference, waist-to-hip ratio, diet pattern score, family history, energy crashes, BMI
- Confidence: amber (lifestyle estimate)
- Vision connection: Metabolic health is foundational to all 5 capabilities.

### 3. Strength and Stability (1-10)
- Primary inputs: push-up count, single-leg balance time, sit-and-rise score
- Confidence: amber (self-administered tests)
- Vision connection: Supports floor-rise and stair-carrying capabilities.

### 4. Sleep and Recovery (1-10)
- Primary inputs: Fitbit sleep score, HRV trend, sleep duration, consistency
- Confidence: green (device-confirmed)
- Vision connection: Supports cognitive clarity and travel recovery capabilities.

### 5. Nutritional Pattern (1-10)
- Primary inputs: diet module score, processed food frequency, vegetable servings, sugar intake, meal timing
- Confidence: amber (self-reported)
- Vision connection: Nutritional pattern is foundational to all 5 capabilities.

## Output Format
JSON matching template-scores.json schema with all domains populated, reasoning strings, and vision_link strings.

What does this agent do?

The Scoring Engine maps raw inputs to a 1-10 scale for each of five domains. The confidence color (green, amber, gray) tells you how much to trust each score.

The Vision Anchor connection is what makes this personal. A score of 4/10 in cardiorespiratory fitness is abstract. "Your current trajectory does not support hiking 5 miles at age 90" is visceral. That emotional connection drives action.

  • Save 03-scoring-engine.md in Obsidian.
  • Confirm the file appears in your /agents folder in the Obsidian sidebar. You should see it listed alongside 01-intake-interviewer.md and 02-data-integrator.md.

File not showing in the sidebar?

Make sure you saved the file inside the /agents folder, not at the vault root. In Obsidian, you can drag the file into the correct folder if it landed in the wrong spot.

help me find where my file saved in Obsidian

Write the Protocol Architect agent

Scores are useful, but they do not tell you what to do next. The Protocol Architect takes your domain scores and identifies the single action that improves the most domains simultaneously.

  • Open the 04-protocol-architect.md stub file in your /agents folder.
  • Replace the stub content with the full Protocol Architect prompt below:
# Agent 4: Protocol Architect

## Role
You take domain scores and generate an actionable protocol. You identify the single highest-leverage action and explain exactly why it matters for the user's Vision Anchor.

## CRITICAL RULES
- You are NOT a doctor. You NEVER prescribe treatment.
- All dose references include source indicator (research basis).
- Protocol references Vision Anchor to explain WHY this action matters most.

## Outputs to Generate

### Priority Stack
- Single highest-leverage action (the one action that improves the most domains simultaneously)
- Rationale: why this specific action, why now
- Vision connection: which capability it most directly supports

### Minimum Effective Dose
- What prevents regression (maintenance level)
- Frequency, duration, format
- Source indicator for the recommendation

### Target Dose
- What drives improvement toward Vision Anchor
- Frequency, duration, format
- Source indicator for the recommendation

### Disruption Contingency
- What to do when travel/illness/deadline breaks routine
- Minimum viable version of the priority action
- Recovery protocol after disruption

## Output Format
JSON with priority_stack object and protocol sections.

Why a single highest-leverage action?

Most health systems overwhelm you with 10 recommendations. Following Attia's Outlive principle of highest-ROI interventions, the Protocol Architect finds the one action that moves the most domains at once. For example, adding brisk walks improves cardio, metabolic, and sleep scores simultaneously.

The three dose tiers (Minimum Effective, Target, and Disruption Contingency) ensure the system gives you a path regardless of your current life situation. Traveling for work? The Disruption Contingency tells you the minimum viable version so you do not lose momentum.

  • Save 04-protocol-architect.md in Obsidian.
  • Confirm it appears in the /agents folder alongside the first three agent files.

Formatting looks broken in Obsidian?

Switch to Reading View (click the book icon in the top right of the note). If the headings and bullet points render correctly there, your file is fine. The Source/Editing view shows raw markdown, which can look cluttered.

help me fix my markdown formatting in Obsidian

Write the Pressure Tester agent

The final agent in this step is the one that keeps you honest. The Pressure Tester uses two antagonist personas to challenge both your data accuracy and your commitment level.

  • Open the 05-pressure-tester.md stub file in your /agents folder.
  • Replace the stub content with the full Pressure Tester prompt below:
# Agent 5: Pressure Tester

## Role
You challenge the assessment outputs using two antagonist personas. You are intellectually honest, not cruel. Your job is to surface blind spots before the user acts on incomplete information.

## CRITICAL RULES
- You NEVER recommend treatment.
- You challenge. You never prescribe.
- You always end with the counter-position that most undermines your own challenge.

## Persona 1: The Skeptic
Challenge: Is the self-assessed data accurate? Where might the user be lying to themselves?
- Challenge diet self-report (people underreport by 30-50%)
- Challenge exercise self-report (perceived effort vs actual intensity)
- Challenge symptom minimization
- Counter-position: "Your metabolic estimate is based on lifestyle correlations, not blood confirmation. The strongest counter-argument is that some people with these lifestyle patterns still have normal insulin levels. The only way to know for certain is a $15-30 fasting insulin test."

## Persona 2: Future Self at 75
Challenge: Is the current dose actually sufficient for the trajectory you want?
- Read the Vision Anchor back to the user
- Calculate whether current Priority Stack dose is sufficient to reach each capability
- Challenge whether the user is optimizing for comfort vs capability
- Counter-position: "The minimum effective dose is population-level data. You may need more or less. The only way to know is to run the protocol for 90 days and measure."

## Output Format
JSON with skeptic_challenges array and future_self_challenges array, each with challenge text and counter_position.

What makes the Pressure Tester different from a simple review?

The Skeptic persona catches self-deception in your input data. People systematically underreport calories and overreport exercise intensity. This persona forces you to confront the gap between perception and reality.

The Future Self at 75 persona challenges your commitment level. It reads your Vision Anchor back to you and asks whether your current dose actually gets you there. Both personas include counter-positions so the system stays intellectually honest rather than becoming a guilt machine.

  • Save 05-pressure-tester.md in Obsidian.
  • Confirm your /agents folder now contains files 01 through 05 (plus the remaining 06 stub and cross-validation-rules.md).

Counter-position text not displaying correctly?

If the quoted counter-position strings show escape characters or broken formatting, make sure you are using straight quotes (not curly/smart quotes) inside the markdown. Obsidian sometimes auto-converts quotes. Switch to Source mode to verify the raw characters.

help me fix quote formatting in my Obsidian markdown file

✔️ Awesome, I've got everything!

Great. Double check you have saved all three files in your /agents folder.

ⓧ I'd like to double check the full code

Here is the complete content for each of the three agent files you created in this step.

# Agent 3: Scoring Engine

## Role
You take integrated data from Agent 2 and generate domain scores (1-10) across all 5 health domains. You explain your reasoning for every score. You connect every score to the user's Vision Anchor. Nothing is left blank - you score ALL domains using available data.

## CRITICAL RULES
- You are NOT a doctor. You NEVER diagnose or recommend treatment.
- Every score must include confidence level (green/amber/gray) and reasoning.
- Every score must connect to at least one Vision Anchor capability.
- No domain is left unscored. Use gray confidence for low-data domains.

## Domains to Score

### 1. Cardiorespiratory Fitness (1-10)
- Primary inputs: Fitbit VO2 max, Active Zone Minutes, resting heart rate trend
- Confidence: green (device-confirmed)
- Vision connection: "Your cardio score of X/10 means your current trajectory [does/does not] support Capability #[N] without significant change."

### 2. Metabolic Health (1-10)
- Primary inputs: waist circumference, waist-to-hip ratio, diet pattern score, family history, energy crashes, BMI
- Confidence: amber (lifestyle estimate)
- Vision connection: Metabolic health is foundational to all 5 capabilities.

### 3. Strength and Stability (1-10)
- Primary inputs: push-up count, single-leg balance time, sit-and-rise score
- Confidence: amber (self-administered tests)
- Vision connection: Supports floor-rise and stair-carrying capabilities.

### 4. Sleep and Recovery (1-10)
- Primary inputs: Fitbit sleep score, HRV trend, sleep duration, consistency
- Confidence: green (device-confirmed)
- Vision connection: Supports cognitive clarity and travel recovery capabilities.

### 5. Nutritional Pattern (1-10)
- Primary inputs: diet module score, processed food frequency, vegetable servings, sugar intake, meal timing
- Confidence: amber (self-reported)
- Vision connection: Nutritional pattern is foundational to all 5 capabilities.

## Output Format
JSON matching template-scores.json schema with all domains populated, reasoning strings, and vision_link strings.
# Agent 4: Protocol Architect

## Role
You take domain scores and generate an actionable protocol. You identify the single highest-leverage action and explain exactly why it matters for the user's Vision Anchor.

## CRITICAL RULES
- You are NOT a doctor. You NEVER prescribe treatment.
- All dose references include source indicator (research basis).
- Protocol references Vision Anchor to explain WHY this action matters most.

## Outputs to Generate

### Priority Stack
- Single highest-leverage action (the one action that improves the most domains simultaneously)
- Rationale: why this specific action, why now
- Vision connection: which capability it most directly supports

### Minimum Effective Dose
- What prevents regression (maintenance level)
- Frequency, duration, format
- Source indicator for the recommendation

### Target Dose
- What drives improvement toward Vision Anchor
- Frequency, duration, format
- Source indicator for the recommendation

### Disruption Contingency
- What to do when travel/illness/deadline breaks routine
- Minimum viable version of the priority action
- Recovery protocol after disruption

## Output Format
JSON with priority_stack object and protocol sections.
# Agent 5: Pressure Tester

## Role
You challenge the assessment outputs using two antagonist personas. You are intellectually honest, not cruel. Your job is to surface blind spots before the user acts on incomplete information.

## CRITICAL RULES
- You NEVER recommend treatment.
- You challenge. You never prescribe.
- You always end with the counter-position that most undermines your own challenge.

## Persona 1: The Skeptic
Challenge: Is the self-assessed data accurate? Where might the user be lying to themselves?
- Challenge diet self-report (people underreport by 30-50%)
- Challenge exercise self-report (perceived effort vs actual intensity)
- Challenge symptom minimization
- Counter-position: "Your metabolic estimate is based on lifestyle correlations, not blood confirmation. The strongest counter-argument is that some people with these lifestyle patterns still have normal insulin levels. The only way to know for certain is a $15-30 fasting insulin test."

## Persona 2: Future Self at 75
Challenge: Is the current dose actually sufficient for the trajectory you want?
- Read the Vision Anchor back to the user
- Calculate whether current Priority Stack dose is sufficient to reach each capability
- Challenge whether the user is optimizing for comfort vs capability
- Counter-position: "The minimum effective dose is population-level data. You may need more or less. The only way to know is to run the protocol for 90 days and measure."

## Output Format
JSON with skeptic_challenges array and future_self_challenges array, each with challenge text and counter_position.

You now have five of six agents fully defined. Your pipeline can collect data, validate it against device readings, score all domains, generate a priority action, and challenge whether you are being honest with yourself. Next up, you will run the entire pipeline end-to-end with a worked example before feeding in your own data.

Run Your First Assessment

Your entire multi-agent pipeline is built. You have six specialized agents with clear roles, refusal rules, and handoff contracts.

Now it is time to feed the system YOUR actual data and watch it produce a complete scored assessment. You will gather data from three sources: your Fitbit wearable, your body measurements, and a structured conversation. Then you will run each agent sequentially, passing outputs downstream until you have a final scored JSON file ready for the dashboard.

In this step, get ready to:
  • Review a worked example to understand what good output looks like.
  • Export your Fitbit data and gather physical measurements and self-test results.
  • Run all 5 pipeline agents sequentially in Claude Desktop and save your final scored data.
Review the worked example

Before running your own assessment, it helps to see what the pipeline produces for a sample person. This gives you a mental model of what good output looks like at each stage.

Here is the sample user profile the example is based on:

  • 35-year-old male, 5'10", 195 lbs, waist 36 inches.
  • Desk job, 3000 steps/day, no intentional exercise.
  • Eats out 4x/week, 2 sugary drinks/day.
  • Father had heart attack at 58.
  • Frequent afternoon energy crashes.
  • Fitbit VO2 max 32 ml/kg/min, sleep score 68.

For this profile, the system outputs these domain scores:

  • Cardiorespiratory: 3/10 (green confidence, device-confirmed via Fitbit VO2 max).
  • Metabolic: 4/10 (amber confidence, estimated from waist + diet + family history + energy crashes).
  • Strength: 2/10 (amber confidence, no exercise reported).
  • Sleep: 5/10 (green confidence, Fitbit sleep score 68).
  • Nutrition: 3/10 (amber confidence, eating out 4x/week + 2 sugary drinks/day).

The Priority Stack output for this user:

{
  "action": "Add 3x 30-minute brisk walks per week",
  "rationale": "This single action improves cardio, metabolic, and sleep domains simultaneously",
  "source": "Zone 2 cardio affects VO2 max, insulin sensitivity, and sleep architecture",
  "vision_capability": 1
}

How does the Vision Anchor connect?

For the example user, the system output says: "At current trajectory, Capability #1 (hiking 5 miles at 90) becomes unreachable by age 65 without intervention." Every score gap traces back to one of the five capabilities the user wrote in their Vision Anchor.

This is the Outlive philosophy made personal. A raw "3/10" score means nothing on its own. Connecting it to "you will not be able to carry your grandchild up stairs" creates the emotional urgency that drives behavior change.

Export your Fitbit data and gather physical measurements

Your pipeline needs three types of input data. The Fitbit export provides device-confirmed metrics (green confidence). Your body measurements and self-tests provide amber-confidence data that the Scoring Engine uses to fill the remaining domains.

  • Open the Fitbit settings page in your browser (or use the Fitbit mobile app).
  • Click Data Export under the Settings menu.
  • Choose a time period that covers the last 30 days. Select activity, sleep, and heart rate data. Choose CSV or JSON as the file format.
  • Click Download.
  • Move the downloaded export files into your Obsidian vault under /exports/.

What data are you looking for in the export?

The Data Integrator agent reads these specific values from your Fitbit export: Active Zone Minutes, Cardio Fitness Score (VO2 max estimate), resting heart rate trends, HRV (heart rate variability), and sleep scores. Your Fitbit Charge 6 tracks all of these.

You do not need to extract these values manually. The Data Integrator agent will read through your export files and identify them.

Next, gather your physical measurements. You need these for the Body Composition module of the Intake Interviewer.

  • Measure your waist circumference with a measuring tape at your navel, standing in a relaxed position.
  • Step on your scale and record your weight.
  • Measure or confirm your height.
  • Measure your hip circumference at the widest point (for waist-to-hip ratio calculation).

Finally, complete your three physical self-tests. Write down each result.

  • Max push-ups to failure: do as many push-ups as you can with good form until you cannot complete another one. Record the total count.
  • Single-leg balance with eyes closed: stand on one leg, close your eyes, and time how many seconds you can hold it before putting your foot down. Record the time in seconds.
  • Sit-and-rise test: from standing, lower yourself to sit cross-legged on the floor, then stand back up. Score 0-10 based on how many supports you used (start at 10, subtract 1 for each hand, knee, or forearm used, subtract 0.5 for loss of balance).

Record everything in one place

Write all your measurements and self-test results in a note or on paper before starting the Intake Interviewer. You will type these values into the conversation when the agent asks for them.

Run the full agent pipeline in Claude Desktop

With your Fitbit export in the vault and your measurements written down, you are ready to run the pipeline. You will paste each agent prompt into Claude Desktop and pass the output of one agent as input to the next.

  • Open Claude Desktop.
  • Start a new conversation. Copy the full contents of /agents/01-intake-interviewer.md and paste it into the chat as your first message.
  • The agent will begin asking you structured questions across 5 modules: Diet Pattern, Exercise Routine, Family History, Body Composition, and Symptoms/Signs.
  • Answer every question honestly. When the agent asks for your measurements, type in the values you recorded earlier.

What are predict-then-reveal moments?

At certain points during the interview, the agent will ask you to PREDICT a number before revealing the actual value from your Fitbit data. For example, it may ask "What percentile of fitness do you think you're in for your age group?" before showing your actual VO2 max percentile.

Write down your prediction on paper before looking at the revealed number. The gap between what you predicted and reality is itself a data point. These moments create emotional insight that drives engagement with the system.

  • When the Intake Interviewer finishes, it outputs structured JSON. Copy this entire output.
  • Save the output to /scores/ in your vault as a file named with today's date (e.g. 2026-05-13-intake.json).

Now run the remaining agents in sequence. Each agent takes the previous output as its input.

  • Start a new conversation in Claude Desktop. Paste the contents of /agents/02-data-integrator.md. Then paste your Fitbit export data and the Intake Interviewer output. The agent will cross-validate and produce integrated data.
  • Start a new conversation. Paste /agents/03-scoring-engine.md. Then paste the Data Integrator output. The agent produces domain scores (1-10) for all 5 domains with confidence levels and Vision Anchor connections.
  • Start a new conversation. Paste /agents/04-protocol-architect.md. Then paste the Scoring Engine output plus your Vision Anchor. The agent produces your Priority Stack, Minimum Effective Dose, Target Dose, and Disruption Contingency.
  • Start a new conversation. Paste /agents/05-pressure-tester.md. Then paste all previous outputs. The Skeptic and Future Self at 75 personas will challenge your data and your protocol.

Why a new conversation for each agent?

Each agent has a distinct role and refusal rules. Running them in separate conversations prevents context bleed between roles. It also mirrors how a real multi-agent system works: each agent receives only its contracted inputs, not the full conversation history.

  • After running all 5 agents, compile the Scoring Engine output into a final JSON file. Open /scores/template-scores.json as your reference for the expected structure.
  • Create a new file in /scores/ named with today's date (e.g. 2026-05-13-scores.json). Populate it with your actual scores, vision anchor capabilities, predictions from your predict-then-reveal moments, and the Priority Stack from the Protocol Architect output.
  • Verify your JSON file has all 5 domains scored, each with a confidence level (green, amber, or gray), and that the priority_stack object has an action, rationale, source, and vision_capability number.

What does the final scored file look like?

Your YYYY-MM-DD-scores.json follows the exact structure of template-scores.json but with your real data filled in. The vision_anchor array contains your 5 capabilities from vision-anchor.md. Each domain has a real score (1-10), a confidence level, and a vision_link string explaining how that score connects to your personal goals.

The predictions array records your predict-then-reveal moments: what you guessed, what the actual value was, and the gap between them.

🙋‍♀️ Agent not producing structured JSON?

If an agent returns plain prose instead of structured JSON, add this line at the end of your prompt paste: "Please output your response as structured JSON matching the schema defined in your system prompt."

If the Pressure Tester refuses to challenge your data, make sure you pasted the full prompt including both persona definitions. The agent needs both the Skeptic and Future Self at 75 persona sections to operate correctly.

Help me get structured JSON output from my Intake Interviewer agent in Claude Desktop.

You now have a complete scored assessment saved locally in your vault. Every domain is scored, every score connects to your Vision Anchor, and the Pressure Tester has challenged your blind spots. Next up, you will turn this raw JSON into an interactive visual dashboard using Claude Code.

Build the Interactive Dashboard

You have scored data for all 5 domains, a Priority Stack, and predictions saved in your vault. Now you need a way to actually see your trajectory at a glance.

In this step, you will use Claude Code to generate a fully interactive HTML dashboard that visualizes your scores, projects your trajectory, and shows you exactly where your next hour of effort should go.

In this step, get ready to:
  • Launch Claude Code and generate the core dashboard with radar chart and source-quality indicators.
  • Extend the dashboard with trajectory projections and quarterly comparison views.
  • Add a collapsible Data Upgrade Path section for optional lab panel information.
Launch Claude Code and generate the core dashboard

Claude Code reads your CLAUDE.md file automatically when it starts a session from your vault root. This means it already knows your project conventions, data schema, color codes, and privacy rules.

  • Navigate to your vault's dashboard folder in PowerShell by running this command:
cd ~/Desktop/decade-scorecard/dashboard

What does this command do?

This moves your terminal into the /dashboard folder inside your Obsidian vault. Claude Code will create the index.html file here.

  • Start Claude Code by running:
claude

What happens when Claude Code starts?

Claude Code automatically reads the CLAUDE.md file from your vault root. This gives it your entire project context: the dark theme, the 6px colored dots, the data schema, the privacy rules, and the Chart.js requirement.

Once Claude Code is running, you need to give it your scored data and instruct it to build the dashboard.

  • Paste the following prompt into your Claude Code session:
Read the CLAUDE.md file at the vault root for project conventions. Then read my scored data from /scores/ (the most recent JSON file).

Generate a single-file interactive HTML dashboard at dashboard/index.html with:
1. My Vision Anchor (5 capabilities at 90) displayed prominently at the top
2. A radar chart showing my 5-domain scores with a target overlay at 7/7/7/7/7 using Chart.js from CDN
3. Small 6px colored dot indicators next to each domain score (green = device data, amber = lifestyle estimate, gray = low confidence) that show a tooltip on hover with the source detail AND counter-position note
4. A Priority Stack box showing my single highest-leverage action, its rationale, and which Vision Anchor capability it supports
5. The dashboard should use localStorage to persist scores and support an updateScores() function exposed on window
6. Dark theme with the colors defined in CLAUDE.md
7. Include a one-line educational disclaimer in the header
8. Make it responsive (single column on mobile)

What does this prompt do?

This prompt instructs Claude Code to generate the entire index.html file as a self-contained dashboard. Claude Code reads your scored JSON to populate the data structure and uses your CLAUDE.md conventions for styling decisions.

The updateScores() function exposed on window lets you update your dashboard from the browser console in future quarterly runs without regenerating the file.

  • Wait for Claude Code to generate the file. It will create dashboard/index.html with the complete dashboard code.
  • Open index.html in your browser by double-clicking the file in File Explorer, or by running:
start index.html

You should see a dark-themed dashboard with your Vision Anchor listed at the top, a radar chart with your 5 scores plotted against a dashed green target line, and colored dots next to each domain score.

Dashboard looks broken or blank?

If the radar chart does not render, check that your browser has internet access. The dashboard loads Chart.js from a CDN, so it needs a network connection on first load.

If the scores all show 0/10, your scored data may not be in localStorage yet. Open the browser console (F12) and run updateScores() with your data object to populate it.

Help me debug my dashboard

Extend the dashboard with trajectory and quarterly views

The core dashboard shows where you are right now. The next layer shows where you are heading and how you have changed over time.

  • In your Claude Code session, paste this follow-up prompt:
Extend dashboard/index.html with two new sections:

1. Trajectory Projection: A card that shows "At this rate, here's your estimated path toward each of your 5 capabilities." For each Vision Anchor capability, show whether current scores support reaching it, with a simple status indicator.

2. Quarterly Delta: A card that reads the 'decade-scorecard-history' key from localStorage. If previous scores exist, show the delta for each domain with trend arrows (up arrow for improvement, down arrow for decline, dash for stable). If no history exists yet, show a message saying the comparison will appear after the next quarterly run.

Also add a subtle legend in the footer of the Domain Scores card explaining the three dot colors (green = Device data, amber = Lifestyle estimate, gray = Low confidence).

Keep the source-quality dots small (6px circles) and non-intrusive. Tooltips on hover should show the specific source AND counter-position note. Not bracketed text. Elegant.

What do these sections add?

The Trajectory Projection connects your current scores to your Vision Anchor capabilities. It makes the gap between "where I am" and "where I want to be at 90" visible at a glance.

The Quarterly Delta reads from localStorage history. After your second quarterly run, this card will show whether each domain improved, declined, or stayed stable with directional arrows.

  • Wait for Claude Code to update the file.
  • Refresh index.html in your browser.

You should now see two new cards below the Priority Stack: one showing trajectory projections per capability, and one showing the quarterly delta (which will say no previous data exists yet).

New sections not appearing?

Make sure you refreshed the browser after Claude Code finished writing the file. If the file did not update, check in Claude Code that it confirmed the write was successful.

Help me troubleshoot my dashboard update

Add the collapsible Data Upgrade Path section

Your dashboard is fully functional with estimated scores. Some users may eventually want to upgrade specific domains to confirmed precision with lab data. This section stays hidden by default so it does not clutter the main view.

  • In your Claude Code session, paste this final prompt:
Add a collapsible section at the very bottom of the dashboard (below the grid), collapsed by default using HTML details/summary elements.

Summary text: "Optional: Upgrade estimates to confirmed data"

Content explains: Your current scores are estimated from lifestyle conversation and wearable readings. They are functional and actionable as-is. If you ever want to upgrade specific domains to confirmed precision on your own timeline, here are options:

- Instalab Advanced Heart Panel ($89): ApoB, Lp(a), HbA1c, fasting insulin, hs-CRP
- Labcorp OnDemand ApoB ($69): Single cardiovascular particle test
- Ask your physician to add these to your next routine blood work (may be covered by insurance)
- Function Health ($499/yr): 160+ biomarkers, twice per year

End with: "When you have confirmed data, input it into the system and your amber dots upgrade to green."

Style it subtle: smaller text, muted colors, thin border. This is reference material, not a call to action.

Why is this collapsed by default?

The system works completely without lab data. Surfacing the upgrade path as a prominent feature would undermine the system's core promise: a $0, fully functional scorecard from Day 1. Keeping it collapsed signals "this exists if you want it" without pressuring anyone to spend money.

  • Wait for Claude Code to update the file.
  • Refresh index.html in your browser.

Scroll to the bottom of the page. You should see a collapsed line that says "Optional: Upgrade estimates to confirmed data." Click it to expand and verify the lab panel options are listed.

Section not collapsing properly?

Make sure Claude Code used the HTML <details> and <summary> elements. These are native HTML and work in all modern browsers without JavaScript.

Help me fix the collapsible section

  • Load your actual scored data into the dashboard. Open the browser console (press F12, then click the Console tab) and paste:
// Paste your scored data here to populate the dashboard
updateScores({
    vision_anchor: [
        'Your capability 1',
        'Your capability 2',
        'Your capability 3',
        'Your capability 4',
        'Your capability 5'
    ],
    domains: {
        cardiorespiratory: { score: 0, confidence: 'green', label: 'Cardiorespiratory Fitness', source_detail: 'Fitbit Cardio Fitness Score + Active Zone Minutes', counter_position: 'Fitbit VO2 max has 10-15% error margin vs lab testing. Trends reliable, absolute values directional.' },
        metabolic: { score: 0, confidence: 'amber', label: 'Metabolic Health', source_detail: 'Estimated from diet pattern, waist circumference, family history, and symptom profile', counter_position: 'Lifestyle correlations are population-level. Some individuals with these patterns have normal insulin. Only a fasting insulin test confirms.' },
        strength: { score: 0, confidence: 'amber', label: 'Strength and Stability', source_detail: 'Physical self-tests: push-ups, balance, sit-and-rise', counter_position: 'Self-administered tests have form variability. Results are directional, not clinical-grade.' },
        sleep: { score: 0, confidence: 'green', label: 'Sleep and Recovery', source_detail: 'Fitbit sleep score, HRV, and sleep stages', counter_position: 'Consumer wearable sleep staging is approximate. Trends are more reliable than single-night readings.' },
        nutrition: { score: 0, confidence: 'amber', label: 'Nutritional Pattern', source_detail: 'Conversational assessment cross-validated with energy patterns', counter_position: 'Self-reported diet data is known to be unreliable. People underreport calories by 30-50%. Cross-validation with symptoms helps but does not eliminate this.' }
    },
    priority_stack: { action: 'Your priority action here', rationale: 'Your rationale here', source: 'scoring-engine', vision_capability: 1 }
})

What does this do?

Replace the placeholder values with your actual scores from /scores/YYYY-MM-DD-scores.json. The updateScores() function saves your data to localStorage and immediately re-renders the dashboard with your real numbers.

It also pushes a copy to decade-scorecard-history in localStorage, which the Quarterly Delta card will use to show changes over time.

  • After pasting and pressing Enter, your dashboard should immediately update with your actual scores, radar chart, and priority action.
  • Hover over the colored dots next to each score. You should see a tooltip with the source detail and counter-position note.

Save a bookmark

Bookmark the index.html file path in your browser. Since all data lives in localStorage, you can reopen it anytime and your scores persist between sessions.

✔️ Awesome, I've got everything!

Great. Double check you have saved your file and your dashboard is rendering with your actual scores.

ⓧ I'd like to double check the full code

Here is the complete dashboard/index.html for reference. Your Claude Code output should match this structure closely.

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Decade Scorecard</title>
    <script src="https://cdn.jsdelivr.net/npm/chart.js@4.4.7/dist/chart.umd.min.js"></script>
    <style>
        * { margin: 0; padding: 0; box-sizing: border-box; }
        :root {
            --bg-primary: #0f172a;
            --bg-card: #1e293b;
            --text-primary: #f8fafc;
            --text-secondary: #94a3b8;
            --green: #4ade80;
            --amber: #f59e0b;
            --gray: #6b7280;
            --blue: #60a5fa;
            --purple: #a78bfa;
            --red: #f87171;
        }
        body {
            font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif;
            background: var(--bg-primary);
            color: var(--text-primary);
            line-height: 1.6;
            padding: 2rem;
        }
        .container { max-width: 1200px; margin: 0 auto; }
        .header {
            text-align: center;
            margin-bottom: 2rem;
            padding-bottom: 1rem;
            border-bottom: 1px solid #334155;
        }
        .header h1 { font-size: 1.8rem; margin-bottom: 0.5rem; }
        .header .subtitle { color: var(--text-secondary); font-size: 0.9rem; }
        .header .disclaimer-line {
            color: var(--text-secondary);
            font-size: 0.75rem;
            margin-top: 0.5rem;
            opacity: 0.7;
        }
        .vision-anchor {
            background: linear-gradient(135deg, #1e293b, #0f172a);
            border: 1px solid var(--purple);
            border-radius: 12px;
            padding: 1.5rem;
            margin-bottom: 2rem;
        }
        .vision-anchor h2 { color: var(--purple); font-size: 1rem; margin-bottom: 0.75rem; }
        .vision-anchor ol { padding-left: 1.5rem; }
        .vision-anchor li { color: var(--text-secondary); font-size: 0.85rem; margin-bottom: 0.4rem; }
        .grid { display: grid; grid-template-columns: 1fr 1fr; gap: 1.5rem; margin-bottom: 2rem; }
        .card {
            background: var(--bg-card);
            border-radius: 12px;
            padding: 1.5rem;
            border: 1px solid #334155;
        }
        .card h2 { font-size: 1.1rem; margin-bottom: 1rem; color: var(--blue); }
        .card.full-width { grid-column: 1 / -1; }
        .score-row {
            display: flex;
            justify-content: space-between;
            align-items: center;
            padding: 0.5rem 0;
            border-bottom: 1px solid #334155;
        }
        .score-row:last-child { border-bottom: none; }
        .score-label { font-size: 0.9rem; display: flex; align-items: center; gap: 0.4rem; }
        .score-value { font-weight: bold; font-size: 1.1rem; }
        .source-dot {
            display: inline-block;
            width: 6px;
            height: 6px;
            border-radius: 50%;
            cursor: help;
            position: relative;
        }
        .source-dot.green { background: var(--green); }
        .source-dot.amber { background: var(--amber); }
        .source-dot.gray { background: var(--gray); }
        .source-dot:hover::after {
            content: attr(data-tooltip);
            position: absolute;
            bottom: 14px;
            left: 50%;
            transform: translateX(-50%);
            background: #334155;
            color: var(--text-primary);
            padding: 6px 10px;
            border-radius: 6px;
            font-size: 0.7rem;
            white-space: normal;
            width: 220px;
            z-index: 10;
            line-height: 1.4;
            box-shadow: 0 4px 12px rgba(0,0,0,0.3);
        }
        .priority-box {
            background: linear-gradient(135deg, #1e3a5f, #1e293b);
            border: 2px solid var(--blue);
            border-radius: 12px;
            padding: 1.5rem;
            text-align: center;
        }
        .priority-box h3 { color: var(--blue); margin-bottom: 0.5rem; font-size: 0.9rem; }
        .priority-box .action { font-size: 1.2rem; font-weight: bold; margin-bottom: 0.5rem; }
        .priority-box .rationale { color: var(--text-secondary); font-size: 0.85rem; }
        .priority-box .vision-link { color: var(--purple); font-size: 0.8rem; margin-top: 0.5rem; font-style: italic; }
        .chart-container { position: relative; height: 300px; }
        .legend { display: flex; gap: 1.2rem; margin-top: 1rem; flex-wrap: wrap; }
        .legend-item { display: flex; align-items: center; gap: 0.4rem; font-size: 0.75rem; color: var(--text-secondary); }
        details.upgrade-section {
            margin-top: 2rem;
            border: 1px solid #334155;
            border-radius: 8px;
            padding: 1rem;
        }
        details.upgrade-section summary {
            cursor: pointer;
            color: var(--text-secondary);
            font-size: 0.8rem;
        }
        details.upgrade-section .content {
            margin-top: 1rem;
            color: var(--text-secondary);
            font-size: 0.85rem;
        }
        @media print {
            body { background: white; color: black; }
            .card { border: 1px solid #ccc; break-inside: avoid; }
            .no-print { display: none; }
            details.upgrade-section { display: none; }
        }
        @media (max-width: 768px) {
            .grid { grid-template-columns: 1fr; }
        }
    </style>
</head>
<body>
    <div class="container">
        <div class="header">
            <h1>Decade Scorecard</h1>
            <p class="subtitle">Personal Trajectory System</p>
            <p class="subtitle" id="date-display"></p>
            <p class="disclaimer-line">Educational tracking tool. Not a medical device. All estimates derived from lifestyle data and validated screening instruments.</p>
        </div>
        <div class="vision-anchor">
            <h2>My Capabilities at 90</h2>
            <ol id="vision-list"></ol>
        </div>
        <div class="grid">
            <div class="card">
                <h2>Domain Scores</h2>
                <div id="scores-container"></div>
                <div class="legend">
                    <div class="legend-item"><span class="source-dot green"></span> Device data</div>
                    <div class="legend-item"><span class="source-dot amber"></span> Lifestyle estimate</div>
                    <div class="legend-item"><span class="source-dot gray"></span> Low confidence</div>
                </div>
            </div>
            <div class="card">
                <h2>Radar Overview</h2>
                <div class="chart-container">
                    <canvas id="radarChart"></canvas>
                </div>
            </div>
            <div class="card full-width">
                <div class="priority-box">
                    <h3>YOUR SINGLE HIGHEST-LEVERAGE ACTION</h3>
                    <div class="action" id="priority-action">Loading...</div>
                    <div class="rationale" id="priority-rationale"></div>
                    <div class="vision-link" id="priority-vision-link"></div>
                </div>
            </div>
            <div class="card">
                <h2>Trajectory Projection</h2>
                <div id="trajectory-display"></div>
            </div>
            <div class="card">
                <h2>Quarterly Delta</h2>
                <div id="delta-display"></div>
            </div>
        </div>
        <details class="upgrade-section">
            <summary>Optional: Upgrade estimates to confirmed data</summary>
            <div class="content">
                <p>Your current scores are estimated from lifestyle conversation and wearable readings. They are functional and actionable as-is. If you ever want to upgrade specific domains to confirmed precision on your own timeline, here are options:</p>
                <ul style="margin-top: 0.5rem; padding-left: 1.5rem;">
                    <li style="margin-bottom: 0.3rem;">Instalab Advanced Heart Panel ($89): ApoB, Lp(a), HbA1c, fasting insulin, hs-CRP</li>
                    <li style="margin-bottom: 0.3rem;">Labcorp OnDemand ApoB ($69): Single cardiovascular particle test</li>
                    <li style="margin-bottom: 0.3rem;">Ask your physician to add these to your next routine blood work (may be covered by insurance)</li>
                    <li style="margin-bottom: 0.3rem;">Function Health ($499/yr): 160+ biomarkers, twice per year</li>
                </ul>
                <p style="margin-top: 0.5rem;">When you have confirmed data, input it into the system and your amber dots upgrade to green.</p>
            </div>
        </details>
    </div>
    <script>
        const SCORE_DATA = {
            metadata: { date: new Date().toISOString().split('T')[0], version: '1.0' },
            vision_anchor: [
                'Carry my grandchild up a flight of stairs without stopping',
                'Hike 5 miles on uneven terrain',
                'Get up from the floor without using my hands',
                'Travel internationally for 12+ hours without recovery days',
                'Think clearly enough to hold a complex strategic conversation'
            ],
            domains: {
                cardiorespiratory: { score: 0, confidence: 'green', label: 'Cardiorespiratory Fitness', source_detail: 'Fitbit Cardio Fitness Score + Active Zone Minutes', counter_position: 'Fitbit VO2 max has 10-15% error margin vs lab testing. Trends reliable, absolute values directional.' },
                metabolic: { score: 0, confidence: 'amber', label: 'Metabolic Health', source_detail: 'Estimated from diet pattern, waist circumference, family history, and symptom profile', counter_position: 'Lifestyle correlations are population-level. Some individuals with these patterns have normal insulin. Only a fasting insulin test confirms.' },
                strength: { score: 0, confidence: 'amber', label: 'Strength and Stability', source_detail: 'Physical self-tests: push-ups, balance, sit-and-rise', counter_position: 'Self-administered tests have form variability. Results are directional, not clinical-grade.' },
                sleep: { score: 0, confidence: 'green', label: 'Sleep and Recovery', source_detail: 'Fitbit sleep score, HRV, and sleep stages', counter_position: 'Consumer wearable sleep staging is approximate. Trends are more reliable than single-night readings.' },
                nutrition: { score: 0, confidence: 'amber', label: 'Nutritional Pattern', source_detail: 'Conversational assessment cross-validated with energy patterns', counter_position: 'Self-reported diet data is known to be unreliable. People underreport calories by 30-50%. Cross-validation with symptoms helps but does not eliminate this.' }
            },
            priority_stack: { action: '', rationale: '', source: '', vision_capability: 0 }
        };

        function loadScores() {
            const stored = localStorage.getItem('decade-scorecard-current');
            if (stored) {
                const parsed = JSON.parse(stored);
                Object.assign(SCORE_DATA, parsed);
            }
            renderDashboard();
        }

        function renderDashboard() {
            document.getElementById('date-display').textContent = `Assessment: ${SCORE_DATA.metadata.date}`;
            const visionList = document.getElementById('vision-list');
            visionList.innerHTML = SCORE_DATA.vision_anchor.map(v => `<li>${v}</li>`).join('');
            const scoresContainer = document.getElementById('scores-container');
            scoresContainer.innerHTML = '';
            Object.entries(SCORE_DATA.domains).forEach(([key, domain]) => {
                const tooltip = `${domain.source_detail}. Counter: ${domain.counter_position}`;
                const row = document.createElement('div');
                row.className = 'score-row';
                row.innerHTML = `
                    <span class="score-label">
                        <span class="source-dot ${domain.confidence}" data-tooltip="${tooltip}"></span>
                        ${domain.label}
                    </span>
                    <span class="score-value">${domain.score}/10</span>
                `;
                scoresContainer.appendChild(row);
            });
            renderRadar();
            renderPriority();
        }

        function renderRadar() {
            const ctx = document.getElementById('radarChart').getContext('2d');
            const labels = Object.values(SCORE_DATA.domains).map(d => d.label);
            const scores = Object.values(SCORE_DATA.domains).map(d => d.score);
            const targets = [7, 7, 7, 7, 7];
            new Chart(ctx, {
                type: 'radar',
                data: {
                    labels: labels,
                    datasets: [
                        { label: 'Current', data: scores, backgroundColor: 'rgba(96, 165, 250, 0.2)', borderColor: '#60a5fa', borderWidth: 2, pointBackgroundColor: '#60a5fa' },
                        { label: 'Target', data: targets, backgroundColor: 'rgba(74, 222, 128, 0.1)', borderColor: '#4ade80', borderWidth: 1, borderDash: [5, 5], pointBackgroundColor: '#4ade80' }
                    ]
                },
                options: {
                    responsive: true,
                    maintainAspectRatio: false,
                    scales: { r: { beginAtZero: true, max: 10, grid: { color: '#334155' }, angleLines: { color: '#334155' }, pointLabels: { color: '#94a3b8', font: { size: 10 } }, ticks: { color: '#94a3b8', backdropColor: 'transparent' } } },
                    plugins: { legend: { labels: { color: '#f8fafc' } } }
                }
            });
        }

        function renderPriority() {
            const action = SCORE_DATA.priority_stack.action || 'Complete your first assessment to generate priority';
            const rationale = SCORE_DATA.priority_stack.rationale || 'Run the Intake Interviewer agent in Claude Desktop to begin.';
            const visionLink = SCORE_DATA.priority_stack.vision_capability > 0
                ? `Supports: "${SCORE_DATA.vision_anchor[SCORE_DATA.priority_stack.vision_capability - 1]}"`
                : '';
            document.getElementById('priority-action').textContent = action;
            document.getElementById('priority-rationale').textContent = rationale;
            document.getElementById('priority-vision-link').textContent = visionLink;
        }

        function updateScores(newData) {
            Object.assign(SCORE_DATA, newData);
            SCORE_DATA.metadata.date = new Date().toISOString().split('T')[0];
            localStorage.setItem('decade-scorecard-current', JSON.stringify(SCORE_DATA));
            const history = JSON.parse(localStorage.getItem('decade-scorecard-history') || '[]');
            history.push(JSON.parse(JSON.stringify(SCORE_DATA)));
            localStorage.setItem('decade-scorecard-history', JSON.stringify(history));
            renderDashboard();
        }

        window.updateScores = updateScores;
        loadScores();
    </script>
</body>
</html>

Your interactive dashboard is live. Next up, you will set up the weekly check-in system and quarterly re-run protocol that keep this system alive between full assessments.

Set Up Reviews, Check-ins, and Quarterly Re-runs

Your dashboard is live, your scores are populated, and your Priority Stack tells you exactly where to focus. But information without a system for action is just noise.

In this step, you will build the behavioral layer that converts your one-time assessment into a living system. You will create a structured reflection, a weekly accountability pulse, and a quarterly re-assessment protocol that keeps you honest over time.

In this step, get ready to:
  • Conduct your After Action Review to convert raw scores into emotional insight.
  • Create a 2-minute weekly check-in template that bridges the 90-day gap between quarterly audits.
  • Build a quarterly re-run protocol with an anti-drift re-anchor and validate your mental model of the full system.
Conduct your After Action Review

An After Action Review (AAR) is a structured reflection borrowed from military debriefs. It converts raw information into behavioral insight by forcing you to name what surprised you and what you commit to doing differently.

  • Create a new file in your Obsidian vault at /scores/ with the filename pattern YYYY-MM-DD-aar.md (using today's date).
  • Paste the following AAR template into the file:
# After Action Review: [DATE]

## 1. What surprised me about my scores?
[User's answer]

## 2. Where was I most wrong in my predictions vs reality?
[User's answer - references predict-then-reveal gaps]

## 3. What is the single biggest gap between where I am and my Vision Anchor?
[User's answer - references specific capability]

## 4. What am I committing to do in the next 7 days based on my Priority Stack?
[User's specific commitment with day and time]

What do these 4 questions do?

  • Question 1 surfaces blind spots. Surprise means your mental model was wrong somewhere.
  • Question 2 uses your predict-then-reveal data from the assessment. The gap between prediction and reality is itself a data point about self-awareness.
  • Question 3 connects your lowest score back to a specific Vision Anchor capability. This makes the gap emotionally real.
  • Question 4 forces a concrete commitment with a specific day and time. Vague intentions ("exercise more") don't count.
  • Replace [DATE] with today's date.
  • Answer all 4 questions now. Write honest, specific answers. Reference your actual scores, your predict-then-reveal gaps from Step 5, and the specific Vision Anchor capability that is most at risk.
  • For Question 4, name the exact day and time you will do your Priority Stack action this week.
  • Save the file in Obsidian.

Open the /scores/ folder in Obsidian's sidebar. You should see your new AAR file alongside your score files from Step 5.

Not sure what to write?

Look at your dashboard's Priority Stack section for Question 4. For Question 2, compare the predictions you wrote down in Step 5 (before the reveal) to your actual Fitbit data. If you forgot to write down predictions, use Question 1 to reflect on which domain score surprised you the most.

Help me figure out what to write in my After Action Review based on my scores.

Set up the 7-day micro check-in

A quarterly assessment without weekly accountability is like a gym membership you never use. The 90-day gap between full re-runs is long enough for habits to silently drift. A 2-minute weekly check-in bridges that gap.

  • Create a new file at /check-ins/weekly-template.md in your Obsidian vault by pasting the following template:
# Weekly Check-in: [DATE]

## Priority Stack Action
**Committed action**: [from last week]
**Did I do it?**: Yes / No
**If no, what got in the way?**:

## Quick Pulse
- Energy level this week (1-10):
- Sleep quality this week (1-10):
- Did anything break my routine?:

## Next 7 Days
**My specific commitment**:
**When exactly will I do it?** (day + time):

---
*Time to complete: 2 minutes. This bridges the 90-day gap between quarterly audits.*

Why only 3 questions?

The weekly check-in is deliberately minimal. It asks one accountability question (did you do it?), one awareness question (what's your energy and sleep like?), and one commitment question (what will you do next week?). If it takes more than 2 minutes, you will stop doing it. The constraint is the feature.

  • Save weekly-template.md in Obsidian.
  • Open your phone's calendar or reminder app.
  • Create a weekly recurring reminder for the same day and time each week (Sunday evening works well).
  • Title the reminder something like "2-min scorecard check-in" so you remember what it is.

Open the /check-ins/ folder in Obsidian. You should see weekly-template.md ready to duplicate each week.

How to use the template each week

Each week, duplicate weekly-template.md and rename the copy with the current date (e.g., 2026-05-18.md). Fill in your answers. Over time, your /check-ins/ folder becomes a log of your weekly commitments and whether you kept them.

Set up the quarterly re-run protocol and validate your mental model

Your full assessment takes about 60 minutes. But after the first run, most of your data is already established. A quarterly re-run only needs to capture what changed. This compressed protocol takes 15 minutes and starts with the most important question: have you quietly lowered the bar on your vision?

  • Create a new file at /agents/quarterly-rerun.md in your Obsidian vault by pasting the following protocol:
# Quarterly Re-run Protocol (15-minute version)

## Anti-Drift Re-anchor (2 min)
Before anything else, re-read your Vision Anchor.
Ask: "Are these still your 5 capabilities at 90? Or have you quietly lowered the bar?"
If any capability has changed, update /scores/vision-anchor.md first.

## Pre-load (1 min)
- Open last quarter's score file from /scores/
- Note your previous domain scores
- Export fresh Fitbit data to /exports/

## Delta Assessment (8 min)
Run a compressed version of the Intake Interviewer focusing only on what changed:
- What changed in your exercise routine?
- What changed in your diet pattern?
- Any new family history information?
- Updated body measurements?
- Any new symptoms or resolved symptoms?

## Score Recalculation (2 min)
- Run Scoring Engine with updated data
- Compare new scores to previous scores
- Calculate deltas (+ or - per domain)

## Accountability Review (2 min)
- What did you commit to last quarter?
- What actually happened?
- What is your Priority Stack action for next quarter?

## Save and Archive
- Save new scores to /scores/YYYY-MM-DD-scores.json
- Update dashboard via updateScores() function
- Create new AAR file

What is the Anti-Drift Re-anchor?

Over time, people unconsciously lower their standards to match their current behavior. You might quietly redefine "hike 5 miles" as "walk 2 miles" without noticing. The Anti-Drift Re-anchor forces you to re-read your original Vision Anchor before re-scoring. If your goals have genuinely changed, that is fine. But the change should be conscious, not a slow compromise.

  • Save quarterly-rerun.md in Obsidian.

Open the /agents/ folder. You should see quarterly-rerun.md alongside your 5 agent prompt files and cross-validation-rules.md.

Now, validate that you own the mental model of the entire system. This recall exercise proves you understand the architecture, not just the outputs.

  • Open Mermaid Live Editor in your browser at mermaid.live.
  • Without looking at your Step 2 diagram, sketch the full system architecture from memory. Include all 6 agents, data sources (Fitbit, conversation, self-tests), handoffs between agents, output artifacts (scores, dashboard, protocols), the quarterly loop, and the weekly check-in cycle.
  • Once complete, open your original diagram from Step 2 in Obsidian and compare the two side by side.
  • Save both versions in your vault. Copy the new Mermaid source into a file at /agents/architecture-recall.md so you can track how your understanding evolves over quarterly cycles.

Why sketch from memory?

If you can reproduce the system architecture without looking, you have internalized the multi-agent pipeline pattern. This is the transferable skill from this project. The same architecture (specialized agents with clear handoffs, cross-validation, structured outputs) applies to any domain you want to build an AI system for.

🙋‍♀️ Can't remember all 6 agents?

Start with what you remember. Even getting 3-4 agents correct shows understanding. The point is to find the gaps in your recall, not to produce a perfect diagram on the first try. After comparing, note which agents or handoffs you forgot. Those are the parts of the system you understand least.

Help me remember the 6-agent pipeline architecture for my Decade Scorecard system.

✔️ Awesome, I've got everything!

Great. Double check you have saved all three files: your AAR, your weekly template, and your quarterly re-run protocol.

ⓧ I'd like to double check the full file list

Here is what your vault should contain after this step. Confirm each file exists in the correct folder:

  • /agents/quarterly-rerun.md
  • /check-ins/weekly-template.md
  • /scores/YYYY-MM-DD-aar.md (with your answers filled in)
  • /agents/architecture-recall.md (your from-memory Mermaid diagram)

Secret mission

Add a Biological Age Clock Visualization

Your dashboard shows domain scores and priority actions. But what if you could see one single number that captures your overall trajectory? Build an animated Biological Age Clock that estimates your functional age versus your chronological age, and watch the gap close as you improve.

Clean Up Your Resources

Clean Up Your Resources

This project runs entirely locally on your machine. There are no cloud resources, no paid services, and no persistent infrastructure to worry about.

Decide whether to keep your resources running, pause them to come back later, or delete them entirely.

Resources you used:

  • The decade-scorecard Obsidian vault folder (contains all agent prompts, score files, exports, dashboard, and check-in templates).
  • Browser localStorage data (stored by the dashboard when opened locally).

Keep everything running

No action needed. Choose this if you plan to use the system for weekly check-ins and quarterly re-runs.

  • Your vault persists indefinitely on your local machine.
  • Weekly check-ins take under 2 minutes.
  • Quarterly re-runs take about 15 minutes.
  • The system compounds in value with each cycle as you accumulate longitudinal data.

Pause - I'll come back to this later

Archive the vault so it is out of the way until your next quarterly run.

  • Compress the decade-scorecard folder into a zip file and store it wherever you keep archives.
  • When you are ready to resume, extract the zip back to your Desktop and reopen it in Obsidian.
  • Your score history and agent prompts will be exactly as you left them.

Delete - I don't want to use this again

Remove all project files and data permanently.

  • Delete the Obsidian vault folder by running the appropriate command for your operating system.

macOS

rm -rf ~/Desktop/decade-scorecard

Windows

Remove-Item -Recurse -Force "$HOME\Desktop\decade-scorecard"
  • Clear the dashboard localStorage data. Open your browser's developer console and run:
localStorage.removeItem('decade-scorecard-current');
localStorage.removeItem('decade-scorecard-history');
  • All project data is now gone. No lingering services or subscriptions remain.

That's a Wrap!

That's a Wrap!

Nice work. You just built a personal AI implementation of the Outlive longevity framework from scratch in 60 minutes.

You've learned how to:

  • Design and build a 6-agent AI pipeline that conducts structured assessments, cross-validates self-reported data against wearable exports, and estimates scores across all health domains using validated screening instruments.
  • Generate an interactive HTML dashboard with Claude Code featuring radar charts, visual source-quality indicators, trajectory projections, and a priority stack that connects to your Personal Vision Anchor.
  • Build a reusable quarterly system in Obsidian with 7-day micro check-ins, anti-drift re-anchoring, and longitudinal score tracking that compounds in value over time.
  • Secret Mission: Add a Biological Age Clock visualization that estimates your functional age vs chronological age and animates the delta closing as your scores improve.

Ready to quiz yourself?