instar 1.3.887 → 1.3.889

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 (131) hide show
  1. package/dashboard/index.html +12 -0
  2. package/dashboard/preferences-learning.js +87 -5
  3. package/dist/cli.js +8 -0
  4. package/dist/cli.js.map +1 -1
  5. package/dist/commands/gate.d.ts +3 -0
  6. package/dist/commands/gate.d.ts.map +1 -1
  7. package/dist/commands/gate.js +17 -0
  8. package/dist/commands/gate.js.map +1 -1
  9. package/dist/commands/init.js +3 -0
  10. package/dist/commands/init.js.map +1 -1
  11. package/dist/commands/server.d.ts.map +1 -1
  12. package/dist/commands/server.js +129 -0
  13. package/dist/commands/server.js.map +1 -1
  14. package/dist/config/ConfigDefaults.d.ts.map +1 -1
  15. package/dist/config/ConfigDefaults.js +20 -0
  16. package/dist/config/ConfigDefaults.js.map +1 -1
  17. package/dist/core/BackupManager.d.ts.map +1 -1
  18. package/dist/core/BackupManager.js +9 -0
  19. package/dist/core/BackupManager.js.map +1 -1
  20. package/dist/core/ClassReviewReplicatedStore.d.ts +27 -0
  21. package/dist/core/ClassReviewReplicatedStore.d.ts.map +1 -0
  22. package/dist/core/ClassReviewReplicatedStore.js +153 -0
  23. package/dist/core/ClassReviewReplicatedStore.js.map +1 -0
  24. package/dist/core/CoherenceJournal.d.ts +1 -1
  25. package/dist/core/CoherenceJournal.d.ts.map +1 -1
  26. package/dist/core/CoherenceJournal.js +9 -2
  27. package/dist/core/CoherenceJournal.js.map +1 -1
  28. package/dist/core/PostUpdateMigrator.d.ts +2 -1
  29. package/dist/core/PostUpdateMigrator.d.ts.map +1 -1
  30. package/dist/core/PostUpdateMigrator.js +153 -0
  31. package/dist/core/PostUpdateMigrator.js.map +1 -1
  32. package/dist/core/StopGateBreakerState.d.ts +45 -0
  33. package/dist/core/StopGateBreakerState.d.ts.map +1 -0
  34. package/dist/core/StopGateBreakerState.js +49 -0
  35. package/dist/core/StopGateBreakerState.js.map +1 -0
  36. package/dist/core/StopGateDb.d.ts +25 -1
  37. package/dist/core/StopGateDb.d.ts.map +1 -1
  38. package/dist/core/StopGateDb.js +125 -0
  39. package/dist/core/StopGateDb.js.map +1 -1
  40. package/dist/core/UnjustifiedStopGate.d.ts +22 -1
  41. package/dist/core/UnjustifiedStopGate.d.ts.map +1 -1
  42. package/dist/core/UnjustifiedStopGate.js +165 -8
  43. package/dist/core/UnjustifiedStopGate.js.map +1 -1
  44. package/dist/core/WriteDomainRegistry.d.ts.map +1 -1
  45. package/dist/core/WriteDomainRegistry.js +32 -0
  46. package/dist/core/WriteDomainRegistry.js.map +1 -1
  47. package/dist/core/componentCategories.d.ts.map +1 -1
  48. package/dist/core/componentCategories.js +2 -0
  49. package/dist/core/componentCategories.js.map +1 -1
  50. package/dist/core/devGatedFeatures.d.ts.map +1 -1
  51. package/dist/core/devGatedFeatures.js +18 -0
  52. package/dist/core/devGatedFeatures.js.map +1 -1
  53. package/dist/core/machineCoherenceManifest.d.ts +2 -2
  54. package/dist/core/machineCoherenceManifest.d.ts.map +1 -1
  55. package/dist/core/machineCoherenceManifest.js +2 -1
  56. package/dist/core/machineCoherenceManifest.js.map +1 -1
  57. package/dist/core/types.d.ts +17 -0
  58. package/dist/core/types.d.ts.map +1 -1
  59. package/dist/core/types.js.map +1 -1
  60. package/dist/data/llmBenchCoverage.d.ts.map +1 -1
  61. package/dist/data/llmBenchCoverage.js +14 -0
  62. package/dist/data/llmBenchCoverage.js.map +1 -1
  63. package/dist/data/provenanceCoverage.d.ts +4 -0
  64. package/dist/data/provenanceCoverage.d.ts.map +1 -1
  65. package/dist/data/provenanceCoverage.js +20 -0
  66. package/dist/data/provenanceCoverage.js.map +1 -1
  67. package/dist/monitoring/ClaimClauseArbiter.d.ts +54 -0
  68. package/dist/monitoring/ClaimClauseArbiter.d.ts.map +1 -0
  69. package/dist/monitoring/ClaimClauseArbiter.js +163 -0
  70. package/dist/monitoring/ClaimClauseArbiter.js.map +1 -0
  71. package/dist/monitoring/ClassReviewStore.d.ts +152 -0
  72. package/dist/monitoring/ClassReviewStore.d.ts.map +1 -0
  73. package/dist/monitoring/ClassReviewStore.js +431 -0
  74. package/dist/monitoring/ClassReviewStore.js.map +1 -0
  75. package/dist/monitoring/CommitmentTracker.d.ts +5 -0
  76. package/dist/monitoring/CommitmentTracker.d.ts.map +1 -1
  77. package/dist/monitoring/CommitmentTracker.js +2 -0
  78. package/dist/monitoring/CommitmentTracker.js.map +1 -1
  79. package/dist/monitoring/CompletionClaimVerifier.d.ts +79 -0
  80. package/dist/monitoring/CompletionClaimVerifier.d.ts.map +1 -0
  81. package/dist/monitoring/CompletionClaimVerifier.js +281 -0
  82. package/dist/monitoring/CompletionClaimVerifier.js.map +1 -0
  83. package/dist/monitoring/CorrectionCaptureLoop.d.ts +6 -1
  84. package/dist/monitoring/CorrectionCaptureLoop.d.ts.map +1 -1
  85. package/dist/monitoring/CorrectionCaptureLoop.js +10 -0
  86. package/dist/monitoring/CorrectionCaptureLoop.js.map +1 -1
  87. package/dist/monitoring/CorrectionClassReview.d.ts +93 -0
  88. package/dist/monitoring/CorrectionClassReview.d.ts.map +1 -0
  89. package/dist/monitoring/CorrectionClassReview.js +280 -0
  90. package/dist/monitoring/CorrectionClassReview.js.map +1 -0
  91. package/dist/monitoring/CorrectionInstanceFixGate.d.ts +20 -0
  92. package/dist/monitoring/CorrectionInstanceFixGate.d.ts.map +1 -0
  93. package/dist/monitoring/CorrectionInstanceFixGate.js +30 -0
  94. package/dist/monitoring/CorrectionInstanceFixGate.js.map +1 -0
  95. package/dist/monitoring/TurnEvidence.d.ts +38 -0
  96. package/dist/monitoring/TurnEvidence.d.ts.map +1 -0
  97. package/dist/monitoring/TurnEvidence.js +208 -0
  98. package/dist/monitoring/TurnEvidence.js.map +1 -0
  99. package/dist/monitoring/guardManifest.d.ts.map +1 -1
  100. package/dist/monitoring/guardManifest.js +26 -0
  101. package/dist/monitoring/guardManifest.js.map +1 -1
  102. package/dist/scaffold/templates.d.ts.map +1 -1
  103. package/dist/scaffold/templates.js +2 -0
  104. package/dist/scaffold/templates.js.map +1 -1
  105. package/dist/server/AgentServer.d.ts +6 -0
  106. package/dist/server/AgentServer.d.ts.map +1 -1
  107. package/dist/server/AgentServer.js +116 -1
  108. package/dist/server/AgentServer.js.map +1 -1
  109. package/dist/server/CapabilityIndex.d.ts.map +1 -1
  110. package/dist/server/CapabilityIndex.js +16 -0
  111. package/dist/server/CapabilityIndex.js.map +1 -1
  112. package/dist/server/routes.d.ts +3 -0
  113. package/dist/server/routes.d.ts.map +1 -1
  114. package/dist/server/routes.js +346 -9
  115. package/dist/server/routes.js.map +1 -1
  116. package/dist/testing/selfActionRegistry.d.ts +12 -0
  117. package/dist/testing/selfActionRegistry.d.ts.map +1 -1
  118. package/dist/testing/selfActionRegistry.js +87 -0
  119. package/dist/testing/selfActionRegistry.js.map +1 -1
  120. package/package.json +1 -1
  121. package/src/data/builtin-manifest.json +98 -98
  122. package/src/data/llmBenchCoverage.ts +14 -0
  123. package/src/data/provenanceCoverage.ts +24 -0
  124. package/src/scaffold/templates/jobs/instar/correction-class-review-backstop.md +23 -0
  125. package/src/scaffold/templates.ts +2 -0
  126. package/src/templates/hooks/settings-template.json +10 -0
  127. package/upgrades/1.3.888.md +26 -0
  128. package/upgrades/1.3.889.md +26 -0
  129. package/upgrades/eli16/durable-stop-gate-breaker.eli16.md +30 -0
  130. package/upgrades/side-effects/NEXT.md +57 -68
  131. package/upgrades/side-effects/durable-stop-gate-breaker.md +141 -0
