polymath-society 0.2.12 → 0.2.14
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.
- package/dist/cli.js +150 -50
- package/dist/engine/chat-loops.js +1 -1
- package/dist/engine/exp-allfacets.js +1 -1
- package/dist/engine/exp-person.js +1 -1
- package/dist/engine/ingest-export.js +3 -2
- package/dist/engine/peak-demos.js +1 -1
- package/dist/engine/person-dimension-summary.js +1 -1
- package/dist/engine/person-facet-lines.js +1 -1
- package/dist/engine/person-headline.js +1 -1
- package/dist/engine/person-report.js +1 -1
- package/dist/engine/person-self-image.js +1 -1
- package/dist/engine/public-report.js +4 -3
- package/dist/engine/run-analysis.js +8 -3
- package/dist/index.js +102 -15
- package/dist/pipeline/coding-agglomerate.js +4 -3
- package/dist/pipeline/coding-aggregate.js +4 -3
- package/dist/pipeline/coding-build.js +4 -3
- package/dist/pipeline/coding-coaching.js +27 -8
- package/dist/pipeline/coding-day-digest.js +4 -3
- package/dist/pipeline/coding-delegation.js +4 -3
- package/dist/pipeline/coding-expertise.js +4 -3
- package/dist/pipeline/coding-flow.js +4 -3
- package/dist/pipeline/coding-frontier-detail.js +4 -3
- package/dist/pipeline/coding-frontier.js +4 -3
- package/dist/pipeline/coding-gap-dist.js +4 -3
- package/dist/pipeline/coding-gap.js +27 -8
- package/dist/pipeline/coding-grade.js +4 -3
- package/dist/pipeline/coding-nutshell.js +4 -3
- package/dist/pipeline/coding-projects.js +4 -3
- package/dist/pipeline/coding-walkthrough.js +4 -3
- package/dist/web/app.js +1462 -1403
- package/package.json +1 -1
package/dist/cli.js
CHANGED
|
@@ -1047,7 +1047,7 @@ var init_backends = __esm({
|
|
|
1047
1047
|
});
|
|
1048
1048
|
|
|
1049
1049
|
// src/grade/cliAdapter.ts
|
|
1050
|
-
import { spawn } from "child_process";
|
|
1050
|
+
import { spawn as spawn2 } from "child_process";
|
|
1051
1051
|
function toolTarget(input) {
|
|
1052
1052
|
return String(input.file_path ?? input.path ?? input.pattern ?? input.query ?? input.command ?? "");
|
|
1053
1053
|
}
|
|
@@ -1090,7 +1090,7 @@ var init_cliAdapter = __esm({
|
|
|
1090
1090
|
let costUsd;
|
|
1091
1091
|
let numTurns;
|
|
1092
1092
|
await new Promise((resolve2, reject) => {
|
|
1093
|
-
const child =
|
|
1093
|
+
const child = spawn2(bin, args, {
|
|
1094
1094
|
cwd: inv.cwd ?? inv.addDir,
|
|
1095
1095
|
// scrubbed: a stray ANTHROPIC_API_KEY in the user's shell hijacks the
|
|
1096
1096
|
// claude CLI away from their claude.ai login (coding-core/env.ts)
|
|
@@ -1193,7 +1193,12 @@ var init_cliAdapter = __esm({
|
|
|
1193
1193
|
});
|
|
1194
1194
|
|
|
1195
1195
|
// src/grade/codexAdapter.ts
|
|
1196
|
-
import { spawn as
|
|
1196
|
+
import { spawn as spawn3 } from "child_process";
|
|
1197
|
+
function mapCodexTier(model, env = process.env) {
|
|
1198
|
+
if (model && !/^(claude|haiku|sonnet|opus)/i.test(model)) return { model };
|
|
1199
|
+
if (model && /^haiku/i.test(model)) return { model: env.POLYMATH_CODEX_MODEL_MINI || CODEX_MINI_MODEL };
|
|
1200
|
+
return { model: env.POLYMATH_CODEX_MODEL || CODEX_DEFAULT_MODEL };
|
|
1201
|
+
}
|
|
1197
1202
|
function composePrompt(inv, roots) {
|
|
1198
1203
|
return [
|
|
1199
1204
|
inv.systemPrompt ? `<system>
|
|
@@ -1204,12 +1209,14 @@ ${roots.map((r) => ` - ${r}`).join("\n")}` : "",
|
|
|
1204
1209
|
inv.prompt
|
|
1205
1210
|
].filter(Boolean).join("\n\n");
|
|
1206
1211
|
}
|
|
1207
|
-
var codexAdapter;
|
|
1212
|
+
var CODEX_DEFAULT_MODEL, CODEX_MINI_MODEL, codexAdapter;
|
|
1208
1213
|
var init_codexAdapter = __esm({
|
|
1209
1214
|
"src/grade/codexAdapter.ts"() {
|
|
1210
1215
|
"use strict";
|
|
1211
1216
|
init_adapter();
|
|
1212
1217
|
init_backends();
|
|
1218
|
+
CODEX_DEFAULT_MODEL = "gpt-5.5";
|
|
1219
|
+
CODEX_MINI_MODEL = "gpt-5.4-mini";
|
|
1213
1220
|
codexAdapter = {
|
|
1214
1221
|
name: "codex",
|
|
1215
1222
|
async run(inv) {
|
|
@@ -1227,7 +1234,7 @@ var init_codexAdapter = __esm({
|
|
|
1227
1234
|
"read-only",
|
|
1228
1235
|
"--json"
|
|
1229
1236
|
];
|
|
1230
|
-
|
|
1237
|
+
args.push("--model", mapCodexTier(inv.model).model);
|
|
1231
1238
|
args.push(composePrompt(inv, roots));
|
|
1232
1239
|
const started = Date.now();
|
|
1233
1240
|
const toolCalls = [];
|
|
@@ -1235,7 +1242,7 @@ var init_codexAdapter = __esm({
|
|
|
1235
1242
|
let resultText = "";
|
|
1236
1243
|
let numTurns = 0;
|
|
1237
1244
|
await new Promise((resolve2, reject) => {
|
|
1238
|
-
const child =
|
|
1245
|
+
const child = spawn3(bin, args, { cwd, env: process.env, stdio: ["ignore", "pipe", "pipe"] });
|
|
1239
1246
|
let buf = "";
|
|
1240
1247
|
let err = "";
|
|
1241
1248
|
const timeoutMs = inv.timeoutMs ?? 3e5;
|
|
@@ -1541,15 +1548,15 @@ var init_exportLinks = __esm({
|
|
|
1541
1548
|
});
|
|
1542
1549
|
|
|
1543
1550
|
// src/notify.ts
|
|
1544
|
-
import { spawn as
|
|
1551
|
+
import { spawn as spawn9 } from "node:child_process";
|
|
1545
1552
|
function systemNotify(title, body) {
|
|
1546
1553
|
try {
|
|
1547
1554
|
const opts = { stdio: "ignore" };
|
|
1548
1555
|
if (process.platform === "darwin") {
|
|
1549
|
-
|
|
1556
|
+
spawn9("osascript", ["-e", `display notification ${JSON.stringify(body)} with title ${JSON.stringify(title)} sound name "Glass"`], opts).on("error", () => {
|
|
1550
1557
|
});
|
|
1551
1558
|
} else if (process.platform === "linux") {
|
|
1552
|
-
|
|
1559
|
+
spawn9("notify-send", [title, body], opts).on("error", () => {
|
|
1553
1560
|
});
|
|
1554
1561
|
}
|
|
1555
1562
|
} catch {
|
|
@@ -2646,7 +2653,19 @@ try {
|
|
|
2646
2653
|
import { promises as fs36, existsSync as existsSync7 } from "fs";
|
|
2647
2654
|
import path41 from "path";
|
|
2648
2655
|
import { fileURLToPath as fileURLToPath5 } from "url";
|
|
2649
|
-
|
|
2656
|
+
|
|
2657
|
+
// src/openBrowser.ts
|
|
2658
|
+
import { spawn } from "child_process";
|
|
2659
|
+
function openBrowser(url, cmd) {
|
|
2660
|
+
const bin = cmd ?? (process.platform === "darwin" ? "open" : process.platform === "win32" ? "start" : "xdg-open");
|
|
2661
|
+
try {
|
|
2662
|
+
const child = spawn(bin, [url], { stdio: "ignore", detached: true });
|
|
2663
|
+
child.on("error", () => console.log(` (couldn't open a browser here \u2014 open ${url} yourself)`));
|
|
2664
|
+
child.unref();
|
|
2665
|
+
} catch {
|
|
2666
|
+
console.log(` (couldn't open a browser here \u2014 open ${url} yourself)`);
|
|
2667
|
+
}
|
|
2668
|
+
}
|
|
2650
2669
|
|
|
2651
2670
|
// src/analyze.ts
|
|
2652
2671
|
init_raw2();
|
|
@@ -3590,7 +3609,7 @@ var CODING_CRITERIA = [
|
|
|
3590
3609
|
label: "Abstraction \u2014 seeing the load-bearing thing, and being right",
|
|
3591
3610
|
graded: true,
|
|
3592
3611
|
definition: "Under genuine ambiguity (an obvious path sitting right there, no answer key): did the USER see that the obvious path was subtly wrong \u2014 or that something decisive was invisible \u2014 and do the non-obvious thing that made it right, AND were they right? The graded unit is the whole move: the CATCH (noticing the fork) -> the QUESTION (formulating it) -> the CALL (resolving it). The move surfaces three interchangeable ways, scored identically: a REFRAME (collapse a mess to its real axis), a QUESTION (pose the hard thing nobody posed), or an INSTRUMENT (build the code/chart/structure that makes the truth legible, then read it). Tag the SUBSTANCE, not the medium \u2014 a chart built (technical act) to make a human-intensity call legible is a JUDGMENT catch.",
|
|
3593
|
-
read: "FOUR LEVERS set the height: (1) INVISIBILITY \u2014 how non-obvious there was anything to catch; a sharp operator in the flow drives past it (the DOMINANT lever); (2) DIFFICULTY of forming the catch; (3) STAKES \u2014 'without this, things silently go wrong' is the 9-10 condition; (4) SOUNDNESS \u2014 did the call hold. THREE OVERRIDING GATES: (a) OBVIOUSNESS KILLS IT \u2014 a correct, even load-bearing catch a sharp operator reaches anyway scores LOW ('you're evaluating the person not the AI' is correct but obvious -> ~5; 'compute in the OAuth dead-time' is real but fairly obvious -> ~6). (b) LEVERAGE BEATS INSIGHT \u2014 a move whose payoff is a HIGHER RATE OF FUTURE INSIGHT (building the tool that lets him set his own boundaries; timestamp-by-timestamp structure to instruct the grader precisely) raises the bandwidth of the loop that produces every later catch, and can outrank a clean one-off reframe. (c) SOUNDNESS GATE \u2014 a confident WRONG call to a noticed fork is an ANTI-SIGNAL; an honest 'not sure, here's a range' is NOT penalized. HUNT THE FORK BLIND \u2014 reconstruct what continuing-without-noticing looked like, then check whether/why he diverged; do NOT hand yourself the fork pre-formed or you score everyone's problem-finding a 10. TAG every instance: kind = systems | judgment | both (+ optional register: human/product/measurement). Reasoning and instrument-building are the SAME criterion. ANCHORS: 10 = 'OCEAN won't change, measure effectiveness of actions' (reframe that redefines the measure) /
|
|
3612
|
+
read: "FOUR LEVERS set the height: (1) INVISIBILITY \u2014 how non-obvious there was anything to catch; a sharp operator in the flow drives past it (the DOMINANT lever); (2) DIFFICULTY of forming the catch; (3) STAKES \u2014 'without this, things silently go wrong' is the 9-10 condition; (4) SOUNDNESS \u2014 did the call hold. THREE OVERRIDING GATES: (a) OBVIOUSNESS KILLS IT \u2014 a correct, even load-bearing catch a sharp operator reaches anyway scores LOW ('you're evaluating the person not the AI' is correct but obvious -> ~5; 'compute in the OAuth dead-time' is real but fairly obvious -> ~6). (b) LEVERAGE BEATS INSIGHT \u2014 a move whose payoff is a HIGHER RATE OF FUTURE INSIGHT (building the tool that lets him set his own boundaries; timestamp-by-timestamp structure to instruct the grader precisely) raises the bandwidth of the loop that produces every later catch, and can outrank a clean one-off reframe. (c) SOUNDNESS GATE \u2014 a confident WRONG call to a noticed fork is an ANTI-SIGNAL; an honest 'not sure, here's a range' is NOT penalized. HUNT THE FORK BLIND \u2014 reconstruct what continuing-without-noticing looked like, then check whether/why he diverged; do NOT hand yourself the fork pre-formed or you score everyone's problem-finding a 10. TAG every instance: kind = systems | judgment | both (+ optional register: human/product/measurement). Reasoning and instrument-building are the SAME criterion. ANCHORS: 10 = 'OCEAN won't change, measure effectiveness of actions' (reframe that redefines the measure) / a human-stakes call where the person overrode the analytically-clean answer on knowledge only they could have about someone involved, and was right (lived judgment, requires being the person) / 'plot it sorted, let me set the boundaries' (leverage \u2014 builds the bandwidth tool); 9 = 'word count IS the proxy \u2014 sitting there is unfakeable focus' / 'uncertainty collapses in that direction'; 8 = 'a better metric is the difficulty of content + original synthesis' (hard opening question); 7 = 'this candidate seems too strong for his judgement to be real' (real non-obvious catch, modest stakes); 6 = 'compute in the OAuth dead-time' / 'why overcomplicate it, single agent' (real but obvious); 5 = 'you're evaluating the person not the AI' (correct but obvious).",
|
|
3594
3613
|
rungs: [
|
|
3595
3614
|
{ level: 2, marker: "A fork existed; defers the call to the AI, or takes the obvious branch; vague." },
|
|
3596
3615
|
{ level: 4, marker: "Notices something, but the question is vague or obvious \u2014 anyone in the seat asks it." },
|
|
@@ -4173,7 +4192,10 @@ async function getAccessToken(dataDir) {
|
|
|
4173
4192
|
headers: { "content-type": "application/json", apikey: supabaseAnonKey },
|
|
4174
4193
|
body: JSON.stringify({ refresh_token: id.refreshToken })
|
|
4175
4194
|
});
|
|
4176
|
-
if (!r.ok)
|
|
4195
|
+
if (!r.ok) {
|
|
4196
|
+
if (r.status >= 400 && r.status < 500) await signOut(dataDir);
|
|
4197
|
+
return null;
|
|
4198
|
+
}
|
|
4177
4199
|
const fresh = await persistSession(dataDir, await r.json());
|
|
4178
4200
|
return { token: fresh.accessToken, identity: fresh };
|
|
4179
4201
|
} catch {
|
|
@@ -4183,11 +4205,11 @@ async function getAccessToken(dataDir) {
|
|
|
4183
4205
|
|
|
4184
4206
|
// ../../lib/calibration/index.ts
|
|
4185
4207
|
var DEFAULT_CALIBRATION = {
|
|
4186
|
-
version: "2026-07-
|
|
4208
|
+
version: "2026-07-16.2",
|
|
4187
4209
|
// = RUBRIC_FINGERPRINT of the shipped npm rubric (packages/coding-analyzer/
|
|
4188
4210
|
// src/grade/criteria.ts). A unit test fails loud when the rubric changes
|
|
4189
4211
|
// without this being updated (and re-pushed to the server).
|
|
4190
|
-
rubricVersion: "
|
|
4212
|
+
rubricVersion: "7983c01d53",
|
|
4191
4213
|
// Canonical scale = the one the product owner set for the public report
|
|
4192
4214
|
// (11=0.01% … 8=2%), extended downward from the old report ladder. The old
|
|
4193
4215
|
// CodeAnalysisView / npm-viewer maps (7→10%/15%, 6→25%/30%) were drift, not
|
|
@@ -4274,6 +4296,7 @@ var DEFAULT_CALIBRATION = {
|
|
|
4274
4296
|
codingTiers: {
|
|
4275
4297
|
push: { median: 300, sigma: 0.91, tag: "estimated \u2014 log-normal fit", source: "Anthropic 2026 Claude Code study (400k sessions): median engaged user ~8 prompts/day at ~35 words \u2014 ~300 directed words/day; tail: a 1-in-1,000 user AVERAGES ~5k directed words/day (near-daily heavy dictation, clearly below the ~10k single-day record). AVERAGE over substantial days, cumulative not spiky." },
|
|
4276
4298
|
focus: { median: 0.08, sigma: 0.559, tag: "estimated \u2014 proxy-anchored", source: "median: Anthropic 20h/week engaged-user figure implies ~1h/day of true rapid exchange against an 8h working day; ceiling anchored to the ~4h/day deep-work limit (45% share = 1-in-1,000). AVERAGE share, cumulative not spiky." },
|
|
4299
|
+
hours: { median: 3, sigma: 0.4, tag: "estimated \u2014 proxy-anchored", source: "median: RescueTime-measured ~2h48m of real productive time/day (same source as the flow benchmark) \u2248 3h of active building; shape: sustaining ~7.5h/day \u2248 top 1%, a ~12h/day average \u2248 1-in-3,000. AVERAGE work-day length, cumulative not spiky." },
|
|
4277
4300
|
orchestration: { tag: "estimated \u2014 behavior bands", source: "no published concurrency distribution exists; ceiling anchored to the Claude Code lead's documented 10-15 parallel sessions" }
|
|
4278
4301
|
},
|
|
4279
4302
|
codingBenchmarks: {
|
|
@@ -4406,7 +4429,7 @@ import path13 from "path";
|
|
|
4406
4429
|
|
|
4407
4430
|
// ../../lib/agents/shared/cliAdapter.ts
|
|
4408
4431
|
init_env();
|
|
4409
|
-
import { spawn as
|
|
4432
|
+
import { spawn as spawn4 } from "child_process";
|
|
4410
4433
|
import { promises as fs7 } from "fs";
|
|
4411
4434
|
import path7 from "path";
|
|
4412
4435
|
|
|
@@ -4512,7 +4535,7 @@ var cliAdapter2 = {
|
|
|
4512
4535
|
let numTurns;
|
|
4513
4536
|
let usage;
|
|
4514
4537
|
await new Promise((resolve2, reject) => {
|
|
4515
|
-
const child =
|
|
4538
|
+
const child = spawn4(CLAUDE_BIN, args, {
|
|
4516
4539
|
cwd: inv.cwd ?? inv.addDir,
|
|
4517
4540
|
// scrubbed: a stray ANTHROPIC_API_KEY in the user's shell hijacks the
|
|
4518
4541
|
// claude CLI away from their claude.ai login (coding-core/env.ts)
|
|
@@ -4642,7 +4665,7 @@ var cliAdapter2 = {
|
|
|
4642
4665
|
};
|
|
4643
4666
|
|
|
4644
4667
|
// ../../lib/agents/shared/codexAdapter.ts
|
|
4645
|
-
import { spawn as
|
|
4668
|
+
import { spawn as spawn5 } from "child_process";
|
|
4646
4669
|
import { existsSync as existsSync4, statSync } from "fs";
|
|
4647
4670
|
import path9 from "path";
|
|
4648
4671
|
|
|
@@ -4796,7 +4819,7 @@ var codexAdapter2 = {
|
|
|
4796
4819
|
let resultText = "";
|
|
4797
4820
|
let numTurns = 0;
|
|
4798
4821
|
await new Promise((resolve2, reject) => {
|
|
4799
|
-
const child =
|
|
4822
|
+
const child = spawn5(bin, args, {
|
|
4800
4823
|
cwd,
|
|
4801
4824
|
env: process.env,
|
|
4802
4825
|
stdio: ["ignore", "pipe", "pipe"]
|
|
@@ -4874,7 +4897,7 @@ var codexAdapter2 = {
|
|
|
4874
4897
|
};
|
|
4875
4898
|
|
|
4876
4899
|
// ../../lib/agents/shared/cursorAdapter.ts
|
|
4877
|
-
import { spawn as
|
|
4900
|
+
import { spawn as spawn6 } from "child_process";
|
|
4878
4901
|
function composePrompt3(inv, roots) {
|
|
4879
4902
|
return [
|
|
4880
4903
|
inv.systemPrompt ? `<system>
|
|
@@ -4897,7 +4920,7 @@ var cursorAdapter = {
|
|
|
4897
4920
|
const started = Date.now();
|
|
4898
4921
|
let out = "";
|
|
4899
4922
|
await new Promise((resolve2, reject) => {
|
|
4900
|
-
const child =
|
|
4923
|
+
const child = spawn6(bin, args, {
|
|
4901
4924
|
cwd: inv.cwd ?? inv.addDir,
|
|
4902
4925
|
env: process.env,
|
|
4903
4926
|
stdio: ["ignore", "pipe", "pipe"]
|
|
@@ -20885,7 +20908,7 @@ var growthLens = {
|
|
|
20885
20908
|
{
|
|
20886
20909
|
key: "implementation",
|
|
20887
20910
|
name: "Observed execution improvement",
|
|
20888
|
-
definition: "The slope itself: whether diagnosed problems get attacked with experiments and whether the change in BEHAVIOR lands and sticks. Graded from dated evidence on ACTIONS, not feelings: a recurring feeling, urge, or complaint is expected base temperament and is NOT a mark against implementation \u2014 only a recurring unchanged behavior is. Credit a changed action even when the underlying feeling repeats verbatim (e.g. still dreads cold outreach but now sends it daily). A COMPULSION OR URGE IS TEMPERAMENT, NOT AN ACTION: a perfectionism / over-analysis / decision-paralysis loop is the behavioral face of base temperament
|
|
20911
|
+
definition: "The slope itself: whether diagnosed problems get attacked with experiments and whether the change in BEHAVIOR lands and sticks. Graded from dated evidence on ACTIONS, not feelings: a recurring feeling, urge, or complaint is expected base temperament and is NOT a mark against implementation \u2014 only a recurring unchanged behavior is. Credit a changed action even when the underlying feeling repeats verbatim (e.g. still dreads cold outreach but now sends it daily). A COMPULSION OR URGE IS TEMPERAMENT, NOT AN ACTION: a perfectionism / over-analysis / decision-paralysis loop is the behavioral face of base temperament, so if the person INCREASINGLY OVERRIDES it and still ships, that is temperament being managed better over time \u2014 a RISING slope, NOT a recurring unchanged action \u2014 and must NOT cap the score. Only count such a loop against implementation if the ACTION genuinely shows NO improvement across the window (still loses whole days with no rising ability to override and ship). A FIX THAT NEEDED A FORCING FUNCTION STILL COUNTS, FULLY: a change triggered by a deadline, a painful lesson, or 'getting burnt' that then LANDS and STICKS is a real fix on a legitimate route \u2014 learning from consequence is how humans change \u2014 so do NOT dock a landed, sticky fix for needing a catalyst; the catalyst is not a defect. Judge the slope over LONG horizons (weeks\u2192months across the dated record), NEVER within a single day or conversation \u2014 behavior change takes time, so the absence of same-day change is NOT a failure and must NEVER buckle the score. GRADE THE AGGREGATE SLOPE, not the one unfixed thread: humans cannot fix everything, and very few fix anything at all \u2014 so fixing several genuinely hard, DISTINCT stuck-points and making them stick across the window is exceptional and scores HIGH (9-10), and one stubborn temperament loop that is being increasingly overridden does NOT pull an otherwise broad, rising, sticky record down. The real question: across the record, did the problems they identified earlier become LESS of an issue in their later ACTIONS? Internal baselines (neuroticism, needing people to feel happy) are not the unit here \u2014 grade the actions.",
|
|
20889
20912
|
rungs: [
|
|
20890
20913
|
{ level: 3, marker: "The same BEHAVIORS recur across the window, unchanged \u2014 recognition (if any) never becomes a change in action. (A recurring feeling alongside changed behavior does NOT belong here \u2014 that is a fix, scored higher.)" },
|
|
20891
20914
|
{ level: 5, marker: "Occasionally a fix happens \u2014 intends to solve, and sometimes it lands, but not usually." },
|
|
@@ -23761,6 +23784,8 @@ async function compileCodingProfile() {
|
|
|
23761
23784
|
const avgWords = aggregate?.throughput?.avgWordsPerDay ?? null;
|
|
23762
23785
|
const pushPctl = lognPct(avgWords, tiers?.push);
|
|
23763
23786
|
const focusPctl = lognPct(flowPctDay, tiers?.focus);
|
|
23787
|
+
const workDayHrs = aggregate?.flow?.flow?.workDayHours ? Math.round(aggregate.flow.flow.workDayHours * 10) / 10 : null;
|
|
23788
|
+
const hoursPctl = lognPct(workDayHrs, tiers?.hours);
|
|
23764
23789
|
const hoursAt = (min) => Object.entries(pHist).reduce((a, [k, v]) => Number(k) >= min ? a + v : a, 0) / 60;
|
|
23765
23790
|
const orchPctl = hoursAt(5) >= 5 || hoursAt(3) >= 10 && parallelism.queueOps >= 1e3 ? 99.5 : hoursAt(3) >= 10 ? 99 : hoursAt(2) >= 0.1 * (soloMin + parMin) / 60 ? 97 : hoursAt(2) >= 2 ? 90 : 70;
|
|
23766
23791
|
const stackUp = [
|
|
@@ -23770,14 +23795,25 @@ async function compileCodingProfile() {
|
|
|
23770
23795
|
`you peak at ~${peakWords.toLocaleString()} words of pure direction in a single day \u2014 the very top sustain ~${BEST.throughput.topAvgWordsPerDay.toLocaleString()} every day, week after week; the wildest single days on record push ~${BEST.throughput.topPeakWordsPerDay.toLocaleString()}`
|
|
23771
23796
|
),
|
|
23772
23797
|
sRow(
|
|
23773
|
-
"
|
|
23798
|
+
"Hours you put in",
|
|
23799
|
+
null,
|
|
23800
|
+
workDayHrs != null ? `~${workDayHrs}h of active building on a typical work day \u2014 engaged builders average ~3h, and sustaining 7h+ day after day, week after week, is top-1% territory` : "not enough dated activity yet to measure a typical work day"
|
|
23801
|
+
),
|
|
23802
|
+
sRow(
|
|
23803
|
+
"Your AI parallelism",
|
|
23774
23804
|
ceilOf("delegation"),
|
|
23775
23805
|
soloPct != null ? `~${soloPct}% of your hours you drive a single agent (${Math.round(soloMin / 60)}h solo vs ${Math.round(parMin / 60)}h with 2+ live) \u2014 the Claude Code lead keeps 10\u201315 going at once, so this is the single biggest speed-up still on the table` : "you brief the AI sharply, but mostly drive one agent at a time \u2014 the top run 10\u201315 in parallel, a several-fold speed-up"
|
|
23776
23806
|
),
|
|
23807
|
+
// The evidence line cites the RANKING metric (flow as a share of the work
|
|
23808
|
+
// day), never absolute hours — a friend with MORE flow hours over a longer
|
|
23809
|
+
// day landed a WORSE percentile and the hours-based line read as a bug
|
|
23810
|
+
// (2026-07-16: "he has more hours but less percentile??"). The label says
|
|
23811
|
+
// "when you work" ON PURPOSE: this chip ranks quality of the hours, and
|
|
23812
|
+
// the volume of hours is its own chip above.
|
|
23777
23813
|
sRow(
|
|
23778
|
-
"
|
|
23814
|
+
"Focus quality when you work",
|
|
23779
23815
|
focusScore,
|
|
23780
|
-
|
|
23816
|
+
flowPctDay != null ? `~${Math.round(flowPctDay * 100)}% of your work day is true deep flow${flowHrsDay != null ? ` (~${flowHrsDay}h)` : ""} \u2014 the very best hold ~${Math.round(BEST.flow.topPctOfDay * 100)}% of theirs in one unbroken block; yours fragments across parallel sessions, so the gain is directing your attention at one thread for longer` : "your attention scatters across parallel sessions \u2014 directing it at one thread for longer is the unlock"
|
|
23781
23817
|
),
|
|
23782
23818
|
// The four estimates LEAD with a concrete moment from their own sessions, then an
|
|
23783
23819
|
// HONEST caveat — how many graded sessions back the read. No invented weakness, no
|
|
@@ -23810,12 +23846,17 @@ async function compileCodingProfile() {
|
|
|
23810
23846
|
r.metric = avgWords;
|
|
23811
23847
|
r.curve = "push";
|
|
23812
23848
|
}
|
|
23813
|
-
if (r.label === "
|
|
23849
|
+
if (r.label === "Hours you put in" && hoursPctl != null) {
|
|
23850
|
+
r.percentile = hoursPctl;
|
|
23851
|
+
r.metric = workDayHrs;
|
|
23852
|
+
r.curve = "hours";
|
|
23853
|
+
}
|
|
23854
|
+
if (r.label === "Focus quality when you work" && focusPctl != null) {
|
|
23814
23855
|
r.percentile = focusPctl;
|
|
23815
23856
|
r.metric = flowPctDay;
|
|
23816
23857
|
r.curve = "focus";
|
|
23817
23858
|
}
|
|
23818
|
-
if (r.label === "
|
|
23859
|
+
if (r.label === "Your AI parallelism") r.percentile = orchPctl;
|
|
23819
23860
|
}
|
|
23820
23861
|
return { generatedAt: (/* @__PURE__ */ new Date()).toISOString(), gradedSessions: grades.length, agglomeration, outcomeCadence, dayDigest, dayChart, timeline, walkthroughs, rubric: rubric2, wordsByDay, dayThroughput, throughputCeiling: tCeiling, stackUp, criteria, parallelism, throughput, workstyle, flow, focus, expertiseMap, frontierArsenal, frontierDetail, coaching, gap, aggregate, delegationRollup, gapDist, projects };
|
|
23821
23862
|
}
|
|
@@ -23921,7 +23962,7 @@ async function buildSkeleton(codingDir, stackUp) {
|
|
|
23921
23962
|
...thr.avgWordsPerDay ? [{ big: String(Math.round(thr.avgWordsPerDay).toLocaleString()), lab: "typed/dictated words per day, averaged (~300 for the median active user)" }] : [],
|
|
23922
23963
|
...thr.substantialDays ? [{ big: `${thr.substantialDays}/${thr.totalCodingDays}`, lab: "coding days were substantial (3h+ span)" }] : []
|
|
23923
23964
|
], moments: [] },
|
|
23924
|
-
{ key: "ai", label: "How they use AI", topPct: pct2("
|
|
23965
|
+
{ key: "ai", label: "How they use AI", topPct: pct2("parallelism"), sub: "orchestration, measured", claim: "", read: "", numbers: [
|
|
23925
23966
|
...par.max ? [{ big: String(par.max), lab: "agents at once, peak" }] : [],
|
|
23926
23967
|
...par.hours2plus ? [{ big: `${par.hours2plus}h`, lab: "working 2+ live agents" }] : [],
|
|
23927
23968
|
...par.queueOps ? [{ big: par.queueOps.toLocaleString(), lab: "instructions queued ahead" }] : []
|
|
@@ -24341,12 +24382,15 @@ async function handlePublicCodingPageShare(dataDir, body) {
|
|
|
24341
24382
|
return { status: 409, json: { error: "nothing to share yet \u2014 generate your page first" } };
|
|
24342
24383
|
}
|
|
24343
24384
|
const chatReport = body.includeChat === false ? null : await localChatReport();
|
|
24385
|
+
const prior = await readOwnReportContent(cfg, auth.token, auth.identity.userId);
|
|
24344
24386
|
try {
|
|
24345
|
-
const
|
|
24387
|
+
const merged = { ...prior, format: "coding-pr1", page };
|
|
24388
|
+
if (chatReport) merged.chatReport = chatReport;
|
|
24389
|
+
else delete merged.chatReport;
|
|
24346
24390
|
const up = await fetch(`${cfg.supabaseUrl}/rest/v1/rpc/submit_report`, {
|
|
24347
24391
|
method: "POST",
|
|
24348
24392
|
headers: { apikey: cfg.supabaseAnonKey, authorization: `Bearer ${auth.token}`, "content-type": "application/json" },
|
|
24349
|
-
body: JSON.stringify({ p_session_id: null, p_content:
|
|
24393
|
+
body: JSON.stringify({ p_session_id: null, p_content: JSON.stringify(merged) })
|
|
24350
24394
|
});
|
|
24351
24395
|
if (!up.ok) return { status: 502, json: { error: `share failed (HTTP ${up.status})` } };
|
|
24352
24396
|
const verification = String(await up.json().catch(() => "unverified"));
|
|
@@ -24355,6 +24399,49 @@ async function handlePublicCodingPageShare(dataDir, body) {
|
|
|
24355
24399
|
return { status: 502, json: { error: e.message.slice(0, 200) } };
|
|
24356
24400
|
}
|
|
24357
24401
|
}
|
|
24402
|
+
async function readOwnReportContent(cfg, token, userId) {
|
|
24403
|
+
try {
|
|
24404
|
+
const r = await fetch(`${cfg.supabaseUrl}/rest/v1/reports?user_id=eq.${encodeURIComponent(userId)}&select=content`, {
|
|
24405
|
+
headers: { apikey: cfg.supabaseAnonKey, authorization: `Bearer ${token}` }
|
|
24406
|
+
});
|
|
24407
|
+
if (!r.ok) return {};
|
|
24408
|
+
const rows = await r.json();
|
|
24409
|
+
const c = rows[0]?.content;
|
|
24410
|
+
return c && typeof c === "object" ? c : {};
|
|
24411
|
+
} catch {
|
|
24412
|
+
return {};
|
|
24413
|
+
}
|
|
24414
|
+
}
|
|
24415
|
+
async function handleAnalysisShare(dataDir, kind, full) {
|
|
24416
|
+
const cfg = centralConfig();
|
|
24417
|
+
if (!cfg.configured) return { status: 503, json: { error: "central services are disabled in this build" } };
|
|
24418
|
+
const auth = await getAccessToken(dataDir);
|
|
24419
|
+
if (!auth) return { status: 401, json: { error: "sign in with Google (top right) first" } };
|
|
24420
|
+
const slim = (p) => {
|
|
24421
|
+
if (!p || typeof p !== "object") return p;
|
|
24422
|
+
const { timeline: _t, walkthroughs: _w, dayDigest: _d, dayChart: _c, ...rest } = p;
|
|
24423
|
+
return rest;
|
|
24424
|
+
};
|
|
24425
|
+
const value = kind === "coding" ? slim(full.coding()) : await full.chat().catch(() => null);
|
|
24426
|
+
if (!value) return { status: 409, json: { error: "nothing to share yet \u2014 run the analysis first" } };
|
|
24427
|
+
const prior = await readOwnReportContent(cfg, auth.token, auth.identity.userId);
|
|
24428
|
+
try {
|
|
24429
|
+
const merged = {
|
|
24430
|
+
format: "coding-pr1",
|
|
24431
|
+
...prior,
|
|
24432
|
+
[kind === "coding" ? "fullCoding" : "fullChat"]: value
|
|
24433
|
+
};
|
|
24434
|
+
const up = await fetch(`${cfg.supabaseUrl}/rest/v1/rpc/submit_report`, {
|
|
24435
|
+
method: "POST",
|
|
24436
|
+
headers: { apikey: cfg.supabaseAnonKey, authorization: `Bearer ${auth.token}`, "content-type": "application/json" },
|
|
24437
|
+
body: JSON.stringify({ p_session_id: null, p_content: JSON.stringify(merged) })
|
|
24438
|
+
});
|
|
24439
|
+
if (!up.ok) return { status: 502, json: { error: `share failed (HTTP ${up.status})` } };
|
|
24440
|
+
return { status: 200, json: { ok: true, kind } };
|
|
24441
|
+
} catch (e) {
|
|
24442
|
+
return { status: 502, json: { error: e.message.slice(0, 200) } };
|
|
24443
|
+
}
|
|
24444
|
+
}
|
|
24358
24445
|
|
|
24359
24446
|
// src/server.ts
|
|
24360
24447
|
var __dirname = path33.dirname(fileURLToPath2(import.meta.url));
|
|
@@ -24682,6 +24769,18 @@ function startServer(opts) {
|
|
|
24682
24769
|
json(res, out.status, out.json);
|
|
24683
24770
|
return;
|
|
24684
24771
|
}
|
|
24772
|
+
if (req.method === "POST" && route === "/api/analysis/share") {
|
|
24773
|
+
const body = JSON.parse(await readBody(req) || "{}");
|
|
24774
|
+
const out = await handleAnalysisShare(dataDir, body.kind === "chat" ? "chat" : "coding", {
|
|
24775
|
+
coding: () => liveProfile,
|
|
24776
|
+
chat: async () => {
|
|
24777
|
+
const p = await handlePerson();
|
|
24778
|
+
return p.status === 200 ? p.json : null;
|
|
24779
|
+
}
|
|
24780
|
+
});
|
|
24781
|
+
json(res, out.status, out.json);
|
|
24782
|
+
return;
|
|
24783
|
+
}
|
|
24685
24784
|
if (route.startsWith("/api/")) {
|
|
24686
24785
|
json(res, 404, { error: `this viewer doesn't serve ${route}` });
|
|
24687
24786
|
return;
|
|
@@ -24703,7 +24802,7 @@ function startServer(opts) {
|
|
|
24703
24802
|
serverUrl = `http://${host}:${port}`;
|
|
24704
24803
|
void getCalibration().then((cal) => {
|
|
24705
24804
|
if (cal.source === "central" && cal.doc.rubricVersion !== RUBRIC_FINGERPRINT2) {
|
|
24706
|
-
console.warn(`[polymath-society]
|
|
24805
|
+
console.warn(`[polymath-society] you're not on the latest version \u2014 run: npm install -g polymath-society@latest`);
|
|
24707
24806
|
}
|
|
24708
24807
|
}).catch(() => {
|
|
24709
24808
|
});
|
|
@@ -24732,7 +24831,7 @@ function startServer(opts) {
|
|
|
24732
24831
|
}
|
|
24733
24832
|
|
|
24734
24833
|
// src/pipeline.ts
|
|
24735
|
-
import { spawn as
|
|
24834
|
+
import { spawn as spawn7 } from "child_process";
|
|
24736
24835
|
import os8 from "os";
|
|
24737
24836
|
import path36 from "path";
|
|
24738
24837
|
import { existsSync as existsSync5, promises as fs31 } from "fs";
|
|
@@ -24993,7 +25092,7 @@ function stageInvocation(repoRoot, scriptRel, args) {
|
|
|
24993
25092
|
function runStage(repoRoot, st, env, onLine) {
|
|
24994
25093
|
return new Promise((resolve2, reject) => {
|
|
24995
25094
|
const { cmd, argv, cwd } = stageInvocation(repoRoot, st.script, st.args);
|
|
24996
|
-
const child =
|
|
25095
|
+
const child = spawn7(cmd, argv, { cwd, env, stdio: ["ignore", "pipe", "pipe"] });
|
|
24997
25096
|
const pump = (buf) => {
|
|
24998
25097
|
if (!onLine) return;
|
|
24999
25098
|
for (const line of buf.toString().split(/\r?\n/)) if (line.trim()) onLine(line);
|
|
@@ -25034,15 +25133,19 @@ async function evalUpToDate(codingDir, threshold, regrade) {
|
|
|
25034
25133
|
(await fs31.readdir(path36.join(codingDir, "grades")).catch(() => [])).filter((f) => f.endsWith(".json")).map((f) => f.slice(0, -5))
|
|
25035
25134
|
);
|
|
25036
25135
|
const agg = JSON.parse(await fs31.readFile(path36.join(codingDir, "aggregate.json"), "utf8").catch(() => "{}"));
|
|
25037
|
-
|
|
25038
|
-
|
|
25039
|
-
|
|
25040
|
-
|
|
25041
|
-
|
|
25042
|
-
|
|
25043
|
-
|
|
25136
|
+
const hasPriorRun = typeof agg.bigPicture === "string" && agg.bigPicture.trim().length > 0;
|
|
25137
|
+
return {
|
|
25138
|
+
...upToDateSkip({
|
|
25139
|
+
gradableIds: gradable.map((s) => s.sessionId),
|
|
25140
|
+
gradedIds: graded,
|
|
25141
|
+
hasBigPicture: hasPriorRun,
|
|
25142
|
+
threshold,
|
|
25143
|
+
regrade
|
|
25144
|
+
}),
|
|
25145
|
+
hasPriorRun
|
|
25146
|
+
};
|
|
25044
25147
|
} catch {
|
|
25045
|
-
return { skip: false, pending: -1 };
|
|
25148
|
+
return { skip: false, pending: -1, hasPriorRun: false };
|
|
25046
25149
|
}
|
|
25047
25150
|
}
|
|
25048
25151
|
function startKeepAwake(o = {}) {
|
|
@@ -25057,7 +25160,7 @@ function startKeepAwake(o = {}) {
|
|
|
25057
25160
|
const up = () => {
|
|
25058
25161
|
if (stopped) return;
|
|
25059
25162
|
try {
|
|
25060
|
-
child =
|
|
25163
|
+
child = spawn7(cmd, argv, { detached: true, stdio: "ignore" });
|
|
25061
25164
|
child.unref();
|
|
25062
25165
|
child.on("error", () => {
|
|
25063
25166
|
stopped = true;
|
|
@@ -25151,6 +25254,10 @@ async function runPipeline(o) {
|
|
|
25151
25254
|
o.onLine?.(
|
|
25152
25255
|
`\u2713 report is up to date \u2014 ${gate2.pending} new session(s) since the last full run (below the ${threshold}-session threshold). Skipping the AI stages; free metrics still refresh. They'll be analyzed once ${threshold}+ accumulate (POLYMATH_MIN_NEW_SESSIONS=0 or --regrade to force now).`
|
|
25153
25256
|
);
|
|
25257
|
+
} else if (gate2.hasPriorRun) {
|
|
25258
|
+
o.onLine?.(
|
|
25259
|
+
`\u2713 your finished report from the last run is safe and already serving at the link below \u2014 nothing restarts from scratch. ${gate2.pending >= 0 ? `${gate2.pending} pending session(s)` : "New work"} plus any stages added by an update run on top of it, and sections refresh in place as they finish.`
|
|
25260
|
+
);
|
|
25154
25261
|
}
|
|
25155
25262
|
}
|
|
25156
25263
|
}
|
|
@@ -25180,7 +25287,7 @@ async function runPipeline(o) {
|
|
|
25180
25287
|
|
|
25181
25288
|
// src/chatPipeline.ts
|
|
25182
25289
|
init_manifest();
|
|
25183
|
-
import { spawn as
|
|
25290
|
+
import { spawn as spawn8 } from "child_process";
|
|
25184
25291
|
import path37 from "path";
|
|
25185
25292
|
import { existsSync as existsSync6, promises as fs32 } from "fs";
|
|
25186
25293
|
import { fileURLToPath as fileURLToPath4 } from "url";
|
|
@@ -25244,7 +25351,7 @@ async function finalChatArtifacts(dataRoot) {
|
|
|
25244
25351
|
function runStage2(repoRoot, st, env, onLine) {
|
|
25245
25352
|
return new Promise((resolve2, reject) => {
|
|
25246
25353
|
const { cmd, argv, cwd } = stageInvocation2(repoRoot, st.script, st.args);
|
|
25247
|
-
const child =
|
|
25354
|
+
const child = spawn8(cmd, argv, { cwd, env, stdio: ["ignore", "pipe", "pipe"] });
|
|
25248
25355
|
const pump = (buf) => {
|
|
25249
25356
|
if (!onLine) return;
|
|
25250
25357
|
for (const line of buf.toString().split(/\r?\n/)) if (line.trim()) onLine(line);
|
|
@@ -25879,13 +25986,6 @@ async function maybePrintUpdateNotice(opts) {
|
|
|
25879
25986
|
clearTimeout(timer);
|
|
25880
25987
|
}
|
|
25881
25988
|
}
|
|
25882
|
-
function openBrowser(url) {
|
|
25883
|
-
const cmd = process.platform === "darwin" ? "open" : process.platform === "win32" ? "start" : "xdg-open";
|
|
25884
|
-
try {
|
|
25885
|
-
spawn9(cmd, [url], { stdio: "ignore", detached: true }).unref();
|
|
25886
|
-
} catch {
|
|
25887
|
-
}
|
|
25888
|
-
}
|
|
25889
25989
|
main().catch((e) => {
|
|
25890
25990
|
console.error(e);
|
|
25891
25991
|
process.exit(1);
|
|
@@ -551,7 +551,7 @@ var init_growth = __esm({
|
|
|
551
551
|
{
|
|
552
552
|
key: "implementation",
|
|
553
553
|
name: "Observed execution improvement",
|
|
554
|
-
definition: "The slope itself: whether diagnosed problems get attacked with experiments and whether the change in BEHAVIOR lands and sticks. Graded from dated evidence on ACTIONS, not feelings: a recurring feeling, urge, or complaint is expected base temperament and is NOT a mark against implementation \u2014 only a recurring unchanged behavior is. Credit a changed action even when the underlying feeling repeats verbatim (e.g. still dreads cold outreach but now sends it daily). A COMPULSION OR URGE IS TEMPERAMENT, NOT AN ACTION: a perfectionism / over-analysis / decision-paralysis loop is the behavioral face of base temperament
|
|
554
|
+
definition: "The slope itself: whether diagnosed problems get attacked with experiments and whether the change in BEHAVIOR lands and sticks. Graded from dated evidence on ACTIONS, not feelings: a recurring feeling, urge, or complaint is expected base temperament and is NOT a mark against implementation \u2014 only a recurring unchanged behavior is. Credit a changed action even when the underlying feeling repeats verbatim (e.g. still dreads cold outreach but now sends it daily). A COMPULSION OR URGE IS TEMPERAMENT, NOT AN ACTION: a perfectionism / over-analysis / decision-paralysis loop is the behavioral face of base temperament, so if the person INCREASINGLY OVERRIDES it and still ships, that is temperament being managed better over time \u2014 a RISING slope, NOT a recurring unchanged action \u2014 and must NOT cap the score. Only count such a loop against implementation if the ACTION genuinely shows NO improvement across the window (still loses whole days with no rising ability to override and ship). A FIX THAT NEEDED A FORCING FUNCTION STILL COUNTS, FULLY: a change triggered by a deadline, a painful lesson, or 'getting burnt' that then LANDS and STICKS is a real fix on a legitimate route \u2014 learning from consequence is how humans change \u2014 so do NOT dock a landed, sticky fix for needing a catalyst; the catalyst is not a defect. Judge the slope over LONG horizons (weeks\u2192months across the dated record), NEVER within a single day or conversation \u2014 behavior change takes time, so the absence of same-day change is NOT a failure and must NEVER buckle the score. GRADE THE AGGREGATE SLOPE, not the one unfixed thread: humans cannot fix everything, and very few fix anything at all \u2014 so fixing several genuinely hard, DISTINCT stuck-points and making them stick across the window is exceptional and scores HIGH (9-10), and one stubborn temperament loop that is being increasingly overridden does NOT pull an otherwise broad, rising, sticky record down. The real question: across the record, did the problems they identified earlier become LESS of an issue in their later ACTIONS? Internal baselines (neuroticism, needing people to feel happy) are not the unit here \u2014 grade the actions.",
|
|
555
555
|
rungs: [
|
|
556
556
|
{ level: 3, marker: "The same BEHAVIORS recur across the window, unchanged \u2014 recognition (if any) never becomes a change in action. (A recurring feeling alongside changed behavior does NOT belong here \u2014 that is a fix, scored higher.)" },
|
|
557
557
|
{ level: 5, marker: "Occasionally a fix happens \u2014 intends to solve, and sometimes it lands, but not usually." },
|
|
@@ -16490,7 +16490,7 @@ var growthLens = {
|
|
|
16490
16490
|
{
|
|
16491
16491
|
key: "implementation",
|
|
16492
16492
|
name: "Observed execution improvement",
|
|
16493
|
-
definition: "The slope itself: whether diagnosed problems get attacked with experiments and whether the change in BEHAVIOR lands and sticks. Graded from dated evidence on ACTIONS, not feelings: a recurring feeling, urge, or complaint is expected base temperament and is NOT a mark against implementation \u2014 only a recurring unchanged behavior is. Credit a changed action even when the underlying feeling repeats verbatim (e.g. still dreads cold outreach but now sends it daily). A COMPULSION OR URGE IS TEMPERAMENT, NOT AN ACTION: a perfectionism / over-analysis / decision-paralysis loop is the behavioral face of base temperament
|
|
16493
|
+
definition: "The slope itself: whether diagnosed problems get attacked with experiments and whether the change in BEHAVIOR lands and sticks. Graded from dated evidence on ACTIONS, not feelings: a recurring feeling, urge, or complaint is expected base temperament and is NOT a mark against implementation \u2014 only a recurring unchanged behavior is. Credit a changed action even when the underlying feeling repeats verbatim (e.g. still dreads cold outreach but now sends it daily). A COMPULSION OR URGE IS TEMPERAMENT, NOT AN ACTION: a perfectionism / over-analysis / decision-paralysis loop is the behavioral face of base temperament, so if the person INCREASINGLY OVERRIDES it and still ships, that is temperament being managed better over time \u2014 a RISING slope, NOT a recurring unchanged action \u2014 and must NOT cap the score. Only count such a loop against implementation if the ACTION genuinely shows NO improvement across the window (still loses whole days with no rising ability to override and ship). A FIX THAT NEEDED A FORCING FUNCTION STILL COUNTS, FULLY: a change triggered by a deadline, a painful lesson, or 'getting burnt' that then LANDS and STICKS is a real fix on a legitimate route \u2014 learning from consequence is how humans change \u2014 so do NOT dock a landed, sticky fix for needing a catalyst; the catalyst is not a defect. Judge the slope over LONG horizons (weeks\u2192months across the dated record), NEVER within a single day or conversation \u2014 behavior change takes time, so the absence of same-day change is NOT a failure and must NEVER buckle the score. GRADE THE AGGREGATE SLOPE, not the one unfixed thread: humans cannot fix everything, and very few fix anything at all \u2014 so fixing several genuinely hard, DISTINCT stuck-points and making them stick across the window is exceptional and scores HIGH (9-10), and one stubborn temperament loop that is being increasingly overridden does NOT pull an otherwise broad, rising, sticky record down. The real question: across the record, did the problems they identified earlier become LESS of an issue in their later ACTIONS? Internal baselines (neuroticism, needing people to feel happy) are not the unit here \u2014 grade the actions.",
|
|
16494
16494
|
rungs: [
|
|
16495
16495
|
{ level: 3, marker: "The same BEHAVIORS recur across the window, unchanged \u2014 recognition (if any) never becomes a change in action. (A recurring feeling alongside changed behavior does NOT belong here \u2014 that is a fix, scored higher.)" },
|
|
16496
16496
|
{ level: 5, marker: "Occasionally a fix happens \u2014 intends to solve, and sometimes it lands, but not usually." },
|
|
@@ -16412,7 +16412,7 @@ var growthLens = {
|
|
|
16412
16412
|
{
|
|
16413
16413
|
key: "implementation",
|
|
16414
16414
|
name: "Observed execution improvement",
|
|
16415
|
-
definition: "The slope itself: whether diagnosed problems get attacked with experiments and whether the change in BEHAVIOR lands and sticks. Graded from dated evidence on ACTIONS, not feelings: a recurring feeling, urge, or complaint is expected base temperament and is NOT a mark against implementation \u2014 only a recurring unchanged behavior is. Credit a changed action even when the underlying feeling repeats verbatim (e.g. still dreads cold outreach but now sends it daily). A COMPULSION OR URGE IS TEMPERAMENT, NOT AN ACTION: a perfectionism / over-analysis / decision-paralysis loop is the behavioral face of base temperament
|
|
16415
|
+
definition: "The slope itself: whether diagnosed problems get attacked with experiments and whether the change in BEHAVIOR lands and sticks. Graded from dated evidence on ACTIONS, not feelings: a recurring feeling, urge, or complaint is expected base temperament and is NOT a mark against implementation \u2014 only a recurring unchanged behavior is. Credit a changed action even when the underlying feeling repeats verbatim (e.g. still dreads cold outreach but now sends it daily). A COMPULSION OR URGE IS TEMPERAMENT, NOT AN ACTION: a perfectionism / over-analysis / decision-paralysis loop is the behavioral face of base temperament, so if the person INCREASINGLY OVERRIDES it and still ships, that is temperament being managed better over time \u2014 a RISING slope, NOT a recurring unchanged action \u2014 and must NOT cap the score. Only count such a loop against implementation if the ACTION genuinely shows NO improvement across the window (still loses whole days with no rising ability to override and ship). A FIX THAT NEEDED A FORCING FUNCTION STILL COUNTS, FULLY: a change triggered by a deadline, a painful lesson, or 'getting burnt' that then LANDS and STICKS is a real fix on a legitimate route \u2014 learning from consequence is how humans change \u2014 so do NOT dock a landed, sticky fix for needing a catalyst; the catalyst is not a defect. Judge the slope over LONG horizons (weeks\u2192months across the dated record), NEVER within a single day or conversation \u2014 behavior change takes time, so the absence of same-day change is NOT a failure and must NEVER buckle the score. GRADE THE AGGREGATE SLOPE, not the one unfixed thread: humans cannot fix everything, and very few fix anything at all \u2014 so fixing several genuinely hard, DISTINCT stuck-points and making them stick across the window is exceptional and scores HIGH (9-10), and one stubborn temperament loop that is being increasingly overridden does NOT pull an otherwise broad, rising, sticky record down. The real question: across the record, did the problems they identified earlier become LESS of an issue in their later ACTIONS? Internal baselines (neuroticism, needing people to feel happy) are not the unit here \u2014 grade the actions.",
|
|
16416
16416
|
rungs: [
|
|
16417
16417
|
{ level: 3, marker: "The same BEHAVIORS recur across the window, unchanged \u2014 recognition (if any) never becomes a change in action. (A recurring feeling alongside changed behavior does NOT belong here \u2014 that is a fix, scored higher.)" },
|
|
16418
16418
|
{ level: 5, marker: "Occasionally a fix happens \u2014 intends to solve, and sometimes it lands, but not usually." },
|
|
@@ -661,11 +661,11 @@ var GIFTS = [
|
|
|
661
661
|
|
|
662
662
|
// ../../lib/calibration/index.ts
|
|
663
663
|
var DEFAULT_CALIBRATION = {
|
|
664
|
-
version: "2026-07-
|
|
664
|
+
version: "2026-07-16.2",
|
|
665
665
|
// = RUBRIC_FINGERPRINT of the shipped npm rubric (packages/coding-analyzer/
|
|
666
666
|
// src/grade/criteria.ts). A unit test fails loud when the rubric changes
|
|
667
667
|
// without this being updated (and re-pushed to the server).
|
|
668
|
-
rubricVersion: "
|
|
668
|
+
rubricVersion: "7983c01d53",
|
|
669
669
|
// Canonical scale = the one the product owner set for the public report
|
|
670
670
|
// (11=0.01% … 8=2%), extended downward from the old report ladder. The old
|
|
671
671
|
// CodeAnalysisView / npm-viewer maps (7→10%/15%, 6→25%/30%) were drift, not
|
|
@@ -752,6 +752,7 @@ var DEFAULT_CALIBRATION = {
|
|
|
752
752
|
codingTiers: {
|
|
753
753
|
push: { median: 300, sigma: 0.91, tag: "estimated \u2014 log-normal fit", source: "Anthropic 2026 Claude Code study (400k sessions): median engaged user ~8 prompts/day at ~35 words \u2014 ~300 directed words/day; tail: a 1-in-1,000 user AVERAGES ~5k directed words/day (near-daily heavy dictation, clearly below the ~10k single-day record). AVERAGE over substantial days, cumulative not spiky." },
|
|
754
754
|
focus: { median: 0.08, sigma: 0.559, tag: "estimated \u2014 proxy-anchored", source: "median: Anthropic 20h/week engaged-user figure implies ~1h/day of true rapid exchange against an 8h working day; ceiling anchored to the ~4h/day deep-work limit (45% share = 1-in-1,000). AVERAGE share, cumulative not spiky." },
|
|
755
|
+
hours: { median: 3, sigma: 0.4, tag: "estimated \u2014 proxy-anchored", source: "median: RescueTime-measured ~2h48m of real productive time/day (same source as the flow benchmark) \u2248 3h of active building; shape: sustaining ~7.5h/day \u2248 top 1%, a ~12h/day average \u2248 1-in-3,000. AVERAGE work-day length, cumulative not spiky." },
|
|
755
756
|
orchestration: { tag: "estimated \u2014 behavior bands", source: "no published concurrency distribution exists; ceiling anchored to the Claude Code lead's documented 10-15 parallel sessions" }
|
|
756
757
|
},
|
|
757
758
|
codingBenchmarks: {
|
|
@@ -530,7 +530,7 @@ var growthLens = {
|
|
|
530
530
|
{
|
|
531
531
|
key: "implementation",
|
|
532
532
|
name: "Observed execution improvement",
|
|
533
|
-
definition: "The slope itself: whether diagnosed problems get attacked with experiments and whether the change in BEHAVIOR lands and sticks. Graded from dated evidence on ACTIONS, not feelings: a recurring feeling, urge, or complaint is expected base temperament and is NOT a mark against implementation \u2014 only a recurring unchanged behavior is. Credit a changed action even when the underlying feeling repeats verbatim (e.g. still dreads cold outreach but now sends it daily). A COMPULSION OR URGE IS TEMPERAMENT, NOT AN ACTION: a perfectionism / over-analysis / decision-paralysis loop is the behavioral face of base temperament
|
|
533
|
+
definition: "The slope itself: whether diagnosed problems get attacked with experiments and whether the change in BEHAVIOR lands and sticks. Graded from dated evidence on ACTIONS, not feelings: a recurring feeling, urge, or complaint is expected base temperament and is NOT a mark against implementation \u2014 only a recurring unchanged behavior is. Credit a changed action even when the underlying feeling repeats verbatim (e.g. still dreads cold outreach but now sends it daily). A COMPULSION OR URGE IS TEMPERAMENT, NOT AN ACTION: a perfectionism / over-analysis / decision-paralysis loop is the behavioral face of base temperament, so if the person INCREASINGLY OVERRIDES it and still ships, that is temperament being managed better over time \u2014 a RISING slope, NOT a recurring unchanged action \u2014 and must NOT cap the score. Only count such a loop against implementation if the ACTION genuinely shows NO improvement across the window (still loses whole days with no rising ability to override and ship). A FIX THAT NEEDED A FORCING FUNCTION STILL COUNTS, FULLY: a change triggered by a deadline, a painful lesson, or 'getting burnt' that then LANDS and STICKS is a real fix on a legitimate route \u2014 learning from consequence is how humans change \u2014 so do NOT dock a landed, sticky fix for needing a catalyst; the catalyst is not a defect. Judge the slope over LONG horizons (weeks\u2192months across the dated record), NEVER within a single day or conversation \u2014 behavior change takes time, so the absence of same-day change is NOT a failure and must NEVER buckle the score. GRADE THE AGGREGATE SLOPE, not the one unfixed thread: humans cannot fix everything, and very few fix anything at all \u2014 so fixing several genuinely hard, DISTINCT stuck-points and making them stick across the window is exceptional and scores HIGH (9-10), and one stubborn temperament loop that is being increasingly overridden does NOT pull an otherwise broad, rising, sticky record down. The real question: across the record, did the problems they identified earlier become LESS of an issue in their later ACTIONS? Internal baselines (neuroticism, needing people to feel happy) are not the unit here \u2014 grade the actions.",
|
|
534
534
|
rungs: [
|
|
535
535
|
{ level: 3, marker: "The same BEHAVIORS recur across the window, unchanged \u2014 recognition (if any) never becomes a change in action. (A recurring feeling alongside changed behavior does NOT belong here \u2014 that is a fix, scored higher.)" },
|
|
536
536
|
{ level: 5, marker: "Occasionally a fix happens \u2014 intends to solve, and sometimes it lands, but not usually." },
|
|
@@ -530,7 +530,7 @@ var growthLens = {
|
|
|
530
530
|
{
|
|
531
531
|
key: "implementation",
|
|
532
532
|
name: "Observed execution improvement",
|
|
533
|
-
definition: "The slope itself: whether diagnosed problems get attacked with experiments and whether the change in BEHAVIOR lands and sticks. Graded from dated evidence on ACTIONS, not feelings: a recurring feeling, urge, or complaint is expected base temperament and is NOT a mark against implementation \u2014 only a recurring unchanged behavior is. Credit a changed action even when the underlying feeling repeats verbatim (e.g. still dreads cold outreach but now sends it daily). A COMPULSION OR URGE IS TEMPERAMENT, NOT AN ACTION: a perfectionism / over-analysis / decision-paralysis loop is the behavioral face of base temperament
|
|
533
|
+
definition: "The slope itself: whether diagnosed problems get attacked with experiments and whether the change in BEHAVIOR lands and sticks. Graded from dated evidence on ACTIONS, not feelings: a recurring feeling, urge, or complaint is expected base temperament and is NOT a mark against implementation \u2014 only a recurring unchanged behavior is. Credit a changed action even when the underlying feeling repeats verbatim (e.g. still dreads cold outreach but now sends it daily). A COMPULSION OR URGE IS TEMPERAMENT, NOT AN ACTION: a perfectionism / over-analysis / decision-paralysis loop is the behavioral face of base temperament, so if the person INCREASINGLY OVERRIDES it and still ships, that is temperament being managed better over time \u2014 a RISING slope, NOT a recurring unchanged action \u2014 and must NOT cap the score. Only count such a loop against implementation if the ACTION genuinely shows NO improvement across the window (still loses whole days with no rising ability to override and ship). A FIX THAT NEEDED A FORCING FUNCTION STILL COUNTS, FULLY: a change triggered by a deadline, a painful lesson, or 'getting burnt' that then LANDS and STICKS is a real fix on a legitimate route \u2014 learning from consequence is how humans change \u2014 so do NOT dock a landed, sticky fix for needing a catalyst; the catalyst is not a defect. Judge the slope over LONG horizons (weeks\u2192months across the dated record), NEVER within a single day or conversation \u2014 behavior change takes time, so the absence of same-day change is NOT a failure and must NEVER buckle the score. GRADE THE AGGREGATE SLOPE, not the one unfixed thread: humans cannot fix everything, and very few fix anything at all \u2014 so fixing several genuinely hard, DISTINCT stuck-points and making them stick across the window is exceptional and scores HIGH (9-10), and one stubborn temperament loop that is being increasingly overridden does NOT pull an otherwise broad, rising, sticky record down. The real question: across the record, did the problems they identified earlier become LESS of an issue in their later ACTIONS? Internal baselines (neuroticism, needing people to feel happy) are not the unit here \u2014 grade the actions.",
|
|
534
534
|
rungs: [
|
|
535
535
|
{ level: 3, marker: "The same BEHAVIORS recur across the window, unchanged \u2014 recognition (if any) never becomes a change in action. (A recurring feeling alongside changed behavior does NOT belong here \u2014 that is a fix, scored higher.)" },
|
|
536
536
|
{ level: 5, marker: "Occasionally a fix happens \u2014 intends to solve, and sometimes it lands, but not usually." },
|
|
@@ -530,7 +530,7 @@ var growthLens = {
|
|
|
530
530
|
{
|
|
531
531
|
key: "implementation",
|
|
532
532
|
name: "Observed execution improvement",
|
|
533
|
-
definition: "The slope itself: whether diagnosed problems get attacked with experiments and whether the change in BEHAVIOR lands and sticks. Graded from dated evidence on ACTIONS, not feelings: a recurring feeling, urge, or complaint is expected base temperament and is NOT a mark against implementation \u2014 only a recurring unchanged behavior is. Credit a changed action even when the underlying feeling repeats verbatim (e.g. still dreads cold outreach but now sends it daily). A COMPULSION OR URGE IS TEMPERAMENT, NOT AN ACTION: a perfectionism / over-analysis / decision-paralysis loop is the behavioral face of base temperament
|
|
533
|
+
definition: "The slope itself: whether diagnosed problems get attacked with experiments and whether the change in BEHAVIOR lands and sticks. Graded from dated evidence on ACTIONS, not feelings: a recurring feeling, urge, or complaint is expected base temperament and is NOT a mark against implementation \u2014 only a recurring unchanged behavior is. Credit a changed action even when the underlying feeling repeats verbatim (e.g. still dreads cold outreach but now sends it daily). A COMPULSION OR URGE IS TEMPERAMENT, NOT AN ACTION: a perfectionism / over-analysis / decision-paralysis loop is the behavioral face of base temperament, so if the person INCREASINGLY OVERRIDES it and still ships, that is temperament being managed better over time \u2014 a RISING slope, NOT a recurring unchanged action \u2014 and must NOT cap the score. Only count such a loop against implementation if the ACTION genuinely shows NO improvement across the window (still loses whole days with no rising ability to override and ship). A FIX THAT NEEDED A FORCING FUNCTION STILL COUNTS, FULLY: a change triggered by a deadline, a painful lesson, or 'getting burnt' that then LANDS and STICKS is a real fix on a legitimate route \u2014 learning from consequence is how humans change \u2014 so do NOT dock a landed, sticky fix for needing a catalyst; the catalyst is not a defect. Judge the slope over LONG horizons (weeks\u2192months across the dated record), NEVER within a single day or conversation \u2014 behavior change takes time, so the absence of same-day change is NOT a failure and must NEVER buckle the score. GRADE THE AGGREGATE SLOPE, not the one unfixed thread: humans cannot fix everything, and very few fix anything at all \u2014 so fixing several genuinely hard, DISTINCT stuck-points and making them stick across the window is exceptional and scores HIGH (9-10), and one stubborn temperament loop that is being increasingly overridden does NOT pull an otherwise broad, rising, sticky record down. The real question: across the record, did the problems they identified earlier become LESS of an issue in their later ACTIONS? Internal baselines (neuroticism, needing people to feel happy) are not the unit here \u2014 grade the actions.",
|
|
534
534
|
rungs: [
|
|
535
535
|
{ level: 3, marker: "The same BEHAVIORS recur across the window, unchanged \u2014 recognition (if any) never becomes a change in action. (A recurring feeling alongside changed behavior does NOT belong here \u2014 that is a fix, scored higher.)" },
|
|
536
536
|
{ level: 5, marker: "Occasionally a fix happens \u2014 intends to solve, and sometimes it lands, but not usually." },
|