polymath-society 0.2.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (45) hide show
  1. package/LICENSE +52 -0
  2. package/README.md +311 -0
  3. package/dist/DATA-MAP.md +109 -0
  4. package/dist/cli.js +24136 -0
  5. package/dist/engine/closing-rubric.md +50 -0
  6. package/dist/engine/exp-allfacets.js +16832 -0
  7. package/dist/engine/exp-person.js +16922 -0
  8. package/dist/engine/exp-pipeline.js +16700 -0
  9. package/dist/engine/feel-seen-rubric.md +192 -0
  10. package/dist/engine/ingest-export.js +1423 -0
  11. package/dist/engine/peak-demos.js +16752 -0
  12. package/dist/engine/person-dimension-summary.js +16744 -0
  13. package/dist/engine/person-facet-lines.js +16784 -0
  14. package/dist/engine/person-headline.js +16733 -0
  15. package/dist/engine/person-report.js +16845 -0
  16. package/dist/engine/person-self-image.js +16689 -0
  17. package/dist/engine/public-report-guidelines.md +80 -0
  18. package/dist/engine/public-report.js +17284 -0
  19. package/dist/engine/run-analysis.js +16035 -0
  20. package/dist/engine/run-tagger.js +16092 -0
  21. package/dist/engine/top-companies.md +41 -0
  22. package/dist/engine/writing-well.md +56 -0
  23. package/dist/index.js +22021 -0
  24. package/dist/pipeline/TECHNIQUES.md +406 -0
  25. package/dist/pipeline/WRITING.md +48 -0
  26. package/dist/pipeline/coding-agglomerate.js +15876 -0
  27. package/dist/pipeline/coding-aggregate.js +440 -0
  28. package/dist/pipeline/coding-build.js +1168 -0
  29. package/dist/pipeline/coding-coaching.js +16893 -0
  30. package/dist/pipeline/coding-day-digest.js +15869 -0
  31. package/dist/pipeline/coding-delegation.js +16292 -0
  32. package/dist/pipeline/coding-expertise.js +15925 -0
  33. package/dist/pipeline/coding-flow.js +313 -0
  34. package/dist/pipeline/coding-frontier-detail.js +15878 -0
  35. package/dist/pipeline/coding-frontier.js +51 -0
  36. package/dist/pipeline/coding-gap-dist.js +293 -0
  37. package/dist/pipeline/coding-gap.js +17108 -0
  38. package/dist/pipeline/coding-grade.js +16195 -0
  39. package/dist/pipeline/coding-nutshell.js +15725 -0
  40. package/dist/pipeline/coding-projects.js +104 -0
  41. package/dist/pipeline/coding-walkthrough.js +15947 -0
  42. package/dist/web/app.js +12024 -0
  43. package/dist/web/index.html +1 -0
  44. package/dist/web/styles.css +1 -0
  45. package/package.json +61 -0
