A deterministic end-of-day reflection agent. No LLM at runtime. Same answers → same path → same reflection. Every time.
/tree/
reflection-tree.json ← Part A: the full tree data
tree-diagram.md ← Part A: Mermaid visual diagram
/agent/
index.html ← Part B: runnable web agent (single file, no dependencies)
/transcripts/
persona-1-transcript.md ← Part B: Victor/Contributing/Altrocentric path
persona-2-transcript.md ← Part B: Victim/Entitled/Self-centric path
write-up.md ← Part A: design rationale (question design, branching, sources)
README.md ← this file
No installation required. The agent is a single self-contained HTML file.
- Open
/agent/index.htmlin any modern browser (Chrome, Firefox, Safari, Edge) - That's it. No server, no npm, no API keys.
The tree data is embedded inline in the HTML (equivalent to loading from file). Alternatively, to run with the external JSON file, place reflection-tree.json and index.html in the same directory and add a fetch('reflection-tree.json') call — the tree schema supports this with no code changes.
Keyboard shortcuts: Press 1–4 to select options, Enter to continue.
The tree is stored in /tree/reflection-tree.json as an array of nodes. Each node has this shape:
{
"id": "A1_Q1_HIGH",
"parentId": "A1_D1",
"type": "question",
"text": "You said \"{A1_OPEN}\". When something went right — what made it happen?",
"options": [
{ "label": "I prepared or thought it through beforehand", "value": "prepared", "signal": "axis1:internal" },
{ "label": "The timing was just good — things aligned", "value": "timing", "signal": "axis1:external" }
],
"target": null,
"signal": null
}| Type | Behavior | User interaction |
|---|---|---|
start |
Opens session | None — click Begin |
question |
Asks with fixed options | Employee picks one, clicks Continue |
decision |
Internal routing (invisible) | None — auto-advances |
reflection |
Shows insight based on path | Employee reads, clicks Continue |
bridge |
Transitions between axes | None — auto-advances |
summary |
End-of-session synthesis | Employee reads, clicks Close |
end |
Closes session | None |
Decision nodes use one of three routing patterns in their options array:
// Pattern 1: Route based on the raw answer value from the previous question
{ "match": ["sunny", "unpredictable"], "goto": "A1_Q1_HIGH" }
// Pattern 2: Route based on the signal from the most recent answered question
{ "matchSignal": "axis1:internal", "goto": "A1_Q2_INT" }
// Pattern 3: Route based on the dominant accumulated signal for an axis
{ "matchDominant": "axis1:internal", "goto": "A1_R_INT" }
// Pattern 4: Route based on dominant signals across all 3 axes (summary routing)
{ "matchAllDominant": ["axis1:internal", "axis2:contribution", "axis3:altro"], "goto": "SUMMARY_INT_CONTRIB_ALTRO" }Each question option may carry a signal field:
"signal": "axis1:internal" → state.axis1.internal += 1
"signal": "axis1:external" → state.axis1.external += 1
"signal": "axis2:contribution" → state.axis2.contribution += 1
"signal": "axis2:entitlement" → state.axis2.entitlement += 1
"signal": "axis3:altro" → state.axis3.altro += 1
"signal": "axis3:self" → state.axis3.self += 1
Reflection and summary nodes can reference earlier answers using {NODE_ID} syntax:
"You said \"{A1_OPEN}\" — but you also \"{A2_Q2_CONTRIB}\"."
The engine replaces {A1_OPEN} with the label of the option the employee selected at node A1_OPEN.
| Metric | Count |
|---|---|
| Total nodes | 55 |
| Question nodes | 12 |
| Decision nodes | 13 |
| Reflection nodes | 6 |
| Bridge nodes | 2 |
| Summary nodes | 8 |
| Start/End nodes | 2 |
| Possible conversation paths | 8 (2³ axis combinations) |
| Questions per session | 6 (2 per axis) |
| Options per question | 4 |
| Axis | Spectrum | Psychology |
|---|---|---|
| 1 — Locus | Victim ↔ Victor | Rotter (1954) Locus of Control; Dweck (2006) Growth Mindset |
| 2 — Orientation | Entitlement ↔ Contribution | Campbell et al. (2004); Organ (1988) OCB |
| 3 — Radius | Self-centrism ↔ Altrocentrism | Maslow (1969) Self-Transcendence; Batson (2011) Perspective-Taking |
The tree is the product. The LLM was the power tool used to build it.
The agent makes zero API calls at runtime. The entire intelligence — every branch, every reflection, every summary — is encoded in the tree structure. A different engine could load reflection-tree.json and produce an identical conversation, in any language or interface.