instar 1.3.990 → 1.3.992

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.
@@ -0,0 +1,134 @@
1
+ /**
2
+ * RecurrenceReader — one reader across the stores that already notice things.
3
+ *
4
+ * THE DEFECT THIS ADDRESSES (project convergence-towards-coherence, Tier 2).
5
+ * Instar notices constantly and in three separate places: the attention queue,
6
+ * the evolution action queue, and the sentinel event log. Nothing reads across
7
+ * them, so the same underlying problem is noticed dozens of times and closed
8
+ * zero times. The measured filing-to-completion ratio is roughly 30:1.
9
+ *
10
+ * Measured on this machine, 2026-07-27 — the number that makes the case:
11
+ *
12
+ * 371 OPEN attention items → 49 distinct problems
13
+ * the single largest cluster ("credential rebalancer") is 177 items — 48%
14
+ *
15
+ * Reading that queue item-by-item, nobody would ever see it. The items are all
16
+ * individually true and individually minor; the SHAPE is the finding, and the
17
+ * shape is invisible without a reader that groups.
18
+ *
19
+ * WHAT THIS IS NOT. It is not a new notification channel, and it must never
20
+ * become one (operator directive 2026-07-26 20:08Z: synthesis must lead to
21
+ * ACTION through the paths that already exist — a phase advance, a blocker
22
+ * raised, work queued — with the loop closed and without depending on the user).
23
+ * This module is READ-ONLY and returns a report; driving action from it is a
24
+ * separate, gated concern.
25
+ *
26
+ * THE HONEST-DENOMINATOR RULE APPLIES TO THIS READER TOO. Every store it could
27
+ * not read is named in `coverage`, and a report with any unreadable store is
28
+ * NEVER `complete`. "I found no recurrence" and "I could not look" are different
29
+ * answers, and conflating them is the exact failure this project exists to
30
+ * remove — a synthesiser that silently synthesised over two of three stores
31
+ * would be the most expensive instance of it yet.
32
+ */
33
+ /** A single observation from any of the noticing stores. */
34
+ export interface Observation {
35
+ /** Which store this came from. */
36
+ store: 'attention' | 'actions' | 'sentinel';
37
+ /** Stable id within that store, when it has one. */
38
+ id?: string;
39
+ /** Human title / summary — the recurrence key is derived from this. */
40
+ title: string;
41
+ /** Emitting subsystem, when known. `undefined` is itself a finding (see below). */
42
+ source?: string;
43
+ /** ISO timestamp, when known. */
44
+ at?: string;
45
+ /** Open / unresolved. Only open observations form recurrence clusters. */
46
+ open: boolean;
47
+ }
48
+ /** One recurring problem, as distinct from the many times it was noticed. */
49
+ export interface RecurrenceCluster {
50
+ /** Normalized key the members share. */
51
+ key: string;
52
+ /** A readable exemplar (the first member's title, untruncated). */
53
+ exemplar: string;
54
+ /** How many times this was noticed. THE point of the whole module. */
55
+ count: number;
56
+ /** Which stores noticed it — a problem seen in more than one is stronger evidence. */
57
+ stores: Observation['store'][];
58
+ /** Sources that emitted it, when known. */
59
+ sources: string[];
60
+ /** Earliest / latest observation timestamps available. */
61
+ firstSeen?: string;
62
+ lastSeen?: string;
63
+ /**
64
+ * True when at least one member came from the ACTION queue — i.e. somebody has
65
+ * at some point committed to doing something about this. A high-count cluster
66
+ * with `tracked: false` is the sharpest signal available: noticed many times,
67
+ * never once turned into work.
68
+ */
69
+ tracked: boolean;
70
+ }
71
+ /** What the reader could and could not see. Never omitted, never inferred. */
72
+ export interface Coverage {
73
+ /** Stores read successfully. */
74
+ read: Observation['store'][];
75
+ /** Stores that could NOT be read, with the reason. */
76
+ unreadable: {
77
+ store: Observation['store'];
78
+ reason: string;
79
+ }[];
80
+ /**
81
+ * `complete` only when every store was read. Any unreadable store makes this
82
+ * `partial`, and a partial report may never be presented as a clean bill.
83
+ */
84
+ completeness: 'complete' | 'partial';
85
+ }
86
+ export interface RecurrenceReport {
87
+ generatedAt: string;
88
+ coverage: Coverage;
89
+ /** Distinct problems, densest first. */
90
+ clusters: RecurrenceCluster[];
91
+ /** Open observations considered. */
92
+ observationsConsidered: number;
93
+ /**
94
+ * observations ÷ clusters — the noticing-to-problem ratio. `null` when there
95
+ * are no clusters: no denominator, no ratio (never a flattering 1, never a
96
+ * damning 0).
97
+ */
98
+ noticingRatio: number | null;
99
+ /**
100
+ * Present ONLY on a complete report. On a partial read this is absent and the
101
+ * caller must say "I could not look", never "nothing recurring was found".
102
+ */
103
+ verdict?: 'no-recurrence' | 'recurrence-found';
104
+ }
105
+ /**
106
+ * Derive the recurrence key from a title.
107
+ *
108
+ * Digits collapse to `N` and long hex runs to `H`, so "3 topics stranded on
109
+ * m_cc2ec…" and "7 topics stranded on m_91af…" are recognised as ONE problem
110
+ * rather than two. This is deliberately blunt: the goal is to surface shape, and
111
+ * an over-eager grouping that a human immediately recognises as one problem is
112
+ * more useful than a precise grouping that preserves the illusion of 371
113
+ * separate things.
114
+ */
115
+ export declare function recurrenceKey(title: string): string;
116
+ /**
117
+ * Group open observations into recurrence clusters.
118
+ *
119
+ * Pure over its input — every store read (and every read FAILURE) is the
120
+ * caller's job to supply, so this function cannot silently swallow one.
121
+ */
122
+ export declare function buildRecurrenceReport(observations: Observation[], coverage: Coverage): RecurrenceReport;
123
+ /**
124
+ * The clusters worth a human's attention, by a deterministic rule.
125
+ *
126
+ * `minCount` defaults to 2 because a thing noticed once is not yet recurrence.
127
+ * `untrackedOnly` narrows to the sharpest class: repeatedly noticed, never
128
+ * turned into work.
129
+ */
130
+ export declare function significantClusters(report: RecurrenceReport, opts?: {
131
+ minCount?: number;
132
+ untrackedOnly?: boolean;
133
+ }): RecurrenceCluster[];
134
+ //# sourceMappingURL=RecurrenceReader.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"RecurrenceReader.d.ts","sourceRoot":"","sources":["../../src/core/RecurrenceReader.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+BG;AAEH,4DAA4D;AAC5D,MAAM,WAAW,WAAW;IAC1B,kCAAkC;IAClC,KAAK,EAAE,WAAW,GAAG,SAAS,GAAG,UAAU,CAAC;IAC5C,oDAAoD;IACpD,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,uEAAuE;IACvE,KAAK,EAAE,MAAM,CAAC;IACd,mFAAmF;IACnF,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,iCAAiC;IACjC,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,0EAA0E;IAC1E,IAAI,EAAE,OAAO,CAAC;CACf;AAED,6EAA6E;AAC7E,MAAM,WAAW,iBAAiB;IAChC,wCAAwC;IACxC,GAAG,EAAE,MAAM,CAAC;IACZ,mEAAmE;IACnE,QAAQ,EAAE,MAAM,CAAC;IACjB,sEAAsE;IACtE,KAAK,EAAE,MAAM,CAAC;IACd,sFAAsF;IACtF,MAAM,EAAE,WAAW,CAAC,OAAO,CAAC,EAAE,CAAC;IAC/B,2CAA2C;IAC3C,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,0DAA0D;IAC1D,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB;;;;;OAKG;IACH,OAAO,EAAE,OAAO,CAAC;CAClB;AAED,8EAA8E;AAC9E,MAAM,WAAW,QAAQ;IACvB,gCAAgC;IAChC,IAAI,EAAE,WAAW,CAAC,OAAO,CAAC,EAAE,CAAC;IAC7B,sDAAsD;IACtD,UAAU,EAAE;QAAE,KAAK,EAAE,WAAW,CAAC,OAAO,CAAC,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;IAC9D;;;OAGG;IACH,YAAY,EAAE,UAAU,GAAG,SAAS,CAAC;CACtC;AAED,MAAM,WAAW,gBAAgB;IAC/B,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,QAAQ,CAAC;IACnB,wCAAwC;IACxC,QAAQ,EAAE,iBAAiB,EAAE,CAAC;IAC9B,oCAAoC;IACpC,sBAAsB,EAAE,MAAM,CAAC;IAC/B;;;;OAIG;IACH,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B;;;OAGG;IACH,OAAO,CAAC,EAAE,eAAe,GAAG,kBAAkB,CAAC;CAChD;AAED;;;;;;;;;GASG;AACH,wBAAgB,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAQnD;AAED;;;;;GAKG;AACH,wBAAgB,qBAAqB,CACnC,YAAY,EAAE,WAAW,EAAE,EAC3B,QAAQ,EAAE,QAAQ,GACjB,gBAAgB,CA0ClB;AAED;;;;;;GAMG;AACH,wBAAgB,mBAAmB,CACjC,MAAM,EAAE,gBAAgB,EACxB,IAAI,GAAE;IAAE,QAAQ,CAAC,EAAE,MAAM,CAAC;IAAC,aAAa,CAAC,EAAE,OAAO,CAAA;CAAO,GACxD,iBAAiB,EAAE,CAKrB"}
@@ -0,0 +1,111 @@
1
+ /**
2
+ * RecurrenceReader — one reader across the stores that already notice things.
3
+ *
4
+ * THE DEFECT THIS ADDRESSES (project convergence-towards-coherence, Tier 2).
5
+ * Instar notices constantly and in three separate places: the attention queue,
6
+ * the evolution action queue, and the sentinel event log. Nothing reads across
7
+ * them, so the same underlying problem is noticed dozens of times and closed
8
+ * zero times. The measured filing-to-completion ratio is roughly 30:1.
9
+ *
10
+ * Measured on this machine, 2026-07-27 — the number that makes the case:
11
+ *
12
+ * 371 OPEN attention items → 49 distinct problems
13
+ * the single largest cluster ("credential rebalancer") is 177 items — 48%
14
+ *
15
+ * Reading that queue item-by-item, nobody would ever see it. The items are all
16
+ * individually true and individually minor; the SHAPE is the finding, and the
17
+ * shape is invisible without a reader that groups.
18
+ *
19
+ * WHAT THIS IS NOT. It is not a new notification channel, and it must never
20
+ * become one (operator directive 2026-07-26 20:08Z: synthesis must lead to
21
+ * ACTION through the paths that already exist — a phase advance, a blocker
22
+ * raised, work queued — with the loop closed and without depending on the user).
23
+ * This module is READ-ONLY and returns a report; driving action from it is a
24
+ * separate, gated concern.
25
+ *
26
+ * THE HONEST-DENOMINATOR RULE APPLIES TO THIS READER TOO. Every store it could
27
+ * not read is named in `coverage`, and a report with any unreadable store is
28
+ * NEVER `complete`. "I found no recurrence" and "I could not look" are different
29
+ * answers, and conflating them is the exact failure this project exists to
30
+ * remove — a synthesiser that silently synthesised over two of three stores
31
+ * would be the most expensive instance of it yet.
32
+ */
33
+ /**
34
+ * Derive the recurrence key from a title.
35
+ *
36
+ * Digits collapse to `N` and long hex runs to `H`, so "3 topics stranded on
37
+ * m_cc2ec…" and "7 topics stranded on m_91af…" are recognised as ONE problem
38
+ * rather than two. This is deliberately blunt: the goal is to surface shape, and
39
+ * an over-eager grouping that a human immediately recognises as one problem is
40
+ * more useful than a precise grouping that preserves the illusion of 371
41
+ * separate things.
42
+ */
43
+ export function recurrenceKey(title) {
44
+ return (title || '')
45
+ .toLowerCase()
46
+ .replace(/[a-f0-9]{8,}/g, 'H')
47
+ .replace(/\d+/g, 'N')
48
+ .replace(/\s+/g, ' ')
49
+ .trim()
50
+ .slice(0, 80);
51
+ }
52
+ /**
53
+ * Group open observations into recurrence clusters.
54
+ *
55
+ * Pure over its input — every store read (and every read FAILURE) is the
56
+ * caller's job to supply, so this function cannot silently swallow one.
57
+ */
58
+ export function buildRecurrenceReport(observations, coverage) {
59
+ const open = observations.filter((o) => o.open);
60
+ const byKey = new Map();
61
+ for (const o of open) {
62
+ const k = recurrenceKey(o.title);
63
+ if (!k)
64
+ continue;
65
+ const bucket = byKey.get(k);
66
+ if (bucket)
67
+ bucket.push(o);
68
+ else
69
+ byKey.set(k, [o]);
70
+ }
71
+ const clusters = [...byKey.entries()].map(([key, members]) => {
72
+ const times = members.map((m) => m.at).filter((t) => !!t).sort();
73
+ return {
74
+ key,
75
+ exemplar: members[0].title,
76
+ count: members.length,
77
+ stores: [...new Set(members.map((m) => m.store))],
78
+ sources: [...new Set(members.map((m) => m.source).filter((s) => !!s))],
79
+ firstSeen: times[0],
80
+ lastSeen: times[times.length - 1],
81
+ tracked: members.some((m) => m.store === 'actions'),
82
+ };
83
+ }).sort((a, b) => b.count - a.count);
84
+ const report = {
85
+ generatedAt: new Date().toISOString(),
86
+ coverage,
87
+ clusters,
88
+ observationsConsidered: open.length,
89
+ noticingRatio: clusters.length === 0 ? null : Number((open.length / clusters.length).toFixed(2)),
90
+ };
91
+ // A verdict is only meaningful over a COMPLETE read. On a partial read the
92
+ // field is absent entirely rather than set to a hedged value — an absent field
93
+ // forces the caller to handle it; a hedged value invites it to be rendered as
94
+ // if it were an answer.
95
+ if (coverage.completeness === 'complete') {
96
+ report.verdict = clusters.some((c) => c.count > 1) ? 'recurrence-found' : 'no-recurrence';
97
+ }
98
+ return report;
99
+ }
100
+ /**
101
+ * The clusters worth a human's attention, by a deterministic rule.
102
+ *
103
+ * `minCount` defaults to 2 because a thing noticed once is not yet recurrence.
104
+ * `untrackedOnly` narrows to the sharpest class: repeatedly noticed, never
105
+ * turned into work.
106
+ */
107
+ export function significantClusters(report, opts = {}) {
108
+ const min = opts.minCount ?? 2;
109
+ return report.clusters.filter((c) => c.count >= min && (!opts.untrackedOnly || !c.tracked));
110
+ }
111
+ //# sourceMappingURL=RecurrenceReader.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"RecurrenceReader.js","sourceRoot":"","sources":["../../src/core/RecurrenceReader.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"templates.d.ts","sourceRoot":"","sources":["../../src/scaffold/templates.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AASH,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,QAAQ,EAAE,aAAa,GAAG,MAAM,CAgG/D;AAED;;;;;GAKG;AACH,wBAAgB,cAAc,CAAC,SAAS,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,CA2E/F;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAiBvD;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CA2B1D;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,CAC9B,WAAW,EAAE,MAAM,EACnB,SAAS,EAAE,MAAM,EACjB,IAAI,EAAE,MAAM,EACZ,WAAW,EAAE,OAAO,EACpB,WAAW,GAAE,OAAe,EAC5B,WAAW,GAAE,OAAe,GAC3B,MAAM,CA0pDR;AAED;;;;GAIG;AACH,wBAAgB,oBAAoB,CAClC,WAAW,EAAE,MAAM,EACnB,SAAS,EAAE,MAAM,EACjB,IAAI,EAAE,MAAM,EACZ,WAAW,EAAE,OAAO,EACpB,WAAW,GAAE,OAAe,GAC3B,MAAM,CA2TR"}
1
+ {"version":3,"file":"templates.d.ts","sourceRoot":"","sources":["../../src/scaffold/templates.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AASH,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,QAAQ,EAAE,aAAa,GAAG,MAAM,CAgG/D;AAED;;;;;GAKG;AACH,wBAAgB,cAAc,CAAC,SAAS,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,CA2E/F;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAiBvD;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CA2B1D;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,CAC9B,WAAW,EAAE,MAAM,EACnB,SAAS,EAAE,MAAM,EACjB,IAAI,EAAE,MAAM,EACZ,WAAW,EAAE,OAAO,EACpB,WAAW,GAAE,OAAe,EAC5B,WAAW,GAAE,OAAe,GAC3B,MAAM,CA4pDR;AAED;;;;GAIG;AACH,wBAAgB,oBAAoB,CAClC,WAAW,EAAE,MAAM,EACnB,SAAS,EAAE,MAAM,EACjB,IAAI,EAAE,MAAM,EACZ,WAAW,EAAE,OAAO,EACpB,WAAW,GAAE,OAAe,GAC3B,MAAM,CA2TR"}
@@ -1573,6 +1573,8 @@ curl -X POST -H "Authorization: Bearer $AUTH" http://localhost:${port}/intent/jo
1573
1573
 
1574
1574
  **Reading the stats honestly:** \`principledCount\` / \`unprincipledCount\` sit beside \`count\`. \`topPrinciples: []\` alone cannot tell you whether nobody has decided anything yet or whether many decisions were recorded and not one said why — these two counters are what separates those cases. The machine-generated dispatch path is deliberately exempt; an auto-applied dispatch has no principle to cite and is never blocked.
1575
1575
 
1576
+ **Alignment score — N/A means not assessed:** \`GET /intent/alignment\` returns \`grade: 'N/A'\` and \`assessable: false\` when the analysis window held no decisions. Do NOT read that as a failing grade — \`score: 0\` is a placeholder, not a measurement. Branch on \`assessable\` (or \`sampleSize > 0\`) before treating the score as a verdict, and never report an unassessed period to the user as poor alignment.
1577
+
1576
1578
  ### Playbook — Adaptive Context Engineering
1577
1579
 
1578
1580
  The Playbook system gives you a living knowledge base that makes every session smarter than the last. Instead of loading the same static context every time, Playbook curates a manifest of context items — facts, lessons, patterns, safety rules — and selects exactly what's relevant for each session based on triggers, token budgets, and usefulness scores.
@@ -1 +1 @@
1
- {"version":3,"file":"templates.js","sourceRoot":"","sources":["../../src/scaffold/templates.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"templates.js","sourceRoot":"","sources":["../../src/scaffold/templates.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "instar",
3
- "version": "1.3.990",
3
+ "version": "1.3.992",
4
4
  "description": "Coherence infrastructure for self-evolving AI agents — on the Claude Code or Codex subscription you already have.",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",
@@ -1,8 +1,8 @@
1
1
  {
2
2
  "$schema": "./builtin-manifest.schema.json",
3
3
  "schemaVersion": 1,
4
- "generatedAt": "2026-07-26T22:16:50.661Z",
5
- "instarVersion": "1.3.990",
4
+ "generatedAt": "2026-07-27T03:37:34.934Z",
5
+ "instarVersion": "1.3.992",
6
6
  "entryCount": 202,
7
7
  "entries": {
8
8
  "hook:session-start": {
@@ -11,7 +11,7 @@
11
11
  "domain": "identity",
12
12
  "sourcePath": "src/core/PostUpdateMigrator.ts",
13
13
  "installedPath": ".instar/hooks/instar/session-start.sh",
14
- "contentHash": "e309ba72e9b8f2d3f37f52207646257c9a3b2d2569bc2f1f5419442f5ad9a74f",
14
+ "contentHash": "3f824e7d0a659043dfc23895748d4588eeaf072fd4aa214b987a85a7372308b1",
15
15
  "since": "2025-01-01"
16
16
  },
17
17
  "hook:dangerous-command-guard": {
@@ -20,7 +20,7 @@
20
20
  "domain": "safety",
21
21
  "sourcePath": "src/core/PostUpdateMigrator.ts",
22
22
  "installedPath": ".instar/hooks/instar/dangerous-command-guard.sh",
23
- "contentHash": "e309ba72e9b8f2d3f37f52207646257c9a3b2d2569bc2f1f5419442f5ad9a74f",
23
+ "contentHash": "3f824e7d0a659043dfc23895748d4588eeaf072fd4aa214b987a85a7372308b1",
24
24
  "since": "2025-01-01"
25
25
  },
26
26
  "hook:grounding-before-messaging": {
@@ -29,7 +29,7 @@
29
29
  "domain": "safety",
30
30
  "sourcePath": "src/core/PostUpdateMigrator.ts",
31
31
  "installedPath": ".instar/hooks/instar/grounding-before-messaging.sh",
32
- "contentHash": "e309ba72e9b8f2d3f37f52207646257c9a3b2d2569bc2f1f5419442f5ad9a74f",
32
+ "contentHash": "3f824e7d0a659043dfc23895748d4588eeaf072fd4aa214b987a85a7372308b1",
33
33
  "since": "2025-01-01"
34
34
  },
35
35
  "hook:compaction-recovery": {
@@ -38,7 +38,7 @@
38
38
  "domain": "identity",
39
39
  "sourcePath": "src/core/PostUpdateMigrator.ts",
40
40
  "installedPath": ".instar/hooks/instar/compaction-recovery.sh",
41
- "contentHash": "e309ba72e9b8f2d3f37f52207646257c9a3b2d2569bc2f1f5419442f5ad9a74f",
41
+ "contentHash": "3f824e7d0a659043dfc23895748d4588eeaf072fd4aa214b987a85a7372308b1",
42
42
  "since": "2025-01-01"
43
43
  },
44
44
  "hook:external-operation-gate": {
@@ -47,7 +47,7 @@
47
47
  "domain": "safety",
48
48
  "sourcePath": "src/core/PostUpdateMigrator.ts",
49
49
  "installedPath": ".instar/hooks/instar/external-operation-gate.js",
50
- "contentHash": "e309ba72e9b8f2d3f37f52207646257c9a3b2d2569bc2f1f5419442f5ad9a74f",
50
+ "contentHash": "3f824e7d0a659043dfc23895748d4588eeaf072fd4aa214b987a85a7372308b1",
51
51
  "since": "2025-01-01"
52
52
  },
53
53
  "hook:deferral-detector": {
@@ -56,7 +56,7 @@
56
56
  "domain": "safety",
57
57
  "sourcePath": "src/core/PostUpdateMigrator.ts",
58
58
  "installedPath": ".instar/hooks/instar/deferral-detector.js",
59
- "contentHash": "e309ba72e9b8f2d3f37f52207646257c9a3b2d2569bc2f1f5419442f5ad9a74f",
59
+ "contentHash": "3f824e7d0a659043dfc23895748d4588eeaf072fd4aa214b987a85a7372308b1",
60
60
  "since": "2025-01-01"
61
61
  },
62
62
  "hook:self-stop-guard": {
@@ -65,7 +65,7 @@
65
65
  "domain": "coherence",
66
66
  "sourcePath": "src/core/PostUpdateMigrator.ts",
67
67
  "installedPath": ".instar/hooks/instar/self-stop-guard.js",
68
- "contentHash": "e309ba72e9b8f2d3f37f52207646257c9a3b2d2569bc2f1f5419442f5ad9a74f",
68
+ "contentHash": "3f824e7d0a659043dfc23895748d4588eeaf072fd4aa214b987a85a7372308b1",
69
69
  "since": "2025-01-01"
70
70
  },
71
71
  "hook:post-action-reflection": {
@@ -74,7 +74,7 @@
74
74
  "domain": "evolution",
75
75
  "sourcePath": "src/core/PostUpdateMigrator.ts",
76
76
  "installedPath": ".instar/hooks/instar/post-action-reflection.js",
77
- "contentHash": "e309ba72e9b8f2d3f37f52207646257c9a3b2d2569bc2f1f5419442f5ad9a74f",
77
+ "contentHash": "3f824e7d0a659043dfc23895748d4588eeaf072fd4aa214b987a85a7372308b1",
78
78
  "since": "2025-01-01"
79
79
  },
80
80
  "hook:external-communication-guard": {
@@ -83,7 +83,7 @@
83
83
  "domain": "safety",
84
84
  "sourcePath": "src/core/PostUpdateMigrator.ts",
85
85
  "installedPath": ".instar/hooks/instar/external-communication-guard.js",
86
- "contentHash": "e309ba72e9b8f2d3f37f52207646257c9a3b2d2569bc2f1f5419442f5ad9a74f",
86
+ "contentHash": "3f824e7d0a659043dfc23895748d4588eeaf072fd4aa214b987a85a7372308b1",
87
87
  "since": "2025-01-01"
88
88
  },
89
89
  "hook:scope-coherence-collector": {
@@ -92,7 +92,7 @@
92
92
  "domain": "coherence",
93
93
  "sourcePath": "src/core/PostUpdateMigrator.ts",
94
94
  "installedPath": ".instar/hooks/instar/scope-coherence-collector.js",
95
- "contentHash": "e309ba72e9b8f2d3f37f52207646257c9a3b2d2569bc2f1f5419442f5ad9a74f",
95
+ "contentHash": "3f824e7d0a659043dfc23895748d4588eeaf072fd4aa214b987a85a7372308b1",
96
96
  "since": "2025-01-01"
97
97
  },
98
98
  "hook:scope-coherence-checkpoint": {
@@ -101,7 +101,7 @@
101
101
  "domain": "coherence",
102
102
  "sourcePath": "src/core/PostUpdateMigrator.ts",
103
103
  "installedPath": ".instar/hooks/instar/scope-coherence-checkpoint.js",
104
- "contentHash": "e309ba72e9b8f2d3f37f52207646257c9a3b2d2569bc2f1f5419442f5ad9a74f",
104
+ "contentHash": "3f824e7d0a659043dfc23895748d4588eeaf072fd4aa214b987a85a7372308b1",
105
105
  "since": "2025-01-01"
106
106
  },
107
107
  "hook:free-text-guard": {
@@ -110,7 +110,7 @@
110
110
  "domain": "safety",
111
111
  "sourcePath": "src/core/PostUpdateMigrator.ts",
112
112
  "installedPath": ".instar/hooks/instar/free-text-guard.sh",
113
- "contentHash": "e309ba72e9b8f2d3f37f52207646257c9a3b2d2569bc2f1f5419442f5ad9a74f",
113
+ "contentHash": "3f824e7d0a659043dfc23895748d4588eeaf072fd4aa214b987a85a7372308b1",
114
114
  "since": "2025-01-01"
115
115
  },
116
116
  "hook:claim-intercept": {
@@ -119,7 +119,7 @@
119
119
  "domain": "coherence",
120
120
  "sourcePath": "src/core/PostUpdateMigrator.ts",
121
121
  "installedPath": ".instar/hooks/instar/claim-intercept.js",
122
- "contentHash": "e309ba72e9b8f2d3f37f52207646257c9a3b2d2569bc2f1f5419442f5ad9a74f",
122
+ "contentHash": "3f824e7d0a659043dfc23895748d4588eeaf072fd4aa214b987a85a7372308b1",
123
123
  "since": "2025-01-01"
124
124
  },
125
125
  "hook:claim-intercept-response": {
@@ -128,7 +128,7 @@
128
128
  "domain": "coherence",
129
129
  "sourcePath": "src/core/PostUpdateMigrator.ts",
130
130
  "installedPath": ".instar/hooks/instar/claim-intercept-response.js",
131
- "contentHash": "e309ba72e9b8f2d3f37f52207646257c9a3b2d2569bc2f1f5419442f5ad9a74f",
131
+ "contentHash": "3f824e7d0a659043dfc23895748d4588eeaf072fd4aa214b987a85a7372308b1",
132
132
  "since": "2025-01-01"
133
133
  },
134
134
  "hook:stop-gate-router": {
@@ -137,7 +137,7 @@
137
137
  "domain": "safety",
138
138
  "sourcePath": "src/core/PostUpdateMigrator.ts",
139
139
  "installedPath": ".instar/hooks/instar/stop-gate-router.js",
140
- "contentHash": "e309ba72e9b8f2d3f37f52207646257c9a3b2d2569bc2f1f5419442f5ad9a74f",
140
+ "contentHash": "3f824e7d0a659043dfc23895748d4588eeaf072fd4aa214b987a85a7372308b1",
141
141
  "since": "2025-01-01"
142
142
  },
143
143
  "hook:auto-approve-permissions": {
@@ -146,7 +146,7 @@
146
146
  "domain": "safety",
147
147
  "sourcePath": "src/core/PostUpdateMigrator.ts",
148
148
  "installedPath": ".instar/hooks/instar/auto-approve-permissions.js",
149
- "contentHash": "e309ba72e9b8f2d3f37f52207646257c9a3b2d2569bc2f1f5419442f5ad9a74f",
149
+ "contentHash": "3f824e7d0a659043dfc23895748d4588eeaf072fd4aa214b987a85a7372308b1",
150
150
  "since": "2025-01-01"
151
151
  },
152
152
  "job:health-check": {
@@ -1562,7 +1562,7 @@
1562
1562
  "type": "subsystem",
1563
1563
  "domain": "updates",
1564
1564
  "sourcePath": "src/core/PostUpdateMigrator.ts",
1565
- "contentHash": "e309ba72e9b8f2d3f37f52207646257c9a3b2d2569bc2f1f5419442f5ad9a74f",
1565
+ "contentHash": "3f824e7d0a659043dfc23895748d4588eeaf072fd4aa214b987a85a7372308b1",
1566
1566
  "since": "2025-01-01"
1567
1567
  },
1568
1568
  "subsystem:scheduler": {
@@ -1594,6 +1594,8 @@ curl -X POST -H "Authorization: Bearer $AUTH" http://localhost:${port}/intent/jo
1594
1594
 
1595
1595
  **Reading the stats honestly:** \`principledCount\` / \`unprincipledCount\` sit beside \`count\`. \`topPrinciples: []\` alone cannot tell you whether nobody has decided anything yet or whether many decisions were recorded and not one said why — these two counters are what separates those cases. The machine-generated dispatch path is deliberately exempt; an auto-applied dispatch has no principle to cite and is never blocked.
1596
1596
 
1597
+ **Alignment score — N/A means not assessed:** \`GET /intent/alignment\` returns \`grade: 'N/A'\` and \`assessable: false\` when the analysis window held no decisions. Do NOT read that as a failing grade — \`score: 0\` is a placeholder, not a measurement. Branch on \`assessable\` (or \`sampleSize > 0\`) before treating the score as a verdict, and never report an unassessed period to the user as poor alignment.
1598
+
1597
1599
  ### Playbook — Adaptive Context Engineering
1598
1600
 
1599
1601
  The Playbook system gives you a living knowledge base that makes every session smarter than the last. Instead of loading the same static context every time, Playbook curates a manifest of context items — facts, lessons, patterns, safety rules — and selects exactly what's relevant for each session based on triggers, token budgets, and usefulness scores.
@@ -0,0 +1,57 @@
1
+ # Upgrade Guide — vNEXT
2
+
3
+ <!-- assembled-by: assemble-next-md -->
4
+ <!-- bump: patch -->
5
+
6
+ ## What Changed
7
+
8
+ `IntentDriftDetector.alignmentScore()` reported `score: 0, grade: 'F'` when its analysis window held
9
+ no decisions. The `summary` field said "alignment cannot be assessed", but `score` and `grade` are
10
+ what consumers read — so "no data" and "assessed, catastrophically bad" were identical on every field
11
+ in use.
12
+
13
+ The grade union is now `'A'|'B'|'C'|'D'|'F'|'N/A'`, and the result carries `assessable: boolean`.
14
+ `GET /intent/alignment` returns both. `instar intent drift` prints the reason instead of a fabricated
15
+ grade when nothing was assessed.
16
+
17
+ Root cause was vocabulary: with no grade meaning *no verdict*, absence had to borrow the worst real
18
+ grade — the same shape as a status set with no way to say "undetermined".
19
+
20
+ ## What to Tell Your User
21
+
22
+ If you look at the alignment score, a flat zero with an F used to mean one of two very different
23
+ things: that your decisions genuinely scored badly, or that there was nothing to score. You could not
24
+ tell which from the number.
25
+
26
+ Now an unassessed period says so plainly, and the score carries a flag saying whether anything was
27
+ actually measured.
28
+
29
+ The honest scope: this changes what you are told, not how aligned anything is. It also does not
30
+ change the default command view, where the unassessable case was already handled well — that path
31
+ stops early with a helpful message and never reached the bad grade. The fabricated F is visible to
32
+ anything reading the score programmatically, and on the command line only if you widen the window
33
+ past thirty days by hand.
34
+
35
+ ## Summary of New Capabilities
36
+
37
+ No new endpoint or command. An existing score gained an honest "not assessed" state and a flag
38
+ distinguishing a placeholder from a measurement.
39
+
40
+ ## Evidence
41
+
42
+ - Restoring the fabricated `'F'`: 3 failed | 25 passed. Making `assessable` constant: 5 failed.
43
+ - Disabling the renderer's honest branch left all 28 module and route tests green — the wiring was
44
+ unguarded until a test was added that drives the real command and reads its output. With it, that
45
+ same change fails immediately.
46
+ - Restored: 42 passed across the five affected files; `tsc --noEmit` exit 0.
47
+ - Two existing tests asserted `grade === 'F'` on the empty case — they encoded the defect rather than
48
+ merely lagging it. Both updated, with the reason recorded in place.
49
+
50
+ ## Known limits
51
+
52
+ The early-return window and the scoring window differ (the command's `--window`, default 14, versus a
53
+ fixed 30), which is what makes the command-line case reachable at all; reconciling them changes what
54
+ every user sees and is deliberately not bundled. `score` stays `0` on the unassessable case rather
55
+ than becoming `null`, to avoid a breaking type change — `assessable` is the additive signal. Nothing
56
+ here improves alignment or judges whether a cited principle was genuinely consulted.
57
+ <!-- tracked: CMT-1044 -->
@@ -0,0 +1,55 @@
1
+ # Upgrade Guide — vNEXT
2
+
3
+ <!-- assembled-by: assemble-next-md -->
4
+ <!-- bump: patch -->
5
+
6
+ ## What Changed
7
+
8
+ Instar notices problems in three separate stores — the attention queue, the evolution action queue,
9
+ and the sentinel log — and nothing has ever read across them. So the same problem is noticed dozens
10
+ of times and closed zero times (measured filing-to-completion ≈ 30:1).
11
+
12
+ `src/core/RecurrenceReader.ts` groups OPEN observations from all three into recurrence clusters,
13
+ carrying a `coverage` block that names every store it could NOT read. Pure module, read-only, no
14
+ route, no authority.
15
+
16
+ ## What to Tell Your User
17
+
18
+ Nothing is required of you, and nothing visible changes yet — this ships the engine, not a surface.
19
+
20
+ What it does, in plain terms: your agent writes down the things it notices in three different places,
21
+ and until now nothing looked at all three together. So one recurring problem could be written down a
22
+ hundred times and read as a hundred separate problems. This groups them.
23
+
24
+ On a live agent it turned 2,068 unresolved items into 836 actual problems — and found 69 problems
25
+ that had been noticed 1,242 times between them without a single one ever being picked up. The
26
+ largest was one component's warnings repeating 177 times, nearly half that agent's attention queue.
27
+
28
+ If you later ask your agent "what keeps going wrong?", this is what lets it answer honestly instead
29
+ of reciting a list. And if it can only read some of its records, it will tell you that rather than
30
+ reporting a clean bill — "nothing found" and "couldn't look" stay different answers.
31
+
32
+ ## Summary of New Capabilities
33
+
34
+ - Groups repeated observations across the attention queue, action queue and sentinel log into
35
+ distinct problems, so recurrence becomes visible instead of buried in volume.
36
+ - Flags problems noticed repeatedly that were **never** turned into tracked work — the sharpest
37
+ signal for what is actually being dropped.
38
+ - Refuses to issue a verdict over an incomplete read: any unreadable store is named with its reason,
39
+ and the verdict field is omitted entirely rather than hedged.
40
+
41
+ ## Evidence
42
+
43
+ Live data, 2026-07-27: **2,068 open observations → 836 distinct problems** (ratio 2.47). **69
44
+ problems account for 1,242 noticings and none is tracked.** Largest clusters: 278x idle-timeout
45
+ detection, 238x escalation-suppressed, 177x credential rebalancer (48% of the attention queue).
46
+
47
+ Refusal, on real data with the action store made unreadable: reported the 59 clusters it could see
48
+ and left `verdict` **absent** rather than claiming `no-recurrence`. Unit suite 11/11; `tsc` exit 0.
49
+
50
+ ## Known limits
51
+
52
+ Title-only keying will not merge the same problem worded differently; semantic matching would mean an
53
+ LLM and a judgment point, deliberately avoided. The blunt key can occasionally over-merge — `exemplar`
54
+ and `sources` are carried so a reader spots it. Read-only: it reports, it does not act. Driving
55
+ action through existing gated paths is the next increment, not this one.