package/LICENSE ADDED
@@ -0,0 +1,52 @@
1
+ Copyright (c) 2026 Akshay Iyer (Flomi Inc. / Polymath Society). All Rights Reserved.
2
+
3
+ PROPRIETARY AND CONFIDENTIAL — SOURCE-AVAILABLE, NOT OPEN SOURCE.
4
+
5
+ This software, in both source and compiled/bundled form, together with its
6
+ structure, rubrics, prompts, methods, and output formats (collectively, the
7
+ "Software"), is the proprietary and confidential property of the copyright
8
+ holder. Publication to the npm registry is for distribution and execution
9
+ convenience only; it does NOT place the Software in the public domain, does NOT
10
+ make it open source, and grants NO rights except the limited license below.
11
+
12
+ 1. LIMITED LICENSE TO RUN. Subject to your continuous compliance with this
13
+ License, the copyright holder grants you a personal, non-exclusive,
14
+ non-transferable, non-sublicensable, royalty-free, and REVOCABLE license to
15
+ download and execute the UNMODIFIED published package, as distributed on npm,
16
+ on machines you own or control, solely to analyze your own data and view the
17
+ resulting reports. This is the only right granted.
18
+
19
+ 2. PROHIBITED. Except as expressly permitted in Section 1, and except to the
20
+ narrow extent a restriction below is unenforceable under applicable law, you
21
+ may NOT, in whole or in part:
22
+ - copy, reproduce, host, or store the Software (beyond the transient copies
23
+ automatically made by npm and Node.js to run it under Section 1);
24
+ - modify, adapt, translate, or create derivative works of the Software;
25
+ - redistribute, republish, sublicense, sell, rent, lease, lend, or
26
+ otherwise make the Software available to any third party;
27
+ - reverse engineer, decompile, disassemble, deobfuscate, or otherwise
28
+ attempt to derive the source code, rubrics, prompts, or methods from the
29
+ distributed bundles;
30
+ - use the Software, its outputs, its rubrics, its prompts, or its methods
31
+ to design, train, build, or operate a competing or substantially similar
32
+ product or service;
33
+ - remove, obscure, or alter any proprietary or attribution notices.
34
+
35
+ 3. RESERVATION. All rights not expressly granted in Section 1 are reserved by
36
+ the copyright holder. This License grants no rights in any trademark, and no
37
+ patent license except as strictly necessary to exercise Section 1.
38
+
39
+ 4. TERMINATION. This License terminates automatically and immediately upon any
40
+ breach, and may be revoked by the copyright holder at any time. On
41
+ termination you must cease all use and delete all copies.
42
+
43
+ 5. NO WARRANTY. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
44
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
45
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, AND NONINFRINGEMENT. IN NO
46
+ EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES, OR OTHER
47
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT, OR OTHERWISE, ARISING FROM,
48
+ OUT OF, OR IN CONNECTION WITH THE SOFTWARE OR ITS USE.
49
+
50
+ Any unauthorized use is a violation of applicable copyright and other laws and
51
+ may result in legal action. For any use beyond Section 1, contact the copyright
52
+ holder for written permission.
package/README.md ADDED
@@ -0,0 +1,311 @@
1
+ # polymath-society
2
+
3
+ > **Proprietary — All Rights Reserved (source-available, not open source).** You may run the unmodified npm package to analyze your own data; copying, modifying, redistributing, reverse-engineering the bundles, or using its methods to build a competing product is prohibited. See [LICENSE](./LICENSE).
4
+
5
+
6
+ A **local app** for understanding how you work from your own **Claude Code** and
7
+ **Codex** agent logs — parallelism, flow-state, throughput, per-project
8
+ contributions, and (opt-in) AI-graded judgment criteria.
9
+
10
+ Three things, in one package:
11
+
12
+ 1. **Deterministic metrics** — computed in-process from the JSONL on your disk.
13
+ Zero LLM, zero network. Facts, not judgments. (Instant and free.)
14
+ 2. **Local LLM grading** *(opt-in, `--grade`)* — grades abstraction, taste,
15
+ delegation, expertise, and frontier tool-use by invoking the **local
16
+ `claude -p` / `codex` binary you're already logged into**. No API key; it
17
+ spends your own subscription. Your prompts never leave the machine.
18
+ 3. **A local web UI** *(`serve`)* — the same warm "Code tab" view the hosted
19
+ Polymath app shows, served on a free port, with **per-section Share**.
20
+
21
+ ---
22
+
23
+ ## What it reads
24
+
25
+ - `~/.claude/projects/**/*.jsonl` — Claude Code sessions
26
+ - `~/.codex/sessions/**/*.jsonl` — Codex sessions
27
+
28
+ (Override with `CLAUDE_PROJECTS_DIR` / `CODEX_SESSIONS_DIR` env vars.)
29
+
30
+ It separates **your real interactive sessions** from headless agent runs,
31
+ auth-ping sessions, and machine-assembled mega-prompts (the `klass` /
32
+ `klassReason` on every parsed session is transparent and auditable), de-dupes
33
+ resume/fork copies, and then computes everything below over the canonical set.
34
+
35
+ ## What it computes
36
+
37
+ | Metric | What it is |
38
+ | --- | --- |
39
+ | **sessions** | per-session structural facts: duration, active time, turns, tool counts, models, tokens, modes, renames |
40
+ | **parallelism** | sweep-line concurrency across sessions — max concurrent, minutes spent at each level, per-day overlap, top windows |
41
+ | **day-chart** | per-day Gantt of every conversation's active spans (clipped to local midnight) |
42
+ | **flow** | every 10-minute slot classified in-flow / active-pause / away (rapid rhythm + dictation beat the gaps) |
43
+ | **throughput** | words you actually *typed* per day (pasted code stripped) → a 1–11 score, plus a proven ceiling |
44
+ | **projects** | GitHub-style per-project days / hours / range |
45
+ | **aggregate** | average throughput over substantial days + flow stats (work window, % in flow, when flow peaks) |
46
+
47
+ ---
48
+
49
+ ## Install
50
+
51
+ ```bash
52
+ npm install polymath-society
53
+ # or run the CLI without installing:
54
+ npx coding-analyzer
55
+ ```
56
+
57
+ ## CLI
58
+
59
+ ```bash
60
+ coding-analyzer # human-readable summary of the deterministic profile
61
+ coding-analyzer --json # full profile JSON to stdout
62
+ coding-analyzer --out p.json # write full profile JSON to a file
63
+
64
+ coding-analyzer projects # just the projects/contributions view (JSON)
65
+ coding-analyzer flow # just the per-day flow slots + totals (JSON)
66
+ coding-analyzer aggregate # just the corpus aggregate (JSON)
67
+
68
+ coding-analyzer grade # OPT-IN: AI-grade your sessions on your OWN
69
+ # Claude Code / Codex login (no API key)
70
+ coding-analyzer serve # scrape → (optionally --grade) → open the web UI
71
+ coding-analyzer serve --grade # …including the AI-graded sections
72
+ ```
73
+
74
+ Flags: `--no-codex` · `--idle <min>` · `--tz <IANA>` · `--span <hours>` ·
75
+ `--json` · `--out <file>` · `--grade` · `--adapter <cli|codex>` · `--model <id>` ·
76
+ `--max-sessions <n>` · `--port <n>` · `--share-url <url>` · `--open`
77
+
78
+ Example summary:
79
+
80
+ ```
81
+ ========== DETERMINISTIC CODING PROFILE ==========
82
+ timezone America/Los_Angeles · idle-gap 5m
83
+ sessions: 106 interactive (canonical) · 1101 agent/excluded · 19 resume-copies dropped
84
+ active work time: 147.5h tool calls: 16,017 subagents: 41 queue-ahead: 2271
85
+
86
+ PARALLELISM
87
+ max concurrent sessions: 6
88
+
89
+ THROUGHPUT
90
+ proven ceiling (≥3 days): 10/11
91
+ AVG over substantial days: 7/11 — 5960 words/day over 30/50 days
92
+
93
+ FLOW
94
+ work window: 12:30pm–6:40pm over 47 active days
95
+ in flow: 63% of active time · 86.5h total (1.8h/day)
96
+
97
+ PROJECTS
98
+ 4 projects · 37 active days · 102h
99
+ ```
100
+
101
+ ## The local app (`serve`)
102
+
103
+ ```bash
104
+ coding-analyzer serve # deterministic only — instant, free
105
+ coding-analyzer serve --grade # + AI-graded sections (spends your subscription)
106
+ coding-analyzer serve --grade --open --port 8765
107
+ ```
108
+
109
+ `serve` scrapes `~/.claude/projects` + `~/.codex/sessions`, optionally grades,
110
+ starts a tiny zero-dependency HTTP server on a free port, and prints the
111
+ clickable `http://localhost:<port>` URL. `--grade` writes its analysis to
112
+ `./.data/coding` under the **current directory** — re-run from the same
113
+ directory and it resumes (already-graded sessions are skipped) instead of
114
+ re-grading from scratch. The page reproduces the hosted app's
115
+ **Code tab** — the same warm palette, cards, contributions heatmap, flow stats,
116
+ throughput scatter, and (when graded) the criterion cards with verbatim receipts.
117
+
118
+ The server exposes:
119
+
120
+ | Route | What |
121
+ | --- | --- |
122
+ | `GET /` | the bundled static UI |
123
+ | `GET /profile.json` | the computed profile, organized into the share-contract sections |
124
+ | `GET /meta.json` | `{ version, shareUrl }` for the share bar |
125
+ | `POST /share` | proxies the chosen sections to the share endpoint (server-side — no browser CORS) |
126
+
127
+ ### Local LLM grading (no API key)
128
+
129
+ Grading is **opt-in** because it spends your tokens; the deterministic metrics
130
+ stay instant and free. With `--grade`, the package invokes the **local
131
+ `claude -p` (or `codex`) binary you're already logged into** — billed to your
132
+ Claude / ChatGPT subscription, never an API key. On startup it detects whether a
133
+ backend is installed *and* logged in; if not, it prints the exact fix (e.g. *run
134
+ `claude` to log in*) instead of failing obscurely, and `serve` falls back to
135
+ deterministic-only.
136
+
137
+ ```bash
138
+ coding-analyzer grade # grade + write graded.json, print means
139
+ coding-analyzer grade --adapter codex # pin the Codex backend
140
+ coding-analyzer grade --max-sessions 20 # cap the token/time budget
141
+ ```
142
+
143
+ The five graded criteria — **abstraction, taste, delegation, expertise,
144
+ frontier** — are ported from the main Polymath pipeline (same rubric, 1–11 ladder
145
+ with verbatim quotes, per-conversation ceiling 10). Grading plugs into the
146
+ `analyze()` `gradeProvider` seam (see Library below).
147
+
148
+ ### Share — per-section selection
149
+
150
+ Every section in the UI has a checkbox; tick the ones you want and hit **Share
151
+ selected** in the footer bar. The browser sends only the ticked keys to the local
152
+ server, which forwards exactly this contract to the share endpoint:
153
+
154
+ ```http
155
+ POST <shareUrl>
156
+ Content-Type: application/json
157
+
158
+ {
159
+ "source": "coding-analyzer",
160
+ "version": "<pkg version>",
161
+ "name": "<optional user-provided name>",
162
+ "sharedAt": "<ISO8601>",
163
+ "sections": { "<key>": <that section's data> }
164
+ }
165
+ ```
166
+
167
+ `key ∈ { howYouWork, snapshot, workstyle, parallelism, lixiThroughput, topDays,
168
+ abstraction, taste, delegation, expertise, frontier, operate }` — only ticked
169
+ keys appear in `sections`. The endpoint defaults to
170
+ `http://localhost:3100/api/coding-share` (dev) and is overridable with
171
+ `--share-url <url>` or `PS_SHARE_URL`. **TODO:** set the production share URL
172
+ before shipping. The local server does the POST server-side, so the browser never
173
+ hits CORS.
174
+
175
+ ### How the bundled UI is produced / rebuilt
176
+
177
+ The UI sources live in `ui/` (`index.html`, `styles.css`, `app.js` — vanilla JS,
178
+ no React/Tailwind; the warm palette tokens and Card/Chip primitives are
179
+ hand-ported to plain CSS). `npm run build` runs `tsc` then `scripts/build-ui.mjs`,
180
+ which **esbuild**-bundles `ui/app.js` → `dist/ui/app.js` (minified, IIFE, zero
181
+ runtime deps) and copies the HTML/CSS. The server serves `dist/ui/`, which ships
182
+ inside the published package. To rebuild only the UI: `npm run build:ui`.
183
+
184
+ ## Library
185
+
186
+ ```ts
187
+ import { analyze } from "polymath-society";
188
+
189
+ const profile = await analyze({
190
+ codex: true, // include ~/.codex/sessions (default)
191
+ idleGapMin: 5, // gap that breaks a session into active intervals
192
+ tz: "America/Los_Angeles",
193
+ spanHourMin: 4, // "substantial day" threshold for the throughput avg
194
+ });
195
+
196
+ console.log(profile.concurrency.maxConcurrency);
197
+ console.log(profile.throughput.ceiling); // 1–11, proven on ≥3 days
198
+ console.log(profile.flow.totals.flowFraction);
199
+ console.log(profile.projects.projects);
200
+ ```
201
+
202
+ Every building block is exported too, so you can compose your own pipeline:
203
+
204
+ ```ts
205
+ import {
206
+ readAllSessions, toSessionRecords, buildConcurrency, buildDayChart,
207
+ markDuplicates, computeFlow, computeProjects, computeAggregate,
208
+ proseWords, throughputScore, throughputCeiling,
209
+ } from "polymath-society";
210
+
211
+ const raw = await readAllSessions();
212
+ const interactive = raw.filter((s) => s.klass === "interactive");
213
+ const records = toSessionRecords(interactive);
214
+ await markDuplicates(records);
215
+ const canon = records.filter((r) => !r.duplicateOf);
216
+ const conc = buildConcurrency(interactive, canon);
217
+ const flow = await computeFlow(canon);
218
+ // …
219
+ ```
220
+
221
+ ### Local LLM grading via `analyze()`'s `gradeProvider`
222
+
223
+ `analyze()` is deterministic by default and never calls a model. The grading
224
+ seam is the optional `gradeProvider`: pass one and `analyze()` attaches a
225
+ `graded` block of per-criterion means. The package ships `LocalGradeProvider`,
226
+ which implements that seam by grading on your **local Claude Code / Codex** CLI:
227
+
228
+ ```ts
229
+ import { analyze, LocalGradeProvider } from "polymath-society";
230
+
231
+ const provider = new LocalGradeProvider({
232
+ adapter: "cli", // or "codex"; omit for auto (first installed + logged-in)
233
+ model: "sonnet", // grading model (cli only; codex ignores it)
234
+ maxSessions: 20, // cap the token/time budget
235
+ });
236
+
237
+ const profile = await analyze({ gradeProvider: provider });
238
+ profile.graded; // { abstraction: { mean, n }, taste: { mean, n }, … }
239
+ provider.detail(); // richer per-criterion distributions + per-session takes (UI)
240
+ ```
241
+
242
+ Or supply your own `gradeProvider` (any object with `criteriaMean(records)`) to
243
+ fold in grades from a different pipeline.
244
+
245
+ ```ts
246
+ const profile = await analyze({
247
+ gradeProvider: { criteriaMean: () => ({ taste: { mean: 8.2, n: 40 } }) },
248
+ });
249
+ ```
250
+
251
+ ### Serving programmatically
252
+
253
+ ```ts
254
+ import { analyze, LocalGradeProvider, buildWebProfile, startServer } from "polymath-society";
255
+
256
+ const provider = new LocalGradeProvider();
257
+ const profile = await analyze({ gradeProvider: provider });
258
+ const web = buildWebProfile(profile, provider.detail());
259
+ const { url } = await startServer({ profile: web, version: "0.2.0", shareUrl: "https://…/api/coding-share" });
260
+ console.log(url);
261
+ ```
262
+
263
+ ## Project aliases
264
+
265
+ A session's project is its working directory, so the same project shows up under
266
+ several paths (parent-folder runs, old names). Pass `aliases` to canonicalize:
267
+
268
+ ```ts
269
+ await analyze({
270
+ aliases: [
271
+ { name: "Polymath", match: ["/polymath-society", "/polymath"], note: "merged old name" },
272
+ ],
273
+ });
274
+ ```
275
+
276
+ Without aliases, the leaf directory name is used.
277
+
278
+ ## Configuration
279
+
280
+ | Option (lib) | Flag (CLI) | Env | Default |
281
+ | --- | --- | --- | --- |
282
+ | `codex` | `--no-codex` | | `true` |
283
+ | `idleGapMin` | `--idle` | | `5` |
284
+ | `tz` | `--tz` | `CODING_TZ` | `America/Los_Angeles` |
285
+ | `spanHourMin` | `--span` | | `4` |
286
+ | — | `--port` | | free OS-assigned |
287
+ | — | `--share-url` | `PS_SHARE_URL` | `http://localhost:3100/api/coding-share` |
288
+ | — | `--adapter` | `CODING_ANALYZER_ADAPTER` | auto (`cli` → `codex`) |
289
+ | — | — | `CLAUDE_BIN` / `CODEX_BIN` | resolved from PATH |
290
+ | — | — | `CLAUDE_PROJECTS_DIR` | `~/.claude/projects` |
291
+ | — | — | `CODEX_SESSIONS_DIR` | `~/.codex/sessions` |
292
+
293
+ ## Privacy
294
+
295
+ On-device by default. The deterministic library reads local files and returns
296
+ plain objects — no telemetry, no network, no model inference.
297
+
298
+ **Grading** (`--grade`) runs on the **local CLI you're logged into** (`claude -p`
299
+ / `codex exec`) — your prompts are read from disk and graded on your own
300
+ subscription; nothing is sent to a third party. The **only** outbound network
301
+ call the package ever makes is `POST /share`, and only for the exact sections you
302
+ tick, to the endpoint you configure.
303
+
304
+ ## Requirements
305
+
306
+ Node.js ≥ 18, ESM only. Grading additionally needs **Claude Code** or **Codex**
307
+ installed and logged in (`claude` / `codex login`).
308
+
309
+ ## License
310
+
311
+ MIT
@@ -0,0 +1,109 @@
1
+ # DATA-MAP.md — how an agent traverses this person's local record
2
+
3
+ You are an agent with READ access to the `.data/` directory of a Polymath installation.
4
+ This map tells you what lives where, what the artifacts mean, and how to answer questions
5
+ by going to the source. TRUST THE FILESYSTEM OVER THIS MAP — layouts evolve; `ls`/Glob a
6
+ directory before assuming its contents. Everything is local; nothing you read may be sent
7
+ anywhere, and third parties are referred to by their initials in your replies.
8
+
9
+ ## The two corpora
10
+
11
+ 1. **Life corpus** — the person's imported chat history (ChatGPT, claude.ai), notes
12
+ (Obsidian, Apple Notes), and the analysis the engine built from them.
13
+ 2. **Coding corpus** — their Claude Code / Codex session logs and the deterministic +
14
+ graded analysis built from those.
15
+
16
+ When BOTH exist, the strongest answers cross-reference them: a rule declared in the notes
17
+ can be checked against measured coding behavior; a life event can explain a low-output
18
+ week. Prefer cross-corpus receipts when the question allows it.
19
+
20
+ ## Life corpus layout
21
+
22
+ - `.data/signals/index.jsonl` — one JSON per signal. Fields: `docId`, `date` (ISO,
23
+ the field is `date`, NOT `ts`), `source` (`chatgpt` | `claude` | `obsidian` |
24
+ `apple-notes`), `title` (an LLM one-line summary — semantically rich, safe to scan in
25
+ bulk), `paragraph` (a longer summary), `evidence`, `userChars`, `userMessages`.
26
+ THIS IS YOUR PRIMARY INDEX for the life corpus: grep it by date range, theme keywords,
27
+ or source before reading anything heavier. Caveats: notes without dates in their path
28
+ cluster on their import date (a huge one-day spike is an import artifact, not activity);
29
+ a title "touching" a theme is an upper bound, not proof of deliberation.
30
+ - `.data/signals/timeline.json` — the same signals arranged as a timeline.
31
+ - `.data/sources/…` — raw imported conversation content (large). Only dip in when a
32
+ specific conversation matters; quote at most a line or two.
33
+ - `grades/<lens>/_person.json` (under `.data/`, engine output) — the person-level
34
+ aggregation per lens (ocean, agency, reasoning, growth, interpersonal…): facet scores
35
+ with reasoning. `grades/<lens>/*.allfacets.json` — per-conversation grades: score or
36
+ null per facet plus verbatim receipt quotes. A facet with ~0 direct grades while its
37
+ siblings have many means coverage failed, not that the person lacks the trait.
38
+ - `growth-latest.json` / analysis agents' outputs — growth axes (used-to → now milestone
39
+ timelines anchored on the person's deliberate moves), drivers, circumstances.
40
+
41
+ ## Coding corpus layout (`.data/coding/`)
42
+
43
+ - `sessions.json` — every session: title, times, `activeMin`, `durationMin`, `humanTurns`,
44
+ tool counts, `klass` (only `interactive` sessions are the person; the rest are machine
45
+ runs), `duplicateOf` (fork copies — skip them or you double-count).
46
+ - `focus.json` — the flow analysis: per-day half-hour cells (`S` in-flow / `N` nudging /
47
+ `G` away), steering runs, run-end boundaries with the person's next messages, gaps,
48
+ false starts, semantic `features` (LLM-clustered workstreams with day maps and flow
49
+ share), and `llm` (causal findings, triggers in/out, priority verdicts, leverage,
50
+ a personalized CLAUDE.md snippet). Flow definition: typed-message gaps ≤6 min sustained
51
+ ≥20 min; supervision is "nudging", never flow.
52
+ - `flow.json` — the older, looser engaged-time metric (5-min gap tolerance). The report
53
+ calls this "engaged time", NOT flow. Do not conflate the two.
54
+ - `day-chart.json` — per day, each conversation's active intervals (timestamps).
55
+ - `grades/*.json` — per-session grades against the coding rubric: per criterion a score
56
+ on the 1–11 ladder, the keyed instance, why, and verbatim quotes. 6 is strong-normal;
57
+ 10–11 are frontier outliers. Scores across different `rubricVersion` values are not
58
+ comparable.
59
+ - `aggregate.json` (ability ceilings + `bigPicture` nutshell), `expertise.json` (domain
60
+ knowledge map), `gap.json` (ranked technique recommendations), `frontier.json`,
61
+ `delegation-rollup.json`, `projects.json`, `concurrency.json` — each self-describing;
62
+ read the file before citing it.
63
+
64
+ ## Raw Claude Code session JSONL (only if an artifact can't answer)
65
+
66
+ `~/.claude/projects/<project>/<sessionId>.jsonl`. If you must read one: only `type:"user"`
67
+ entries are candidate person-text, and you MUST skip `isMeta:true`, injected blocks
68
+ (`<task-notification>`, command wrappers, system reminders), compact-continuation
69
+ summaries, and "[Request interrupted…]" markers; fork copies duplicate whole transcripts
70
+ (dedupe by timestamp+text). Prefer the artifacts — they already did this correctly.
71
+
72
+ ## What the gradations mean
73
+
74
+ Engine facets and coding criteria use a 1–11 ladder where each rung has concrete
75
+ requirements (the rubric text in your context is the authority). "Top X%" bands come from
76
+ a single calibration source; do not invent percentile mappings. Confidence markers
77
+ ("tentative") mean thin evidence, and honesty about that beats a confident guess.
78
+
79
+ ## Traversal recipes
80
+
81
+ - "How often do I X / when did I last X" → grep `signals/index.jsonl` titles by keyword +
82
+ date; count by month; report the shape (spans, spikes, gaps) with dates.
83
+ - "Why did I get this score" → the grades file for that criterion/facet: rung, keyed
84
+ instance, verbatim quote. Name the session/conversation and date.
85
+ - "What was I doing on <date>" → signals index for that date (all sources) +
86
+ `day-chart.json` + `focus.json` day cells. Coding-log silence usually means selling,
87
+ deciding, or living, not idleness — say so when the coding record is empty but the
88
+ life corpus isn't.
89
+ - "Did my habit/rule actually happen" → find declarations in the life corpus, then check
90
+ the MEASURED coding artifacts (start times, flow, features) for execution. Declared vs
91
+ measured is the highest-value answer shape this dataset supports.
92
+ - Anything about loops → count recurrences across months in the index; three receipts or
93
+ it isn't a pattern; one is noise.
94
+
95
+ ## Traversal budget
96
+
97
+ You have a hard turn limit. Budget 2-4 lookups per question: one Glob/ls to orient (only
98
+ if needed), one or two Greps on an index, one Read of the specific artifact. Then ANSWER.
99
+ If you have not found the receipt after 4 lookups, answer with what you have and say what
100
+ you could not find. Running out of turns mid-traversal means the person gets nothing.
101
+
102
+ ## Answer rules
103
+
104
+ - Receipts on every claim: dates, counts, short quotes (≤2 lines). Never fabricate a
105
+ file, score, session, or quote. If a lookup comes up empty, say "insufficient data".
106
+ - Plain speech, at most one number per sentence, verdicts not questions, no em dashes.
107
+ - Patterns, never psychology: describe what the record shows; the person decides meaning.
108
+ - Be honest about instrument limits: logs under-observe a life. Absence in one corpus is
109
+ not absence in the life; check the other corpus before concluding.