polymath-society 0.2.11 → 0.2.13

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 (36) hide show
  1. package/dist/cli.js +109 -49
  2. package/dist/engine/chat-loops.js +23 -2
  3. package/dist/engine/exp-allfacets.js +23 -2
  4. package/dist/engine/exp-person.js +23 -2
  5. package/dist/engine/exp-pipeline.js +22 -1
  6. package/dist/engine/ingest-export.js +2 -2
  7. package/dist/engine/peak-demos.js +23 -2
  8. package/dist/engine/person-dimension-summary.js +23 -2
  9. package/dist/engine/person-facet-lines.js +23 -2
  10. package/dist/engine/person-headline.js +23 -2
  11. package/dist/engine/person-report.js +23 -2
  12. package/dist/engine/person-self-image.js +23 -2
  13. package/dist/engine/public-report.js +25 -4
  14. package/dist/engine/run-analysis.js +23 -2
  15. package/dist/engine/run-tagger.js +22 -1
  16. package/dist/index.js +37 -8
  17. package/dist/pipeline/coding-agglomerate.js +25 -4
  18. package/dist/pipeline/coding-aggregate.js +3 -3
  19. package/dist/pipeline/coding-build.js +3 -3
  20. package/dist/pipeline/coding-coaching.js +25 -4
  21. package/dist/pipeline/coding-day-digest.js +25 -4
  22. package/dist/pipeline/coding-delegation.js +25 -4
  23. package/dist/pipeline/coding-expertise.js +25 -4
  24. package/dist/pipeline/coding-flow.js +3 -3
  25. package/dist/pipeline/coding-focus.js +22 -1
  26. package/dist/pipeline/coding-frontier-detail.js +25 -4
  27. package/dist/pipeline/coding-frontier.js +3 -3
  28. package/dist/pipeline/coding-gap-dist.js +3 -3
  29. package/dist/pipeline/coding-gap.js +25 -4
  30. package/dist/pipeline/coding-grade.js +40 -5
  31. package/dist/pipeline/coding-nutshell.js +25 -4
  32. package/dist/pipeline/coding-projects.js +3 -3
  33. package/dist/pipeline/coding-walkthrough.js +41 -5
  34. package/dist/web/app.js +65 -2
  35. package/dist/web/styles.css +1 -1
  36. package/package.json +1 -1
@@ -151,6 +151,25 @@ import { spawn } from "child_process";
151
151
  import { promises as fs2 } from "fs";
152
152
  import path2 from "path";
153
153
 
154
+ // ../coding-core/dist/env.js
155
+ var AUTH_VARS = ["ANTHROPIC_API_KEY", "ANTHROPIC_AUTH_TOKEN"];
156
+ var warned = false;
157
+ function claudeCliEnv(base = process.env) {
158
+ if (process.env.POLYMATH_USE_API_KEY === "1")
159
+ return base;
160
+ const present = AUTH_VARS.filter((k) => base[k]);
161
+ if (!present.length)
162
+ return base;
163
+ if (!warned) {
164
+ warned = true;
165
+ console.error(`[polymath-society] ${present.join(" + ")} is set in your shell \u2014 ignoring it so the analysis runs on your claude.ai login (the key would take over auth and either fail or bill your API account). Set POLYMATH_USE_API_KEY=1 if you really want the API key used.`);
166
+ }
167
+ const scrubbed = { ...base };
168
+ for (const k of AUTH_VARS)
169
+ delete scrubbed[k];
170
+ return scrubbed;
171
+ }
172
+
154
173
  // ../../lib/agents/shared/adapter.ts
