create-pmos 0.505.0 → 0.507.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/package.json +45 -27
- package/payload/AGENTS.md +2 -0
- package/payload/KIT-VERSION +1 -1
- package/payload/planning/evals/eval-calibration.md +1 -1
- package/payload/planning/okrs/health-budgets.md +1 -1
- package/payload/state/discoveries.md +1 -1
- package/workspace/changelog.json +44 -0
- package/workspace/fixtures/decision-pairs.js +94 -0
- package/workspace/fixtures/rehearse-replay.json +159 -0
- package/workspace/guide/ask-the-past.md +46 -0
- package/workspace/guide/claude-proposes.md +29 -2
- package/workspace/guide/index.md +3 -0
- package/workspace/guide/rehearse.md +52 -0
- package/workspace/guide/what-you-missed.md +42 -0
- package/workspace/lib/ai-cli.js +63 -0
- package/workspace/lib/ai-guard.js +314 -0
- package/workspace/lib/briefing-premium-agent.js +3 -0
- package/workspace/lib/decision-ledger.js +236 -0
- package/workspace/lib/decision-memory.js +237 -0
- package/workspace/lib/drift-cli.js +98 -0
- package/workspace/lib/drift-facts.js +151 -0
- package/workspace/lib/drift-runs.js +149 -0
- package/workspace/lib/drift.js +227 -0
- package/workspace/lib/grill-cli.js +22 -1
- package/workspace/lib/grill-runs.js +20 -3
- package/workspace/lib/grill.js +15 -8
- package/workspace/lib/past-chat.js +32 -0
- package/workspace/lib/past-cli.js +147 -0
- package/workspace/lib/past-repeat.js +126 -0
- package/workspace/lib/past.js +353 -0
- package/workspace/lib/pmos-verbs.js +12 -0
- package/workspace/lib/proposal-runs.js +20 -0
- package/workspace/lib/rehearse-cli.js +102 -0
- package/workspace/lib/rehearse-guard.js +81 -0
- package/workspace/lib/rehearse-read.js +159 -0
- package/workspace/lib/rehearse.js +279 -0
- package/workspace/lib/route-modules.js +1 -0
- package/workspace/lib/routes-drift.js +62 -0
- package/workspace/lib/settings-store.js +6 -0
- package/workspace/package-lock.json +2 -2
- package/workspace/package.json +1 -1
- package/workspace/public/pm/grill-words.js +4 -2
- package/workspace/public/pm/home-app.js +14 -2
- package/workspace/public/pm/home-drift.js +76 -0
- package/workspace/server.js +19 -0
- package/workspace/skills/grill.skill +4 -2
- package/workspace/test-files.json +1 -1
- package/workspace/test-lists/ask-the-past.json +5 -0
- package/workspace/test-lists/decision-memory.json +6 -0
- package/workspace/test-lists/plan-rehearsal.json +5 -0
- package/workspace/test-lists/weekly-drift-check.json +5 -0
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "create-pmos",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.507.0",
|
|
4
4
|
"description": "Scaffold the PMOS portable kit — run the PMOS product-management workflow (initiative → lane-fit spec → contract → build → three gates, with work-type lanes for features, research, maintenance, incidents, and content) entirely inside your own repo, with all state as git-versioned files. Includes `workflow-sweep`, which audits the state every board derives from and separates real defects from work you simply have not done. `create-pmos workspace` also installs + launches the local Terminal Workspace GUI. No database, no network, no telemetry.",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"bin": {
|
|
@@ -32,6 +32,50 @@
|
|
|
32
32
|
"audit"
|
|
33
33
|
],
|
|
34
34
|
"pmosChanges": [
|
|
35
|
+
{
|
|
36
|
+
"v": "0.507.0",
|
|
37
|
+
"at": "2026-11-03T12:15:29.445Z",
|
|
38
|
+
"f": 3,
|
|
39
|
+
"prs": [
|
|
40
|
+
{
|
|
41
|
+
"n": 1194,
|
|
42
|
+
"t": "Rehearse a plan before you approve it (pmos rehearse)",
|
|
43
|
+
"s": "Rehearse a plan before you approve it (pmos rehearse)",
|
|
44
|
+
"k": "new"
|
|
45
|
+
}
|
|
46
|
+
]
|
|
47
|
+
},
|
|
48
|
+
{
|
|
49
|
+
"v": "0.506.0",
|
|
50
|
+
"at": "2026-11-03T12:09:23.758Z",
|
|
51
|
+
"f": 3,
|
|
52
|
+
"prs": [
|
|
53
|
+
{
|
|
54
|
+
"n": null,
|
|
55
|
+
"t": "Ai-guard, one guard for every AI job (#1191) [skip publish]",
|
|
56
|
+
"s": "Ai-guard, one guard for every AI job (#1191) [skip publish]",
|
|
57
|
+
"k": "new"
|
|
58
|
+
},
|
|
59
|
+
{
|
|
60
|
+
"n": null,
|
|
61
|
+
"t": "Decision memory, the grill's earlier-decision angle (#1193) [skip publish]",
|
|
62
|
+
"s": "Decision memory, the grill's earlier-decision angle (#1193) [skip publish]",
|
|
63
|
+
"k": "new"
|
|
64
|
+
},
|
|
65
|
+
{
|
|
66
|
+
"n": null,
|
|
67
|
+
"t": "Ask PMOS about the past, with the record behind every answer (#1195) [skip publish]",
|
|
68
|
+
"s": "Ask PMOS about the past, with the record behind every answer (#1195) [skip publish]",
|
|
69
|
+
"k": "new"
|
|
70
|
+
},
|
|
71
|
+
{
|
|
72
|
+
"n": 1192,
|
|
73
|
+
"t": "What would I have missed, a weekly check for quiet drift",
|
|
74
|
+
"s": "What would I have missed, a weekly check for quiet drift",
|
|
75
|
+
"k": "new"
|
|
76
|
+
}
|
|
77
|
+
]
|
|
78
|
+
},
|
|
35
79
|
{
|
|
36
80
|
"v": "0.505.0",
|
|
37
81
|
"at": "2026-11-03T10:44:31.649Z",
|
|
@@ -409,32 +453,6 @@
|
|
|
409
453
|
"k": "new"
|
|
410
454
|
}
|
|
411
455
|
]
|
|
412
|
-
},
|
|
413
|
-
{
|
|
414
|
-
"v": "0.487.0",
|
|
415
|
-
"at": "2026-11-02T05:32:30.382Z",
|
|
416
|
-
"f": 3,
|
|
417
|
-
"prs": [
|
|
418
|
-
{
|
|
419
|
-
"n": 1147,
|
|
420
|
-
"t": "Batch 23 feedback",
|
|
421
|
-
"s": "Batch 23 feedback",
|
|
422
|
-
"k": "new"
|
|
423
|
-
}
|
|
424
|
-
]
|
|
425
|
-
},
|
|
426
|
-
{
|
|
427
|
-
"v": "0.486.0",
|
|
428
|
-
"at": "2026-11-02T03:54:59.832Z",
|
|
429
|
-
"f": 3,
|
|
430
|
-
"prs": [
|
|
431
|
-
{
|
|
432
|
-
"n": 1146,
|
|
433
|
-
"t": "An initiative owns its tasks; the Board reads them (D104, batch 22 item 21)",
|
|
434
|
-
"s": "An initiative owns its tasks; the Board reads them",
|
|
435
|
-
"k": "new"
|
|
436
|
-
}
|
|
437
|
-
]
|
|
438
456
|
}
|
|
439
457
|
]
|
|
440
458
|
}
|
package/payload/AGENTS.md
CHANGED
|
@@ -54,6 +54,8 @@ State files are **append-only**: never rewrite or delete an existing line or ini
|
|
|
54
54
|
|
|
55
55
|
**Read current state through `pmos`, never from a ledger line.** A `.jsonl` ledger is a log of changes: a later line replaces an earlier one, so its first line for a task can hold dates that were changed long ago. Read an initiative's tasks, with the state and the start and due day the Board timeline shows, with `pmos task list <initiative> --all` (add `--json` for fields). Read the Board with `pmos board`, and initiatives with `pmos initiative list`. Never quote a date, owner or state that you read from `boards.jsonl` or another ledger by hand. When `pmos` cannot answer, say so; do not fall back to the raw file.
|
|
56
56
|
|
|
57
|
+
**Rehearse a change before you make it.** When the PM asks you to move a task's dates, change an initiative's end date, or cut a task or an initiative, run `pmos rehearse move|end|cut …` first and show the PM what it prints: what the change breaks and what it helps in other initiatives, goals and program milestones, each with its source. Then wait. Make the change with `pmos task set` or `pmos task state` only after the PM says yes in their own words; a rehearsal is never approval. When it says nothing else moves, say so in one line and go on. When it says rehearsals are off, make the change as asked.
|
|
58
|
+
|
|
57
59
|
## Work-type lanes (D56)
|
|
58
60
|
|
|
59
61
|
Every initiative carries a `type` — the lane picks what the gate requires **before** work; the kernel (anchor — a KR **or** `health:<id>` from `planning/okrs/health-budgets.md` (D59) — eval-before-work in lane-appropriate form, human Acceptance, append-only state) holds in every lane. Unknown/missing type = `feature`, the strictest lane. The enum is closed — never invent a lane; a work shape with no lane escalates to the PM.
|
package/payload/KIT-VERSION
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
type: Reference
|
|
3
3
|
title: "Eval calibration log"
|
|
4
4
|
description: "Append-only record of every PM override of an evaluator verdict."
|
|
5
|
-
generated: {by: process:create-pmos, at: "2026-11-
|
|
5
|
+
generated: {by: process:create-pmos, at: "2026-11-03T12:15:25Z"}
|
|
6
6
|
status: stable
|
|
7
7
|
---
|
|
8
8
|
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
type: Reference
|
|
3
3
|
title: "Health budgets"
|
|
4
4
|
description: "Closed registry of health-budget anchors (D59), edited only by the PM."
|
|
5
|
-
generated: {by: process:create-pmos, at: "2026-11-
|
|
5
|
+
generated: {by: process:create-pmos, at: "2026-11-03T12:15:25Z"}
|
|
6
6
|
status: stable
|
|
7
7
|
---
|
|
8
8
|
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
type: Reference
|
|
3
3
|
title: "Discoveries and friction log"
|
|
4
4
|
description: "Append-only record of what runs discovered and where the process rubbed."
|
|
5
|
-
generated: {by: process:create-pmos, at: "2026-11-
|
|
5
|
+
generated: {by: process:create-pmos, at: "2026-11-03T12:15:25Z"}
|
|
6
6
|
status: stable
|
|
7
7
|
---
|
|
8
8
|
|
package/workspace/changelog.json
CHANGED
|
@@ -1,4 +1,48 @@
|
|
|
1
1
|
[
|
|
2
|
+
{
|
|
3
|
+
"v": "0.507.0",
|
|
4
|
+
"at": "2026-11-03T12:15:29.445Z",
|
|
5
|
+
"f": 3,
|
|
6
|
+
"prs": [
|
|
7
|
+
{
|
|
8
|
+
"n": 1194,
|
|
9
|
+
"t": "Rehearse a plan before you approve it (pmos rehearse)",
|
|
10
|
+
"s": "Rehearse a plan before you approve it (pmos rehearse)",
|
|
11
|
+
"k": "new"
|
|
12
|
+
}
|
|
13
|
+
]
|
|
14
|
+
},
|
|
15
|
+
{
|
|
16
|
+
"v": "0.506.0",
|
|
17
|
+
"at": "2026-11-03T12:09:23.758Z",
|
|
18
|
+
"f": 3,
|
|
19
|
+
"prs": [
|
|
20
|
+
{
|
|
21
|
+
"n": null,
|
|
22
|
+
"t": "Ai-guard, one guard for every AI job (#1191) [skip publish]",
|
|
23
|
+
"s": "Ai-guard, one guard for every AI job (#1191) [skip publish]",
|
|
24
|
+
"k": "new"
|
|
25
|
+
},
|
|
26
|
+
{
|
|
27
|
+
"n": null,
|
|
28
|
+
"t": "Decision memory, the grill's earlier-decision angle (#1193) [skip publish]",
|
|
29
|
+
"s": "Decision memory, the grill's earlier-decision angle (#1193) [skip publish]",
|
|
30
|
+
"k": "new"
|
|
31
|
+
},
|
|
32
|
+
{
|
|
33
|
+
"n": null,
|
|
34
|
+
"t": "Ask PMOS about the past, with the record behind every answer (#1195) [skip publish]",
|
|
35
|
+
"s": "Ask PMOS about the past, with the record behind every answer (#1195) [skip publish]",
|
|
36
|
+
"k": "new"
|
|
37
|
+
},
|
|
38
|
+
{
|
|
39
|
+
"n": 1192,
|
|
40
|
+
"t": "What would I have missed, a weekly check for quiet drift",
|
|
41
|
+
"s": "What would I have missed, a weekly check for quiet drift",
|
|
42
|
+
"k": "new"
|
|
43
|
+
}
|
|
44
|
+
]
|
|
45
|
+
},
|
|
2
46
|
{
|
|
3
47
|
"v": "0.505.0",
|
|
4
48
|
"at": "2026-11-03T10:44:31.649Z",
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
/* fixtures/decision-pairs.js — The real supersede pairs in DECISIONS.md, read by hand on 2026-11-03 (decision memory). decision-memory.test.js checks the ledger finds exactly these, and lib/decision-memory.js replays them before any finding is shown. Add a pair here when a new decision supersedes an old one. */
|
|
2
|
+
'use strict';
|
|
3
|
+
module.exports = {
|
|
4
|
+
"reverted": [
|
|
5
|
+
"D29"
|
|
6
|
+
],
|
|
7
|
+
"pairs": [
|
|
8
|
+
{
|
|
9
|
+
"newer": "D40",
|
|
10
|
+
"older": "D20",
|
|
11
|
+
"where": "DECISIONS.md:83"
|
|
12
|
+
},
|
|
13
|
+
{
|
|
14
|
+
"newer": "D43",
|
|
15
|
+
"older": "D27",
|
|
16
|
+
"where": "DECISIONS.md:173"
|
|
17
|
+
},
|
|
18
|
+
{
|
|
19
|
+
"newer": "D64",
|
|
20
|
+
"older": "D26",
|
|
21
|
+
"where": "DECISIONS.md:237"
|
|
22
|
+
},
|
|
23
|
+
{
|
|
24
|
+
"newer": "D64",
|
|
25
|
+
"older": "D24",
|
|
26
|
+
"where": "DECISIONS.md:237"
|
|
27
|
+
},
|
|
28
|
+
{
|
|
29
|
+
"newer": "D64",
|
|
30
|
+
"older": "D25",
|
|
31
|
+
"where": "DECISIONS.md:237"
|
|
32
|
+
},
|
|
33
|
+
{
|
|
34
|
+
"newer": "D64",
|
|
35
|
+
"older": "D43",
|
|
36
|
+
"where": "DECISIONS.md:237"
|
|
37
|
+
},
|
|
38
|
+
{
|
|
39
|
+
"newer": "D66",
|
|
40
|
+
"older": "D46",
|
|
41
|
+
"where": "DECISIONS.md:243"
|
|
42
|
+
},
|
|
43
|
+
{
|
|
44
|
+
"newer": "D66",
|
|
45
|
+
"older": "D50",
|
|
46
|
+
"where": "DECISIONS.md:243"
|
|
47
|
+
},
|
|
48
|
+
{
|
|
49
|
+
"newer": "D66",
|
|
50
|
+
"older": "D37",
|
|
51
|
+
"where": "DECISIONS.md:243"
|
|
52
|
+
},
|
|
53
|
+
{
|
|
54
|
+
"newer": "D66",
|
|
55
|
+
"older": "D33",
|
|
56
|
+
"where": "DECISIONS.md:243"
|
|
57
|
+
},
|
|
58
|
+
{
|
|
59
|
+
"newer": "D66",
|
|
60
|
+
"older": "D53",
|
|
61
|
+
"where": "DECISIONS.md:243"
|
|
62
|
+
},
|
|
63
|
+
{
|
|
64
|
+
"newer": "D66",
|
|
65
|
+
"older": "D24",
|
|
66
|
+
"where": "DECISIONS.md:243"
|
|
67
|
+
},
|
|
68
|
+
{
|
|
69
|
+
"newer": "D66",
|
|
70
|
+
"older": "D25",
|
|
71
|
+
"where": "DECISIONS.md:243"
|
|
72
|
+
},
|
|
73
|
+
{
|
|
74
|
+
"newer": "D101",
|
|
75
|
+
"older": "D79",
|
|
76
|
+
"where": "DECISIONS.md:353"
|
|
77
|
+
},
|
|
78
|
+
{
|
|
79
|
+
"newer": "D101",
|
|
80
|
+
"older": "D69",
|
|
81
|
+
"where": "DECISIONS.md:353"
|
|
82
|
+
},
|
|
83
|
+
{
|
|
84
|
+
"newer": "D101",
|
|
85
|
+
"older": "D70",
|
|
86
|
+
"where": "DECISIONS.md:353"
|
|
87
|
+
},
|
|
88
|
+
{
|
|
89
|
+
"newer": "D101",
|
|
90
|
+
"older": "D71",
|
|
91
|
+
"where": "DECISIONS.md:353"
|
|
92
|
+
}
|
|
93
|
+
]
|
|
94
|
+
};
|
|
@@ -0,0 +1,159 @@
|
|
|
1
|
+
{
|
|
2
|
+
"_comment": "A recorded snapshot for the rehearse replay cases (lib/rehearse-guard.js). `contents` are the ledger and record files its sources cite; the guard writes them to a temporary folder and computes every source from them, so each effect cites a line that is really there.",
|
|
3
|
+
"today": "2026-11-03",
|
|
4
|
+
"tasks": [
|
|
5
|
+
{
|
|
6
|
+
"uid": "a1",
|
|
7
|
+
"title": "Design checkout",
|
|
8
|
+
"ini": "checkout",
|
|
9
|
+
"status": "To do",
|
|
10
|
+
"start": "2026-11-05",
|
|
11
|
+
"end": "2026-11-10"
|
|
12
|
+
},
|
|
13
|
+
{
|
|
14
|
+
"uid": "a2",
|
|
15
|
+
"title": "Build checkout",
|
|
16
|
+
"ini": "checkout",
|
|
17
|
+
"status": "To do",
|
|
18
|
+
"start": "2026-11-11",
|
|
19
|
+
"end": "2026-11-20"
|
|
20
|
+
},
|
|
21
|
+
{
|
|
22
|
+
"uid": "b1",
|
|
23
|
+
"title": "Launch promo",
|
|
24
|
+
"ini": "promo",
|
|
25
|
+
"status": "To do",
|
|
26
|
+
"start": "2026-11-21",
|
|
27
|
+
"end": "2026-11-25"
|
|
28
|
+
},
|
|
29
|
+
{
|
|
30
|
+
"uid": "b2",
|
|
31
|
+
"title": "Promo live",
|
|
32
|
+
"ini": "promo",
|
|
33
|
+
"status": "To do",
|
|
34
|
+
"start": "2026-11-28",
|
|
35
|
+
"end": "2026-11-28",
|
|
36
|
+
"milestone": true
|
|
37
|
+
},
|
|
38
|
+
{
|
|
39
|
+
"uid": "J-1",
|
|
40
|
+
"title": "API change",
|
|
41
|
+
"ini": "promo",
|
|
42
|
+
"status": "To do",
|
|
43
|
+
"start": "2026-11-21",
|
|
44
|
+
"end": "2026-11-23",
|
|
45
|
+
"src": "jira"
|
|
46
|
+
}
|
|
47
|
+
],
|
|
48
|
+
"links": [
|
|
49
|
+
{
|
|
50
|
+
"from": "a1",
|
|
51
|
+
"to": "a2",
|
|
52
|
+
"type": "fs",
|
|
53
|
+
"lag": 0
|
|
54
|
+
},
|
|
55
|
+
{
|
|
56
|
+
"from": "a2",
|
|
57
|
+
"to": "b1",
|
|
58
|
+
"type": "fs",
|
|
59
|
+
"lag": 0
|
|
60
|
+
},
|
|
61
|
+
{
|
|
62
|
+
"from": "b1",
|
|
63
|
+
"to": "b2",
|
|
64
|
+
"type": "fs",
|
|
65
|
+
"lag": 0
|
|
66
|
+
},
|
|
67
|
+
{
|
|
68
|
+
"from": "a2",
|
|
69
|
+
"to": "J-1",
|
|
70
|
+
"type": "fs",
|
|
71
|
+
"lag": 0
|
|
72
|
+
}
|
|
73
|
+
],
|
|
74
|
+
"rows": [
|
|
75
|
+
{
|
|
76
|
+
"id": "checkout",
|
|
77
|
+
"title": "Checkout",
|
|
78
|
+
"end": "2026-11-22",
|
|
79
|
+
"anchor": "conv"
|
|
80
|
+
},
|
|
81
|
+
{
|
|
82
|
+
"id": "promo",
|
|
83
|
+
"title": "Promo",
|
|
84
|
+
"end": "2026-11-30",
|
|
85
|
+
"anchor": "conv"
|
|
86
|
+
}
|
|
87
|
+
],
|
|
88
|
+
"goals": [
|
|
89
|
+
{
|
|
90
|
+
"id": "conv",
|
|
91
|
+
"title": "Checkout conversion",
|
|
92
|
+
"byAt": "2026-11-29",
|
|
93
|
+
"moves": [
|
|
94
|
+
"checkout",
|
|
95
|
+
"promo"
|
|
96
|
+
],
|
|
97
|
+
"forecast": {
|
|
98
|
+
"state": "at-risk",
|
|
99
|
+
"likely": 2.6
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
],
|
|
103
|
+
"programs": [
|
|
104
|
+
{
|
|
105
|
+
"id": "q4",
|
|
106
|
+
"title": "Q4 holiday",
|
|
107
|
+
"milestones": [
|
|
108
|
+
{
|
|
109
|
+
"id": "m",
|
|
110
|
+
"name": "Holiday ready",
|
|
111
|
+
"date": "2026-11-30",
|
|
112
|
+
"waits": [
|
|
113
|
+
"promo"
|
|
114
|
+
],
|
|
115
|
+
"done": false
|
|
116
|
+
}
|
|
117
|
+
]
|
|
118
|
+
}
|
|
119
|
+
],
|
|
120
|
+
"files": {
|
|
121
|
+
"links": "rehearse-links.jsonl",
|
|
122
|
+
"krs": "rehearse-krs.jsonl",
|
|
123
|
+
"programs": "rehearse-programs.jsonl",
|
|
124
|
+
"records": {
|
|
125
|
+
"checkout": "rehearse-checkout.txt",
|
|
126
|
+
"promo": "rehearse-promo.txt"
|
|
127
|
+
}
|
|
128
|
+
},
|
|
129
|
+
"contents": {
|
|
130
|
+
"rehearse-links.jsonl": [
|
|
131
|
+
"{\"at\":\"2026-10-20T09:00:00Z\",\"by\":\"pm\",\"kind\":\"link\",\"board\":\"b\",\"ini\":\"checkout\",\"from\":\"a1\",\"to\":\"a2\",\"type\":\"fs\",\"lag\":0,\"source\":\"page\"}",
|
|
132
|
+
"{\"at\":\"2026-10-20T09:01:00Z\",\"by\":\"pm\",\"kind\":\"link\",\"board\":\"b\",\"ini\":\"promo\",\"from\":\"a2\",\"to\":\"b1\",\"type\":\"fs\",\"lag\":0,\"source\":\"page\"}",
|
|
133
|
+
"{\"at\":\"2026-10-20T09:02:00Z\",\"by\":\"pm\",\"kind\":\"link\",\"board\":\"b\",\"ini\":\"promo\",\"from\":\"b1\",\"to\":\"b2\",\"type\":\"fs\",\"lag\":0,\"source\":\"page\"}",
|
|
134
|
+
"{\"at\":\"2026-10-20T09:03:00Z\",\"by\":\"pm\",\"kind\":\"link\",\"board\":\"b\",\"ini\":\"promo\",\"from\":\"a2\",\"to\":\"J-1\",\"type\":\"fs\",\"lag\":0,\"source\":\"chat\"}"
|
|
135
|
+
],
|
|
136
|
+
"rehearse-krs.jsonl": [
|
|
137
|
+
"{\"rid\":\"conv\",\"metric\":\"Checkout conversion\",\"unit\":\"%\",\"baseline\":2.1,\"target\":3,\"by\":\"2026-11-29\"}"
|
|
138
|
+
],
|
|
139
|
+
"rehearse-programs.jsonl": [
|
|
140
|
+
"{\"at\":\"2026-10-01T00:00:00Z\",\"kind\":\"program\",\"id\":\"q4\",\"title\":\"Q4 holiday\",\"milestones\":[{\"id\":\"m\",\"name\":\"Holiday ready\",\"date\":\"2026-11-30\",\"waits\":[\"promo\"]}]}"
|
|
141
|
+
],
|
|
142
|
+
"rehearse-checkout.txt": [
|
|
143
|
+
"---",
|
|
144
|
+
"type: Initiative",
|
|
145
|
+
"title: \"Checkout\"",
|
|
146
|
+
"id: checkout",
|
|
147
|
+
"parent_kr: conv",
|
|
148
|
+
"---"
|
|
149
|
+
],
|
|
150
|
+
"rehearse-promo.txt": [
|
|
151
|
+
"---",
|
|
152
|
+
"type: Initiative",
|
|
153
|
+
"title: \"Promo\"",
|
|
154
|
+
"id: promo",
|
|
155
|
+
"parent_kr: conv",
|
|
156
|
+
"---"
|
|
157
|
+
]
|
|
158
|
+
}
|
|
159
|
+
}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
---
|
|
2
|
+
type: Guide
|
|
3
|
+
title: "Ask about the past: why something was decided or dropped, with the record that says so"
|
|
4
|
+
timestamp: 2026-11-03
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# Ask about the past
|
|
8
|
+
|
|
9
|
+
Ask in the initiative chat. There is no search box and no button.
|
|
10
|
+
|
|
11
|
+
- "Why did we drop the hosted backend?"
|
|
12
|
+
- "Did we ever decide on a graph store?"
|
|
13
|
+
- "What did we decide about Now, Next and Later?"
|
|
14
|
+
|
|
15
|
+
Claude answers from the records PMOS keeps, never from memory. Each claim has the file and line it rests on, for example `DECISIONS.md:243`. When no record answers the question, Claude says **No record found** and names what it read. It does not guess a reason.
|
|
16
|
+
|
|
17
|
+
A decision that a later one replaced is marked as superseded, with the decision that replaced it.
|
|
18
|
+
|
|
19
|
+
## What it reads
|
|
20
|
+
|
|
21
|
+
- `DECISIONS.md`: each decision and each line of the amendment log
|
|
22
|
+
- the decision records in `okf/products/pmos/adr/`
|
|
23
|
+
- `pm-decisions.md`, the PM journal
|
|
24
|
+
- `planning/out-of-scope/`, the requests that were declined
|
|
25
|
+
- `planning/initiatives/`, each initiative record and its status
|
|
26
|
+
- `discoveries.md`, the run log (it counts less)
|
|
27
|
+
- the decisions in your meeting notes, except a point you marked not right or deleted. A private note is never read.
|
|
28
|
+
|
|
29
|
+
It does not read chat transcripts or Jira tickets, because PMOS keeps no searchable copy of them on your machine. It says so in each answer.
|
|
30
|
+
|
|
31
|
+
## You decided this before
|
|
32
|
+
|
|
33
|
+
When you add an initiative that repeats something decided or declined before, one finding waits under the initiative's ✦. It quotes the earlier record and its line. The next step is to say what is different this time. Keep it to add that step as a task, or drop it. Nothing changes until you keep it. When nothing repeats, nothing shows.
|
|
34
|
+
|
|
35
|
+
It goes through the same guardrail as every AI job: every quote is checked at its line, it is tested on known cases before anything shows, and every run is in the audit. `pmos ai off past-repeat` turns it off.
|
|
36
|
+
|
|
37
|
+
## From a terminal
|
|
38
|
+
|
|
39
|
+
| Command | What it does |
|
|
40
|
+
|---|---|
|
|
41
|
+
| `pmos past ask "<question>"` | The records that answer the question, each with its path:line and its own words, and how sure the match is. "No record found" when none does. `--json` for a script. |
|
|
42
|
+
| `pmos past check "<idea>"` | What was decided or declined before about an idea. |
|
|
43
|
+
| `pmos past verify --text "<answer>"` | Checks that every path:line in an answer is a record PMOS read, at a line that exists. |
|
|
44
|
+
| `pmos past sources` | Which records were read, and which were not on this machine. |
|
|
45
|
+
|
|
46
|
+
Nothing here writes a record, sends anything or calls a model.
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
type: Guide
|
|
3
3
|
title: "Claude proposes: the one ✦ on each initiative"
|
|
4
4
|
description: "What Claude finds when you add an initiative that already lives elsewhere, the new dates, done and tidy names it proposes for late tasks, the clean-up of the work that is not in an initiative, how you keep or drop them in the Viewer, Undo, the pmos propose commands, and how Claude grills an initiative by itself (pmos grill)."
|
|
5
|
-
timestamp: 2026-11-
|
|
5
|
+
timestamp: 2026-11-03
|
|
6
6
|
---
|
|
7
7
|
|
|
8
8
|
# Claude proposes: the one ✦ on each initiative
|
|
@@ -64,14 +64,23 @@ Claude also tests an initiative without being asked. There is no Grill button an
|
|
|
64
64
|
- before it leaves a stage (the stage has one open task or none left),
|
|
65
65
|
- when its forecast turns at risk or will miss,
|
|
66
66
|
- when its scope or dates move a lot (30% more or fewer tasks, or the end moves 14 days or more),
|
|
67
|
+
- when its PRD changes (the first look only notes the PRD; a later change starts a run),
|
|
67
68
|
- once a month, every running initiative that has open tasks: the ones with late work first, then the ones it grilled longest ago. Each one at most once in 30 days, and only while the monthly credit lasts.
|
|
68
69
|
|
|
69
70
|
You can also start one any time: in the initiative's chat, write "grill this" (or "grill it"). The run starts at once in the background, and the chat says so in one line. If it cannot start, for example because another grill is running or this month's credit is spent, the chat says why. The findings arrive under the ✦ as for the other runs.
|
|
70
71
|
|
|
71
|
-
Each finding is a proposal in the group "Claude grilled it", under the same ✦. Each row shows the mark and the name of the angle that found it: Premortem, Red team, Voices, Reframe, Scope
|
|
72
|
+
Each finding is a proposal in the group "Claude grilled it", under the same ✦. Each row shows the mark and the name of the angle that found it: Premortem, Red team, Voices, Reframe, Scope, What-if or Earlier decision. Voices are simulated from your stored research and meeting notes, only with 3 sources or more, and carry the tag "Simulated, not evidence". A What-if carries "Simulated, not the plan". Each finding ends with one next step. ✓ adds that step as a task. ✎ lets you write the step in your own words first; ✓ then adds your words. ✕ drops the finding. A finding never rides on the header's ✓. Above the findings, one quiet line names the angles Claude chose, when and why it ran, and what the run cost. Three findings show at a time; "+N smaller findings" and its ⋯ show the rest. On a phone the findings are cards side by side: swipe for the next. With no findings, nothing shows.
|
|
72
73
|
|
|
73
74
|
When Claude grilled an initiative this week and left findings, Home says so in one line under "Good morning", and its ✦ opens the findings. When it grilled more than one, the line names the newest and says how many more, for example "I grilled Inline login and 5 more this week: 21 findings." The others' findings are under each initiative's own ✦. When a key result will miss its goal, or drifted to at risk, Intelligence's ✦ line names it and the initiative Claude grilled for it; its ✦ opens those findings.
|
|
74
75
|
|
|
76
|
+
### Earlier decision: Claude remembers what you decided
|
|
77
|
+
|
|
78
|
+
On every run Claude checks the plan and the PRD against the decisions that still stand in DECISIONS.md and the ADRs. When the plan goes against one, the finding quotes the decision and the plan word for word, says which file and line each is on, and suggests one of three answers: keep the decision and change the plan, change the decision with a new one that amends it, or drop it with a new one that supersedes it. It never blocks anything.
|
|
79
|
+
|
|
80
|
+
Claude never pushes back with a decision that a later one replaced: such a finding is refused, and the refusal names the decision that replaced it. A quote that is not word for word is refused, and so is a guess (low confidence). Nothing shows until a replay of the real "this replaces that" pairs in DECISIONS.md passes. `PMOS_DECISION_MEMORY=off` or `pmos ai off decision-memory` turns this angle off.
|
|
81
|
+
|
|
82
|
+
- `pmos grill decisions [--all]`: the decisions that stand, one line each with its file and line. With `--all`, also the superseded and reverted ones and what replaced them.
|
|
83
|
+
|
|
75
84
|
Every run counts against a monthly credit cap. A run starts only when the cap holds its whole budget, and it stops at that budget, so the month never goes past the cap. At the cap Claude pauses until the next month.
|
|
76
85
|
|
|
77
86
|
Set when Claude grills, and how much it may spend, in **Settings › Claude's checks** (see the Settings guide), or with these commands:
|
|
@@ -83,5 +92,23 @@ Set when Claude grills, and how much it may spend, in **Settings › Claude's ch
|
|
|
83
92
|
Claude's grill run files with these commands, which refuse outside that run:
|
|
84
93
|
|
|
85
94
|
- `pmos grill find <premortem|redteam|voices|reframe|scope|whatif> --json <file|->`: one finding, with its sources and next step.
|
|
95
|
+
- `pmos grill find decision --json <file|->`: a plan that goes against an earlier decision, with both quotes, keep, change or drop, and the next step.
|
|
86
96
|
- `pmos grill voices --sources <n>`: how many stored sources Voices can use.
|
|
87
97
|
- `pmos grill status`: what is open, kept and dropped.
|
|
98
|
+
|
|
99
|
+
## The guard on every AI job
|
|
100
|
+
|
|
101
|
+
Decision memory, the weekly what-I'd-miss check, ask about the past and the other AI jobs run in your usual Claude session. What they find goes through one guard before you see it:
|
|
102
|
+
|
|
103
|
+
- **Proposals only.** A job files a proposal under ✦. It writes no task, document or decision. Your ✓ does.
|
|
104
|
+
- **Every claim cites.** Each claim names a file and a line, and quotes it. The guard reads that line. A quote that is not there drops the proposal.
|
|
105
|
+
- **Honest confidence.** High needs two sources or more. "No record" is a valid answer.
|
|
106
|
+
- **Replay first.** A job shows nothing until its replay cases pass. Those cases include fabricated quotes that the guard must drop.
|
|
107
|
+
- **Kill switch and audit.** Every filed, dropped and held proposal is a line in the audit, with the reason.
|
|
108
|
+
|
|
109
|
+
The commands:
|
|
110
|
+
|
|
111
|
+
- `pmos ai status`: whether each job is on, whether its replay passed, and what its last run filed.
|
|
112
|
+
- `pmos ai off` or `pmos ai off <job>`: every AI job off, or one job. `PMOS_AI=off` in the environment wins.
|
|
113
|
+
- `pmos ai on` or `pmos ai on <job>`: on again.
|
|
114
|
+
- `pmos ai log`: the last audit lines. Each drop shows its reason.
|
package/workspace/guide/index.md
CHANGED
|
@@ -63,12 +63,14 @@ On a desktop the workspace is one frame. [Layout](layout.md) explains each part.
|
|
|
63
63
|
- [Present while a meeting records](present-in-a-meeting.md): Present in the recording tab, the audience tab, the presenter view, and presenting a window.
|
|
64
64
|
- [Notes](notes.md): listen to a meeting on this machine, see decisions, actions and questions caught and checked against the repository, and get a summary.
|
|
65
65
|
- [Find knowledge without reading whole files](knowledge-graph.md): what `pmos kg` finds, its commands, how to read its numbers, and its limits.
|
|
66
|
+
- [Ask about the past](ask-the-past.md): why something was decided or dropped, answered in the initiative chat from the records, with the line each claim rests on; "You decided this before" on a new initiative.
|
|
66
67
|
- [Initiatives: the Roadmap, the List and the initiative sheet](initiatives-screen.md): how to read and order the initiatives of a repository, open the sheet, make a new initiative, and review the cycle.
|
|
67
68
|
- [Initiatives and the Roadmap: one ranked list](initiatives-roadmap.md): what day one shows, what happened to Now, Next and Later, and `pmos initiative` and `pmos measure` from a terminal.
|
|
68
69
|
- [The Initiative Driver: drafts the agent files for you](initiative-driver.md): when the driver runs, the unblock sweep, the limits, Keep, Send back and Drop, the board modes, and `pmos driver`.
|
|
69
70
|
- [Claude proposes: the one ✦ on each initiative](claude-proposes.md): what Claude finds when you add an initiative, new dates, done and tidy names for late tasks, ✓, ✕, Undo, and `pmos propose`.
|
|
70
71
|
- [Claude drafts metrics without being asked](metric-drafts.md): when Claude drafts the metrics of a product, a program or an initiative, keep, drop, Undo, and `pmos metrics draft`.
|
|
71
72
|
- [Your impact](your-impact.md): what counts as your impact, the weekly check in Home's chat, the switch, and `pmos impact`. Private to you.
|
|
73
|
+
- [What you might have missed](what-you-missed.md): the weekly check for quiet drift, at most three items in Home's chat, its replay, and `pmos drift`.
|
|
72
74
|
- [Adler, Claude's face](adler.md): who Adler is, where he shows, what his six moods mean, and Settings › Adler.
|
|
73
75
|
- [Ready-made dashboards and reports](ready-made-dashboards.md): the dashboard and reports every program, product and initiative has, the Work | Dashboard icon, the Sponsors and Team cuts, late and held reports.
|
|
74
76
|
- [Core documents: what each level keeps](core-documents.md): the core documents of the portfolio, a board and an initiative, their states, how PMOS drafts them, Issue it, and `pmos coredoc write`.
|
|
@@ -78,6 +80,7 @@ On a desktop the workspace is one frame. [Layout](layout.md) explains each part.
|
|
|
78
80
|
- [Breakdown › Timeline](timeline.md): an initiative's items on a time axis, split by stage, with milestones, today, and the at-risk flag when an item starts before its predecessor ends.
|
|
79
81
|
- [Initiatives › Timeline](initiatives-timeline.md): when each initiative runs, one row per initiative, and how to reorder rows by their grip.
|
|
80
82
|
- [Workflows](workflows.md): Settings › Workflows, the stages each kind of initiative goes through, New workflow in the chat, and `pmos workflow`.
|
|
83
|
+
- [Rehearse a plan](rehearse.md): before you approve a date change or a cut, Claude shows what it breaks or helps in other initiatives, goals and program milestones, with the record each effect comes from, and `pmos rehearse`.
|
|
81
84
|
- [Forecasts](forecast.md): how a goal, a delivery, a program and a health budget are forecast, the states, the kept baseline, and `pmos forecast`.
|
|
82
85
|
- [Programs on the Board](programs.md): All products, programs first then products, By product, the program panel and its milestones, and the 60 % side panels.
|
|
83
86
|
- [Board](board.md): one Kanban for the items of every initiative, its filters, Release, and `pmos board`.
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
---
|
|
2
|
+
type: Guide
|
|
3
|
+
title: "Rehearse a plan: what a change breaks or helps, before you approve it"
|
|
4
|
+
description: "How Claude rehearses a date change or a cut before you approve it, what each effect means, where its source comes from, the guardrails, and the pmos rehearse commands."
|
|
5
|
+
timestamp: 2026-11-03
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
# Rehearse a plan
|
|
9
|
+
|
|
10
|
+
When you ask Claude in your session to move a task, change an initiative's end date, or cut a task or a whole initiative, Claude first rehearses the change. It shows you what the change breaks and what it helps, and it waits for your yes. The rehearsal changes nothing. There is no button: you approve in your own words, and only then does Claude make the change.
|
|
11
|
+
|
|
12
|
+
## What a rehearsal shows
|
|
13
|
+
|
|
14
|
+
Each line is one effect, with the record it comes from under it.
|
|
15
|
+
|
|
16
|
+
- **✗ Breaks** — something gets worse because of the change:
|
|
17
|
+
- a task in another initiative moves later, because it waits on the changed task through a task link;
|
|
18
|
+
- a ◇ milestone moves;
|
|
19
|
+
- a Jira ticket would have to start later. PMOS cannot move a Jira ticket, so its assignee would have to;
|
|
20
|
+
- a task would start before a task it waits on allows (a task moved earlier than its link allows);
|
|
21
|
+
- an initiative's last task now ends after the initiative's end date;
|
|
22
|
+
- a goal's date falls before the new end of an initiative that moves the goal, or the goal loses an initiative (a cut). The line adds the goal's forecast as it is today ([Forecasts](forecast.md));
|
|
23
|
+
- a program milestone that waits on the initiative comes after its date, or waits on an initiative you would cut;
|
|
24
|
+
- a task that waited on a cut task loses what it waited on.
|
|
25
|
+
- **✓ Helps** — something gets better: an initiative or a goal is back in time, a program milestone clears, or a task held by a task you move earlier could start earlier.
|
|
26
|
+
- **· Moves** — the tasks of the same initiative that move with the change, in one line.
|
|
27
|
+
|
|
28
|
+
When nothing else changes, the rehearsal says so in one line.
|
|
29
|
+
|
|
30
|
+
A moved task's line gives the date it moves from. When late work before it already pushes it past the Board's date, the line gives both. A task that is already late gets a note with where its due day goes. When a task link names a task no board has any more (it was removed or renamed), the rehearsal leaves that link out and says how many it left out.
|
|
31
|
+
|
|
32
|
+
## How it decides
|
|
33
|
+
|
|
34
|
+
The effects are the difference between the plan as it is and the plan with the change. Both are first settled through your approved [task links](workflows.md), so a link that is already broken today is not blamed on the change. Only what a record and the date arithmetic prove is said. A goal effect gives the date fact and today's forecast state; it never estimates a new number. An initiative's work lands when its last open task ends. Its end date counts only when no open task has a date, so moving an end date later does not flag a goal or a program milestone that the work still meets. An effect for which PMOS finds no record line to cite is not shown, and the rehearsal says how many it left out.
|
|
35
|
+
|
|
36
|
+
## The guardrails
|
|
37
|
+
|
|
38
|
+
- **Propose-only.** The rehearsal writes nothing except one audit line.
|
|
39
|
+
- **Every effect cites its source**: the line of the task link, the initiative record, the goal's KR metric record or the program charter. Before an effect is shown, PMOS checks that the quoted text is really at that line. An effect whose source cannot be found is not shown, and the rehearsal says how many were left out.
|
|
40
|
+
- **Replay-tested.** A new version of the rehearsal shows nothing until its recorded cases pass (one of them checks that a change nothing waits on says nothing).
|
|
41
|
+
- **Kill switch.** `pmos ai off rehearse` turns rehearsals off, and `pmos ai on rehearse` turns them on again. `PMOS_AI_REHEARSE=off` or `PMOS_AI=off` in the environment also turns them off.
|
|
42
|
+
- **Audit.** Each rehearsal adds lines to the AI audit log: `pmos rehearse log`, or `pmos ai log rehearse` for every line.
|
|
43
|
+
|
|
44
|
+
## The commands
|
|
45
|
+
|
|
46
|
+
- `pmos rehearse move <task> --by <days>` — the task moves later by whole days, or earlier with a minus (`--by -2`).
|
|
47
|
+
- `pmos rehearse move <task> --start YYYY-MM-DD [--due YYYY-MM-DD]`, or `--due YYYY-MM-DD` alone — the task gets new dates. A new start alone keeps the task's length.
|
|
48
|
+
- `pmos rehearse end <initiative> --to YYYY-MM-DD` — the initiative's end date changes.
|
|
49
|
+
- `pmos rehearse cut <task|initiative>` — what if we cut this. An initiative id cuts the whole initiative; a task id cuts one task.
|
|
50
|
+
- `pmos rehearse log [--n N]` — the last rehearsals.
|
|
51
|
+
|
|
52
|
+
Every command takes `--json` and `--root <repository>`. Exit codes: 0 done, 1 off or refused, 2 usage.
|