@telora/daemon 0.21.169 → 0.21.178

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (75) hide show
  1. package/build-info.json +6 -3
  2. package/dist/completion/completion-decision.d.ts +16 -0
  3. package/dist/completion/completion-decision.d.ts.map +1 -1
  4. package/dist/completion/completion-decision.js +15 -0
  5. package/dist/completion/completion-decision.js.map +1 -1
  6. package/dist/completion/event-escalations.d.ts +26 -0
  7. package/dist/completion/event-escalations.d.ts.map +1 -1
  8. package/dist/completion/event-escalations.js +77 -19
  9. package/dist/completion/event-escalations.js.map +1 -1
  10. package/dist/completion/event-phases.d.ts +7 -0
  11. package/dist/completion/event-phases.d.ts.map +1 -1
  12. package/dist/completion/event-phases.js +19 -0
  13. package/dist/completion/event-phases.js.map +1 -1
  14. package/dist/completion/event.d.ts.map +1 -1
  15. package/dist/completion/event.js +1 -0
  16. package/dist/completion/event.js.map +1 -1
  17. package/dist/completion/human-only-act.d.ts +43 -0
  18. package/dist/completion/human-only-act.d.ts.map +1 -0
  19. package/dist/completion/human-only-act.js +75 -0
  20. package/dist/completion/human-only-act.js.map +1 -0
  21. package/dist/completion/machine-remediable-demotion.d.ts +14 -0
  22. package/dist/completion/machine-remediable-demotion.d.ts.map +1 -1
  23. package/dist/completion/machine-remediable-demotion.js +24 -1
  24. package/dist/completion/machine-remediable-demotion.js.map +1 -1
  25. package/dist/focus/focus-loop-registry.d.ts.map +1 -1
  26. package/dist/focus/focus-loop-registry.js +12 -0
  27. package/dist/focus/focus-loop-registry.js.map +1 -1
  28. package/dist/focus/listener-auto-advance.d.ts.map +1 -1
  29. package/dist/focus/listener-auto-advance.js +40 -25
  30. package/dist/focus/listener-auto-advance.js.map +1 -1
  31. package/dist/queries/agent-resolvable-aging.d.ts +88 -0
  32. package/dist/queries/agent-resolvable-aging.d.ts.map +1 -0
  33. package/dist/queries/agent-resolvable-aging.js +145 -0
  34. package/dist/queries/agent-resolvable-aging.js.map +1 -0
  35. package/dist/queries/agent-resolvable-promotion.d.ts +37 -8
  36. package/dist/queries/agent-resolvable-promotion.d.ts.map +1 -1
  37. package/dist/queries/agent-resolvable-promotion.js +77 -18
  38. package/dist/queries/agent-resolvable-promotion.js.map +1 -1
  39. package/dist/queries/escalation-consumption.d.ts +14 -0
  40. package/dist/queries/escalation-consumption.d.ts.map +1 -1
  41. package/dist/queries/escalation-consumption.js +15 -0
  42. package/dist/queries/escalation-consumption.js.map +1 -1
  43. package/dist/queries/focuses.d.ts +8 -0
  44. package/dist/queries/focuses.d.ts.map +1 -1
  45. package/dist/queries/focuses.js +19 -1
  46. package/dist/queries/focuses.js.map +1 -1
  47. package/dist/queries/routing-measurement.d.ts +65 -0
  48. package/dist/queries/routing-measurement.d.ts.map +1 -0
  49. package/dist/queries/routing-measurement.js +109 -0
  50. package/dist/queries/routing-measurement.js.map +1 -0
  51. package/dist/queries/routing-quality.d.ts +70 -0
  52. package/dist/queries/routing-quality.d.ts.map +1 -0
  53. package/dist/queries/routing-quality.js +66 -0
  54. package/dist/queries/routing-quality.js.map +1 -0
  55. package/dist/queries/schemas.d.ts +6 -0
  56. package/dist/queries/schemas.d.ts.map +1 -1
  57. package/dist/queries/schemas.js +6 -0
  58. package/dist/queries/schemas.js.map +1 -1
  59. package/dist/queries/sessions.d.ts +10 -0
  60. package/dist/queries/sessions.d.ts.map +1 -1
  61. package/dist/queries/sessions.js +14 -1
  62. package/dist/queries/sessions.js.map +1 -1
  63. package/dist/queries/source-reliability.d.ts +60 -0
  64. package/dist/queries/source-reliability.d.ts.map +1 -0
  65. package/dist/queries/source-reliability.js +70 -0
  66. package/dist/queries/source-reliability.js.map +1 -0
  67. package/dist/shell/control-state.d.ts +23 -7
  68. package/dist/shell/control-state.d.ts.map +1 -1
  69. package/dist/shell/control-state.js +41 -16
  70. package/dist/shell/control-state.js.map +1 -1
  71. package/dist/templates/claude-md.d.ts +1 -1
  72. package/dist/templates/claude-md.d.ts.map +1 -1
  73. package/dist/templates/claude-md.js +9 -0
  74. package/dist/templates/claude-md.js.map +1 -1
  75. package/package.json +3 -3
