instar 1.3.716 → 1.3.717
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/data/llmBenchCoverage.d.ts.map +1 -1
- package/dist/data/llmBenchCoverage.js +39 -25
- package/dist/data/llmBenchCoverage.js.map +1 -1
- package/package.json +1 -1
- package/src/data/builtin-manifest.json +2 -2
- package/src/data/llmBenchCoverage.ts +45 -25
- package/upgrades/1.3.717.md +33 -0
- package/upgrades/side-effects/routing-registry-bench-apply.md +32 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"llmBenchCoverage.d.ts","sourceRoot":"","sources":["../../src/data/llmBenchCoverage.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AAEH,MAAM,MAAM,aAAa,GACrB;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,GAChB;IAAE,OAAO,EAAE,QAAQ,GAAG,QAAQ,CAAA;CAAE,GAChC;IAAE,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC;AAEvB,eAAO,MAAM,kBAAkB,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,aAAa,CAAC,
|
|
1
|
+
{"version":3,"file":"llmBenchCoverage.d.ts","sourceRoot":"","sources":["../../src/data/llmBenchCoverage.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AAEH,MAAM,MAAM,aAAa,GACrB;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,GAChB;IAAE,OAAO,EAAE,QAAQ,GAAG,QAAQ,CAAA;CAAE,GAChC;IAAE,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC;AAEvB,eAAO,MAAM,kBAAkB,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,aAAa,CAAC,CAqFtE,CAAC"}
|
|
@@ -40,31 +40,45 @@ export const LLM_BENCH_COVERAGE = {
|
|
|
40
40
|
InteractivePoolCanaryJudge: {
|
|
41
41
|
exempt: 'judges a FIXED known-answer canary probe — the canary is its own benchmark; a bench task would re-test the same constant',
|
|
42
42
|
},
|
|
43
|
-
// ── Wave 2 (
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
43
|
+
// ── Covered by Wave 2 (authored 2026-07-02; tasks-wave2/ in the bench harness) ──
|
|
44
|
+
InputGuard: { task: 'input-guard-coherence' },
|
|
45
|
+
SessionActivitySentinel: { task: 'activity-digest' },
|
|
46
|
+
StallTriageNurse: { task: 'stall-triage-diagnosis' },
|
|
47
|
+
CommitmentSentinel: { task: 'commitment-detector' },
|
|
48
|
+
PresenceProxy: { task: 'presence-tier3-stall' },
|
|
49
|
+
ProjectDriftChecker: { task: 'project-drift-check' },
|
|
50
|
+
TemporalCoherenceChecker: { task: 'temporal-coherence' },
|
|
51
|
+
SessionWatchdog: { task: 'watchdog-stuck-judge' },
|
|
52
|
+
ResumeQueueDrainer: { task: 'resume-sanity-check' },
|
|
53
|
+
TopicIntentArcCheck: { task: 'arc-check-classify' },
|
|
54
|
+
TelegramAdapter: { task: 'telegram-stall-confirm' },
|
|
55
|
+
// SlackAdapter.confirmStallAlert builds a byte-identical prompt to
|
|
56
|
+
// TelegramAdapter's (verified by diff) — the same task id covers both
|
|
57
|
+
// (precedent: CompletionEvaluator maps two surfaces to two ids).
|
|
58
|
+
SlackAdapter: { task: 'telegram-stall-confirm' },
|
|
59
|
+
PromptGate: { task: 'prompt-gate-detect' },
|
|
60
|
+
UnjustifiedStopGate: { task: 'unjustified-stop-gate' },
|
|
61
|
+
OverrideDetector: { task: 'override-detector' },
|
|
62
|
+
TaskClassifier: { task: 'task-classifier' },
|
|
63
|
+
ResumeValidator: { task: 'resume-validator' },
|
|
64
|
+
SessionSummarySentinel: { task: 'session-summary-sentinel' },
|
|
65
|
+
TopicIntentExtractor: { task: 'topic-intent-extractor' },
|
|
66
|
+
// ── Wave-2 argued exemptions (evidence: tasks-wave2/SKIPPED.md in the bench harness) ──
|
|
67
|
+
IntegrationGate: {
|
|
68
|
+
exempt: 'no LLM prompt of its own — delegates to JobReflector.reflect() (attribution JobReflector, tracked wave-3); zero LLM-provider callsites of its own in IntegrationGate.ts',
|
|
69
|
+
},
|
|
70
|
+
CoherenceGate: {
|
|
71
|
+
exempt: 'no callsite carries attribution CoherenceGate — all LLM calls flow through CoherenceReviewer.callApi() (incl. the DynamicReviewer subclass), covered by gate-triage',
|
|
72
|
+
},
|
|
73
|
+
AutoApprover: {
|
|
74
|
+
exempt: 'mechanical key injection + audit logging, no LLM callsite; the upstream judgment is InputClassifier.classify(), covered by input-classifier',
|
|
75
|
+
},
|
|
76
|
+
InputDetector: {
|
|
77
|
+
exempt: 'attribution-manifest alias only (a legacy prompt-pattern matcher); the live InputDetector class in PromptGate.ts calls with attribution PromptGate, covered by prompt-gate-detect',
|
|
78
|
+
},
|
|
79
|
+
PromiseBeacon: {
|
|
80
|
+
exempt: 'no live LLM prompt — generateStatusLine/classifyProgress hooks are unwired at the construction site (server.ts); the enqueue path resolves templated strings; revisit if a generator is wired',
|
|
81
|
+
},
|
|
68
82
|
// ── Wave 3 (reflectors + background/job tasks) ──
|
|
69
83
|
JobReflector: { pending: 'wave-3' },
|
|
70
84
|
crossModelReviewer: { pending: 'wave-3' },
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"llmBenchCoverage.js","sourceRoot":"","sources":["../../src/data/llmBenchCoverage.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AAOH,MAAM,CAAC,MAAM,kBAAkB,GAA4C;IACzE,mEAAmE;IACnE,eAAe,EAAE,EAAE,IAAI,EAAE,mBAAmB,EAAE;IAC9C,iBAAiB,EAAE,EAAE,IAAI,EAAE,WAAW,EAAE;IACxC,6DAA6D;IAC7D,mBAAmB,EAAE,EAAE,IAAI,EAAE,iCAAiC,EAAE;IAChE,qBAAqB,EAAE,EAAE,IAAI,EAAE,kBAAkB,EAAE;IACnD,YAAY,EAAE,EAAE,IAAI,EAAE,qBAAqB,EAAE;IAC7C,iBAAiB,EAAE,EAAE,IAAI,EAAE,gBAAgB,EAAE;IAC7C,eAAe,EAAE,EAAE,IAAI,EAAE,kBAAkB,EAAE;IAC7C,KAAK,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE;IACxB,qBAAqB,EAAE,EAAE,IAAI,EAAE,sBAAsB,EAAE;IACvD,iBAAiB,EAAE,EAAE,IAAI,EAAE,aAAa,EAAE;IAE1C,kEAAkE;IAClE,0BAA0B,EAAE;QAC1B,MAAM,EACJ,0HAA0H;KAC7H;IAED,
|
|
1
|
+
{"version":3,"file":"llmBenchCoverage.js","sourceRoot":"","sources":["../../src/data/llmBenchCoverage.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
{
|
|
2
2
|
"$schema": "./builtin-manifest.schema.json",
|
|
3
3
|
"schemaVersion": 1,
|
|
4
|
-
"generatedAt": "2026-07-02T12:
|
|
5
|
-
"instarVersion": "1.3.
|
|
4
|
+
"generatedAt": "2026-07-02T12:29:51.364Z",
|
|
5
|
+
"instarVersion": "1.3.717",
|
|
6
6
|
"entryCount": 202,
|
|
7
7
|
"entries": {
|
|
8
8
|
"hook:session-start": {
|
|
@@ -49,31 +49,51 @@ export const LLM_BENCH_COVERAGE: Readonly<Record<string, BenchCoverage>> = {
|
|
|
49
49
|
'judges a FIXED known-answer canary probe — the canary is its own benchmark; a bench task would re-test the same constant',
|
|
50
50
|
},
|
|
51
51
|
|
|
52
|
-
// ── Wave 2 (
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
52
|
+
// ── Covered by Wave 2 (authored 2026-07-02; tasks-wave2/ in the bench harness) ──
|
|
53
|
+
InputGuard: { task: 'input-guard-coherence' },
|
|
54
|
+
SessionActivitySentinel: { task: 'activity-digest' },
|
|
55
|
+
StallTriageNurse: { task: 'stall-triage-diagnosis' },
|
|
56
|
+
CommitmentSentinel: { task: 'commitment-detector' },
|
|
57
|
+
PresenceProxy: { task: 'presence-tier3-stall' },
|
|
58
|
+
ProjectDriftChecker: { task: 'project-drift-check' },
|
|
59
|
+
TemporalCoherenceChecker: { task: 'temporal-coherence' },
|
|
60
|
+
SessionWatchdog: { task: 'watchdog-stuck-judge' },
|
|
61
|
+
ResumeQueueDrainer: { task: 'resume-sanity-check' },
|
|
62
|
+
TopicIntentArcCheck: { task: 'arc-check-classify' },
|
|
63
|
+
TelegramAdapter: { task: 'telegram-stall-confirm' },
|
|
64
|
+
// SlackAdapter.confirmStallAlert builds a byte-identical prompt to
|
|
65
|
+
// TelegramAdapter's (verified by diff) — the same task id covers both
|
|
66
|
+
// (precedent: CompletionEvaluator maps two surfaces to two ids).
|
|
67
|
+
SlackAdapter: { task: 'telegram-stall-confirm' },
|
|
68
|
+
PromptGate: { task: 'prompt-gate-detect' },
|
|
69
|
+
UnjustifiedStopGate: { task: 'unjustified-stop-gate' },
|
|
70
|
+
OverrideDetector: { task: 'override-detector' },
|
|
71
|
+
TaskClassifier: { task: 'task-classifier' },
|
|
72
|
+
ResumeValidator: { task: 'resume-validator' },
|
|
73
|
+
SessionSummarySentinel: { task: 'session-summary-sentinel' },
|
|
74
|
+
TopicIntentExtractor: { task: 'topic-intent-extractor' },
|
|
75
|
+
|
|
76
|
+
// ── Wave-2 argued exemptions (evidence: tasks-wave2/SKIPPED.md in the bench harness) ──
|
|
77
|
+
IntegrationGate: {
|
|
78
|
+
exempt:
|
|
79
|
+
'no LLM prompt of its own — delegates to JobReflector.reflect() (attribution JobReflector, tracked wave-3); zero LLM-provider callsites of its own in IntegrationGate.ts',
|
|
80
|
+
},
|
|
81
|
+
CoherenceGate: {
|
|
82
|
+
exempt:
|
|
83
|
+
'no callsite carries attribution CoherenceGate — all LLM calls flow through CoherenceReviewer.callApi() (incl. the DynamicReviewer subclass), covered by gate-triage',
|
|
84
|
+
},
|
|
85
|
+
AutoApprover: {
|
|
86
|
+
exempt:
|
|
87
|
+
'mechanical key injection + audit logging, no LLM callsite; the upstream judgment is InputClassifier.classify(), covered by input-classifier',
|
|
88
|
+
},
|
|
89
|
+
InputDetector: {
|
|
90
|
+
exempt:
|
|
91
|
+
'attribution-manifest alias only (a legacy prompt-pattern matcher); the live InputDetector class in PromptGate.ts calls with attribution PromptGate, covered by prompt-gate-detect',
|
|
92
|
+
},
|
|
93
|
+
PromiseBeacon: {
|
|
94
|
+
exempt:
|
|
95
|
+
'no live LLM prompt — generateStatusLine/classifyProgress hooks are unwired at the construction site (server.ts); the enqueue path resolves templated strings; revisit if a generator is wired',
|
|
96
|
+
},
|
|
77
97
|
|
|
78
98
|
// ── Wave 3 (reflectors + background/job tasks) ──
|
|
79
99
|
JobReflector: { pending: 'wave-3' },
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
# Upgrade Guide — vNEXT
|
|
2
|
+
|
|
3
|
+
<!-- assembled-by: assemble-next-md -->
|
|
4
|
+
<!-- bump: patch -->
|
|
5
|
+
|
|
6
|
+
## What Changed
|
|
7
|
+
|
|
8
|
+
First in-repo shipment of docs/LLM-ROUTING-REGISTRY.md at v2: 7 hard routing
|
|
9
|
+
rules and tiered subsidized-non-Claude-first defaults per task nature, every
|
|
10
|
+
choice citing its INSTAR-Bench v2 run stamp; plus the record of the 4 shipped
|
|
11
|
+
prompt fixes (PRs #1325/#1327/#1328) and 2 ratchet-held ones.
|
|
12
|
+
src/data/llmBenchCoverage.ts: the 24 wave-2 pending entries graduate (19
|
|
13
|
+
covered by task batteries, 5 argued exemptions); the ratchet test's pinned
|
|
14
|
+
baselines updated accordingly.
|
|
15
|
+
|
|
16
|
+
## What to Tell Your User
|
|
17
|
+
|
|
18
|
+
The rulebook deciding which AI model answers each of my internal questions is
|
|
19
|
+
now evidence-based: every default cites a benchmark run instead of a
|
|
20
|
+
judgment call, including hard bans on routes that proved unreliable for
|
|
21
|
+
safety-critical checks. No behavior changes in this update itself — it's the
|
|
22
|
+
map and its enforcement catching up with the proof.
|
|
23
|
+
|
|
24
|
+
## Summary of New Capabilities
|
|
25
|
+
|
|
26
|
+
None new — routing guidance and benchmark-coverage enforcement are now
|
|
27
|
+
complete and citable.
|
|
28
|
+
|
|
29
|
+
## Evidence
|
|
30
|
+
|
|
31
|
+
INSTAR-Bench v2: 3,030+ critical-set calls (stamps crit-cli/crit-metered),
|
|
32
|
+
wave-2 full-coverage runs (stamp wave2), 570 forensic verdicts, 6 prompt A/Bs
|
|
33
|
+
with ratchet semantics. Ratchet test 6/6 green with the new baselines.
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
# Side-effects review — LLM Routing Registry (bench-derived v2) + wave-2 coverage flips
|
|
2
|
+
|
|
3
|
+
**Change:** (1) first canonical shipment of docs/LLM-ROUTING-REGISTRY.md,
|
|
4
|
+
updated to v2 with the INSTAR-Bench-derived routing defaults: 7 hard rules
|
|
5
|
+
(each citing its run stamp), tiered subsidized-non-Claude-first chains per
|
|
6
|
+
task nature, and the record of the 4 shipped / 2 held prompt fixes;
|
|
7
|
+
(2) src/data/llmBenchCoverage.ts wave-2 flips — 24 pending entries graduate
|
|
8
|
+
to 19 covered (18 task ids; SlackAdapter shares TelegramAdapter's) + 5 argued
|
|
9
|
+
exemptions; (3) the ratchet test's pinned baselines updated to match (pending
|
|
10
|
+
shrinks to wave-3 only; exemptions grow by the 5 argued ones — the visible,
|
|
11
|
+
reviewed act the ratchet requires).
|
|
12
|
+
|
|
13
|
+
**Principle check (Phase 1):** no decision point touched. The registry doc is
|
|
14
|
+
documentation; llmBenchCoverage.ts is a CI-time data map consumed only by the
|
|
15
|
+
ratchet test; no runtime code path changes.
|
|
16
|
+
|
|
17
|
+
1. **Over-block** — n/a (no runtime gate).
|
|
18
|
+
2. **Under-block** — n/a.
|
|
19
|
+
3. **Level-of-abstraction fit** — right layer: the intentional-defaults doc
|
|
20
|
+
lives beside the code it governs; coverage decisions live in the pinned map.
|
|
21
|
+
4. **Signal vs authority** — n/a (docs + CI data).
|
|
22
|
+
5. **Interactions** — the ratchet test is the only consumer; run green (6/6).
|
|
23
|
+
Exemption additions are deliberately pinned-visible per the ratchet design.
|
|
24
|
+
6. **External surfaces** — none. The doc's run-stamp citations reference the
|
|
25
|
+
benching agent's research tree (not shipped) — documented as such.
|
|
26
|
+
7. **Multi-machine posture** — machine-local BY DESIGN (repo docs + CI data).
|
|
27
|
+
8. **Rollback cost** — trivial: revert the commit. No runtime behavior changes.
|
|
28
|
+
|
|
29
|
+
**Evidence:** run stamps crit-cli / crit-metered / wave2 / ab-* in the bench
|
|
30
|
+
research tree; CRITICAL-SET-DIGEST.md; 570 forensic verdicts; 6 A/B verdict
|
|
31
|
+
JSONs. Second-pass: not-required (no gate/lifecycle/messaging decision logic
|
|
32
|
+
touched — documentation + CI-time data only).
|