@@ -3743,6 +3743,16 @@
3743
3743
  <p class="ph-h-sub">Patterns I've distilled from moments you corrected me. The exact words are never stored — just a short, scrubbed summary.</p>
3744
3744
  <div id="plCorrections"></div>
3745
3745
  </section>
3746
+ <section class="ph-section">
3747
+ <h3 class="ph-h">Class reviews and outcomes</h3>
3748
+ <p class="ph-h-sub">The standard and process question each correction opened, with their independent durable outcomes.</p>
3749
+ <div id="plClassReviews"></div>
3750
+ </section>
3751
+ <section class="ph-section">
3752
+ <h3 class="ph-h">Verify-before-done observations</h3>
3753
+ <p class="ph-h-sub">Advisory evidence checks from recent completion claims. This never blocks a response.</p>
3754
+ <div id="plCompletionAudit"></div>
3755
+ </section>
3746
3756
  </div>
3747
3757
 
3748
3758
  <!-- machines tab (Multi-Machine Session Pool §L2) -->
@@ -8812,6 +8822,8 @@
8812
8822
  headline: document.getElementById('plHeadline'),
8813
8823
  preferences: document.getElementById('plPreferences'),
8814
8824
  corrections: document.getElementById('plCorrections'),
8825
+ classReviews: document.getElementById('plClassReviews'),
8826
+ completionAudit: document.getElementById('plCompletionAudit'),
8815
8827
  stamp: document.getElementById('plStamp'),