155
174
  function extractJson(text2) {
156
175
  const fences = [...text2.matchAll(/```json\s*([\s\S]*?)```/gi)];
@@ -255,7 +274,9 @@ var cliAdapter = {
255
274
  await new Promise((resolve2, reject) => {
256
275
  const child = spawn(CLAUDE_BIN, args, {
257
276
  cwd: inv.cwd ?? inv.addDir,
258
- env: process.env,
277
+ // scrubbed: a stray ANTHROPIC_API_KEY in the user's shell hijacks the
278
+ // claude CLI away from their claude.ai login (coding-core/env.ts)
279
+ env: claudeCliEnv(),
259
280
  stdio: ["ignore", "pipe", "pipe"],
260
281
  // Own process group, so a timeout can kill the WHOLE tree (claude spawns
261
282
  // its own children that otherwise orphan and pile up — the root cause of
@@ -15653,7 +15674,7 @@ var CODING_CRITERIA = [
15653
15674
  label: "Abstraction \u2014 seeing the load-bearing thing, and being right",
15654
15675
  graded: true,
15655
15676
  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.",
15656
- 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) / 'don't hurt Natalie, not long-term compatible' (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).",
15677
+ 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).",
15657
15678
  rungs: [
15658
15679
  { level: 2, marker: "A fork existed; defers the call to the AI, or takes the obvious branch; vague." },
15659
15680
  { level: 4, marker: "Notices something, but the question is vague or obvious \u2014 anyone in the seat asks it." },
@@ -16106,11 +16127,11 @@ var TRANSCRIPT_LINE_RE = new RegExp(`^\\s*(${NOTE})((,| and) ${NOTE})*\\s*$|^\\s
16106
16127
 
16107
16128
  // ../../lib/calibration/index.ts
16108
16129
  var DEFAULT_CALIBRATION = {
16109
- version: "2026-07-14.2",
16130
+ version: "2026-07-15.1",
16110
16131
  // = RUBRIC_FINGERPRINT of the shipped npm rubric (packages/coding-analyzer/
16111
16132
  // src/grade/criteria.ts). A unit test fails loud when the rubric changes
16112
16133
  // without this being updated (and re-pushed to the server).
16113
- rubricVersion: "f51b3a93a3",
16134
+ rubricVersion: "7983c01d53",
16114
16135
  // Canonical scale = the one the product owner set for the public report
16115
16136
  // (11=0.01% … 8=2%), extended downward from the old report ladder. The old
16116
16137
  // CodeAnalysisView / npm-viewer maps (7→10%/15%, 6→25%/30%) were drift, not
@@ -324,7 +324,7 @@ var CODING_CRITERIA = [
324
324
  label: "Abstraction \u2014 seeing the load-bearing thing, and being right",
325
325
  graded: true,
326
326
  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.",
327
- 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) / 'don't hurt Natalie, not long-term compatible' (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).",
327
+ 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).",
328
328
  rungs: [
329
329
  { level: 2, marker: "A fork existed; defers the call to the AI, or takes the obvious branch; vague." },
330
330
  { level: 4, marker: "Notices something, but the question is vague or obvious \u2014 anyone in the seat asks it." },
@@ -431,11 +431,11 @@ var IDLE_CAP_MS = 12 * 6e4;
431
431
 
432
432
  // ../../lib/calibration/index.ts
433
433
  var DEFAULT_CALIBRATION = {
434
- version: "2026-07-14.2",
434
+ version: "2026-07-15.1",
435
435
  // = RUBRIC_FINGERPRINT of the shipped npm rubric (packages/coding-analyzer/
436
436
  // src/grade/criteria.ts). A unit test fails loud when the rubric changes
437
437
  // without this being updated (and re-pushed to the server).
438
- rubricVersion: "f51b3a93a3",
438
+ rubricVersion: "7983c01d53",
439
439
  // Canonical scale = the one the product owner set for the public report
440
440
  // (11=0.01% … 8=2%), extended downward from the old report ladder. The old
441
441
  // CodeAnalysisView / npm-viewer maps (7→10%/15%, 6→25%/30%) were drift, not
@@ -1138,7 +1138,7 @@ var CODING_CRITERIA = [
1138
1138
  label: "Abstraction \u2014 seeing the load-bearing thing, and being right",
1139
1139
  graded: true,
1140
1140
  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.",
1141
- 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) / 'don't hurt Natalie, not long-term compatible' (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).",
1141
+ 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).",
1142
1142
  rungs: [
1143
1143
  { level: 2, marker: "A fork existed; defers the call to the AI, or takes the obvious branch; vague." },
1144
1144
  { level: 4, marker: "Notices something, but the question is vague or obvious \u2014 anyone in the seat asks it." },
@@ -1294,11 +1294,11 @@ var TRANSCRIPT_LINE_RE = new RegExp(`^\\s*(${NOTE})((,| and) ${NOTE})*\\s*$|^\\s
1294
1294
 
1295
1295
  // ../../lib/calibration/index.ts
1296
1296
  var DEFAULT_CALIBRATION = {
1297
- version: "2026-07-14.2",
1297
+ version: "2026-07-15.1",
1298
1298
  // = RUBRIC_FINGERPRINT of the shipped npm rubric (packages/coding-analyzer/
1299
1299
  // src/grade/criteria.ts). A unit test fails loud when the rubric changes
1300
1300
  // without this being updated (and re-pushed to the server).
1301
- rubricVersion: "f51b3a93a3",
1301
+ rubricVersion: "7983c01d53",
1302
1302
  // Canonical scale = the one the product owner set for the public report
1303
1303
  // (11=0.01% … 8=2%), extended downward from the old report ladder. The old
1304
1304
  // CodeAnalysisView / npm-viewer maps (7→10%/15%, 6→25%/30%) were drift, not
@@ -145,6 +145,25 @@ import { spawn } from "child_process";
145
145
  import { promises as fs2 } from "fs";
146
146
  import path2 from "path";
147
147
 
148
+ // ../coding-core/dist/env.js
149
+ var AUTH_VARS = ["ANTHROPIC_API_KEY", "ANTHROPIC_AUTH_TOKEN"];
150
+ var warned = false;
151
+ function claudeCliEnv(base = process.env) {
152
+ if (process.env.POLYMATH_USE_API_KEY === "1")
153
+ return base;
154
+ const present = AUTH_VARS.filter((k) => base[k]);
155
+ if (!present.length)
156
+ return base;
157
+ if (!warned) {
158
+ warned = true;
159
+ console.error(`[polymath-society] ${present.join(" + ")} is set in your shell \u2014 ignoring it so the analysis runs on your claude.ai login (the key would take over auth and either fail or bill your API account). Set POLYMATH_USE_API_KEY=1 if you really want the API key used.`);
160
+ }
161
+ const scrubbed = { ...base };
162
+ for (const k of AUTH_VARS)
163
+ delete scrubbed[k];
164
+ return scrubbed;
165
+ }
166
+
148
167
  // ../../lib/agents/shared/adapter.ts
149
168
  function extractJson(text2) {
150
169
  const fences = [...text2.matchAll(/```json\s*([\s\S]*?)```/gi)];
@@ -249,7 +268,9 @@ var cliAdapter = {
249
268
  await new Promise((resolve2, reject) => {
250
269
  const child = spawn(CLAUDE_BIN, args, {
251
270
  cwd: inv.cwd ?? inv.addDir,
252
- env: process.env,
271
+ // scrubbed: a stray ANTHROPIC_API_KEY in the user's shell hijacks the
272
+ // claude CLI away from their claude.ai login (coding-core/env.ts)
273
+ env: claudeCliEnv(),
253
274
  stdio: ["ignore", "pipe", "pipe"],
254
275
  // Own process group, so a timeout can kill the WHOLE tree (claude spawns
255
276
  // its own children that otherwise orphan and pile up — the root cause of
@@ -15651,7 +15672,7 @@ var CODING_CRITERIA = [
15651
15672
  label: "Abstraction \u2014 seeing the load-bearing thing, and being right",
15652
15673
  graded: true,
15653
15674
  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.",
15654
- 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) / 'don't hurt Natalie, not long-term compatible' (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).",
15675
+ 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).",
15655
15676
  rungs: [
15656
15677
  { level: 2, marker: "A fork existed; defers the call to the AI, or takes the obvious branch; vague." },
15657
15678
  { level: 4, marker: "Notices something, but the question is vague or obvious \u2014 anyone in the seat asks it." },
@@ -16269,11 +16290,11 @@ function computeWorkstyle(inp) {
16269
16290
 
16270
16291
  // ../../lib/calibration/index.ts
16271
16292
  var DEFAULT_CALIBRATION = {
16272
- version: "2026-07-14.2",
16293
+ version: "2026-07-15.1",
16273
16294
  // = RUBRIC_FINGERPRINT of the shipped npm rubric (packages/coding-analyzer/
16274
16295
  // src/grade/criteria.ts). A unit test fails loud when the rubric changes
16275
16296
  // without this being updated (and re-pushed to the server).
16276
- rubricVersion: "f51b3a93a3",
16297
+ rubricVersion: "7983c01d53",
16277
16298
  // Canonical scale = the one the product owner set for the public report
16278
16299
  // (11=0.01% … 8=2%), extended downward from the old report ladder. The old
16279
16300
  // CodeAnalysisView / npm-viewer maps (7→10%/15%, 6→25%/30%) were drift, not
@@ -151,6 +151,25 @@ import { spawn } from "child_process";
151
151
  import { promises as fs2 } from "fs";
152
152
  import path2 from "path";
153
153
 
154
+ // ../coding-core/dist/env.js
155
+ var AUTH_VARS = ["ANTHROPIC_API_KEY", "ANTHROPIC_AUTH_TOKEN"];
156
+ var warned = false;
157
+ function claudeCliEnv(base = process.env) {
158
+ if (process.env.POLYMATH_USE_API_KEY === "1")
159
+ return base;
160
+ const present = AUTH_VARS.filter((k) => base[k]);
161
+ if (!present.length)
162
+ return base;
163
+ if (!warned) {
164
+ warned = true;
165
+ console.error(`[polymath-society] ${present.join(" + ")} is set in your shell \u2014 ignoring it so the analysis runs on your claude.ai login (the key would take over auth and either fail or bill your API account). Set POLYMATH_USE_API_KEY=1 if you really want the API key used.`);
166
+ }
167
+ const scrubbed = { ...base };
168
+ for (const k of AUTH_VARS)
169
+ delete scrubbed[k];
170
+ return scrubbed;
171
+ }
172
+
154
173
  // ../../lib/agents/shared/adapter.ts
155
174
  function extractJson(text2) {
156
175
  const fences = [...text2.matchAll(/```json\s*([\s\S]*?)```/gi)];
@@ -255,7 +274,9 @@ var cliAdapter = {
255
274
  await new Promise((resolve2, reject) => {
256
275
  const child = spawn(CLAUDE_BIN, args, {
257
276
  cwd: inv.cwd ?? inv.addDir,
258
- env: process.env,
277
+ // scrubbed: a stray ANTHROPIC_API_KEY in the user's shell hijacks the
278
+ // claude CLI away from their claude.ai login (coding-core/env.ts)
279
+ env: claudeCliEnv(),
259
280
  stdio: ["ignore", "pipe", "pipe"],
260
281
  // Own process group, so a timeout can kill the WHOLE tree (claude spawns
261
282
  // its own children that otherwise orphan and pile up — the root cause of
@@ -15901,7 +15922,7 @@ var CODING_CRITERIA = [
15901
15922
  label: "Abstraction \u2014 seeing the load-bearing thing, and being right",
15902
15923
  graded: true,
15903
15924
  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.",
15904
- 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) / 'don't hurt Natalie, not long-term compatible' (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).",
15925
+ 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).",
15905
15926
  rungs: [
15906
15927
  { level: 2, marker: "A fork existed; defers the call to the AI, or takes the obvious branch; vague." },
15907
15928
  { level: 4, marker: "Notices something, but the question is vague or obvious \u2014 anyone in the seat asks it." },
@@ -16012,11 +16033,11 @@ var TRANSCRIPT_LINE_RE = new RegExp(`^\\s*(${NOTE})((,| and) ${NOTE})*\\s*$|^\\s
16012
16033
 
16013
16034
  // ../../lib/calibration/index.ts
16014
16035
  var DEFAULT_CALIBRATION = {
16015
- version: "2026-07-14.2",
16036
+ version: "2026-07-15.1",
16016
16037
  // = RUBRIC_FINGERPRINT of the shipped npm rubric (packages/coding-analyzer/
16017
16038
  // src/grade/criteria.ts). A unit test fails loud when the rubric changes
16018
16039
  // without this being updated (and re-pushed to the server).
16019
- rubricVersion: "f51b3a93a3",
16040
+ rubricVersion: "7983c01d53",
16020
16041
  // Canonical scale = the one the product owner set for the public report
16021
16042
  // (11=0.01% … 8=2%), extended downward from the old report ladder. The old
16022
16043
  // CodeAnalysisView / npm-viewer maps (7→10%/15%, 6→25%/30%) were drift, not
@@ -151,6 +151,25 @@ import { spawn } from "child_process";
151
151
  import { promises as fs2 } from "fs";
152
152
  import path2 from "path";
153
153
 
154
+ // ../coding-core/dist/env.js
155
+ var AUTH_VARS = ["ANTHROPIC_API_KEY", "ANTHROPIC_AUTH_TOKEN"];
156
+ var warned = false;
157
+ function claudeCliEnv(base = process.env) {
158
+ if (process.env.POLYMATH_USE_API_KEY === "1")
159
+ return base;
160
+ const present = AUTH_VARS.filter((k) => base[k]);
161
+ if (!present.length)
162
+ return base;
163
+ if (!warned) {
164
+ warned = true;
165
+ console.error(`[polymath-society] ${present.join(" + ")} is set in your shell \u2014 ignoring it so the analysis runs on your claude.ai login (the key would take over auth and either fail or bill your API account). Set POLYMATH_USE_API_KEY=1 if you really want the API key used.`);
166
+ }
167
+ const scrubbed = { ...base };
168
+ for (const k of AUTH_VARS)
169
+ delete scrubbed[k];
170
+ return scrubbed;
171
+ }
172
+
154
173
  // ../../lib/agents/shared/adapter.ts
155
174
  function extractJson(text2) {
156
175
  const fences = [...text2.matchAll(/```json\s*([\s\S]*?)```/gi)];
@@ -255,7 +274,9 @@ var cliAdapter = {
255
274
  await new Promise((resolve2, reject) => {
256
275
  const child = spawn(CLAUDE_BIN, args, {
257
276
  cwd: inv.cwd ?? inv.addDir,
258
- env: process.env,
277
+ // scrubbed: a stray ANTHROPIC_API_KEY in the user's shell hijacks the
278
+ // claude CLI away from their claude.ai login (coding-core/env.ts)
279
+ env: claudeCliEnv(),
259
280
  stdio: ["ignore", "pipe", "pipe"],
260
281
  // Own process group, so a timeout can kill the WHOLE tree (claude spawns
261
282
  // its own children that otherwise orphan and pile up — the root cause of
@@ -16308,7 +16329,7 @@ var CODING_CRITERIA = [
16308
16329
  label: "Abstraction \u2014 seeing the load-bearing thing, and being right",
16309
16330
  graded: true,
16310
16331
  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.",
16311
- 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) / 'don't hurt Natalie, not long-term compatible' (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).",
16332
+ 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).",
16312
16333
  rungs: [
16313
16334
  { level: 2, marker: "A fork existed; defers the call to the AI, or takes the obvious branch; vague." },
16314
16335
  { level: 4, marker: "Notices something, but the question is vague or obvious \u2014 anyone in the seat asks it." },
@@ -16419,11 +16440,11 @@ var TRANSCRIPT_LINE_RE = new RegExp(`^\\s*(${NOTE})((,| and) ${NOTE})*\\s*$|^\\s
16419
16440
 
16420
16441
  // ../../lib/calibration/index.ts
16421
16442
  var DEFAULT_CALIBRATION = {
16422
- version: "2026-07-14.2",
16443
+ version: "2026-07-15.1",
16423
16444
  // = RUBRIC_FINGERPRINT of the shipped npm rubric (packages/coding-analyzer/
16424
16445
  // src/grade/criteria.ts). A unit test fails loud when the rubric changes
16425
16446
  // without this being updated (and re-pushed to the server).
16426
- rubricVersion: "f51b3a93a3",
16447
+ rubricVersion: "7983c01d53",
16427
16448
  // Canonical scale = the one the product owner set for the public report
16428
16449
  // (11=0.01% … 8=2%), extended downward from the old report ladder. The old
16429
16450
  // CodeAnalysisView / npm-viewer maps (7→10%/15%, 6→25%/30%) were drift, not
@@ -147,6 +147,25 @@ import { spawn } from "child_process";
147
147
  import { promises as fs2 } from "fs";
148
148
  import path2 from "path";
149
149
 
150
+ // ../coding-core/dist/env.js
151
+ var AUTH_VARS = ["ANTHROPIC_API_KEY", "ANTHROPIC_AUTH_TOKEN"];
152
+ var warned = false;
153
+ function claudeCliEnv(base = process.env) {
154
+ if (process.env.POLYMATH_USE_API_KEY === "1")
155
+ return base;
156
+ const present = AUTH_VARS.filter((k) => base[k]);
157
+ if (!present.length)
158
+ return base;
159
+ if (!warned) {
160
+ warned = true;
161
+ console.error(`[polymath-society] ${present.join(" + ")} is set in your shell \u2014 ignoring it so the analysis runs on your claude.ai login (the key would take over auth and either fail or bill your API account). Set POLYMATH_USE_API_KEY=1 if you really want the API key used.`);
162
+ }
163
+ const scrubbed = { ...base };
164
+ for (const k of AUTH_VARS)
165
+ delete scrubbed[k];
166
+ return scrubbed;
167
+ }
168
+
150
169
  // ../../lib/agents/shared/adapter.ts
151
170
  function extractJson(text2) {
152
171
  const fences = [...text2.matchAll(/```json\s*([\s\S]*?)```/gi)];
@@ -251,7 +270,9 @@ var cliAdapter = {
251
270
  await new Promise((resolve2, reject) => {
252
271
  const child = spawn(CLAUDE_BIN, args, {
253
272
  cwd: inv.cwd ?? inv.addDir,
254
- env: process.env,
273
+ // scrubbed: a stray ANTHROPIC_API_KEY in the user's shell hijacks the
274
+ // claude CLI away from their claude.ai login (coding-core/env.ts)
275
+ env: claudeCliEnv(),
255
276
  stdio: ["ignore", "pipe", "pipe"],
256
277
  // Own process group, so a timeout can kill the WHOLE tree (claude spawns
257
278
  // its own children that otherwise orphan and pile up — the root cause of
@@ -15918,7 +15939,7 @@ var CODING_CRITERIA = [
15918
15939
  label: "Abstraction \u2014 seeing the load-bearing thing, and being right",
15919
15940
  graded: true,
15920
15941
  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.",
15921
- 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) / 'don't hurt Natalie, not long-term compatible' (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).",
15942
+ 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).",
15922
15943
  rungs: [
15923
15944
  { level: 2, marker: "A fork existed; defers the call to the AI, or takes the obvious branch; vague." },
15924
15945
  { level: 4, marker: "Notices something, but the question is vague or obvious \u2014 anyone in the seat asks it." },
@@ -16029,11 +16050,11 @@ var TRANSCRIPT_LINE_RE = new RegExp(`^\\s*(${NOTE})((,| and) ${NOTE})*\\s*$|^\\s
16029
16050
 
16030
16051
  // ../../lib/calibration/index.ts
16031
16052
  var DEFAULT_CALIBRATION = {
16032
- version: "2026-07-14.2",
16053
+ version: "2026-07-15.1",
16033
16054
  // = RUBRIC_FINGERPRINT of the shipped npm rubric (packages/coding-analyzer/
16034
16055
  // src/grade/criteria.ts). A unit test fails loud when the rubric changes
16035
16056
  // without this being updated (and re-pushed to the server).
16036
- rubricVersion: "f51b3a93a3",
16057
+ rubricVersion: "7983c01d53",
16037
16058
  // Canonical scale = the one the product owner set for the public report
16038
16059
  // (11=0.01% … 8=2%), extended downward from the old report ladder. The old
16039
16060
  // CodeAnalysisView / npm-viewer maps (7→10%/15%, 6→25%/30%) were drift, not
@@ -287,7 +287,7 @@ var CODING_CRITERIA = [
287
287
  label: "Abstraction \u2014 seeing the load-bearing thing, and being right",
288
288
  graded: true,
289
289
  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.",
290
- 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) / 'don't hurt Natalie, not long-term compatible' (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).",
290
+ 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).",
291
291
  rungs: [
292
292
  { level: 2, marker: "A fork existed; defers the call to the AI, or takes the obvious branch; vague." },
293
293
  { level: 4, marker: "Notices something, but the question is vague or obvious \u2014 anyone in the seat asks it." },
@@ -394,11 +394,11 @@ var IDLE_CAP_MS = 12 * 6e4;
394
394
 
395
395
  // ../../lib/calibration/index.ts
396
396
  var DEFAULT_CALIBRATION = {
397
- version: "2026-07-14.2",
397
+ version: "2026-07-15.1",
398
398
  // = RUBRIC_FINGERPRINT of the shipped npm rubric (packages/coding-analyzer/
399
399
  // src/grade/criteria.ts). A unit test fails loud when the rubric changes
400
400
  // without this being updated (and re-pushed to the server).
401
- rubricVersion: "f51b3a93a3",
401
+ rubricVersion: "7983c01d53",
402
402
  // Canonical scale = the one the product owner set for the public report
403
403
  // (11=0.01% … 8=2%), extended downward from the old report ladder. The old
404
404
  // CodeAnalysisView / npm-viewer maps (7→10%/15%, 6→25%/30%) were drift, not
@@ -159,6 +159,25 @@ import { spawn } from "child_process";
159
159
  import { promises as fs2 } from "fs";
160
160
  import path2 from "path";
161
161
 
162
+ // ../coding-core/dist/env.js
163
+ var AUTH_VARS = ["ANTHROPIC_API_KEY", "ANTHROPIC_AUTH_TOKEN"];
164
+ var warned = false;
165
+ function claudeCliEnv(base = process.env) {
166
+ if (process.env.POLYMATH_USE_API_KEY === "1")
167
+ return base;
168
+ const present = AUTH_VARS.filter((k) => base[k]);
169
+ if (!present.length)
170
+ return base;
171
+ if (!warned) {
172
+ warned = true;
173
+ console.error(`[polymath-society] ${present.join(" + ")} is set in your shell \u2014 ignoring it so the analysis runs on your claude.ai login (the key would take over auth and either fail or bill your API account). Set POLYMATH_USE_API_KEY=1 if you really want the API key used.`);
174
+ }
175
+ const scrubbed = { ...base };
176
+ for (const k of AUTH_VARS)
177
+ delete scrubbed[k];
178
+ return scrubbed;
179
+ }
180
+
162
181
  // ../../lib/agents/shared/adapter.ts
163
182
  function extractJson(text2) {
164
183
  const fences = [...text2.matchAll(/```json\s*([\s\S]*?)```/gi)];
@@ -263,7 +282,9 @@ var cliAdapter = {
263
282
  await new Promise((resolve2, reject) => {
264
283
  const child = spawn(CLAUDE_BIN, args, {
265
284
  cwd: inv.cwd ?? inv.addDir,
266
- env: process.env,
285
+ // scrubbed: a stray ANTHROPIC_API_KEY in the user's shell hijacks the
286
+ // claude CLI away from their claude.ai login (coding-core/env.ts)
287
+ env: claudeCliEnv(),
267
288
  stdio: ["ignore", "pipe", "pipe"],
268
289
  // Own process group, so a timeout can kill the WHOLE tree (claude spawns
269
290
  // its own children that otherwise orphan and pile up — the root cause of
@@ -145,6 +145,25 @@ import { spawn } from "child_process";
145
145
  import { promises as fs2 } from "fs";
146
146
  import path2 from "path";
147
147
 
148
+ // ../coding-core/dist/env.js
149
+ var AUTH_VARS = ["ANTHROPIC_API_KEY", "ANTHROPIC_AUTH_TOKEN"];
150
+ var warned = false;
151
+ function claudeCliEnv(base = process.env) {
152
+ if (process.env.POLYMATH_USE_API_KEY === "1")
153
+ return base;
154
+ const present = AUTH_VARS.filter((k) => base[k]);
155
+ if (!present.length)
156
+ return base;
157
+ if (!warned) {
158
+ warned = true;
159
+ console.error(`[polymath-society] ${present.join(" + ")} is set in your shell \u2014 ignoring it so the analysis runs on your claude.ai login (the key would take over auth and either fail or bill your API account). Set POLYMATH_USE_API_KEY=1 if you really want the API key used.`);
160
+ }
161
+ const scrubbed = { ...base };
162
+ for (const k of AUTH_VARS)
163
+ delete scrubbed[k];
164
+ return scrubbed;
165
+ }
166
+
148
167
  // ../../lib/agents/shared/adapter.ts
149
168
  function extractJson(text2) {
150
169
  const fences = [...text2.matchAll(/```json\s*([\s\S]*?)```/gi)];
@@ -249,7 +268,9 @@ var cliAdapter = {
249
268
  await new Promise((resolve2, reject) => {
250
269
  const child = spawn(CLAUDE_BIN, args, {
251
270
  cwd: inv.cwd ?? inv.addDir,
252
- env: process.env,
271
+ // scrubbed: a stray ANTHROPIC_API_KEY in the user's shell hijacks the
272
+ // claude CLI away from their claude.ai login (coding-core/env.ts)
273
+ env: claudeCliEnv(),
253
274
  stdio: ["ignore", "pipe", "pipe"],
254
275
  // Own process group, so a timeout can kill the WHOLE tree (claude spawns
255
276
  // its own children that otherwise orphan and pile up — the root cause of
@@ -15884,7 +15905,7 @@ var CODING_CRITERIA = [
15884
15905
  label: "Abstraction \u2014 seeing the load-bearing thing, and being right",
15885
15906
  graded: true,
15886
15907
  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.",
15887
- 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) / 'don't hurt Natalie, not long-term compatible' (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).",
15908
+ 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).",
15888
15909
  rungs: [
15889
15910
  { level: 2, marker: "A fork existed; defers the call to the AI, or takes the obvious branch; vague." },
15890
15911
  { level: 4, marker: "Notices something, but the question is vague or obvious \u2014 anyone in the seat asks it." },
@@ -15995,11 +16016,11 @@ var TRANSCRIPT_LINE_RE = new RegExp(`^\\s*(${NOTE})((,| and) ${NOTE})*\\s*$|^\\s
15995
16016
 
15996
16017
  // ../../lib/calibration/index.ts
15997
16018
  var DEFAULT_CALIBRATION = {
15998
- version: "2026-07-14.2",
16019
+ version: "2026-07-15.1",
15999
16020
  // = RUBRIC_FINGERPRINT of the shipped npm rubric (packages/coding-analyzer/
16000
16021
  // src/grade/criteria.ts). A unit test fails loud when the rubric changes
16001
16022
  // without this being updated (and re-pushed to the server).
16002
- rubricVersion: "f51b3a93a3",
16023
+ rubricVersion: "7983c01d53",
16003
16024
  // Canonical scale = the one the product owner set for the public report
16004
16025
  // (11=0.01% … 8=2%), extended downward from the old report ladder. The old
16005
16026
  // CodeAnalysisView / npm-viewer maps (7→10%/15%, 6→25%/30%) were drift, not
@@ -47,7 +47,7 @@ var CODING_CRITERIA = [
47
47
  label: "Abstraction \u2014 seeing the load-bearing thing, and being right",
48
48
  graded: true,
49
49
  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.",
50
- 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) / 'don't hurt Natalie, not long-term compatible' (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).",
50
+ 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).",
51
51
  rungs: [
52
52
  { level: 2, marker: "A fork existed; defers the call to the AI, or takes the obvious branch; vague." },
53
53
  { level: 4, marker: "Notices something, but the question is vague or obvious \u2014 anyone in the seat asks it." },
@@ -203,11 +203,11 @@ var TRANSCRIPT_LINE_RE = new RegExp(`^\\s*(${NOTE})((,| and) ${NOTE})*\\s*$|^\\s
203
203
 
204
204
  // ../../lib/calibration/index.ts
205
205
  var DEFAULT_CALIBRATION = {
206
- version: "2026-07-14.2",
206
+ version: "2026-07-15.1",
207
207
  // = RUBRIC_FINGERPRINT of the shipped npm rubric (packages/coding-analyzer/
208
208
  // src/grade/criteria.ts). A unit test fails loud when the rubric changes
209
209
  // without this being updated (and re-pushed to the server).
210
- rubricVersion: "f51b3a93a3",
210
+ rubricVersion: "7983c01d53",
211
211
  // Canonical scale = the one the product owner set for the public report
212
212
  // (11=0.01% … 8=2%), extended downward from the old report ladder. The old
213
213
  // CodeAnalysisView / npm-viewer maps (7→10%/15%, 6→25%/30%) were drift, not