@@ -0,0 +1,60 @@
1
+ /**
2
+ * Source reliability weighting for the machine-owned lane.
3
+ *
4
+ * Filings enter the agent_resolvable lane at full weight no matter what produced
5
+ * them -- including output from a producer with demonstrated misattribution. The
6
+ * dependency scanner mints "Security Remediation" focuses from npm audit output
7
+ * that misattributes findings on non-Node repositories; the filings on those
8
+ * focuses consume lane capacity AND corrupt the measurements used to judge
9
+ * whether the lane is healthy (part of the "never-attempted" rate is the system
10
+ * arguably correctly declining that junk).
11
+ *
12
+ * A filing's producing source is carried by its FOCUS origin
13
+ * (product_focuses.origin, stamped 'deps_scanner' at the scanner focus-mint
14
+ * path), because the scanner produces focuses, not filings. This module maps an
15
+ * origin to a reliability weight in [0, 1] and applies it to a lane so a
16
+ * low-reliability source sorts/weights BELOW a full-weight peer -- without ever
17
+ * dropping a filing (down-weighting lowers priority; it never silences).
18
+ *
19
+ * Pure and dependency-free so the map + ordering are exercised from fixtures.
20
+ */
21
+ /** Focus origin stamped by the dependency scanner's focus-mint path (the known-bad producer). */
22
+ export declare const FOCUS_ORIGIN_DEPS_SCANNER = "deps_scanner";
23
+ /** Full reliability: the default for a normal (user/unstamped) source. */
24
+ export declare const FULL_RELIABILITY_WEIGHT = 1;
25
+ /**
26
+ * Reduced reliability for a source with demonstrated misattribution. Below full
27
+ * so its filings deprioritize, but strictly > 0 so they are never dropped -- an
28
+ * unreliable source still occasionally produces a real filing.
29
+ */
30
+ export declare const LOW_RELIABILITY_WEIGHT = 0.25;
31
+ /**
32
+ * Reliability weight for a focus origin. Known-unreliable producers map below
33
+ * full; a null/absent or unrecognized origin is a normal source at full weight
34
+ * (down-weighting is opt-IN per demonstrated unreliability, never the default).
35
+ */
36
+ export declare function focusOriginReliabilityWeight(origin: string | null | undefined): number;
37
+ /** Whether a focus origin is a demonstrably-unreliable source (below full weight). */
38
+ export declare function isLowReliabilityOrigin(origin: string | null | undefined): boolean;
39
+ /** An item carrying (at least) the focus it is anchored to. */
40
+ export interface FocusAnchoredItem {
41
+ focusId: string | null;
42
+ }
43
+ /** An item enriched with its source-reliability weight. */
44
+ export type Weighted<T> = T & {
45
+ origin: string | null;
46
+ weight: number;
47
+ };
48
+ /**
49
+ * Attach a source-reliability weight to each item from its focus origin, and
50
+ * return them ordered by DESCENDING weight (full-weight sources first,
51
+ * low-reliability sources last). The sort is STABLE, so items of equal weight
52
+ * keep their input order (e.g. an age or priority order the caller already
53
+ * applied). No item is ever dropped -- a low-reliability filing sinks in the
54
+ * ordering, it does not disappear.
55
+ *
56
+ * `originByFocusId` maps a focusId to the origin of that focus; a focusId not in
57
+ * the map (or a null focusId) is treated as a normal full-weight source.
58
+ */
59
+ export declare function weightByFocusOrigin<T extends FocusAnchoredItem>(items: readonly T[], originByFocusId: ReadonlyMap<string, string | null>): Weighted<T>[];
60
+ //# sourceMappingURL=source-reliability.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"source-reliability.d.ts","sourceRoot":"","sources":["../../src/queries/source-reliability.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAEH,iGAAiG;AACjG,eAAO,MAAM,yBAAyB,iBAAiB,CAAC;AAExD,0EAA0E;AAC1E,eAAO,MAAM,uBAAuB,IAAI,CAAC;AAEzC;;;;GAIG;AACH,eAAO,MAAM,sBAAsB,OAAO,CAAC;AAE3C;;;;GAIG;AACH,wBAAgB,4BAA4B,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAAG,MAAM,CAOtF;AAED,sFAAsF;AACtF,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAAG,OAAO,CAEjF;AAED,+DAA+D;AAC/D,MAAM,WAAW,iBAAiB;IAChC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;CACxB;AAED,2DAA2D;AAC3D,MAAM,MAAM,QAAQ,CAAC,CAAC,IAAI,CAAC,GAAG;IAAE,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC;AAExE;;;;;;;;;;GAUG;AACH,wBAAgB,mBAAmB,CAAC,CAAC,SAAS,iBAAiB,EAC7D,KAAK,EAAE,SAAS,CAAC,EAAE,EACnB,eAAe,EAAE,WAAW,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC,GAClD,QAAQ,CAAC,CAAC,CAAC,EAAE,CAUf"}
@@ -0,0 +1,70 @@
1
+ /**
2
+ * Source reliability weighting for the machine-owned lane.
3
+ *
4
+ * Filings enter the agent_resolvable lane at full weight no matter what produced
5
+ * them -- including output from a producer with demonstrated misattribution. The
6
+ * dependency scanner mints "Security Remediation" focuses from npm audit output
7
+ * that misattributes findings on non-Node repositories; the filings on those
8
+ * focuses consume lane capacity AND corrupt the measurements used to judge
9
+ * whether the lane is healthy (part of the "never-attempted" rate is the system
10
+ * arguably correctly declining that junk).
11
+ *
12
+ * A filing's producing source is carried by its FOCUS origin
13
+ * (product_focuses.origin, stamped 'deps_scanner' at the scanner focus-mint
14
+ * path), because the scanner produces focuses, not filings. This module maps an
15
+ * origin to a reliability weight in [0, 1] and applies it to a lane so a
16
+ * low-reliability source sorts/weights BELOW a full-weight peer -- without ever
17
+ * dropping a filing (down-weighting lowers priority; it never silences).
18
+ *
19
+ * Pure and dependency-free so the map + ordering are exercised from fixtures.
20
+ */
21
+ /** Focus origin stamped by the dependency scanner's focus-mint path (the known-bad producer). */
22
+ export const FOCUS_ORIGIN_DEPS_SCANNER = 'deps_scanner';
23
+ /** Full reliability: the default for a normal (user/unstamped) source. */
24
+ export const FULL_RELIABILITY_WEIGHT = 1;
25
+ /**
26
+ * Reduced reliability for a source with demonstrated misattribution. Below full
27
+ * so its filings deprioritize, but strictly > 0 so they are never dropped -- an
28
+ * unreliable source still occasionally produces a real filing.
29
+ */
30
+ export const LOW_RELIABILITY_WEIGHT = 0.25;
31
+ /**
32
+ * Reliability weight for a focus origin. Known-unreliable producers map below
33
+ * full; a null/absent or unrecognized origin is a normal source at full weight
34
+ * (down-weighting is opt-IN per demonstrated unreliability, never the default).
35
+ */
36
+ export function focusOriginReliabilityWeight(origin) {
37
+ switch (origin) {
38
+ case FOCUS_ORIGIN_DEPS_SCANNER:
39
+ return LOW_RELIABILITY_WEIGHT;
40
+ default:
41
+ return FULL_RELIABILITY_WEIGHT;
42
+ }
43
+ }
44
+ /** Whether a focus origin is a demonstrably-unreliable source (below full weight). */
45
+ export function isLowReliabilityOrigin(origin) {
46
+ return focusOriginReliabilityWeight(origin) < FULL_RELIABILITY_WEIGHT;
47
+ }
48
+ /**
49
+ * Attach a source-reliability weight to each item from its focus origin, and
50
+ * return them ordered by DESCENDING weight (full-weight sources first,
51
+ * low-reliability sources last). The sort is STABLE, so items of equal weight
52
+ * keep their input order (e.g. an age or priority order the caller already
53
+ * applied). No item is ever dropped -- a low-reliability filing sinks in the
54
+ * ordering, it does not disappear.
55
+ *
56
+ * `originByFocusId` maps a focusId to the origin of that focus; a focusId not in
57
+ * the map (or a null focusId) is treated as a normal full-weight source.
58
+ */
59
+ export function weightByFocusOrigin(items, originByFocusId) {
60
+ const weighted = items.map((item) => {
61
+ const origin = item.focusId ? (originByFocusId.get(item.focusId) ?? null) : null;
62
+ return { ...item, origin, weight: focusOriginReliabilityWeight(origin) };
63
+ });
64
+ // Stable descending sort by weight: preserve input order within equal weights.
65
+ return weighted
66
+ .map((item, index) => ({ item, index }))
67
+ .sort((a, b) => b.item.weight - a.item.weight || a.index - b.index)
68
+ .map(({ item }) => item);
69
+ }
70
+ //# sourceMappingURL=source-reliability.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"source-reliability.js","sourceRoot":"","sources":["../../src/queries/source-reliability.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAEH,iGAAiG;AACjG,MAAM,CAAC,MAAM,yBAAyB,GAAG,cAAc,CAAC;AAExD,0EAA0E;AAC1E,MAAM,CAAC,MAAM,uBAAuB,GAAG,CAAC,CAAC;AAEzC;;;;GAIG;AACH,MAAM,CAAC,MAAM,sBAAsB,GAAG,IAAI,CAAC;AAE3C;;;;GAIG;AACH,MAAM,UAAU,4BAA4B,CAAC,MAAiC;IAC5E,QAAQ,MAAM,EAAE,CAAC;QACf,KAAK,yBAAyB;YAC5B,OAAO,sBAAsB,CAAC;QAChC;YACE,OAAO,uBAAuB,CAAC;IACnC,CAAC;AACH,CAAC;AAED,sFAAsF;AACtF,MAAM,UAAU,sBAAsB,CAAC,MAAiC;IACtE,OAAO,4BAA4B,CAAC,MAAM,CAAC,GAAG,uBAAuB,CAAC;AACxE,CAAC;AAUD;;;;;;;;;;GAUG;AACH,MAAM,UAAU,mBAAmB,CACjC,KAAmB,EACnB,eAAmD;IAEnD,MAAM,QAAQ,GAAkB,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE;QACjD,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,eAAe,CAAC,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;QACjF,OAAO,EAAE,GAAG,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,4BAA4B,CAAC,MAAM,CAAC,EAAE,CAAC;IAC3E,CAAC,CAAC,CAAC;IACH,+EAA+E;IAC/E,OAAO,QAAQ;SACZ,GAAG,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;SACvC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,IAAI,CAAC,MAAM,IAAI,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC;SAClE,GAAG,CAAC,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC;AAC7B,CAAC"}
@@ -71,21 +71,37 @@ export interface ReapDisarmedTeamsDeps {
71
71
  initiateCooperativeStop: (focusId: string, options: CooperativeStopOptions) => void;
72
72
  }