8816
8828
  };
8817
8829
  // Raw fetch (NOT apiFetch) so the controller sees 503 itself.
@@ -227,6 +227,81 @@ export function renderCorrections(doc, target, body, now = Date.now()) {
227
227
  }
228
228
  }
229
229
 
230
+ export function renderClassReviews(doc, target, body) {
231
+ if (!target) return;
232
+ target.replaceChildren();
233
+ if (body && body.disabled) {
234
+ target.appendChild(el(doc, 'p', 'ph-empty', 'Class review is still dark on this agent.'));
235
+ return;
236
+ }
237
+ const records = body && Array.isArray(body.records) ? body.records.slice(0, 20) : [];
238
+ if (!records.length) { target.appendChild(el(doc, 'p', 'ph-empty', 'No class reviews yet.')); return; }
239
+ for (const record of records) {
240
+ const item = doc.createElement('details');
241
+ item.setAttribute('class', 'ph-item');
242
+ const heading = doc.createElement('summary');
243
+ heading.setAttribute('class', 'ph-item-summary');
244
+ heading.appendChild(el(doc, 'div', 'ph-item-text', `${friendlyReviewValue(record.standardReview?.verdict || record.fillState, 'Review pending')} · ${friendlyReviewValue(record.processReview?.verdict, 'Process review pending')}`));
245
+ item.appendChild(heading);
246
+ const detail = el(doc, 'div', 'ph-item-body');
247
+ detail.appendChild(labeledRow(doc, 'Lifecycle', friendlyReviewValue(record.reviewLifecycle, 'Open')));
248
+ detail.appendChild(labeledRow(doc, 'Standard outcome', friendlyReviewValue(record.standardOutcome, 'Proposed')));
249
+ detail.appendChild(labeledRow(doc, 'Process outcome', friendlyReviewValue(record.processOutcome, 'Proposed')));
250
+ item.appendChild(detail);
251
+ target.appendChild(item);
252
+ }
253
+ }
254
+
255
+ export function renderCompletionAudit(doc, target, body) {
256
+ if (!target) return;
257
+ target.replaceChildren();
258
+ if (body && body.disabled) { target.appendChild(el(doc, 'p', 'ph-empty', 'Verify-before-done is still dark on this agent.')); return; }
259
+ const records = body && Array.isArray(body.records) ? body.records.slice(-20).reverse() : [];
260
+ if (!records.length) { target.appendChild(el(doc, 'p', 'ph-empty', 'No completion observations yet.')); return; }
261
+ for (const record of records) {
262
+ const item = doc.createElement('details');
263
+ item.setAttribute('class', 'ph-item');
264
+ const heading = doc.createElement('summary');
265
+ heading.setAttribute('class', 'ph-item-summary');
266
+ heading.appendChild(el(doc, 'div', 'ph-item-text', friendlyReviewValue(record.verdict, 'Observed')));
267
+ item.appendChild(heading);
268
+ const detail = el(doc, 'div', 'ph-item-body');
269
+ detail.appendChild(labeledRow(doc, 'Action', friendlyActionKind(record.actionKind)));
270
+ detail.appendChild(labeledRow(doc, 'Blocked', 'No — advisory only'));
271
+ item.appendChild(detail);
272
+ target.appendChild(item);
273
+ }
274
+ }
275
+
276
+ const REVIEW_VALUE_LABELS = Object.freeze({
277
+ pending: 'Review pending', filled: 'Review complete', 'dead-lettered': 'Needs a manual retry',
278
+ covered: 'Covered by an existing standard', 'needs-upgrade': 'Needs a standard upgrade',
279
+ 'new-standard-needed': 'Needs a new standard', 'not-applicable': 'No class change needed',
280
+ 'process-gap': 'Process gap found', open: 'Open', parked: 'Parked for follow-up',
281
+ resolved: 'Resolved', superseded: 'Combined into another review', reopened: 'Reopened',
282
+ proposed: 'Proposed', ratified: 'Approved', shipped: 'Shipped', rejected: 'Declined',
283
+ deferred: 'Parked for follow-up', 'expired-unreviewed': 'Awaiting overdue review',
284
+ 'no-action': 'No action needed', observed: 'Observed', corroborated: 'Evidence found',
285
+ 'uncorroborated-contradicted': 'Evidence contradicts this claim',
286
+ 'uncorroborated-unknown': 'Evidence was not found', 'not-eligible': 'Not eligible for this check',
287
+ 'not-evaluated': 'Not evaluated',
288
+ });
289
+
290
+ export function friendlyReviewValue(value, fallback = 'Status unavailable') {
291
+ return typeof value === 'string' && REVIEW_VALUE_LABELS[value]
292
+ ? REVIEW_VALUE_LABELS[value]
293
+ : fallback;
294
+ }
295
+
296
+ const ACTION_KIND_LABELS = Object.freeze({
297
+ sent: 'Message sent', deployed: 'Deployment', 'handed-off': 'Handoff', committed: 'Commit',
298
+ pushed: 'Push', merged: 'Merge', restarted: 'Restart', fixed: 'Fix', other: 'Other action',
299
+ });
300
+
301
+ export function friendlyActionKind(value) {
302
+ return typeof value === 'string' && ACTION_KIND_LABELS[value] ? ACTION_KIND_LABELS[value] : 'Other action';
303
+ }
304
+
230
305
  /**
231
306
  * Disabled (503) state. Pinned copy + operator hint as PLAIN PROSE — no
232
307
  * `<code>`, no monospace, no config-key string (Dashboard Standard).
@@ -245,7 +320,7 @@ export function renderDisabled(doc, els) {
245
320
  det.appendChild(el(doc, 'p', 'ph-operator-hint', 'You can switch it on in this agent’s settings.'));
246
321
  els.headline.appendChild(det);
247
322
  }
248
- for (const k of ['preferences', 'corrections']) {
323
+ for (const k of ['preferences', 'corrections', 'classReviews', 'completionAudit']) {
249
324
  if (els[k]) els[k].replaceChildren();
250
325
  }
251
326
  if (els.stamp) els.stamp.textContent = '';
@@ -255,6 +330,8 @@ export function renderDisabled(doc, els) {
255
330
  const URLS = {
256
331
  prefs: '/preferences/session-context',
257
332
  corrections: '/corrections?limit=20',
333
+ classReviews: '/class-reviews?limit=20',
334
+ completionAudit: '/completion-claim/audit?limit=20',
258
335
  };
259
336
 
260
337
  /**
@@ -280,10 +357,10 @@ export function createController(opts) {
280
357
  timerId: null,
281
358
  inFlight: null,
282
359
  active: false,
283
- snapshot: { prefs: null, corrections: null },
360
+ snapshot: { prefs: null, corrections: null, classReviews: null, completionAudit: null },
284
361
  last200At: 0,
285
362
  consecutiveFailedTicks: 0,
286
- renderedSig: { headline: null, preferences: null, corrections: null, disabled: false },
363
+ renderedSig: { headline: null, preferences: null, corrections: null, classReviews: null, completionAudit: null, disabled: false },
287
364
  };
288
365
 
289
366
  async function fetchOne(key, controller) {
@@ -303,7 +380,7 @@ export function createController(opts) {
303
380
  state.inFlight = controller;
304
381
  let results;
305
382
  try {
306
- results = await Promise.all(['prefs', 'corrections'].map((k) => fetchOne(k, controller)));
383
+ results = await Promise.all(['prefs', 'corrections', 'classReviews', 'completionAudit'].map((k) => fetchOne(k, controller)));
307
384
  } catch {
308
385
  if (controller.signal && controller.signal.aborted) return;
309
386
  state.inFlight = null;
@@ -315,7 +392,7 @@ export function createController(opts) {
315
392
  if (controller.signal && controller.signal.aborted) return;
316
393
  state.inFlight = null;
317
394
  // Feature OFF (503 on EITHER endpoint) → pinned disabled copy.
318
- if (results.some((r) => r.status === 503)) {
395
+ if (results.some((r) => ['prefs', 'corrections'].includes(r.key) && r.status === 503)) {
319
396
  state.consecutiveFailedTicks = 0;
320
397
  if (state.renderedSig.disabled !== true) {
321
398
  renderDisabled(doc, els);
@@ -327,6 +404,7 @@ export function createController(opts) {
327
404
  state.renderedSig.disabled = false;
328
405
  for (const r of results) {
329
406
  if (r.status === 200) { state.snapshot[r.key] = r.body; }
407
+ else if (r.status === 503) { state.snapshot[r.key] = { disabled: true }; }
330
408
  }
331
409
  state.consecutiveFailedTicks = 0;
332
410
  state.last200At = now();
@@ -350,11 +428,15 @@ export function createController(opts) {
350
428
  const stale = headlineStale();
351
429
  const prefs = state.snapshot.prefs;
352
430
  const corrections = state.snapshot.corrections;
431
+ const classReviews = state.snapshot.classReviews;
432
+ const completionAudit = state.snapshot.completionAudit;
353
433
  const prefCount = prefs && Number.isFinite(prefs.count) ? prefs.count : 0;
354
434
 
355
435
  sectionRender('headline', sig(stale, prefCount), () => renderHeadline(doc, els.headline, { prefCount, stale }));
356
436
  sectionRender('preferences', sig(prefs), () => renderPreferences(doc, els.preferences, prefs));
357
437
  sectionRender('corrections', sig(corrections), () => renderCorrections(doc, els.corrections, corrections, now()));
438
+ sectionRender('classReviews', sig(classReviews), () => renderClassReviews(doc, els.classReviews, classReviews));
439
+ sectionRender('completionAudit', sig(completionAudit), () => renderCompletionAudit(doc, els.completionAudit, completionAudit));
358
440
 
359
441
  if (els.stamp) {
360
442
  const ageS = state.last200At ? Math.max(0, Math.round((now() - state.last200At) / 1000)) : null;
package/dist/cli.js CHANGED
@@ -2310,6 +2310,14 @@ gateCmd
2310
2310
  const { gateLog } = await import('./commands/gate.js');
2311
2311
  return gateLog(opts);
2312
2312
  });
2313
+ gateCmd
2314
+ .command('reset-breaker')
2315
+ .description('Clear the durable authority breaker after repairing a provider')
2316
+ .option('-d, --dir <path>', 'Project directory')
2317
+ .action(async (opts) => {
2318
+ const { gateResetBreaker } = await import('./commands/gate.js');
2319
+ return gateResetBreaker(opts);
2320
+ });
2313
2321
  // ── `instar dev:preflight` — contributor ship-gate verifier ────────
2314
2322
  program
2315
2323
  .command('dev:preflight')