instar 1.3.888 → 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 (109) hide show
  1. package/dashboard/index.html +12 -0
  2. package/dashboard/preferences-learning.js +87 -5
  3. package/dist/commands/init.js +3 -0
  4. package/dist/commands/init.js.map +1 -1
  5. package/dist/commands/server.d.ts.map +1 -1
  6. package/dist/commands/server.js +112 -0
  7. package/dist/commands/server.js.map +1 -1
  8. package/dist/config/ConfigDefaults.d.ts.map +1 -1
  9. package/dist/config/ConfigDefaults.js +20 -0
  10. package/dist/config/ConfigDefaults.js.map +1 -1
  11. package/dist/core/BackupManager.d.ts.map +1 -1
  12. package/dist/core/BackupManager.js +9 -0
  13. package/dist/core/BackupManager.js.map +1 -1
  14. package/dist/core/ClassReviewReplicatedStore.d.ts +27 -0
  15. package/dist/core/ClassReviewReplicatedStore.d.ts.map +1 -0
  16. package/dist/core/ClassReviewReplicatedStore.js +153 -0
  17. package/dist/core/ClassReviewReplicatedStore.js.map +1 -0
  18. package/dist/core/CoherenceJournal.d.ts +1 -1
  19. package/dist/core/CoherenceJournal.d.ts.map +1 -1
  20. package/dist/core/CoherenceJournal.js +9 -2
  21. package/dist/core/CoherenceJournal.js.map +1 -1
  22. package/dist/core/PostUpdateMigrator.d.ts +2 -1
  23. package/dist/core/PostUpdateMigrator.d.ts.map +1 -1
  24. package/dist/core/PostUpdateMigrator.js +153 -0
  25. package/dist/core/PostUpdateMigrator.js.map +1 -1
  26. package/dist/core/WriteDomainRegistry.d.ts.map +1 -1
  27. package/dist/core/WriteDomainRegistry.js +20 -0
  28. package/dist/core/WriteDomainRegistry.js.map +1 -1
  29. package/dist/core/componentCategories.d.ts.map +1 -1
  30. package/dist/core/componentCategories.js +2 -0
  31. package/dist/core/componentCategories.js.map +1 -1
  32. package/dist/core/devGatedFeatures.d.ts.map +1 -1
  33. package/dist/core/devGatedFeatures.js +18 -0
  34. package/dist/core/devGatedFeatures.js.map +1 -1
  35. package/dist/core/machineCoherenceManifest.d.ts +2 -2
  36. package/dist/core/machineCoherenceManifest.d.ts.map +1 -1
  37. package/dist/core/machineCoherenceManifest.js +2 -1
  38. package/dist/core/machineCoherenceManifest.js.map +1 -1
  39. package/dist/core/types.d.ts +17 -0
  40. package/dist/core/types.d.ts.map +1 -1
  41. package/dist/core/types.js.map +1 -1
  42. package/dist/data/llmBenchCoverage.d.ts.map +1 -1
  43. package/dist/data/llmBenchCoverage.js +14 -0
  44. package/dist/data/llmBenchCoverage.js.map +1 -1
  45. package/dist/data/provenanceCoverage.d.ts +4 -0
  46. package/dist/data/provenanceCoverage.d.ts.map +1 -1
  47. package/dist/data/provenanceCoverage.js +20 -0
  48. package/dist/data/provenanceCoverage.js.map +1 -1
  49. package/dist/monitoring/ClaimClauseArbiter.d.ts +54 -0
  50. package/dist/monitoring/ClaimClauseArbiter.d.ts.map +1 -0
  51. package/dist/monitoring/ClaimClauseArbiter.js +163 -0
  52. package/dist/monitoring/ClaimClauseArbiter.js.map +1 -0
  53. package/dist/monitoring/ClassReviewStore.d.ts +152 -0
  54. package/dist/monitoring/ClassReviewStore.d.ts.map +1 -0
  55. package/dist/monitoring/ClassReviewStore.js +431 -0
  56. package/dist/monitoring/ClassReviewStore.js.map +1 -0
  57. package/dist/monitoring/CommitmentTracker.d.ts +5 -0
  58. package/dist/monitoring/CommitmentTracker.d.ts.map +1 -1
  59. package/dist/monitoring/CommitmentTracker.js +2 -0
  60. package/dist/monitoring/CommitmentTracker.js.map +1 -1
  61. package/dist/monitoring/CompletionClaimVerifier.d.ts +79 -0
  62. package/dist/monitoring/CompletionClaimVerifier.d.ts.map +1 -0
  63. package/dist/monitoring/CompletionClaimVerifier.js +281 -0
  64. package/dist/monitoring/CompletionClaimVerifier.js.map +1 -0
  65. package/dist/monitoring/CorrectionCaptureLoop.d.ts +6 -1
  66. package/dist/monitoring/CorrectionCaptureLoop.d.ts.map +1 -1
  67. package/dist/monitoring/CorrectionCaptureLoop.js +10 -0
  68. package/dist/monitoring/CorrectionCaptureLoop.js.map +1 -1
  69. package/dist/monitoring/CorrectionClassReview.d.ts +93 -0
  70. package/dist/monitoring/CorrectionClassReview.d.ts.map +1 -0
  71. package/dist/monitoring/CorrectionClassReview.js +280 -0
  72. package/dist/monitoring/CorrectionClassReview.js.map +1 -0
  73. package/dist/monitoring/CorrectionInstanceFixGate.d.ts +20 -0
  74. package/dist/monitoring/CorrectionInstanceFixGate.d.ts.map +1 -0
  75. package/dist/monitoring/CorrectionInstanceFixGate.js +30 -0
  76. package/dist/monitoring/CorrectionInstanceFixGate.js.map +1 -0
  77. package/dist/monitoring/TurnEvidence.d.ts +38 -0
  78. package/dist/monitoring/TurnEvidence.d.ts.map +1 -0
  79. package/dist/monitoring/TurnEvidence.js +208 -0
  80. package/dist/monitoring/TurnEvidence.js.map +1 -0
  81. package/dist/monitoring/guardManifest.d.ts.map +1 -1
  82. package/dist/monitoring/guardManifest.js +26 -0
  83. package/dist/monitoring/guardManifest.js.map +1 -1
  84. package/dist/scaffold/templates.d.ts.map +1 -1
  85. package/dist/scaffold/templates.js +2 -0
  86. package/dist/scaffold/templates.js.map +1 -1
  87. package/dist/server/AgentServer.d.ts +6 -0
  88. package/dist/server/AgentServer.d.ts.map +1 -1
  89. package/dist/server/AgentServer.js +116 -1
  90. package/dist/server/AgentServer.js.map +1 -1
  91. package/dist/server/CapabilityIndex.d.ts.map +1 -1
  92. package/dist/server/CapabilityIndex.js +16 -0
  93. package/dist/server/CapabilityIndex.js.map +1 -1
  94. package/dist/server/routes.d.ts +3 -0
  95. package/dist/server/routes.d.ts.map +1 -1
  96. package/dist/server/routes.js +335 -8
  97. package/dist/server/routes.js.map +1 -1
  98. package/dist/testing/selfActionRegistry.d.ts.map +1 -1
  99. package/dist/testing/selfActionRegistry.js +32 -0
  100. package/dist/testing/selfActionRegistry.js.map +1 -1
  101. package/package.json +1 -1
  102. package/src/data/builtin-manifest.json +66 -66
  103. package/src/data/llmBenchCoverage.ts +14 -0
  104. package/src/data/provenanceCoverage.ts +24 -0
  105. package/src/scaffold/templates/jobs/instar/correction-class-review-backstop.md +23 -0
  106. package/src/scaffold/templates.ts +2 -0
  107. package/src/templates/hooks/settings-template.json +10 -0
  108. package/upgrades/1.3.889.md +26 -0
  109. package/upgrades/side-effects/NEXT.md +57 -68
@@ -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;
@@ -4136,6 +4136,9 @@ fi
4136
4136
  // Unjustified Stop Gate router — Stop hook that calls the server-side gate.
4137
4137
  // Shadow-mode by default; enforcement is controlled server-side.
4138
4138
  fs.writeFileSync(path.join(hooksDir, 'stop-gate-router.js'), migrator.getHookContent('stop-gate-router'), { mode: 0o755 });
4139
+ // Verify-Before-Done observer — structural client-side TurnEvidence, always
4140
+ // installed; fleet-dark/dev-dry-run gating occurs inside the hook + route.
4141
+ fs.writeFileSync(path.join(hooksDir, 'completion-claim-observe.js'), migrator.getHookContent('completion-claim-observe'), { mode: 0o755 });
4139
4142
  // Hook event reporter — posts hook events to the Instar server for observability
4140
4143
  // and session resumption (claudeSessionId). Uses command hooks because Claude Code
4141
4144
  // HTTP hooks (type: "http") silently fail to fire as of v2.1.78.