73
73
  /**
74
- * Stop running teams whose focus has been DISARMED via the dashboard Stop
75
- * (clearing assigned_agent_role_id). Clearing the role only removes the focus
76
- * from the spawn set; the in-flight team would otherwise run to natural
77
- * completion. This reaper brings the role-clear toggle to parity with the
78
- * cockpit Stop: stop means stop.
74
+ * Stop running teams whose focus has been STOPPED BY AN OPERATOR via the
75
+ * dashboard Stop. This reaper brings the operator Stop toggle to parity with
76
+ * the cockpit Stop: stop means stop.
77
+ *
78
+ * A null assigned_agent_role_id means one of TWO things, and they must be told
79
+ * apart -- exactly the distinction the spawn side already draws in
80
+ * decideNullRoleSpawn (spawn/review-role-fallback.ts):
81
+ * - OPERATOR STOP (operator_stopped_at set): the human pulled the Play toggle
82
+ * to halt the focus. This is what the reaper exists to enforce -> reap it.
83
+ * - LIFECYCLE CLEAR (operator_stopped_at null): auto_terminate_focus_team()
84
+ * nulled the role at completion so a review (a SECOND team) can spawn under
85
+ * the seeded reviewer fallback. Reaping here would tear down that review
86
+ * team ~26s after it spawned, before it can write its focus_reviews row --
87
+ * the exact bug this gate closes. LEAVE it running.
88
+ *
89
+ * The reaper is the half of the spawn/reap pair the operator-stop marker was
90
+ * never applied to; consulting operator_stopped_at here keeps the two sides
91
+ * consistent (a future reader should not have to discover that one half reads
92
+ * the marker and the other does not).
79
93
  *
80
94
  * getActiveFocuses returns ALL status='active' focuses REGARDLESS of role
81
95
  * (daemon-focus-handlers handleDaemonGetActiveFocuses), so:
82
- * - a team whose focus is PRESENT with a null role -> disarmed -> reap it;
96
+ * - PRESENT, null role, operator_stopped_at SET -> operator stop -> reap it;
97
+ * - PRESENT, null role, operator_stopped_at NULL -> lifecycle clear (review
98
+ * running or coding off-state) -> leave it;
83
99
  * - PRESENT with a non-null role -> still armed (idle/in-review/paused) -> leave it;
84
100
  * - ABSENT -> the focus is no longer status='active' (genuine deactivation),
85
101
  * owned by checkForDeactivatedFocuses (which runs earlier in the poll and
86
102
  * does a full teardown incl. worktree removal). The reaper deliberately
87
103
  * does NOT double-handle that case, and never removes the worktree -- a
88
- * disarmed focus keeps its worktree so a re-arm can resume.
104
+ * stopped focus keeps its worktree so a re-arm can resume.
89
105
  *
90
106
  * Re-arm within the grace window: the chosen rule is "complete the stop, then
91
107
  * allow a fresh spawn". The scheduled SIGTERM still fires (the team exits as a
@@ -1 +1 @@
1
- {"version":3,"file":"control-state.d.ts","sourceRoot":"","sources":["../../src/shell/control-state.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAGtE,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,6BAA6B,CAAC;AACtE,OAAO,EAAE,gBAAgB,EAAE,MAAM,+BAA+B,CAAC;AAUjE;;;;GAIG;AACH,eAAO,MAAM,yBAAyB,QAAQ,CAAC;AAE/C;;;;;GAKG;AACH,wBAAsB,wBAAwB,CAAC,MAAM,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC,CA+ClF;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,kBAAkB,GAAG,IAAI,CAgCnE;AAED;;GAEG;AACH,wBAAsB,cAAc,CAAC,MAAM,EAAE,kBAAkB,GAAG,OAAO,CAAC,IAAI,CAAC,CAgE9E;AAED;;;;;GAKG;AACH,wBAAgB,aAAa,CAAC,MAAM,EAAE,kBAAkB,GAAG,IAAI,CAK9D;AAID,2EAA2E;AAC3E,MAAM,WAAW,mBAAmB;IAClC,cAAc,EAAE,MAAM,GAAG,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC;IAClD,aAAa,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,cAAc,CAAC,EAAE,cAAc,CAAC,gBAAgB,CAAC,KAAK,OAAO,CAAC;CAChG;AAID,MAAM,WAAW,sBAAsB;IACrC,4FAA4F;IAC5F,cAAc,EAAE,cAAc,CAAC,gBAAgB,CAAC,CAAC;IACjD,+EAA+E;IAC/E,OAAO,EAAE,MAAM,CAAC;IAChB,uEAAuE;IACvE,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED;;;;;;;;;GASG;AACH,wBAAgB,uBAAuB,CACrC,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,sBAAsB,EAC/B,IAAI,GAAE,mBAAgD,GACrD,IAAI,CAmDN;AAYD,8DAA8D;AAC9D,MAAM,WAAW,qBAAqB;IACpC,cAAc,EAAE,MAAM,GAAG,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC;IAClD,gBAAgB,EAAE,OAAO,gBAAgB,CAAC;IAC1C,uBAAuB,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,sBAAsB,KAAK,IAAI,CAAC;CACrF;AAQD;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,wBAAsB,iBAAiB,CACrC,MAAM,EAAE,YAAY,EACpB,IAAI,GAAE,qBAAuC,GAC5C,OAAO,CAAC,IAAI,CAAC,CAqDf;AAED;;GAEG;AACH,wBAAgB,mBAAmB,IAAI,WAAW,CAAC,MAAM,CAAC,CAEzD;AAED;;GAEG;AACH,wBAAgB,qBAAqB,IAAI,IAAI,CAE5C;AAED;;GAEG;AACH,wBAAgB,uBAAuB,IAAI,IAAI,CAE9C"}
1
+ {"version":3,"file":"control-state.d.ts","sourceRoot":"","sources":["../../src/shell/control-state.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAGtE,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,6BAA6B,CAAC;AACtE,OAAO,EAAE,gBAAgB,EAAE,MAAM,+BAA+B,CAAC;AAUjE;;;;GAIG;AACH,eAAO,MAAM,yBAAyB,QAAQ,CAAC;AAE/C;;;;;GAKG;AACH,wBAAsB,wBAAwB,CAAC,MAAM,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC,CA+ClF;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,kBAAkB,GAAG,IAAI,CAgCnE;AAED;;GAEG;AACH,wBAAsB,cAAc,CAAC,MAAM,EAAE,kBAAkB,GAAG,OAAO,CAAC,IAAI,CAAC,CAgE9E;AAED;;;;;GAKG;AACH,wBAAgB,aAAa,CAAC,MAAM,EAAE,kBAAkB,GAAG,IAAI,CAK9D;AAID,2EAA2E;AAC3E,MAAM,WAAW,mBAAmB;IAClC,cAAc,EAAE,MAAM,GAAG,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC;IAClD,aAAa,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,cAAc,CAAC,EAAE,cAAc,CAAC,gBAAgB,CAAC,KAAK,OAAO,CAAC;CAChG;AAID,MAAM,WAAW,sBAAsB;IACrC,4FAA4F;IAC5F,cAAc,EAAE,cAAc,CAAC,gBAAgB,CAAC,CAAC;IACjD,+EAA+E;IAC/E,OAAO,EAAE,MAAM,CAAC;IAChB,uEAAuE;IACvE,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED;;;;;;;;;GASG;AACH,wBAAgB,uBAAuB,CACrC,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,sBAAsB,EAC/B,IAAI,GAAE,mBAAgD,GACrD,IAAI,CAmDN;AAYD,8DAA8D;AAC9D,MAAM,WAAW,qBAAqB;IACpC,cAAc,EAAE,MAAM,GAAG,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC;IAClD,gBAAgB,EAAE,OAAO,gBAAgB,CAAC;IAC1C,uBAAuB,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,sBAAsB,KAAK,IAAI,CAAC;CACrF;AAQD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAsCG;AACH,wBAAsB,iBAAiB,CACrC,MAAM,EAAE,YAAY,EACpB,IAAI,GAAE,qBAAuC,GAC5C,OAAO,CAAC,IAAI,CAAC,CA8Df;AAED;;GAEG;AACH,wBAAgB,mBAAmB,IAAI,WAAW,CAAC,MAAM,CAAC,CAEzD;AAED;;GAEG;AACH,wBAAgB,qBAAqB,IAAI,IAAI,CAE5C;AAED;;GAEG;AACH,wBAAgB,uBAAuB,IAAI,IAAI,CAE9C"}
@@ -241,21 +241,37 @@ const defaultReapDeps = {
241
241
  initiateCooperativeStop,
242
242
  };
243
243
  /**
244
- * Stop running teams whose focus has been DISARMED via the dashboard Stop
245
- * (clearing assigned_agent_role_id). Clearing the role only removes the focus
246
- * from the spawn set; the in-flight team would otherwise run to natural
247
- * completion. This reaper brings the role-clear toggle to parity with the
248
- * cockpit Stop: stop means stop.
244
+ * Stop running teams whose focus has been STOPPED BY AN OPERATOR via the
245
+ * dashboard Stop. This reaper brings the operator Stop toggle to parity with
246
+ * the cockpit Stop: stop means stop.
247
+ *
248
+ * A null assigned_agent_role_id means one of TWO things, and they must be told
249
+ * apart -- exactly the distinction the spawn side already draws in
250
+ * decideNullRoleSpawn (spawn/review-role-fallback.ts):
251
+ * - OPERATOR STOP (operator_stopped_at set): the human pulled the Play toggle
252
+ * to halt the focus. This is what the reaper exists to enforce -> reap it.
253
+ * - LIFECYCLE CLEAR (operator_stopped_at null): auto_terminate_focus_team()
254
+ * nulled the role at completion so a review (a SECOND team) can spawn under
255
+ * the seeded reviewer fallback. Reaping here would tear down that review
256
+ * team ~26s after it spawned, before it can write its focus_reviews row --
257
+ * the exact bug this gate closes. LEAVE it running.
258
+ *
259
+ * The reaper is the half of the spawn/reap pair the operator-stop marker was
260
+ * never applied to; consulting operator_stopped_at here keeps the two sides
261
+ * consistent (a future reader should not have to discover that one half reads
262
+ * the marker and the other does not).
249
263
  *
250
264
  * getActiveFocuses returns ALL status='active' focuses REGARDLESS of role
251
265
  * (daemon-focus-handlers handleDaemonGetActiveFocuses), so:
252
- * - a team whose focus is PRESENT with a null role -> disarmed -> reap it;
266
+ * - PRESENT, null role, operator_stopped_at SET -> operator stop -> reap it;
267
+ * - PRESENT, null role, operator_stopped_at NULL -> lifecycle clear (review
268
+ * running or coding off-state) -> leave it;
253
269
  * - PRESENT with a non-null role -> still armed (idle/in-review/paused) -> leave it;
254
270
  * - ABSENT -> the focus is no longer status='active' (genuine deactivation),
255
271
  * owned by checkForDeactivatedFocuses (which runs earlier in the poll and
256
272
  * does a full teardown incl. worktree removal). The reaper deliberately
257
273
  * does NOT double-handle that case, and never removes the worktree -- a
258
- * disarmed focus keeps its worktree so a re-arm can resume.
274
+ * stopped focus keeps its worktree so a re-arm can resume.
259
275
  *
260
276
  * Re-arm within the grace window: the chosen rule is "complete the stop, then
261
277
  * allow a fresh spawn". The scheduled SIGTERM still fires (the team exits as a
@@ -284,11 +300,19 @@ export async function reapDisarmedTeams(config, deps = defaultReapDeps) {
284
300
  log.warn(`[disarm-reaper] Cannot determine armed focuses (skipping reap): ${err.message}`);
285
301
  return;
286
302
  }
287
- // focusId -> armed? (status active AND role non-null). Only status='active'
288
- // focuses are returned, so a present focus with a non-null role is armed.
289
- const armed = new Map();
303
+ // focusId -> reap? Only status='active' focuses are returned. A focus is
304
+ // reaped ONLY when an operator stopped it (operator_stopped_at set). A
305
+ // non-null role is still armed (leave); a null role with no operator stop is
306
+ // a lifecycle clear -- a review may be running on it (leave). This mirrors
307
+ // decideNullRoleSpawn's operator-stop-vs-lifecycle-clear split on the spawn
308
+ // side. `present` records membership so an ABSENT focus (owned by
309
+ // checkForDeactivatedFocuses) is told apart from a present-but-not-reaped one.
310
+ const present = new Set();
311
+ const reap = new Map();
290
312
  for (const f of activeFocuses) {
291
- armed.set(f.focus_id, f.assigned_agent_role_id != null && f.status === 'active');
313
+ present.add(f.focus_id);
314
+ const armed = f.assigned_agent_role_id != null && f.status === 'active';
315
+ reap.set(f.focus_id, !armed && f.operator_stopped_at != null);
292
316
  }
293
317
  for (const [focusId, team] of activeTeams) {
294
318
  // Multi-product safety: only act on THIS product's teams (the global map
@@ -301,13 +325,14 @@ export async function reapDisarmedTeams(config, deps = defaultReapDeps) {
301
325
  if (pendingDisarmStops.has(focusId))
302
326
  continue;
303
327
  // Absent -> non-active focus -> owned by checkForDeactivatedFocuses.
304
- if (!armed.has(focusId))
328
+ if (!present.has(focusId))
305
329
  continue;
306
- // Still armed (idle-but-armed / in review / paused) -> not a disarm.
307
- if (armed.get(focusId))
330
+ // Present but not operator-stopped (still armed, or a lifecycle clear with a
331
+ // review possibly running) -> leave it running.
332
+ if (!reap.get(focusId))
308
333
  continue;
309
- log.info(`[disarm-reaper] Focus "${team.focusName}" disarmed (agent role cleared) -- ` +
310
- `cooperatively stopping the running team`);
334
+ log.info(`[disarm-reaper] Focus "${team.focusName}" stopped by operator (role cleared, ` +
335
+ `operator_stopped_at set) -- cooperatively stopping the running team`);
311
336
  pendingDisarmStops.add(focusId);
312
337
  deps.initiateCooperativeStop(focusId, {
313
338
  shutdownReason: 'user_stopped',
@@ -1 +1 @@
1
- {"version":3,"file":"control-state.js","sourceRoot":"","sources":["../../src/shell/control-state.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"control-state.js","sourceRoot":"","sources":["../../src/shell/control-state.ts"],"names":[],"mappings":"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"}
@@ -29,7 +29,7 @@ export declare const TELORA_CLAUDE_MD_END = "<!-- END TELORA SEED -->";
29
29
  * For Codex: the MCP server is registered in `~/.codex/config.toml` (global).
30
30
  */
