polymath-society 0.2.5 → 0.2.6
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 +2339 -1546
- package/dist/engine/ingest-export.js +14 -8
- package/dist/engine/public-report.js +14 -8
- package/dist/index.js +1475 -60
- package/dist/pipeline/coding-agglomerate.js +289 -35
- package/dist/pipeline/coding-aggregate.js +15 -9
- package/dist/pipeline/coding-build.js +14 -8
- package/dist/pipeline/coding-coaching.js +273 -21
- package/dist/pipeline/coding-day-digest.js +17 -10
- package/dist/pipeline/coding-delegation.js +62 -17
- package/dist/pipeline/coding-expertise.js +166 -61
- package/dist/pipeline/coding-flow.js +14 -8
- package/dist/pipeline/coding-frontier-detail.js +143 -27
- package/dist/pipeline/coding-frontier.js +14 -8
- package/dist/pipeline/coding-gap-dist.js +14 -8
- package/dist/pipeline/coding-gap.js +140 -39
- package/dist/pipeline/coding-grade.js +44 -14
- package/dist/pipeline/coding-nutshell.js +39 -11
- package/dist/pipeline/coding-projects.js +41 -10
- package/dist/pipeline/coding-walkthrough.js +15 -9
- package/dist/web/app.js +493 -117
- package/dist/web/styles.css +1 -1
- package/package.json +1 -1
|
@@ -134,9 +134,7 @@ var require_secure_json_parse = __commonJS({
|
|
|
134
134
|
});
|
|
135
135
|
|
|
136
136
|
// ../../scripts/coding-frontier-detail.mts
|
|
137
|
-
import { promises as
|
|
138
|
-
import os2 from "os";
|
|
139
|
-
import path10 from "path";
|
|
137
|
+
import { promises as fs7 } from "fs";
|
|
140
138
|
|
|
141
139
|
// ../../lib/agents/shared/agent.ts
|
|
142
140
|
import { readFileSync } from "fs";
|
|
@@ -15608,6 +15606,10 @@ function invokeAgent(inv, opts = {}) {
|
|
|
15608
15606
|
return withLimitRetry(once, { label });
|
|
15609
15607
|
}
|
|
15610
15608
|
|
|
15609
|
+
// ../../lib/agents/coding/docsDir.ts
|
|
15610
|
+
import { promises as fs5 } from "fs";
|
|
15611
|
+
import path9 from "path";
|
|
15612
|
+
|
|
15611
15613
|
// ../../lib/agents/coding/materialize.ts
|
|
15612
15614
|
import { promises as fs4 } from "fs";
|
|
15613
15615
|
|
|
@@ -15751,13 +15753,100 @@ async function materializeSession(file2) {
|
|
|
15751
15753
|
return { text: lines.join("\n"), humanTurns, humanChars };
|
|
15752
15754
|
}
|
|
15753
15755
|
|
|
15756
|
+
// ../../lib/agents/coding/docsDir.ts
|
|
15757
|
+
async function writeScoreboard(codingDir, docs) {
|
|
15758
|
+
const gradesDir = path9.join(codingDir, "grades");
|
|
15759
|
+
let files = [];
|
|
15760
|
+
try {
|
|
15761
|
+
files = (await fs5.readdir(gradesDir)).filter((f) => f.endsWith(".json")).sort();
|
|
15762
|
+
} catch {
|
|
15763
|
+
return;
|
|
15764
|
+
}
|
|
15765
|
+
const byCriterion = /* @__PURE__ */ new Map();
|
|
15766
|
+
for (const f of files) {
|
|
15767
|
+
let g;
|
|
15768
|
+
try {
|
|
15769
|
+
g = JSON.parse(await fs5.readFile(path9.join(gradesDir, f), "utf8"));
|
|
15770
|
+
} catch {
|
|
15771
|
+
continue;
|
|
15772
|
+
}
|
|
15773
|
+
for (const c of g.criteria ?? []) {
|
|
15774
|
+
const s = c.score ?? c.bestEstimate;
|
|
15775
|
+
if (s == null) continue;
|
|
15776
|
+
const line = `L${s}${c.score == null ? "~" : ""} \xB7 ${(g.date ?? "").slice(0, 10)} \xB7 ${(g.title ?? g.sessionId ?? "").replace(/\n.*/s, "").slice(0, 60)} \xB7 ${g.sessionId} \u2014 ${(c.instance ?? "").slice(0, 110)}`;
|
|
15777
|
+
(byCriterion.get(c.key) ?? byCriterion.set(c.key, []).get(c.key)).push({ s, line });
|
|
15778
|
+
}
|
|
15779
|
+
}
|
|
15780
|
+
if (!byCriterion.size) return;
|
|
15781
|
+
const blocks = [...byCriterion.entries()].sort(([a], [b]) => a < b ? -1 : 1).map(
|
|
15782
|
+
([key, rows]) => `## ${key}
|
|
15783
|
+
${rows.sort((a, b) => b.s - a.s).map((r) => r.line).join("\n")}`
|
|
15784
|
+
);
|
|
15785
|
+
await fs5.writeFile(
|
|
15786
|
+
path9.join(docs, "_scoreboard.md"),
|
|
15787
|
+
`# Scoreboard \u2014 every graded session per criterion, best first.
|
|
15788
|
+
# Lx~ = estimate. Format: level \xB7 date \xB7 title \xB7 sessionId \u2014 graded instance.
|
|
15789
|
+
|
|
15790
|
+
${blocks.join("\n\n")}
|
|
15791
|
+
`
|
|
15792
|
+
);
|
|
15793
|
+
}
|
|
15794
|
+
async function ensureCodingDocs(codingDir, sessions) {
|
|
15795
|
+
const docs = path9.join(codingDir, "docs");
|
|
15796
|
+
await fs5.mkdir(docs, { recursive: true });
|
|
15797
|
+
const user = sessions.filter((s) => s.sessionId && !s.duplicateOf && (!("klass" in s) || s.klass === "interactive"));
|
|
15798
|
+
let written = 0;
|
|
15799
|
+
for (const s of user) {
|
|
15800
|
+
const out = path9.join(docs, `${s.sessionId}.txt`);
|
|
15801
|
+
try {
|
|
15802
|
+
await fs5.access(out);
|
|
15803
|
+
continue;
|
|
15804
|
+
} catch {
|
|
15805
|
+
}
|
|
15806
|
+
const mat = await materializeSession(s.file).catch(() => null);
|
|
15807
|
+
if (!mat?.text) continue;
|
|
15808
|
+
await fs5.writeFile(out, mat.text);
|
|
15809
|
+
written++;
|
|
15810
|
+
}
|
|
15811
|
+
const rows = user.sort((a, b) => (a.start ?? "") < (b.start ?? "") ? -1 : 1).map((s) => `${(s.start ?? "").slice(0, 10)} \xB7 ${(s.title ?? "").replace(/\n.*/s, "").slice(0, 80)} \xB7 ${s.sessionId}`);
|
|
15812
|
+
await fs5.writeFile(path9.join(docs, "_map.md"), rows.join("\n") + "\n");
|
|
15813
|
+
await writeScoreboard(codingDir, docs);
|
|
15814
|
+
if (written) console.log(`[docs] materialized ${written} new transcript(s) \u2192 ${docs}`);
|
|
15815
|
+
return docs;
|
|
15816
|
+
}
|
|
15817
|
+
function sourceLookupNote() {
|
|
15818
|
+
return `
|
|
15819
|
+
|
|
15820
|
+
SOURCE LOOKUP \u2014 you have Read/Grep/Glob over the working directory, which holds EVERYTHING known about this person's coding work. MAPS FIRST, grep second (the engine rule): docs/_scoreboard.md ranks every graded session per criterion, best first \u2014 one glance shows where the spikes/flair are, so start there when hunting peaks or checking whether a high mark is consistent or a one-off; day-digest.json is the day-by-day story of what they did in order \u2014 read the relevant days to get the arc before searching; docs/_map.md lists every session (date \xB7 title \xB7 sessionId). Then drill down: walkthroughs/<sessionId>.json is that session's phase-by-phase account (cheap, already distilled), grades/<sessionId>.json its graded findings with quotes, and docs/<sessionId>.txt the FULL transcript (">> " = the person, "[AI]" = the model) \u2014 the ground truth, read it when the distilled layers can't settle it. Other artifacts (flow.json, delegation/, expertise/, aggregate.json) are there too if a claim depends on them. The digest you were given is the spine \u2014 use lookups when a CLAIM-MOVING question cannot be settled from it (a moment you are about to headline, a promotion/depth call, an ambiguous engagement, whether detail was vision or boilerplate). VERIFY every verbatim quote you cite by finding it in the transcript first; if you cannot find it, do not use it. Look up what changes the output \u2014 do not re-read the whole corpus.`;
|
|
15821
|
+
}
|
|
15822
|
+
|
|
15823
|
+
// ../../lib/agents/coding/promptCache.ts
|
|
15824
|
+
import { createHash } from "crypto";
|
|
15825
|
+
import { promises as fs6 } from "fs";
|
|
15826
|
+
function promptSha(parts) {
|
|
15827
|
+
const h = createHash("sha256");
|
|
15828
|
+
for (const p of parts) {
|
|
15829
|
+
h.update(p ?? "");
|
|
15830
|
+
h.update("\0");
|
|
15831
|
+
}
|
|
15832
|
+
return h.digest("hex").slice(0, 16);
|
|
15833
|
+
}
|
|
15834
|
+
async function reusableOutput(outPath, sha, valid, key = "promptSha") {
|
|
15835
|
+
try {
|
|
15836
|
+
const o = JSON.parse(await fs6.readFile(outPath, "utf8"));
|
|
15837
|
+
if (o[key] === sha && valid(o)) return o;
|
|
15838
|
+
} catch {
|
|
15839
|
+
}
|
|
15840
|
+
return null;
|
|
15841
|
+
}
|
|
15842
|
+
|
|
15754
15843
|
// ../../lib/agents/coding/profile.ts
|
|
15755
|
-
import
|
|
15844
|
+
import path10 from "path";
|
|
15756
15845
|
|
|
15757
15846
|
// ../../lib/calibration/fingerprint.ts
|
|
15758
|
-
import { createHash } from "node:crypto";
|
|
15847
|
+
import { createHash as createHash2 } from "node:crypto";
|
|
15759
15848
|
function rubricFingerprint(criteria) {
|
|
15760
|
-
return
|
|
15849
|
+
return createHash2("sha256").update(JSON.stringify(criteria)).digest("hex").slice(0, 10);
|
|
15761
15850
|
}
|
|
15762
15851
|
|
|
15763
15852
|
// ../../lib/agents/coding/criteria.ts
|
|
@@ -15906,7 +15995,7 @@ var TRANSCRIPT_LINE_RE = new RegExp(`^\\s*(${NOTE})((,| and) ${NOTE})*\\s*$|^\\s
|
|
|
15906
15995
|
|
|
15907
15996
|
// ../../lib/calibration/index.ts
|
|
15908
15997
|
var DEFAULT_CALIBRATION = {
|
|
15909
|
-
version: "2026-07-
|
|
15998
|
+
version: "2026-07-14.2",
|
|
15910
15999
|
// = RUBRIC_FINGERPRINT of the shipped npm rubric (packages/coding-analyzer/
|
|
15911
16000
|
// src/grade/criteria.ts). A unit test fails loud when the rubric changes
|
|
15912
16001
|
// without this being updated (and re-pushed to the server).
|
|
@@ -15995,7 +16084,7 @@ var DEFAULT_CALIBRATION = {
|
|
|
15995
16084
|
}
|
|
15996
16085
|
],
|
|
15997
16086
|
codingTiers: {
|
|
15998
|
-
push: { median: 300, sigma:
|
|
16087
|
+
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." },
|
|
15999
16088
|
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." },
|
|
16000
16089
|
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" }
|
|
16001
16090
|
},
|
|
@@ -16028,12 +16117,18 @@ var DEFAULT_CALIBRATION = {
|
|
|
16028
16117
|
line: "the Claude Code lead runs 10\u201315 sessions at once; his #1 tip is 3\u20135 git worktrees in parallel"
|
|
16029
16118
|
},
|
|
16030
16119
|
throughput: {
|
|
16031
|
-
//
|
|
16032
|
-
//
|
|
16033
|
-
//
|
|
16034
|
-
//
|
|
16035
|
-
|
|
16036
|
-
|
|
16120
|
+
// Two DIFFERENT kinds of line (2026-07-14.2): topAvg is a PERCENTILE
|
|
16121
|
+
// claim — what a 1-in-1,000 user AVERAGES over substantial days (5k/day:
|
|
16122
|
+
// near-daily heavy dictation; a measured top dictating power user
|
|
16123
|
+
// averages ~3.9k). topPeak is NOT a percentile — it is the CEILING
|
|
16124
|
+
// reference, the wildest single days on record (~10k: a 14-16h
|
|
16125
|
+
// launch-day marathon), rendered as "wildest single days", never
|
|
16126
|
+
// "top X% peak". An avg-percentile and a peak-percentile can't both be
|
|
16127
|
+
// shown at a same-ish value (avg≈peak reads broken — user call), and a
|
|
16128
|
+
// peak PERCENTILE line is unknowable anyway; the record framing is
|
|
16129
|
+
// honest and keeps the visual gap.
|
|
16130
|
+
topAvgWordsPerDay: 5e3,
|
|
16131
|
+
topPeakWordsPerDay: 1e4,
|
|
16037
16132
|
benchLabel: "top 0.1%",
|
|
16038
16133
|
// No published "words typed/day" for heavy users — the real story is OUTPUT.
|
|
16039
16134
|
loopsHeadline: ">1,000,000 lines of Rust at 99.8% tests passing",
|
|
@@ -16050,8 +16145,8 @@ var BEST = DEFAULT_CALIBRATION.codingBenchmarks;
|
|
|
16050
16145
|
|
|
16051
16146
|
// ../../lib/agents/coding/profile.ts
|
|
16052
16147
|
var ROOT = process.cwd();
|
|
16053
|
-
var CODING_DIR = process.env.POLYMATH_DATA_DIR ?
|
|
16054
|
-
var GRADES =
|
|
16148
|
+
var CODING_DIR = process.env.POLYMATH_DATA_DIR ? path10.join(process.env.POLYMATH_DATA_DIR, "coding") : path10.join(ROOT, ".data", "coding");
|
|
16149
|
+
var GRADES = path10.join(CODING_DIR, "grades");
|
|
16055
16150
|
|
|
16056
16151
|
// ../../scripts/coding-frontier-detail.mts
|
|
16057
16152
|
var CODING = CODING_DIR;
|
|
@@ -16068,7 +16163,7 @@ var isUuid = (s) => /^[0-9a-f]{8}-?[0-9a-f]/.test(s);
|
|
|
16068
16163
|
async function parseSkillCalls(file2) {
|
|
16069
16164
|
let raw;
|
|
16070
16165
|
try {
|
|
16071
|
-
raw = await
|
|
16166
|
+
raw = await fs7.readFile(file2, "utf8");
|
|
16072
16167
|
} catch {
|
|
16073
16168
|
return [];
|
|
16074
16169
|
}
|
|
@@ -16091,7 +16186,7 @@ async function parseSkillCalls(file2) {
|
|
|
16091
16186
|
return out;
|
|
16092
16187
|
}
|
|
16093
16188
|
async function main() {
|
|
16094
|
-
const all = JSON.parse(await
|
|
16189
|
+
const all = JSON.parse(await fs7.readFile(`${CODING}/sessions.json`, "utf8"));
|
|
16095
16190
|
const sessions = all.filter((s) => s.klass === "interactive");
|
|
16096
16191
|
const dateOf = (s) => (s.start || "").slice(0, 10);
|
|
16097
16192
|
const byActive = (a, b) => (b.activeMin ?? 0) - (a.activeMin ?? 0);
|
|
@@ -16156,20 +16251,41 @@ Assess each. Output a SINGLE fenced json block (every string a complete punctuat
|
|
|
16156
16251
|
}
|
|
16157
16252
|
\`\`\`
|
|
16158
16253
|
Put anything with verdict "tried-failed" into BOTH its list (with the verdict) AND triedButFailed. Use only the exact skill/capability names given.`;
|
|
16159
|
-
|
|
16160
|
-
const
|
|
16254
|
+
const SYSX = SYS + sourceLookupNote();
|
|
16255
|
+
const sha = promptSha([SYSX, prompt, "sonnet"]);
|
|
16256
|
+
if (!process.argv.includes("--refresh")) {
|
|
16257
|
+
const prev = await reusableOutput(`${CODING}/frontier-detail.json`, sha, (o) => Array.isArray(o.skills));
|
|
16258
|
+
if (prev) {
|
|
16259
|
+
console.log(`[frontier-detail] inputs unchanged \u2014 reusing output from ${prev.generatedAt} (--refresh to regenerate)`);
|
|
16260
|
+
return;
|
|
16261
|
+
}
|
|
16262
|
+
}
|
|
16263
|
+
await ensureCodingDocs(CODING, sessions);
|
|
16264
|
+
console.log(`frontier-detail \u2014 ${skillsUsed.length} skills, ${CAP_TARGETS.length} capability candidates, ${mcpServers.length} MCP \u2192 1 Sonnet call (+source lookups)`);
|
|
16161
16265
|
let detail = { skills: [], capabilities: [], triedButFailed: [] };
|
|
16266
|
+
let ok = false;
|
|
16162
16267
|
try {
|
|
16163
|
-
const run2 = await invokeAgent({ prompt, systemPrompt:
|
|
16164
|
-
|
|
16268
|
+
const run2 = await invokeAgent({ prompt, systemPrompt: SYSX, addDir: CODING, allowedTools: ["Read", "Grep", "Glob"], maxTurns: 10, timeoutMs: 6e5, model: "sonnet" });
|
|
16269
|
+
if (run2.json) {
|
|
16270
|
+
detail = run2.json;
|
|
16271
|
+
ok = true;
|
|
16272
|
+
}
|
|
16165
16273
|
} catch (e) {
|
|
16166
16274
|
console.log("ERR", e.message.slice(0, 160));
|
|
16167
|
-
} finally {
|
|
16168
|
-
await fs5.rm(sandbox, { recursive: true, force: true }).catch(() => {
|
|
16169
|
-
});
|
|
16170
16275
|
}
|
|
16171
|
-
|
|
16172
|
-
|
|
16276
|
+
if (!ok) {
|
|
16277
|
+
const existing = await fs7.readFile(`${CODING}/frontier-detail.json`, "utf8").then(JSON.parse).catch(() => null);
|
|
16278
|
+
if (existing && (existing.skills || []).length) {
|
|
16279
|
+
console.error(`REFUSING to write ${CODING}/frontier-detail.json \u2014 the LLM pass failed and the existing file has ${existing.skills.length} assessed skill(s)`);
|
|
16280
|
+
process.exit(1);
|
|
16281
|
+
}
|
|
16282
|
+
}
|
|
16283
|
+
const out = { generatedAt: (/* @__PURE__ */ new Date()).toISOString(), ...ok ? { promptSha: sha } : {}, skillsUsed, mcpServers, ...detail };
|
|
16284
|
+
await fs7.writeFile(`${CODING}/frontier-detail.json`, JSON.stringify(out, null, 2));
|
|
16285
|
+
if (!ok) {
|
|
16286
|
+
console.error(`frontier-detail LLM pass failed \u2014 wrote deterministic portion only (skillsUsed/mcpServers), exiting non-zero`);
|
|
16287
|
+
process.exit(1);
|
|
16288
|
+
}
|
|
16173
16289
|
const sk = detail.skills || [];
|
|
16174
16290
|
const surf = sk.filter((x) => x.verdict === "core" || x.verdict === "occasional").length;
|
|
16175
16291
|
console.log(`WROTE ${CODING}/frontier-detail.json \u2014 skills assessed:${sk.length} (surfaced:${surf}) \xB7 caps:${(detail.capabilities || []).length} \xB7 triedFailed:${(detail.triedButFailed || []).length}`);
|
|
@@ -203,7 +203,7 @@ 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-
|
|
206
|
+
version: "2026-07-14.2",
|
|
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).
|
|
@@ -292,7 +292,7 @@ var DEFAULT_CALIBRATION = {
|
|
|
292
292
|
}
|
|
293
293
|
],
|
|
294
294
|
codingTiers: {
|
|
295
|
-
push: { median: 300, sigma:
|
|
295
|
+
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." },
|
|
296
296
|
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." },
|
|
297
297
|
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" }
|
|
298
298
|
},
|
|
@@ -325,12 +325,18 @@ var DEFAULT_CALIBRATION = {
|
|
|
325
325
|
line: "the Claude Code lead runs 10\u201315 sessions at once; his #1 tip is 3\u20135 git worktrees in parallel"
|
|
326
326
|
},
|
|
327
327
|
throughput: {
|
|
328
|
-
//
|
|
329
|
-
//
|
|
330
|
-
//
|
|
331
|
-
//
|
|
332
|
-
|
|
333
|
-
|
|
328
|
+
// Two DIFFERENT kinds of line (2026-07-14.2): topAvg is a PERCENTILE
|
|
329
|
+
// claim — what a 1-in-1,000 user AVERAGES over substantial days (5k/day:
|
|
330
|
+
// near-daily heavy dictation; a measured top dictating power user
|
|
331
|
+
// averages ~3.9k). topPeak is NOT a percentile — it is the CEILING
|
|
332
|
+
// reference, the wildest single days on record (~10k: a 14-16h
|
|
333
|
+
// launch-day marathon), rendered as "wildest single days", never
|
|
334
|
+
// "top X% peak". An avg-percentile and a peak-percentile can't both be
|
|
335
|
+
// shown at a same-ish value (avg≈peak reads broken — user call), and a
|
|
336
|
+
// peak PERCENTILE line is unknowable anyway; the record framing is
|
|
337
|
+
// honest and keeps the visual gap.
|
|
338
|
+
topAvgWordsPerDay: 5e3,
|
|
339
|
+
topPeakWordsPerDay: 1e4,
|
|
334
340
|
benchLabel: "top 0.1%",
|
|
335
341
|
// No published "words typed/day" for heavy users — the real story is OUTPUT.
|
|
336
342
|
loopsHeadline: ">1,000,000 lines of Rust at 99.8% tests passing",
|
|
@@ -394,7 +394,7 @@ var IDLE_CAP_MS = 12 * 6e4;
|
|
|
394
394
|
|
|
395
395
|
// ../../lib/calibration/index.ts
|
|
396
396
|
var DEFAULT_CALIBRATION = {
|
|
397
|
-
version: "2026-07-
|
|
397
|
+
version: "2026-07-14.2",
|
|
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).
|
|
@@ -483,7 +483,7 @@ var DEFAULT_CALIBRATION = {
|
|
|
483
483
|
}
|
|
484
484
|
],
|
|
485
485
|
codingTiers: {
|
|
486
|
-
push: { median: 300, sigma:
|
|
486
|
+
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." },
|
|
487
487
|
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." },
|
|
488
488
|
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" }
|
|
489
489
|
},
|
|
@@ -516,12 +516,18 @@ var DEFAULT_CALIBRATION = {
|
|
|
516
516
|
line: "the Claude Code lead runs 10\u201315 sessions at once; his #1 tip is 3\u20135 git worktrees in parallel"
|
|
517
517
|
},
|
|
518
518
|
throughput: {
|
|
519
|
-
//
|
|
520
|
-
//
|
|
521
|
-
//
|
|
522
|
-
//
|
|
523
|
-
|
|
524
|
-
|
|
519
|
+
// Two DIFFERENT kinds of line (2026-07-14.2): topAvg is a PERCENTILE
|
|
520
|
+
// claim — what a 1-in-1,000 user AVERAGES over substantial days (5k/day:
|
|
521
|
+
// near-daily heavy dictation; a measured top dictating power user
|
|
522
|
+
// averages ~3.9k). topPeak is NOT a percentile — it is the CEILING
|
|
523
|
+
// reference, the wildest single days on record (~10k: a 14-16h
|
|
524
|
+
// launch-day marathon), rendered as "wildest single days", never
|
|
525
|
+
// "top X% peak". An avg-percentile and a peak-percentile can't both be
|
|
526
|
+
// shown at a same-ish value (avg≈peak reads broken — user call), and a
|
|
527
|
+
// peak PERCENTILE line is unknowable anyway; the record framing is
|
|
528
|
+
// honest and keeps the visual gap.
|
|
529
|
+
topAvgWordsPerDay: 5e3,
|
|
530
|
+
topPeakWordsPerDay: 1e4,
|
|
525
531
|
benchLabel: "top 0.1%",
|
|
526
532
|
// No published "words typed/day" for heavy users — the real story is OUTPUT.
|
|
527
533
|
loopsHeadline: ">1,000,000 lines of Rust at 99.8% tests passing",
|