@supersuit/hyperspec 0.5.0 → 0.7.0
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/CHANGELOG.md +166 -0
- package/README.md +62 -1
- package/SPEC.md +4 -4
- package/WRITING.md +770 -9
- package/bin/hyperspec.mjs +252 -0
- package/examples/writing/essay/claims.jsonl +9 -0
- package/examples/writing/essay/draft.md +82 -0
- package/examples/writing/essay/judge/doctor.packet.json +108 -0
- package/examples/writing/essay/judge/lineup.packet.json +64 -0
- package/examples/writing/essay/judge/persona.packet.json +73 -0
- package/examples/writing/essay/judge/reader.packet.json +93 -0
- package/examples/writing/essay/learn/first-draft.md +84 -0
- package/examples/writing/essay/learn/learn.packet.json +106 -0
- package/examples/writing/essay/materials/interview-notes.md.segments.jsonl +2 -2
- package/examples/writing/essay/sample-verdicts/doctor.verdict.json +43 -0
- package/examples/writing/essay/sample-verdicts/learn.verdict.json +30 -0
- package/examples/writing/essay/sample-verdicts/lineup.verdict.json +6 -0
- package/examples/writing/essay/sample-verdicts/persona.verdict.json +4 -0
- package/examples/writing/essay/sample-verdicts/reader.verdict.json +7 -0
- package/examples/writing/essay.hyperspec.md +23 -7
- package/examples/writing/story/claims.jsonl +9 -0
- package/examples/writing/story/draft.md +267 -0
- package/examples/writing/story/judge/attribution.packet.json +194 -0
- package/examples/writing/story/judge/doctor.packet.json +108 -0
- package/examples/writing/story/judge/knowledge.packet.json +77 -0
- package/examples/writing/story/judge/persona.packet.json +73 -0
- package/examples/writing/story/judge/reader.packet.json +94 -0
- package/examples/writing/story/sample-verdicts/attribution.verdict.json +81 -0
- package/examples/writing/story/sample-verdicts/doctor.verdict.json +43 -0
- package/examples/writing/story/sample-verdicts/knowledge.verdict.json +4 -0
- package/examples/writing/story/sample-verdicts/persona.verdict.json +20 -0
- package/examples/writing/story/sample-verdicts/reader.verdict.json +16 -0
- package/examples/writing/story.hyperspec.md +24 -5
- package/package.json +1 -1
- package/src/check.mjs +191 -0
- package/src/dna.mjs +4 -1
- package/src/draft.mjs +26 -0
- package/src/judge.mjs +386 -0
- package/src/judges/attribution.mjs +360 -0
- package/src/judges/doctor.mjs +126 -0
- package/src/judges/index.mjs +31 -0
- package/src/judges/knowledge.mjs +111 -0
- package/src/judges/lineup.mjs +272 -0
- package/src/judges/persona.mjs +137 -0
- package/src/judges/reader.mjs +111 -0
- package/src/learn.mjs +422 -0
- package/src/ledger.mjs +108 -0
- package/src/sentences.mjs +81 -0
- package/src/stations/claims.mjs +155 -0
- package/src/stations/dna.mjs +126 -0
- package/src/stations/form.mjs +115 -0
- package/src/stations/index.mjs +27 -0
- package/src/stations/links.mjs +275 -0
- package/src/stations/private.mjs +117 -0
- package/src/stations/quotes.mjs +170 -0
- package/src/stations/terms.mjs +131 -0
- package/src/stations/util.mjs +99 -0
- package/src/writing-fields.mjs +26 -2
- package/src/writing.mjs +1 -1
package/bin/hyperspec.mjs
CHANGED
|
@@ -16,11 +16,74 @@ import { splitSegments } from "../src/segments.mjs";
|
|
|
16
16
|
import { sha256 } from "../src/hash.mjs";
|
|
17
17
|
import { readScope, measureFeatures, writeFeatures, scopeTemplate, GOLDENS_README } from "../src/dna.mjs";
|
|
18
18
|
import { str } from "../src/placeholder.mjs";
|
|
19
|
+
import { runCheck } from "../src/check.mjs";
|
|
20
|
+
import { prepareJudges, recordJudgment } from "../src/judge.mjs";
|
|
21
|
+
import { prepareLearn, recordLearn, tallyLine } from "../src/learn.mjs";
|
|
19
22
|
|
|
20
23
|
const HELP = `hyperspec <command> [options]
|
|
21
24
|
|
|
22
25
|
lint <file...> [--json] score each hyperspec against the nine tests
|
|
23
26
|
exit 0 pass, 1 a test fails, 3 blocked on an open decision, 2 usage
|
|
27
|
+
check <spec> --draft <file> [--json] [--only a,b]
|
|
28
|
+
needs a writing spec (profile: writing); lints it first (a spec
|
|
29
|
+
that does not pass lint, or is blocked, exits with lint's own code
|
|
30
|
+
and runs no station: a draft cannot be checked against a spec that
|
|
31
|
+
is not ready); then runs every deterministic station (or the
|
|
32
|
+
--only subset, by name) against the draft, printing pass, fail
|
|
33
|
+
(with findings) or skip (with a reason) per station; appends one
|
|
34
|
+
line to the spec's improvement.ledger with a verdict: one-shot,
|
|
35
|
+
improved, or not-improved with a reason (an --only run is partial:
|
|
36
|
+
not-improved, and ignored by later verdicts)
|
|
37
|
+
exit 0 every run station passed, 1 a station failed, 2 usage
|
|
38
|
+
(including a missing draft file, a spec without the writing
|
|
39
|
+
profile, or an --only that names no known station)
|
|
40
|
+
judge prepare <spec> --draft <file> --out <dir> [--only a,b] [--force] [--json]
|
|
41
|
+
needs a writing spec that passes lint (exits with lint's own code
|
|
42
|
+
otherwise); writes one <station>.packet.json per applicable
|
|
43
|
+
judgment station (or the --only subset) into <dir>: the rubric from
|
|
44
|
+
the spec, fixed instructions, the inputs and the exact verdict
|
|
45
|
+
shape, for an outside judge to fill; hyperspec never calls a model;
|
|
46
|
+
stations: doctor, lineup (a blind voice lineup against the DNA
|
|
47
|
+
scope's goldens, whose answer goes to lineup.key.json for a person
|
|
48
|
+
to read; record rebuilds it and never reads the file), reader,
|
|
49
|
+
persona (against the claims ledger), and for fiction attribution (a
|
|
50
|
+
blind speaker test on the dialogue lines whose speaker the draft
|
|
51
|
+
names; the answers go to attribution.key.json, likewise rebuilt)
|
|
52
|
+
and knowledge (each character's knowledge timeline);
|
|
53
|
+
the same spec and draft give byte-identical packets; refuses to
|
|
54
|
+
overwrite an existing packet without --force
|
|
55
|
+
exit 0 written, 1 a station could not build its packet (the rest
|
|
56
|
+
are written), 2 usage (a missing or non-folder --out, an existing
|
|
57
|
+
packet without --force, an unknown --only name), or lint's own code
|
|
58
|
+
judge record <packet> --verdict <file> [--json]
|
|
59
|
+
validate the judge's verdict against its packet (every evidence
|
|
60
|
+
span must appear in the draft; a draft or spec changed since the
|
|
61
|
+
packet is stale), derive the station's status, and append one line
|
|
62
|
+
to the spec's improvement.ledger, as check does; an invalid or stale
|
|
63
|
+
verdict appends nothing; run it from the folder prepare ran in, since
|
|
64
|
+
the packet keeps the spec and draft paths as they were given
|
|
65
|
+
exit 0 the station passed, 1 it failed or the verdict is invalid
|
|
66
|
+
or stale, 2 usage
|
|
67
|
+
learn prepare <spec> --first <draft> --approved <draft> --out <dir> [--force] [--json]
|
|
68
|
+
needs a writing spec that passes lint (exits with lint's own code
|
|
69
|
+
otherwise); diffs the first draft a factory produced against the
|
|
70
|
+
draft a person approved, sentence by sentence, and writes
|
|
71
|
+
<dir>/learn.packet.json: each edit as a hunk (E1..En: deleted,
|
|
72
|
+
inserted or replaced, with both texts), the spec's block names plus
|
|
73
|
+
none, fixed instructions and the verdict shape, for an outside judge
|
|
74
|
+
to name the block that should have prevented each edit; the same
|
|
75
|
+
files give a byte-identical packet; refuses to overwrite it without
|
|
76
|
+
--force
|
|
77
|
+
exit 0 written, 2 usage
|
|
78
|
+
learn record <packet> --verdict <file> [--json]
|
|
79
|
+
rebuild the packet from the files on disk (a changed file is stale,
|
|
80
|
+
an edited packet is refused), validate the verdict (every hunk id
|
|
81
|
+
exactly once, a block the spec has or none, a why), print the edits
|
|
82
|
+
per block and one next move for the block with the most, and append
|
|
83
|
+
one learn line to the spec's improvement.ledger (not-improved: the
|
|
84
|
+
spec has not changed yet); learn never edits the spec
|
|
85
|
+
exit 0 recorded, 1 the verdict is invalid or stale (nothing
|
|
86
|
+
appended), 2 usage
|
|
24
87
|
init <file> [--title T] [--kind K] write a new hyperspec skeleton (refuses to overwrite)
|
|
25
88
|
init <file> --profile writing [--title T] [--form F] [--fiction]
|
|
26
89
|
write a writing-profile skeleton: every required block (materials,
|
|
@@ -282,6 +345,195 @@ if (cmd === "lint") {
|
|
|
282
345
|
process.exit(worst);
|
|
283
346
|
}
|
|
284
347
|
|
|
348
|
+
if (cmd === "check") {
|
|
349
|
+
const parsed = parseArgs(argv.slice(1), { valueFlags: ["--draft", "--only"], boolFlags: ["--json"] });
|
|
350
|
+
if (parsed.error) { console.error(parsed.error); process.exit(2); }
|
|
351
|
+
const [specPath] = parsed.positionals;
|
|
352
|
+
const json = parsed.values["--json"];
|
|
353
|
+
// A usage error exits 2: a plain message on stderr, or under --json one document on stdout,
|
|
354
|
+
// { spec, draft, error }, the way lint --json reports a file it could not read.
|
|
355
|
+
const usage = (error) => {
|
|
356
|
+
if (json) console.log(JSON.stringify({ spec: specPath ?? null, draft: parsed.values["--draft"] ?? null, error }, null, 2));
|
|
357
|
+
else console.error(error);
|
|
358
|
+
process.exit(2);
|
|
359
|
+
};
|
|
360
|
+
if (!specPath) usage("check needs a spec path");
|
|
361
|
+
if (!parsed.values["--draft"]) usage("check needs --draft <file>");
|
|
362
|
+
let only;
|
|
363
|
+
if (parsed.values["--only"] !== undefined) {
|
|
364
|
+
only = parsed.values["--only"].split(",").map((s) => s.trim()).filter(Boolean);
|
|
365
|
+
if (!only.length) usage("--only names no station");
|
|
366
|
+
}
|
|
367
|
+
|
|
368
|
+
const result = runCheck(specPath, parsed.values["--draft"], { only });
|
|
369
|
+
|
|
370
|
+
// Usage errors (an unreadable spec, a spec without the writing profile, an unknown --only name,
|
|
371
|
+
// a missing draft file): exit 2, as above.
|
|
372
|
+
if (result.usage) usage(result.error);
|
|
373
|
+
|
|
374
|
+
if (result.lintBlocked) {
|
|
375
|
+
if (json) console.log(JSON.stringify(result, null, 2));
|
|
376
|
+
else {
|
|
377
|
+
const r = result.lintScore;
|
|
378
|
+
console.log(`${result.specPath}: ${r.status} (${r.passed}/9)${r.open.length ? `, open: ${r.open.join(", ")}` : ""}`);
|
|
379
|
+
for (const t of r.tests) if (!t.pass) console.log(` ✗ ${t.n}. ${t.name}`);
|
|
380
|
+
for (const f of result.lintFindings) console.log(` ${f.severity === "fail" ? "fail" : "warn"} [${f.test}] ${f.message}\n fix: ${f.fix}`);
|
|
381
|
+
console.log("no stations run: the spec is not ready (run `hyperspec lint` on it for details)");
|
|
382
|
+
}
|
|
383
|
+
process.exit(result.code);
|
|
384
|
+
}
|
|
385
|
+
|
|
386
|
+
if (json) {
|
|
387
|
+
console.log(JSON.stringify(result, null, 2));
|
|
388
|
+
} else {
|
|
389
|
+
for (const s of result.stations) {
|
|
390
|
+
if (s.status === "skip") { console.log(`${s.station}: skip (${s.reason})`); continue; }
|
|
391
|
+
console.log(`${s.station}: ${s.status}`);
|
|
392
|
+
for (const finding of s.findings) console.log(` ${finding.severity === "fail" ? "fail" : "warn"} [${finding.id}] ${finding.message}${typeof finding.line === "number" ? ` (line ${finding.line})` : ""}\n fix: ${finding.fix}`);
|
|
393
|
+
}
|
|
394
|
+
if (result.verdict) {
|
|
395
|
+
const detail = result.verdictDetail.change ?? result.verdictDetail.reason;
|
|
396
|
+
console.log(`verdict: ${result.verdict}${detail ? ` (${detail})` : ""}`);
|
|
397
|
+
}
|
|
398
|
+
if (result.ledgerWarning) console.log(`warn: ${result.ledgerWarning}`);
|
|
399
|
+
}
|
|
400
|
+
process.exit(result.code);
|
|
401
|
+
}
|
|
402
|
+
|
|
403
|
+
if (cmd === "judge") {
|
|
404
|
+
const sub = argv[1];
|
|
405
|
+
const printFinding = (f) => console.log(` ${f.severity === "fail" ? "fail" : "warn"} [${f.id}] ${f.message}${typeof f.line === "number" ? ` (line ${f.line})` : ""}\n fix: ${f.fix}`);
|
|
406
|
+
|
|
407
|
+
if (sub === "prepare") {
|
|
408
|
+
const parsed = parseArgs(argv.slice(2), { valueFlags: ["--draft", "--out", "--only"], boolFlags: ["--force", "--json"] });
|
|
409
|
+
if (parsed.error) { console.error(parsed.error); process.exit(2); }
|
|
410
|
+
const [specPath] = parsed.positionals;
|
|
411
|
+
const json = parsed.values["--json"];
|
|
412
|
+
const usage = (error) => {
|
|
413
|
+
if (json) console.log(JSON.stringify({ spec: specPath ?? null, draft: parsed.values["--draft"] ?? null, out: parsed.values["--out"] ?? null, error }, null, 2));
|
|
414
|
+
else console.error(error);
|
|
415
|
+
process.exit(2);
|
|
416
|
+
};
|
|
417
|
+
if (!specPath) usage("judge prepare needs a spec path");
|
|
418
|
+
if (!parsed.values["--draft"]) usage("judge prepare needs --draft <file>");
|
|
419
|
+
if (!parsed.values["--out"]) usage("judge prepare needs --out <dir>");
|
|
420
|
+
let only;
|
|
421
|
+
if (parsed.values["--only"] !== undefined) {
|
|
422
|
+
only = parsed.values["--only"].split(",").map((x) => x.trim()).filter(Boolean);
|
|
423
|
+
if (!only.length) usage("--only names no judge");
|
|
424
|
+
}
|
|
425
|
+
const result = prepareJudges(specPath, parsed.values["--draft"], parsed.values["--out"], { only, force: parsed.values["--force"] });
|
|
426
|
+
if (result.usage) usage(result.error);
|
|
427
|
+
if (result.lintBlocked) printLintBlocked(result, json, "no packets written");
|
|
428
|
+
if (json) console.log(JSON.stringify(result, null, 2));
|
|
429
|
+
else {
|
|
430
|
+
for (const w of result.written) console.log(w.path);
|
|
431
|
+
for (const s of result.skipped) console.log(`${s.station}: skip (${s.reason})`);
|
|
432
|
+
for (const f of result.crashed) { console.log(`${f.station}: no packet`); printFinding(f); }
|
|
433
|
+
}
|
|
434
|
+
process.exit(result.code);
|
|
435
|
+
}
|
|
436
|
+
|
|
437
|
+
if (sub === "record") {
|
|
438
|
+
const parsed = parseArgs(argv.slice(2), { valueFlags: ["--verdict"], boolFlags: ["--json"] });
|
|
439
|
+
if (parsed.error) { console.error(parsed.error); process.exit(2); }
|
|
440
|
+
const [packetPath] = parsed.positionals;
|
|
441
|
+
const json = parsed.values["--json"];
|
|
442
|
+
const usage = (error) => {
|
|
443
|
+
if (json) console.log(JSON.stringify({ packet: packetPath ?? null, verdict: parsed.values["--verdict"] ?? null, error }, null, 2));
|
|
444
|
+
else console.error(error);
|
|
445
|
+
process.exit(2);
|
|
446
|
+
};
|
|
447
|
+
if (!packetPath) usage("judge record needs a packet path");
|
|
448
|
+
if (!parsed.values["--verdict"]) usage("judge record needs --verdict <file>");
|
|
449
|
+
const result = recordJudgment(packetPath, parsed.values["--verdict"]);
|
|
450
|
+
if (result.usage) usage(result.error);
|
|
451
|
+
if (json) console.log(JSON.stringify(result, null, 2));
|
|
452
|
+
else if (result.invalid) {
|
|
453
|
+
console.log(`${result.station}: ${result.stale ? "stale packet" : "invalid verdict"}, nothing recorded`);
|
|
454
|
+
for (const f of result.findings) printFinding(f);
|
|
455
|
+
} else {
|
|
456
|
+
console.log(`${result.station}: ${result.status}`);
|
|
457
|
+
if (result.summary) console.log(` ${result.summary}`);
|
|
458
|
+
for (const f of result.findings) printFinding(f);
|
|
459
|
+
if (result.verdict) {
|
|
460
|
+
const detail = result.verdictDetail.change ?? result.verdictDetail.reason;
|
|
461
|
+
console.log(`verdict: ${result.verdict}${detail ? ` (${detail})` : ""}`);
|
|
462
|
+
}
|
|
463
|
+
if (result.ledgerWarning) console.log(`warn: ${result.ledgerWarning}`);
|
|
464
|
+
}
|
|
465
|
+
process.exit(result.code);
|
|
466
|
+
}
|
|
467
|
+
|
|
468
|
+
console.error(`unknown judge subcommand: ${sub ?? "(none)"}\n\n${HELP}`);
|
|
469
|
+
process.exit(2);
|
|
470
|
+
}
|
|
471
|
+
|
|
472
|
+
if (cmd === "learn") {
|
|
473
|
+
const sub = argv[1];
|
|
474
|
+
const printFinding = (f) => console.log(` ${f.severity === "fail" ? "fail" : "warn"} [${f.id}] ${f.message}\n fix: ${f.fix}`);
|
|
475
|
+
|
|
476
|
+
if (sub === "prepare") {
|
|
477
|
+
const parsed = parseArgs(argv.slice(2), { valueFlags: ["--first", "--approved", "--out"], boolFlags: ["--force", "--json"] });
|
|
478
|
+
if (parsed.error) { console.error(parsed.error); process.exit(2); }
|
|
479
|
+
const [specPath] = parsed.positionals;
|
|
480
|
+
const json = parsed.values["--json"];
|
|
481
|
+
const opts = { first: parsed.values["--first"], approved: parsed.values["--approved"], out: parsed.values["--out"], force: parsed.values["--force"] };
|
|
482
|
+
const result = prepareLearn(specPath, opts);
|
|
483
|
+
if (result.usage) {
|
|
484
|
+
if (json) console.log(JSON.stringify({ spec: specPath ?? null, first: opts.first ?? null, approved: opts.approved ?? null, out: opts.out ?? null, error: result.error }, null, 2));
|
|
485
|
+
else console.error(result.error);
|
|
486
|
+
process.exit(2);
|
|
487
|
+
}
|
|
488
|
+
if (result.lintBlocked) printLintBlocked(result, json, "no packet written");
|
|
489
|
+
if (json) console.log(JSON.stringify(result, null, 2));
|
|
490
|
+
else console.log(`${result.path}\n${result.summary}`);
|
|
491
|
+
process.exit(result.code);
|
|
492
|
+
}
|
|
493
|
+
|
|
494
|
+
if (sub === "record") {
|
|
495
|
+
const parsed = parseArgs(argv.slice(2), { valueFlags: ["--verdict"], boolFlags: ["--json"] });
|
|
496
|
+
if (parsed.error) { console.error(parsed.error); process.exit(2); }
|
|
497
|
+
const [packetPath] = parsed.positionals;
|
|
498
|
+
const json = parsed.values["--json"];
|
|
499
|
+
const result = recordLearn(packetPath, parsed.values["--verdict"]);
|
|
500
|
+
if (result.usage) {
|
|
501
|
+
if (json) console.log(JSON.stringify({ packet: packetPath ?? null, verdict: parsed.values["--verdict"] ?? null, error: result.error }, null, 2));
|
|
502
|
+
else console.error(result.error);
|
|
503
|
+
process.exit(2);
|
|
504
|
+
}
|
|
505
|
+
if (json) console.log(JSON.stringify(result, null, 2));
|
|
506
|
+
else if (result.invalid) {
|
|
507
|
+
console.log(`learn: ${result.stale ? "stale packet" : "invalid verdict"}, nothing recorded`);
|
|
508
|
+
for (const f of result.findings) printFinding(f);
|
|
509
|
+
} else {
|
|
510
|
+
console.log(`learn: ${result.edits} edit${result.edits === 1 ? "" : "s"} classified`);
|
|
511
|
+
for (const [block, c] of Object.entries(result.tally)) console.log(` ${block} ${tallyLine(c)}`);
|
|
512
|
+
console.log(`next move: ${result.next}`);
|
|
513
|
+
if (result.verdict) console.log(`verdict: ${result.verdict} (${result.reason})`);
|
|
514
|
+
if (result.ledgerWarning) console.log(`warn: ${result.ledgerWarning}`);
|
|
515
|
+
}
|
|
516
|
+
process.exit(result.code);
|
|
517
|
+
}
|
|
518
|
+
|
|
519
|
+
console.error(`unknown learn subcommand: ${sub ?? "(none)"}\n\n${HELP}`);
|
|
520
|
+
process.exit(2);
|
|
521
|
+
}
|
|
522
|
+
|
|
523
|
+
// A spec that does not lint clean: print what lint would, say nothing was written, and exit with
|
|
524
|
+
// lint's own code. Shared by judge prepare and learn prepare.
|
|
525
|
+
function printLintBlocked(result, json, nothingWritten) {
|
|
526
|
+
if (json) console.log(JSON.stringify(result, null, 2));
|
|
527
|
+
else {
|
|
528
|
+
const r = result.lintScore;
|
|
529
|
+
console.log(`${result.specPath}: ${r.status} (${r.passed}/9)${r.open.length ? `, open: ${r.open.join(", ")}` : ""}`);
|
|
530
|
+
for (const t of r.tests) if (!t.pass) console.log(` ✗ ${t.n}. ${t.name}`);
|
|
531
|
+
for (const f of result.lintFindings) console.log(` ${f.severity === "fail" ? "fail" : "warn"} [${f.test}] ${f.message}\n fix: ${f.fix}`);
|
|
532
|
+
console.log(`${nothingWritten}: the spec is not ready (run \`hyperspec lint\` on it for details)`);
|
|
533
|
+
}
|
|
534
|
+
process.exit(result.code);
|
|
535
|
+
}
|
|
536
|
+
|
|
285
537
|
// Generic flag/positional parser for the recipe verbs below. A value-taking flag (valueFlags,
|
|
286
538
|
// repeatableFlags) never swallows a following --flag as its value (missing value is an error, not
|
|
287
539
|
// a silent grab); a bool flag never eats the next token as a positional; any --flag not declared
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
{"text":"29 of 41 people said their most useful one-on-one in the last quarter was one where they brought the first topic.","source":"survey#s3","span":"29 of 41 said their most useful one-on-one in the last quarter was one where they brought the first topic."}
|
|
2
|
+
{"text":"That is how an engineering manager I interviewed, eight years into the job, runs hers.","source":"interview#s4","span":"She keeps a shared document per person; they add items before the meeting, and she adds hers last, at the bottom."}
|
|
3
|
+
{"text":"Her rule is short: the report owns the agenda.","source":"interview#s3","span":"Her rule: the report owns the agenda."}
|
|
4
|
+
{"text":"My first one-on-one as a manager was a disaster, and the reason was simple: I ran it.","source":"voice-memo#s2","span":"My first one-on-one as a manager was a disaster, and the reason was simple: I ran it."}
|
|
5
|
+
{"text":"11 of 41 said at least one of their one-on-ones in the last quarter was mostly project status.","source":"survey#s4","span":"11 of 41 said at least one of their one-on-ones in the last quarter was mostly project status."}
|
|
6
|
+
{"text":"What is taking more of your energy than it should?","source":"voice-memo#s4","span":"What is taking more of your energy than it should?"}
|
|
7
|
+
{"text":"What do you want to be doing more of in six months?","source":"voice-memo#s4","span":"What do you want to be doing more of in six months?"}
|
|
8
|
+
{"text":"What should I stop doing, or start doing, that would make your week easier?","source":"voice-memo#s4","span":"What should I stop doing, or start doing, that would make your week easier?"}
|
|
9
|
+
{"text":"The most common free-text request in the survey, in 9 responses, was to be asked what they want to work on next.","source":"survey#s5","span":"The most common free-text request, in 9 responses: \"ask me what I want to work on next.\""}
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
# Hand your first one-on-one to the person you manage
|
|
2
|
+
|
|
3
|
+
## Who sets the agenda
|
|
4
|
+
|
|
5
|
+
Your first one-on-one with a new report is the only meeting on your calendar where they should
|
|
6
|
+
set the agenda. Everything else you run. This one you hand over.
|
|
7
|
+
|
|
8
|
+
If you walk in with a list, you have told your report what the meeting is for, and it is for
|
|
9
|
+
you. They will answer your list politely and leave. You will know nothing you did not know when
|
|
10
|
+
you sat down, and so will they.
|
|
11
|
+
|
|
12
|
+
My team ran a [survey](materials/team-survey.md) this spring. 29 of 41 people said their most useful one-on-one in the last
|
|
13
|
+
quarter was one where they brought the first topic. The meeting that worked for them was the one
|
|
14
|
+
they started.
|
|
15
|
+
|
|
16
|
+
So give them the start. The simplest way to do it is a running agenda: one shared document per
|
|
17
|
+
person, kept for as long as you manage them. Your report adds items before each meeting, and you
|
|
18
|
+
add yours last, at the bottom. That is how an engineering manager I interviewed, eight years into
|
|
19
|
+
the job, runs hers. Her rule is short: the report owns the agenda.
|
|
20
|
+
|
|
21
|
+
## My first one-on-one
|
|
22
|
+
|
|
23
|
+
My first one-on-one as a manager was a disaster, and the reason was simple: I ran it. I had a
|
|
24
|
+
list, and I went down the list. Project status, blockers, the thing from Tuesday. Thirty minutes
|
|
25
|
+
later my report said thanks and left, and I had learned nothing I could not have read in the
|
|
26
|
+
tracker.
|
|
27
|
+
|
|
28
|
+
What I ran was a status meeting, which is a meeting spent reading out loud what the tracker
|
|
29
|
+
already says. Your report wrote those updates. Asking them to recite the updates to you teaches
|
|
30
|
+
you nothing new, and it spends the one half hour a week that belongs to them.
|
|
31
|
+
|
|
32
|
+
The survey shows the cost from their side. 11 of 41 said at least one of their one-on-ones in the
|
|
33
|
+
last quarter was mostly project status. Read the tracker before you walk in, and leave status
|
|
34
|
+
there.
|
|
35
|
+
|
|
36
|
+
## The three questions
|
|
37
|
+
|
|
38
|
+
Here is what I ask now, in this order, and then I let the report take over:
|
|
39
|
+
|
|
40
|
+
1. What is taking more of your energy than it should?
|
|
41
|
+
2. What do you want to be doing more of in six months?
|
|
42
|
+
3. What should I stop doing, or start doing, that would make your week easier?
|
|
43
|
+
|
|
44
|
+
Three is enough to hand the meeting over. The first asks about this week. The second asks about
|
|
45
|
+
the next six months. The third asks about you, and it is the one your report will not raise
|
|
46
|
+
without being asked. A fourth question starts to look like your list again, and the list is what
|
|
47
|
+
you came to give up.
|
|
48
|
+
|
|
49
|
+
Ask them in the same words every time. Your report will learn them, and after a few weeks they
|
|
50
|
+
will walk in with answers already half formed. That is the point of fixing the words: the meeting
|
|
51
|
+
starts on their topic before you have said anything at all.
|
|
52
|
+
|
|
53
|
+
The second question is the one my own team asked for. The most common free-text request in the
|
|
54
|
+
survey, in 9 responses, was to be asked what they want to work on next.
|
|
55
|
+
|
|
56
|
+
After the third question, stop talking.
|
|
57
|
+
|
|
58
|
+
## What to do with the answers
|
|
59
|
+
|
|
60
|
+
Wait after each question, longer than you want to. Dana, the engineering manager I interviewed,
|
|
61
|
+
puts it in three short sentences: "Wait. Count to five. The real answer is the second one." The first
|
|
62
|
+
answer your report gives is the tidy one, the version they could give anyone. The second is what
|
|
63
|
+
they came in with, and you only hear it if you let the silence run.
|
|
64
|
+
|
|
65
|
+
Write down what they say, in their words, at the top of the running agenda. That list is where
|
|
66
|
+
your next one-on-one starts, so the meeting stays theirs the week after too.
|
|
67
|
+
|
|
68
|
+
Do not try to fix everything in the room. Pick one thing you can act on this week, say what you
|
|
69
|
+
will do, and do it before you meet again. The rest stays on the running agenda until it is done
|
|
70
|
+
or your report takes it off.
|
|
71
|
+
|
|
72
|
+
And keep your own urgent items out of it. She told me: "If I have something urgent, it is not a
|
|
73
|
+
one-on-one topic. I send it the day it happens." Your report should never have to wait a week to
|
|
74
|
+
hear something you needed them to know on Monday.
|
|
75
|
+
|
|
76
|
+
## Before the meeting
|
|
77
|
+
|
|
78
|
+
Open the invite and delete your list from it. Ask your report to add the first item to the
|
|
79
|
+
running agenda instead.
|
|
80
|
+
|
|
81
|
+
So write the three questions on a card. Ask the first one. Then wait, longer than feels polite,
|
|
82
|
+
because the first answer is the one they rehearsed and the second one is the one you came for.
|
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
{
|
|
2
|
+
"hyperspec_judge": "0.1",
|
|
3
|
+
"station": "doctor",
|
|
4
|
+
"spec": "essay.hyperspec.md",
|
|
5
|
+
"spec_sha256": "e03dfac6b445ae779000f7fc109a9d713df2e5cf8967faf8e808fe87d63e40e9",
|
|
6
|
+
"draft": "essay/draft.md",
|
|
7
|
+
"draft_sha256": "aa4a1d99604f7b2b398b67305b368abbb72651356c38bfffad1452db6be62f65",
|
|
8
|
+
"rubric": "the doctor grades the draft against every condition; the simulated reader is asked whether it would copy the questions now",
|
|
9
|
+
"instructions": "Grade the draft (inputs.draft) against each condition in inputs.conditions: a condition passes unless the draft does what its fails_when describes. For every judgment, quote the draft as evidence: each evidence field is a span copied verbatim from inputs.draft. Then answer whether this reader, having read the draft, would take the next step (inputs.goal.next_if_worked) now, and quote the passage that decided it. Answer only in the verdict shape given in verdict_schema: one entry per condition id, each exactly once, with pass and would_take_next_step as true or false, and a note saying why for every condition that fails.",
|
|
10
|
+
"inputs": {
|
|
11
|
+
"goal": {
|
|
12
|
+
"from": "plans to run the first one-on-one from their own list",
|
|
13
|
+
"to": "hands the first one-on-one to the report and asks the three questions",
|
|
14
|
+
"next_if_worked": "writes the three questions on a card before the meeting",
|
|
15
|
+
"change": {
|
|
16
|
+
"kind": "action",
|
|
17
|
+
"text": "the reader asks the three questions in their next one-on-one and waits after each"
|
|
18
|
+
}
|
|
19
|
+
},
|
|
20
|
+
"conditions": [
|
|
21
|
+
{
|
|
22
|
+
"id": "r1",
|
|
23
|
+
"text": "the opening line tells the reader who sets the agenda of a first one-on-one",
|
|
24
|
+
"fails_when": "a reader shown only the first two sentences cannot say who should set the agenda"
|
|
25
|
+
},
|
|
26
|
+
{
|
|
27
|
+
"id": "r2",
|
|
28
|
+
"text": "the three questions appear word for word as the voice memo states them",
|
|
29
|
+
"fails_when": "any of the three questions differs from essay/materials/voice-memo.md by a word"
|
|
30
|
+
},
|
|
31
|
+
{
|
|
32
|
+
"id": "r3",
|
|
33
|
+
"text": "every survey figure in the draft matches the verified survey summary",
|
|
34
|
+
"fails_when": "a figure in the draft has no entry in the claims ledger pointing at essay/materials/team-survey.md, or differs from it"
|
|
35
|
+
},
|
|
36
|
+
{
|
|
37
|
+
"id": "r4",
|
|
38
|
+
"text": "the draft argues only the four claims in the spine, in order",
|
|
39
|
+
"fails_when": "a paragraph advances a point that traces to none of c1 to c4, or c3 lands before c2"
|
|
40
|
+
},
|
|
41
|
+
{
|
|
42
|
+
"id": "r5",
|
|
43
|
+
"text": "the draft tells the reader what to do with silence in the meeting",
|
|
44
|
+
"fails_when": "the draft never says to wait after asking a question"
|
|
45
|
+
},
|
|
46
|
+
{
|
|
47
|
+
"id": "r6",
|
|
48
|
+
"text": "the draft stays inside its length envelope",
|
|
49
|
+
"fails_when": "the word count is under 700 or over 1,100"
|
|
50
|
+
}
|
|
51
|
+
],
|
|
52
|
+
"draft": "# Hand your first one-on-one to the person you manage\n\n## Who sets the agenda\n\nYour first one-on-one with a new report is the only meeting on your calendar where they should\nset the agenda. Everything else you run. This one you hand over.\n\nIf you walk in with a list, you have told your report what the meeting is for, and it is for\nyou. They will answer your list politely and leave. You will know nothing you did not know when\nyou sat down, and so will they.\n\nMy team ran a [survey](materials/team-survey.md) this spring. 29 of 41 people said their most useful one-on-one in the last\nquarter was one where they brought the first topic. The meeting that worked for them was the one\nthey started.\n\nSo give them the start. The simplest way to do it is a running agenda: one shared document per\nperson, kept for as long as you manage them. Your report adds items before each meeting, and you\nadd yours last, at the bottom. That is how an engineering manager I interviewed, eight years into\nthe job, runs hers. Her rule is short: the report owns the agenda.\n\n## My first one-on-one\n\nMy first one-on-one as a manager was a disaster, and the reason was simple: I ran it. I had a\nlist, and I went down the list. Project status, blockers, the thing from Tuesday. Thirty minutes\nlater my report said thanks and left, and I had learned nothing I could not have read in the\ntracker.\n\nWhat I ran was a status meeting, which is a meeting spent reading out loud what the tracker\nalready says. Your report wrote those updates. Asking them to recite the updates to you teaches\nyou nothing new, and it spends the one half hour a week that belongs to them.\n\nThe survey shows the cost from their side. 11 of 41 said at least one of their one-on-ones in the\nlast quarter was mostly project status. Read the tracker before you walk in, and leave status\nthere.\n\n## The three questions\n\nHere is what I ask now, in this order, and then I let the report take over:\n\n1. What is taking more of your energy than it should?\n2. What do you want to be doing more of in six months?\n3. What should I stop doing, or start doing, that would make your week easier?\n\nThree is enough to hand the meeting over. The first asks about this week. The second asks about\nthe next six months. The third asks about you, and it is the one your report will not raise\nwithout being asked. A fourth question starts to look like your list again, and the list is what\nyou came to give up.\n\nAsk them in the same words every time. Your report will learn them, and after a few weeks they\nwill walk in with answers already half formed. That is the point of fixing the words: the meeting\nstarts on their topic before you have said anything at all.\n\nThe second question is the one my own team asked for. The most common free-text request in the\nsurvey, in 9 responses, was to be asked what they want to work on next.\n\nAfter the third question, stop talking.\n\n## What to do with the answers\n\nWait after each question, longer than you want to. Dana, the engineering manager I interviewed,\nputs it in three short sentences: \"Wait. Count to five. The real answer is the second one.\" The first\nanswer your report gives is the tidy one, the version they could give anyone. The second is what\nthey came in with, and you only hear it if you let the silence run.\n\nWrite down what they say, in their words, at the top of the running agenda. That list is where\nyour next one-on-one starts, so the meeting stays theirs the week after too.\n\nDo not try to fix everything in the room. Pick one thing you can act on this week, say what you\nwill do, and do it before you meet again. The rest stays on the running agenda until it is done\nor your report takes it off.\n\nAnd keep your own urgent items out of it. She told me: \"If I have something urgent, it is not a\none-on-one topic. I send it the day it happens.\" Your report should never have to wait a week to\nhear something you needed them to know on Monday.\n\n## Before the meeting\n\nOpen the invite and delete your list from it. Ask your report to add the first item to the\nrunning agenda instead.\n\nSo write the three questions on a card. Ask the first one. Then wait, longer than feels polite,\nbecause the first answer is the one they rehearsed and the second one is the one you came for.\n"
|
|
53
|
+
},
|
|
54
|
+
"verdict_schema": {
|
|
55
|
+
"type": "object",
|
|
56
|
+
"required": [
|
|
57
|
+
"conditions",
|
|
58
|
+
"would_take_next_step",
|
|
59
|
+
"evidence"
|
|
60
|
+
],
|
|
61
|
+
"properties": {
|
|
62
|
+
"conditions": {
|
|
63
|
+
"type": "array",
|
|
64
|
+
"description": "one entry per condition id, each exactly once",
|
|
65
|
+
"items": {
|
|
66
|
+
"type": "object",
|
|
67
|
+
"required": [
|
|
68
|
+
"id",
|
|
69
|
+
"pass",
|
|
70
|
+
"evidence",
|
|
71
|
+
"note"
|
|
72
|
+
],
|
|
73
|
+
"properties": {
|
|
74
|
+
"id": {
|
|
75
|
+
"enum": [
|
|
76
|
+
"r1",
|
|
77
|
+
"r2",
|
|
78
|
+
"r3",
|
|
79
|
+
"r4",
|
|
80
|
+
"r5",
|
|
81
|
+
"r6"
|
|
82
|
+
]
|
|
83
|
+
},
|
|
84
|
+
"pass": {
|
|
85
|
+
"type": "boolean"
|
|
86
|
+
},
|
|
87
|
+
"evidence": {
|
|
88
|
+
"type": "string",
|
|
89
|
+
"description": "a span copied verbatim from the draft"
|
|
90
|
+
},
|
|
91
|
+
"note": {
|
|
92
|
+
"type": "string",
|
|
93
|
+
"description": "why; required when pass is false"
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
},
|
|
98
|
+
"would_take_next_step": {
|
|
99
|
+
"type": "boolean",
|
|
100
|
+
"description": "whether this reader would take inputs.goal.next_if_worked now"
|
|
101
|
+
},
|
|
102
|
+
"evidence": {
|
|
103
|
+
"type": "string",
|
|
104
|
+
"description": "a span copied verbatim from the draft that decided would_take_next_step"
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
}
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
{
|
|
2
|
+
"hyperspec_judge": "0.1",
|
|
3
|
+
"station": "lineup",
|
|
4
|
+
"spec": "essay.hyperspec.md",
|
|
5
|
+
"spec_sha256": "e03dfac6b445ae779000f7fc109a9d713df2e5cf8967faf8e808fe87d63e40e9",
|
|
6
|
+
"draft": "essay/draft.md",
|
|
7
|
+
"draft_sha256": "aa4a1d99604f7b2b398b67305b368abbb72651356c38bfffad1452db6be62f65",
|
|
8
|
+
"rubric": "blind lineup within this scope; a judge shown a generated passage beside the scope's three goldens cannot pick it out",
|
|
9
|
+
"instructions": "Each passage in inputs.candidates carries a capital-letter label. All but one were written by the writer of inputs.scope, for this form, audience and purpose, and approved by a person; exactly one comes from a new draft. Pick the label of the passage you believe comes from the new draft, judging by voice alone: rhythm, diction, sentence shape, what this writer would and would not say. Give your confidence from 0 (a guess) to 1 (certain), and in reason say what in the candidates decided it. Judge from the packet's inputs alone: do not open the spec, the draft or any other file the packet names. Answer only in the verdict shape given in verdict_schema.",
|
|
10
|
+
"inputs": {
|
|
11
|
+
"scope": {
|
|
12
|
+
"writer": "example-author",
|
|
13
|
+
"form": "essay",
|
|
14
|
+
"audience": "new managers",
|
|
15
|
+
"purpose": "teach"
|
|
16
|
+
},
|
|
17
|
+
"candidates": [
|
|
18
|
+
{
|
|
19
|
+
"label": "A",
|
|
20
|
+
"text": "So write the three questions on a card. Ask the first one. Then wait, longer than feels polite, because the first answer is the one they rehearsed and the second one is the one you came for."
|
|
21
|
+
},
|
|
22
|
+
{
|
|
23
|
+
"label": "B",
|
|
24
|
+
"text": "If you can read it in the tracker, do not ask for it in the room. Status already has a home, and your report is the one who put it there. Spend the half hour on what the tracker cannot hold: how the work looks from their side of it."
|
|
25
|
+
},
|
|
26
|
+
{
|
|
27
|
+
"label": "C",
|
|
28
|
+
"text": "Your first one-on-one with a new report is the only meeting on your calendar where they should set the agenda. Everything else you run. This one you hand over."
|
|
29
|
+
},
|
|
30
|
+
{
|
|
31
|
+
"label": "D",
|
|
32
|
+
"text": "The survey shows the cost from their side. 11 of 41 said at least one of their one-on-ones in the last quarter was mostly project status. Read the tracker before you walk in, and leave status there."
|
|
33
|
+
}
|
|
34
|
+
]
|
|
35
|
+
},
|
|
36
|
+
"verdict_schema": {
|
|
37
|
+
"type": "object",
|
|
38
|
+
"required": [
|
|
39
|
+
"pick",
|
|
40
|
+
"confidence",
|
|
41
|
+
"reason"
|
|
42
|
+
],
|
|
43
|
+
"properties": {
|
|
44
|
+
"pick": {
|
|
45
|
+
"enum": [
|
|
46
|
+
"A",
|
|
47
|
+
"B",
|
|
48
|
+
"C",
|
|
49
|
+
"D"
|
|
50
|
+
],
|
|
51
|
+
"description": "the label of the passage you believe comes from the new draft"
|
|
52
|
+
},
|
|
53
|
+
"confidence": {
|
|
54
|
+
"type": "number",
|
|
55
|
+
"minimum": 0,
|
|
56
|
+
"maximum": 1
|
|
57
|
+
},
|
|
58
|
+
"reason": {
|
|
59
|
+
"type": "string",
|
|
60
|
+
"description": "what in the candidates decided the pick"
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
}
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
{
|
|
2
|
+
"hyperspec_judge": "0.1",
|
|
3
|
+
"station": "persona",
|
|
4
|
+
"spec": "essay.hyperspec.md",
|
|
5
|
+
"spec_sha256": "e03dfac6b445ae779000f7fc109a9d713df2e5cf8967faf8e808fe87d63e40e9",
|
|
6
|
+
"draft": "essay/draft.md",
|
|
7
|
+
"draft_sha256": "aa4a1d99604f7b2b398b67305b368abbb72651356c38bfffad1452db6be62f65",
|
|
8
|
+
"rubric": "persona-consistency judge; the mentor stance holds, and no fact appears that is not in the claims ledger",
|
|
9
|
+
"instructions": "Read inputs.draft as the speaker inputs.persona describes. Report every break as an entry in breaks: the passage as evidence, copied verbatim from inputs.draft, at least three whole words; its kind; and why. The kind is one of: stance (the voice leaves inputs.persona.stance), assertion (it asserts something outside inputs.persona.may_assert), will_not_say (it says something inputs.persona.will_not_say rules out), unsourced_fact (it states a fact that none of inputs.claims holds). When inputs.claims is null, no claims ledger is declared and facts cannot be checked against sources: do not report unsourced_fact. If the voice holds throughout, breaks is an empty list. Answer only in the verdict shape given in verdict_schema.",
|
|
10
|
+
"inputs": {
|
|
11
|
+
"persona": {
|
|
12
|
+
"identity": "self",
|
|
13
|
+
"stance": "mentor",
|
|
14
|
+
"may_assert": [
|
|
15
|
+
"what the author did in their own first one-on-ones and what happened",
|
|
16
|
+
"the three questions the author uses now"
|
|
17
|
+
],
|
|
18
|
+
"will_not_say": [
|
|
19
|
+
"a claim about what most managers do, beyond the survey's own figures",
|
|
20
|
+
"the name of anyone on the author's team"
|
|
21
|
+
]
|
|
22
|
+
},
|
|
23
|
+
"claims": [
|
|
24
|
+
"29 of 41 people said their most useful one-on-one in the last quarter was one where they brought the first topic.",
|
|
25
|
+
"That is how an engineering manager I interviewed, eight years into the job, runs hers.",
|
|
26
|
+
"Her rule is short: the report owns the agenda.",
|
|
27
|
+
"My first one-on-one as a manager was a disaster, and the reason was simple: I ran it.",
|
|
28
|
+
"11 of 41 said at least one of their one-on-ones in the last quarter was mostly project status.",
|
|
29
|
+
"What is taking more of your energy than it should?",
|
|
30
|
+
"What do you want to be doing more of in six months?",
|
|
31
|
+
"What should I stop doing, or start doing, that would make your week easier?",
|
|
32
|
+
"The most common free-text request in the survey, in 9 responses, was to be asked what they want to work on next."
|
|
33
|
+
],
|
|
34
|
+
"draft": "# Hand your first one-on-one to the person you manage\n\n## Who sets the agenda\n\nYour first one-on-one with a new report is the only meeting on your calendar where they should\nset the agenda. Everything else you run. This one you hand over.\n\nIf you walk in with a list, you have told your report what the meeting is for, and it is for\nyou. They will answer your list politely and leave. You will know nothing you did not know when\nyou sat down, and so will they.\n\nMy team ran a [survey](materials/team-survey.md) this spring. 29 of 41 people said their most useful one-on-one in the last\nquarter was one where they brought the first topic. The meeting that worked for them was the one\nthey started.\n\nSo give them the start. The simplest way to do it is a running agenda: one shared document per\nperson, kept for as long as you manage them. Your report adds items before each meeting, and you\nadd yours last, at the bottom. That is how an engineering manager I interviewed, eight years into\nthe job, runs hers. Her rule is short: the report owns the agenda.\n\n## My first one-on-one\n\nMy first one-on-one as a manager was a disaster, and the reason was simple: I ran it. I had a\nlist, and I went down the list. Project status, blockers, the thing from Tuesday. Thirty minutes\nlater my report said thanks and left, and I had learned nothing I could not have read in the\ntracker.\n\nWhat I ran was a status meeting, which is a meeting spent reading out loud what the tracker\nalready says. Your report wrote those updates. Asking them to recite the updates to you teaches\nyou nothing new, and it spends the one half hour a week that belongs to them.\n\nThe survey shows the cost from their side. 11 of 41 said at least one of their one-on-ones in the\nlast quarter was mostly project status. Read the tracker before you walk in, and leave status\nthere.\n\n## The three questions\n\nHere is what I ask now, in this order, and then I let the report take over:\n\n1. What is taking more of your energy than it should?\n2. What do you want to be doing more of in six months?\n3. What should I stop doing, or start doing, that would make your week easier?\n\nThree is enough to hand the meeting over. The first asks about this week. The second asks about\nthe next six months. The third asks about you, and it is the one your report will not raise\nwithout being asked. A fourth question starts to look like your list again, and the list is what\nyou came to give up.\n\nAsk them in the same words every time. Your report will learn them, and after a few weeks they\nwill walk in with answers already half formed. That is the point of fixing the words: the meeting\nstarts on their topic before you have said anything at all.\n\nThe second question is the one my own team asked for. The most common free-text request in the\nsurvey, in 9 responses, was to be asked what they want to work on next.\n\nAfter the third question, stop talking.\n\n## What to do with the answers\n\nWait after each question, longer than you want to. Dana, the engineering manager I interviewed,\nputs it in three short sentences: \"Wait. Count to five. The real answer is the second one.\" The first\nanswer your report gives is the tidy one, the version they could give anyone. The second is what\nthey came in with, and you only hear it if you let the silence run.\n\nWrite down what they say, in their words, at the top of the running agenda. That list is where\nyour next one-on-one starts, so the meeting stays theirs the week after too.\n\nDo not try to fix everything in the room. Pick one thing you can act on this week, say what you\nwill do, and do it before you meet again. The rest stays on the running agenda until it is done\nor your report takes it off.\n\nAnd keep your own urgent items out of it. She told me: \"If I have something urgent, it is not a\none-on-one topic. I send it the day it happens.\" Your report should never have to wait a week to\nhear something you needed them to know on Monday.\n\n## Before the meeting\n\nOpen the invite and delete your list from it. Ask your report to add the first item to the\nrunning agenda instead.\n\nSo write the three questions on a card. Ask the first one. Then wait, longer than feels polite,\nbecause the first answer is the one they rehearsed and the second one is the one you came for.\n"
|
|
35
|
+
},
|
|
36
|
+
"verdict_schema": {
|
|
37
|
+
"type": "object",
|
|
38
|
+
"required": [
|
|
39
|
+
"breaks"
|
|
40
|
+
],
|
|
41
|
+
"properties": {
|
|
42
|
+
"breaks": {
|
|
43
|
+
"type": "array",
|
|
44
|
+
"description": "every place the persona breaks; empty when it holds",
|
|
45
|
+
"items": {
|
|
46
|
+
"type": "object",
|
|
47
|
+
"required": [
|
|
48
|
+
"evidence",
|
|
49
|
+
"kind",
|
|
50
|
+
"why"
|
|
51
|
+
],
|
|
52
|
+
"properties": {
|
|
53
|
+
"evidence": {
|
|
54
|
+
"type": "string",
|
|
55
|
+
"description": "the passage, copied verbatim from the draft, at least three words"
|
|
56
|
+
},
|
|
57
|
+
"kind": {
|
|
58
|
+
"enum": [
|
|
59
|
+
"stance",
|
|
60
|
+
"assertion",
|
|
61
|
+
"will_not_say",
|
|
62
|
+
"unsourced_fact"
|
|
63
|
+
]
|
|
64
|
+
},
|
|
65
|
+
"why": {
|
|
66
|
+
"type": "string"
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
}
|