31
31
  export declare const SEED_MCP_REGISTRATION_SENTENCE = "The Telora MCP server is registered in `.mcp.json`.";
32
- export declare const SEED_BODY = "# Telora workstation context\n\nThis repo is connected to Telora -- a differential control plane for\nsoftware delivery. Intent and reality are paired signals; the meaningful\nwork happens at the difference.\n\n## Before you write any code (read this first)\n\nDEFAULT: on a Telora-connected workstation, a new capability starts as\n**declared intent** before any code. When the user says \"I want to build\nX\", your first move is NOT to scaffold X -- it is to declare it: create\n(or select) a Focus -> delivery -> issue and move an issue to **In\nProgress**. Code is written only after intent is anchored above it.\n\nThis polarity is deliberate and easy to get backwards. Building directly\nin the working tree -- scaffolding, installing dependencies, starting a\ndev server, writing application files -- is the **exception**, taken ONLY\nwhen the user explicitly asks for it. Recognized bypass phrases:\n\"build locally\", \"just write it\", \"skip Telora\", \"don't track this\",\n\"throwaway\". Absent an explicit signal like these, treat any build\nrequest as a request to declare intent in Telora first.\n\nAsking good clarifying questions about stack, scope, or dependencies is\nNOT a substitute for this step -- that is execution-layer scoping, and it\ncomes *after* the capability is declared, not instead of it. Scoping is\nagent work; declaring that a capability matters is the part that must\nland in Telora first.\n\n**Surface the fork; do not silently pick it.** The common failure is\nresolving an ambiguous request toward the path of least resistance --\ne.g. reading \"a web app I run locally on my LAN\" (a deployment target) as\n\"build locally\" (skip Telora). When intent is not already explicit, your\nFIRST response to a build request names the choice rather than assuming\nit: \"I'll scope this in Telora unless you want it built locally -- which?\"\nOne question, once, at the start. Let the user pick; never pick for them\nby starting to type code.\n\n**First action rule.** On a build / new-capability request, your first\ntool call is a Telora planning call (telora_product_focus / _delivery /\n_issue) OR the fork question above -- never Write, Edit, or a code-running\nBash command. If the first move cannot be code, building-before-intent\ncannot happen.\n\nWhy: an artifact with no declared intent above it is reality moving with\nnothing to measure it against -- pure noise to the differential loop. The\nwhole system is built to compute intent-minus-reality; code that skips\nthe intent half defeats the instrument.\n\n## Execution polarity (which path executes this?)\n\nOnce intent is declared, a second polarity governs HOW it executes -- and it\nhas the same default-and-exception shape as the intent polarity above. A\ndeclared focus is handed to the **daemon team + review loop** by default.\nTeam execution IS THE DEFAULT; building it inline yourself in this interactive\nsession is the **explicit, named bypass**, taken ONLY when the user says so.\n\nThree execution forks recur. On each, the left side is the default and the\nright side is the effortful, must-be-named bypass:\n\n- **Daemon team + review vs. inline coding.** Default: hand the focus to the\n daemon team, which executes and runs it through the review gate. Bypass:\n build it inline in this session -- only on an explicit signal.\n- **Tree-anchored delivery vs. unanchored delivery.** Default: anchor each\n delivery to a reality-tree injection. Bypass: an unanchored delivery\n (`allowUnanchored`) -- a deliberate, reason-bearing act, not a silent flag.\n- **Review-gated Done vs. self-marked Done.** Default: work is confirmed Done\n by the review gate. Bypass: marking your own work Done without review.\n\nThe recognized signal that switches execution to inline is an explicit\n\"build it now\" (and the same throwaway phrases that bypass the intent step:\n\"build locally\", \"just write it\", \"skip Telora\", \"don't track this\",\n\"throwaway\"). Absent such a signal, hand off to the team -- do not fill the\nchoice with the lowest-resistance path (typing code yourself).\n\n**Surface the fork; do not silently pick it.** When the execution path is not\nalready explicit, your response NAMES the choice rather than assuming it:\n\"I'll hand this to the daemon team + review unless you want it built inline\nnow -- which?\" One question, once. Let the user pick; never default to inline\nby starting to type code.\n\n**Routing is not activation.** \"Hand off to the daemon team\" answers WHICH\npath executes -- it is NOT a signal to arm the focus now. Arming (setting the\nfocus's `assignedAgentRoleId`, which spends real budget spawning a team) is a\nseparate, human-owned go-signal. Scoping ends at a named **scoped, un-armed**\nstate: you decompose the focus into deliveries and issues and then STOP. Do\nNOT arm a focus at the tail of scoping -- a human arms it (or has durably\ndelegated that go-signal). Choosing team-over-inline routing the moment\nscoping ends is NOT the same as deciding it is time to spend; keep the two\ndecisions separate. Activation is a third decision, owned by the human\nalongside intent and completion (see Human-vs-agent boundaries below).\n\n## Planning hierarchy\n\n- **Focus** = the context that defines an area of work -- not \"one\n capability.\" All phases of building within that area belong in one\n focus; if a \"focus\" is really just one phase, fold it back in.\n- **Delivery** = a shippable phase or major component of a capability.\n- **Context Group** = optional grouping of related issues that share\n meaningful context (relevant files, architectural notes). A CG earns its\n existence by carrying context, not by being a folder.\n- **Task** = one discrete implementable unit. Bounded files, focused\n session. Multiple \"and\" clauses across different concerns means split.\n\nScope by purpose, not count. The right number of deliveries is however\nmany phases the work naturally has.\n\n## PRD: \"build a working app in one run\"\n\nA **PRD** sits one altitude above Focus (Product -> PRD -> Focus): a\nbounded, verifiable, retire-able milestone carrying a **Prerequisite Tree**\nof `goal` / `obstacle` / `overcome` nodes. Each `overcome` materializes\nas a focus; the daemon progressively arms the **frontier** of foci as\nupstream obstacles clear. This is the entry point a user means by \"build a\nfully working app in one go.\"\n\nIt is NOT big-bang generation: you author the tree once, commit a path,\nand the differential loop walks the frontier to completion -- the execution\nunderneath is still the normal focus -> delivery -> issue + review loop.\n\nThe PRD tools are **lazy-loaded** -- they do not exist until you load the\ndomain. If you don't see `telora_prd` / `telora_prd_tree`, run:\n\n```\ntelora_discover { action: \"load\", domain: \"prd\" }\n```\n\nThen: `telora_prd` create (referencing a Vision) -> `telora_prd_tree`\nauthor nodes (an obstacle's `clearancePredicate` is OPTIONAL and advisory --\nthe frontier advances as upstream obstacles clear via focus-completion, i.e.\neach overcome's focus finishing its deliveries' verify gates, not via a\nper-obstacle predicate) + edges -> commit a pathway -> `materialize_overcome`\neach into a focus. Authoring STOPS there, at **scoped, un-armed** -- arming\nthe daemon PRD loop is a human go-signal (the activation decision above),\nnot the tail of authoring, unless that go-signal is durably delegated. All\nauthoring is harness+MCP; there is no Telora authoring UI.\n\n## Issue workflow\n\n`To Do` -> `In Progress` -> `In Review` / `Blocked` -> `Done`.\n\nIssue types: **Context Group**, **Task**, **Bug**.\n\nMovement rules:\n\n- An issue MUST be set to `In Progress` before any work begins on it.\n- Never skip `In Progress`. Never move directly from `To Do` to `Done`.\n- Set status with `telora_product_issue` action=update.\n\nDelivery and focus stages advance automatically based on issue\nactivity. Agents never set delivery executionStatus directly.\n\n## Commit attribution (MANDATORY: one trailer per commit)\n\nEvery delivery on a focus shares ONE branch, so their commits interleave.\nThe only way the verify gate can judge a delivery against ITS OWN work is a\nper-commit marker. On EVERY commit you make for a delivery, add a git trailer\nnaming the delivery the work belongs to:\n\n```\nTelora-Delivery: <deliveryId>\n```\n\nStamp it with git's own trailer machinery so an appended `Co-Authored-By`\ncannot void it:\n\n```\ngit commit --trailer \"Telora-Delivery: <deliveryId>\" -m \"<subject>\"\n```\n\nDo NOT pass it as its own `-m` paragraph (`-m \"Telora-Delivery: ...\"`): git\nparses only the last paragraph as trailers, so an appended `Co-Authored-By`\nsilently voids it. A `commit-msg` git hook in this worktree ENFORCES this --\na commit whose message lacks a well-formed `Telora-Delivery: <uuid>` trailer\nis REFUSED, with the exact line to add printed. Fix it and re-commit; do not\nescalate.\n\nA commit that genuinely belongs to NO delivery declares that explicitly: merge\ncommits are exempt by shape (git sets `MERGE_HEAD`), and any other\ndelivery-less housekeeping commit carries the non-delivery sentinel:\n\n```\ngit commit --trailer \"Telora-Delivery: none\" -m \"<subject>\"\n```\n\nNever borrow a real delivery id for a commit that is not that delivery's work.\nThat is false attribution -- it folds a commit that is not its own into the\nborrowed delivery's verify evidence. The sentinel is the sanctioned escape.\n\n## MCP tool surface (what's available in this session)\n\nThe Telora MCP server is registered in `.mcp.json`. Core tool families:\n\n- `telora_product` -- list/get/create/update products\n- `telora_product_focus` -- focuses under a product\n- `telora_product_delivery` -- deliveries under a focus\n- `telora_product_issue` -- issues (Context Groups, Tasks, Bugs) under a delivery\n- `telora_agent` -- agent roles, escalation requests\n- `telora_loop_*` -- loop documents, questions, answers\n- `telora_discover` -- on-demand registration of deferred tool domains\n\nResolve the live tool list at runtime via `telora_discover` rather than\nhard-coding a list that drifts.\n\n## Human-vs-agent boundaries\n\n- Humans own **intent**, **activation**, and **completion**.\n - Intent: what capability matters, what changes when. Pre-handoff.\n - Activation (arming): the go/no-go spend decision -- setting the focus's\n `assignedAgentRoleId` to hand it to the daemon team. Scoping ends\n **scoped, un-armed**; arming is a human go-signal unless durably\n delegated. Sits between intent and completion.\n - Completion: closing the loop on whether a focus is done. Post-handoff.\n- Agents own **scoping** and **execution**.\n - Scoping: decomposing a focus into deliveries, deliveries into\n issues, restructuring mid-flight as the agent learns more. Scoping\n ENDS at **scoped, un-armed** -- it never arms the focus.\n - Execution: writing code, running tests, committing, reporting.\n\nDo not ask humans for operational details they expect the agent to figure\nout. Do not silently complete a focus on the human's behalf. Escalate\nwhen stuck via `telora_agent` action=escalate.\n\nWhen communicating with a human, refer to focuses, deliveries, and issues\nby their **title**, never their UUID. UUIDs are for tool calls only and must\nnot be surfaced in chat. MCP tool results carry both, so this is a\ncommunication choice, not a data-availability problem: keep the id in the\ntool call, name the work by its title in the conversation.\n\n## Differential signaling\n\nTelora is asymmetric: it moves reality toward intent, never the reverse.\nAgents do not lower the bar to make signals look better -- they escalate.\nEvery artifact (commit, work summary, gate result) is signal toward the\ndeclared intent; raw activity without intent reduction is noise.\n\nA short corrective comment from the user is high-signal -- treat brief\npushback as the most important input in the session.\n\n## Workflows and policies\n\n- **Workflow**: stage directives shape agent behavior at discrete\n transitions. What context the agent sees (assembly recipes), what tools\n it can use, how it thinks (prompt + model). Live in Telora's\n `workflow_stages.agent_directive` JSONB.\n- **Policy** (organizational, deferred): cross-cutting constraints that\n feed into stage directives.\n\nWhen you cross a stage transition, the daemon may inject context or spawn\na fresh sub-agent per the directive. Don't override that flow without a\nclear reason.\n";
32
+ export declare const SEED_BODY = "# Telora workstation context\n\nThis repo is connected to Telora -- a differential control plane for\nsoftware delivery. Intent and reality are paired signals; the meaningful\nwork happens at the difference.\n\n## Before you write any code (read this first)\n\nDEFAULT: on a Telora-connected workstation, a new capability starts as\n**declared intent** before any code. When the user says \"I want to build\nX\", your first move is NOT to scaffold X -- it is to declare it: create\n(or select) a Focus -> delivery -> issue and move an issue to **In\nProgress**. Code is written only after intent is anchored above it.\n\nThis polarity is deliberate and easy to get backwards. Building directly\nin the working tree -- scaffolding, installing dependencies, starting a\ndev server, writing application files -- is the **exception**, taken ONLY\nwhen the user explicitly asks for it. Recognized bypass phrases:\n\"build locally\", \"just write it\", \"skip Telora\", \"don't track this\",\n\"throwaway\". Absent an explicit signal like these, treat any build\nrequest as a request to declare intent in Telora first.\n\nAsking good clarifying questions about stack, scope, or dependencies is\nNOT a substitute for this step -- that is execution-layer scoping, and it\ncomes *after* the capability is declared, not instead of it. Scoping is\nagent work; declaring that a capability matters is the part that must\nland in Telora first.\n\n**Surface the fork; do not silently pick it.** The common failure is\nresolving an ambiguous request toward the path of least resistance --\ne.g. reading \"a web app I run locally on my LAN\" (a deployment target) as\n\"build locally\" (skip Telora). When intent is not already explicit, your\nFIRST response to a build request names the choice rather than assuming\nit: \"I'll scope this in Telora unless you want it built locally -- which?\"\nOne question, once, at the start. Let the user pick; never pick for them\nby starting to type code.\n\n**First action rule.** On a build / new-capability request, your first\ntool call is a Telora planning call (telora_product_focus / _delivery /\n_issue) OR the fork question above -- never Write, Edit, or a code-running\nBash command. If the first move cannot be code, building-before-intent\ncannot happen.\n\nWhy: an artifact with no declared intent above it is reality moving with\nnothing to measure it against -- pure noise to the differential loop. The\nwhole system is built to compute intent-minus-reality; code that skips\nthe intent half defeats the instrument.\n\n## Execution polarity (which path executes this?)\n\nOnce intent is declared, a second polarity governs HOW it executes -- and it\nhas the same default-and-exception shape as the intent polarity above. A\ndeclared focus is handed to the **daemon team + review loop** by default.\nTeam execution IS THE DEFAULT; building it inline yourself in this interactive\nsession is the **explicit, named bypass**, taken ONLY when the user says so.\n\nThree execution forks recur. On each, the left side is the default and the\nright side is the effortful, must-be-named bypass:\n\n- **Daemon team + review vs. inline coding.** Default: hand the focus to the\n daemon team, which executes and runs it through the review gate. Bypass:\n build it inline in this session -- only on an explicit signal.\n- **Tree-anchored delivery vs. unanchored delivery.** Default: anchor each\n delivery to a reality-tree injection. Bypass: an unanchored delivery\n (`allowUnanchored`) -- a deliberate, reason-bearing act, not a silent flag.\n- **Review-gated Done vs. self-marked Done.** Default: work is confirmed Done\n by the review gate. Bypass: marking your own work Done without review.\n\nThe recognized signal that switches execution to inline is an explicit\n\"build it now\" (and the same throwaway phrases that bypass the intent step:\n\"build locally\", \"just write it\", \"skip Telora\", \"don't track this\",\n\"throwaway\"). Absent such a signal, hand off to the team -- do not fill the\nchoice with the lowest-resistance path (typing code yourself).\n\n**Surface the fork; do not silently pick it.** When the execution path is not\nalready explicit, your response NAMES the choice rather than assuming it:\n\"I'll hand this to the daemon team + review unless you want it built inline\nnow -- which?\" One question, once. Let the user pick; never default to inline\nby starting to type code.\n\n**Routing is not activation.** \"Hand off to the daemon team\" answers WHICH\npath executes -- it is NOT a signal to arm the focus now. Arming (setting the\nfocus's `assignedAgentRoleId`, which spends real budget spawning a team) is a\nseparate, human-owned go-signal. Scoping ends at a named **scoped, un-armed**\nstate: you decompose the focus into deliveries and issues and then STOP. Do\nNOT arm a focus at the tail of scoping -- a human arms it (or has durably\ndelegated that go-signal). Choosing team-over-inline routing the moment\nscoping ends is NOT the same as deciding it is time to spend; keep the two\ndecisions separate. Activation is a third decision, owned by the human\nalongside intent and completion (see Human-vs-agent boundaries below).\n\n## Planning hierarchy\n\n- **Focus** = the context that defines an area of work -- not \"one\n capability.\" All phases of building within that area belong in one\n focus; if a \"focus\" is really just one phase, fold it back in.\n- **Delivery** = a shippable phase or major component of a capability.\n- **Context Group** = optional grouping of related issues that share\n meaningful context (relevant files, architectural notes). A CG earns its\n existence by carrying context, not by being a folder.\n- **Task** = one discrete implementable unit. Bounded files, focused\n session. Multiple \"and\" clauses across different concerns means split.\n\nScope by purpose, not count. The right number of deliveries is however\nmany phases the work naturally has.\n\n**Scoping reads open intent.** When you place a new unit of work, the first\nquestion -- \"does this belong in a focus that already exists?\" -- is asked\nagainst the OPEN set only: the active and proposed foci. A completed or\ncancelled focus is settled intent. It can no longer absorb new work, and\nconsulting one only re-litigates a decision already closed -- so a terminal\nfocus is neither a placement candidate nor a precedent to reason from. When\nno open focus fits, the answer is a new focus, never a closed one reopened\nin spirit.\n\n## PRD: \"build a working app in one run\"\n\nA **PRD** sits one altitude above Focus (Product -> PRD -> Focus): a\nbounded, verifiable, retire-able milestone carrying a **Prerequisite Tree**\nof `goal` / `obstacle` / `overcome` nodes. Each `overcome` materializes\nas a focus; the daemon progressively arms the **frontier** of foci as\nupstream obstacles clear. This is the entry point a user means by \"build a\nfully working app in one go.\"\n\nIt is NOT big-bang generation: you author the tree once, commit a path,\nand the differential loop walks the frontier to completion -- the execution\nunderneath is still the normal focus -> delivery -> issue + review loop.\n\nThe PRD tools are **lazy-loaded** -- they do not exist until you load the\ndomain. If you don't see `telora_prd` / `telora_prd_tree`, run:\n\n```\ntelora_discover { action: \"load\", domain: \"prd\" }\n```\n\nThen: `telora_prd` create (referencing a Vision) -> `telora_prd_tree`\nauthor nodes (an obstacle's `clearancePredicate` is OPTIONAL and advisory --\nthe frontier advances as upstream obstacles clear via focus-completion, i.e.\neach overcome's focus finishing its deliveries' verify gates, not via a\nper-obstacle predicate) + edges -> commit a pathway -> `materialize_overcome`\neach into a focus. Authoring STOPS there, at **scoped, un-armed** -- arming\nthe daemon PRD loop is a human go-signal (the activation decision above),\nnot the tail of authoring, unless that go-signal is durably delegated. All\nauthoring is harness+MCP; there is no Telora authoring UI.\n\n## Issue workflow\n\n`To Do` -> `In Progress` -> `In Review` / `Blocked` -> `Done`.\n\nIssue types: **Context Group**, **Task**, **Bug**.\n\nMovement rules:\n\n- An issue MUST be set to `In Progress` before any work begins on it.\n- Never skip `In Progress`. Never move directly from `To Do` to `Done`.\n- Set status with `telora_product_issue` action=update.\n\nDelivery and focus stages advance automatically based on issue\nactivity. Agents never set delivery executionStatus directly.\n\n## Commit attribution (MANDATORY: one trailer per commit)\n\nEvery delivery on a focus shares ONE branch, so their commits interleave.\nThe only way the verify gate can judge a delivery against ITS OWN work is a\nper-commit marker. On EVERY commit you make for a delivery, add a git trailer\nnaming the delivery the work belongs to:\n\n```\nTelora-Delivery: <deliveryId>\n```\n\nStamp it with git's own trailer machinery so an appended `Co-Authored-By`\ncannot void it:\n\n```\ngit commit --trailer \"Telora-Delivery: <deliveryId>\" -m \"<subject>\"\n```\n\nDo NOT pass it as its own `-m` paragraph (`-m \"Telora-Delivery: ...\"`): git\nparses only the last paragraph as trailers, so an appended `Co-Authored-By`\nsilently voids it. A `commit-msg` git hook in this worktree ENFORCES this --\na commit whose message lacks a well-formed `Telora-Delivery: <uuid>` trailer\nis REFUSED, with the exact line to add printed. Fix it and re-commit; do not\nescalate.\n\nA commit that genuinely belongs to NO delivery declares that explicitly: merge\ncommits are exempt by shape (git sets `MERGE_HEAD`), and any other\ndelivery-less housekeeping commit carries the non-delivery sentinel:\n\n```\ngit commit --trailer \"Telora-Delivery: none\" -m \"<subject>\"\n```\n\nNever borrow a real delivery id for a commit that is not that delivery's work.\nThat is false attribution -- it folds a commit that is not its own into the\nborrowed delivery's verify evidence. The sentinel is the sanctioned escape.\n\n## MCP tool surface (what's available in this session)\n\nThe Telora MCP server is registered in `.mcp.json`. Core tool families:\n\n- `telora_product` -- list/get/create/update products\n- `telora_product_focus` -- focuses under a product\n- `telora_product_delivery` -- deliveries under a focus\n- `telora_product_issue` -- issues (Context Groups, Tasks, Bugs) under a delivery\n- `telora_agent` -- agent roles, escalation requests\n- `telora_loop_*` -- loop documents, questions, answers\n- `telora_discover` -- on-demand registration of deferred tool domains\n\nResolve the live tool list at runtime via `telora_discover` rather than\nhard-coding a list that drifts.\n\n## Human-vs-agent boundaries\n\n- Humans own **intent**, **activation**, and **completion**.\n - Intent: what capability matters, what changes when. Pre-handoff.\n - Activation (arming): the go/no-go spend decision -- setting the focus's\n `assignedAgentRoleId` to hand it to the daemon team. Scoping ends\n **scoped, un-armed**; arming is a human go-signal unless durably\n delegated. Sits between intent and completion.\n - Completion: closing the loop on whether a focus is done. Post-handoff.\n- Agents own **scoping** and **execution**.\n - Scoping: decomposing a focus into deliveries, deliveries into\n issues, restructuring mid-flight as the agent learns more. Scoping\n ENDS at **scoped, un-armed** -- it never arms the focus.\n - Execution: writing code, running tests, committing, reporting.\n\nDo not ask humans for operational details they expect the agent to figure\nout. Do not silently complete a focus on the human's behalf. Escalate\nwhen stuck via `telora_agent` action=escalate.\n\nWhen communicating with a human, refer to focuses, deliveries, and issues\nby their **title**, never their UUID. UUIDs are for tool calls only and must\nnot be surfaced in chat. MCP tool results carry both, so this is a\ncommunication choice, not a data-availability problem: keep the id in the\ntool call, name the work by its title in the conversation.\n\n## Differential signaling\n\nTelora is asymmetric: it moves reality toward intent, never the reverse.\nAgents do not lower the bar to make signals look better -- they escalate.\nEvery artifact (commit, work summary, gate result) is signal toward the\ndeclared intent; raw activity without intent reduction is noise.\n\nA short corrective comment from the user is high-signal -- treat brief\npushback as the most important input in the session.\n\n## Workflows and policies\n\n- **Workflow**: stage directives shape agent behavior at discrete\n transitions. What context the agent sees (assembly recipes), what tools\n it can use, how it thinks (prompt + model). Live in Telora's\n `workflow_stages.agent_directive` JSONB.\n- **Policy** (organizational, deferred): cross-cutting constraints that\n feed into stage directives.\n\nWhen you cross a stage transition, the daemon may inject context or spawn\na fresh sub-agent per the directive. Don't override that flow without a\nclear reason.\n";
33
33
  /**
34
34
  * Render a fresh-repo CLAUDE.md.
35
35
  *
@@ -1 +1 @@
1
- {"version":3,"file":"claude-md.d.ts","sourceRoot":"","sources":["../../src/templates/claude-md.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,eAAO,MAAM,sBAAsB,+BAA+B,CAAC;AACnE,eAAO,MAAM,oBAAoB,6BAA6B,CAAC;AAE/D;;;;;;GAMG;AACH;;;;;;;GAOG;AACH,eAAO,MAAM,8BAA8B,wDACY,CAAC;AAExD,eAAO,MAAM,SAAS,oxYA0PrB,CAAC;AAEF;;;;;;GAMG;AACH,wBAAgB,cAAc,CAAC,WAAW,EAAE,MAAM,GAAG,IAAI,GAAG,MAAM,CASjE"}
1
+ {"version":3,"file":"claude-md.d.ts","sourceRoot":"","sources":["../../src/templates/claude-md.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,eAAO,MAAM,sBAAsB,+BAA+B,CAAC;AACnE,eAAO,MAAM,oBAAoB,6BAA6B,CAAC;AAE/D;;;;;;GAMG;AACH;;;;;;;GAOG;AACH,eAAO,MAAM,8BAA8B,wDACY,CAAC;AAExD,eAAO,MAAM,SAAS,szZAmQrB,CAAC;AAEF;;;;;;GAMG;AACH,wBAAgB,cAAc,CAAC,WAAW,EAAE,MAAM,GAAG,IAAI,GAAG,MAAM,CASjE"}
@@ -135,6 +135,15 @@ alongside intent and completion (see Human-vs-agent boundaries below).
135
135
  Scope by purpose, not count. The right number of deliveries is however
136
136
  many phases the work naturally has.
137
137
 
138
+ **Scoping reads open intent.** When you place a new unit of work, the first
139
+ question -- "does this belong in a focus that already exists?" -- is asked
140
+ against the OPEN set only: the active and proposed foci. A completed or
141
+ cancelled focus is settled intent. It can no longer absorb new work, and
142
+ consulting one only re-litigates a decision already closed -- so a terminal
143
+ focus is neither a placement candidate nor a precedent to reason from. When
144
+ no open focus fits, the answer is a new focus, never a closed one reopened
145
+ in spirit.
146
+
138
147
  ## PRD: "build a working app in one run"
139
148
 
140
149
  A **PRD** sits one altitude above Focus (Product -> PRD -> Focus): a
@@ -1 +1 @@
1
- {"version":3,"file":"claude-md.js","sourceRoot":"","sources":["../../src/templates/claude-md.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,MAAM,CAAC,MAAM,sBAAsB,GAAG,4BAA4B,CAAC;AACnE,MAAM,CAAC,MAAM,oBAAoB,GAAG,0BAA0B,CAAC;AAE/D;;;;;;GAMG;AACH;;;;;;;GAOG;AACH,MAAM,CAAC,MAAM,8BAA8B,GACzC,qDAAqD,CAAC;AAExD,MAAM,CAAC,MAAM,SAAS,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA0PxB,CAAC;AAEF;;;;;;GAMG;AACH,MAAM,UAAU,cAAc,CAAC,WAA0B;IACvD,MAAM,WAAW,GAAG,WAAW;QAC7B,CAAC,CAAC,kCAAkC,WAAW,SAAS;QACxD,CAAC,CAAC,EAAE,CAAC;IACP,MAAM,KAAK,GACT,GAAG,sBAAsB,IAAI;QAC7B,GAAG,WAAW,GAAG,SAAS,EAAE;QAC5B,GAAG,oBAAoB,IAAI,CAAC;IAC9B,OAAO,KAAK,CAAC;AACf,CAAC"}
1
+ {"version":3,"file":"claude-md.js","sourceRoot":"","sources":["../../src/templates/claude-md.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,MAAM,CAAC,MAAM,sBAAsB,GAAG,4BAA4B,CAAC;AACnE,MAAM,CAAC,MAAM,oBAAoB,GAAG,0BAA0B,CAAC;AAE/D;;;;;;GAMG;AACH;;;;;;;GAOG;AACH,MAAM,CAAC,MAAM,8BAA8B,GACzC,qDAAqD,CAAC;AAExD,MAAM,CAAC,MAAM,SAAS,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAmQxB,CAAC;AAEF;;;;;;GAMG;AACH,MAAM,UAAU,cAAc,CAAC,WAA0B;IACvD,MAAM,WAAW,GAAG,WAAW;QAC7B,CAAC,CAAC,kCAAkC,WAAW,SAAS;QACxD,CAAC,CAAC,EAAE,CAAC;IACP,MAAM,KAAK,GACT,GAAG,sBAAsB,IAAI;QAC7B,GAAG,WAAW,GAAG,SAAS,EAAE;QAC5B,GAAG,oBAAoB,IAAI,CAAC;IAC9B,OAAO,KAAK,CAAC;AACf,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@telora/daemon",
3
- "version": "0.21.169",
3
+ "version": "0.21.178",
4
4
  "description": "Agent orchestration daemon for Telora - spawns and manages Claude Code instances",
5
5
  "type": "module",
6
6
  "bin": {
@@ -37,8 +37,8 @@
37
37
  },
38
38
  "//testRunner": "Uses Node.js built-in test runner (node:test) via tsx for TypeScript support. The root package uses Vitest; this is a deliberate choice for the daemon package to avoid framework dependencies. Test files live beside the modules they exercise (owner-directory layout); the runner discovers them recursively.",
39
39
  "dependencies": {
40
- "@telora/daemon-core": "^0.2.82",
41
- "@telora/mcp-products": "^0.22.123",
40
+ "@telora/daemon-core": "^0.2.83",
41
+ "@telora/mcp-products": "^0.22.126",
42
42
  "commander": "^14.0.3",
43
43
  "yaml": "^2.4.0",
44
44
  "zod": "^4.3.6"