pluribus-context 0.3.22 → 0.3.26

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 (93) hide show
  1. package/CHANGELOG.md +25 -3
  2. package/README.md +2 -2
  3. package/docs/community-review-packet.md +2 -1
  4. package/docs/context-budget-receipts.md +150 -0
  5. package/docs/context-input-evidence.md +397 -0
  6. package/docs/context-receipts-for-agent-observability.md +177 -0
  7. package/docs/orchestration-search-receipts.md +102 -0
  8. package/docs/portability-fidelity-report.md +4 -2
  9. package/examples/context-input-evidence/AGENTS.md +12 -0
  10. package/examples/context-input-evidence/agent-overlay-log.jsonl +4 -0
  11. package/examples/context-input-evidence/agent-overlay-otel-trace.json +548 -0
  12. package/examples/context-input-evidence/agent-overlay-receipt.ndjson +3 -0
  13. package/examples/context-input-evidence/agentgateway-progressive-disclosure-otel-trace.json +393 -0
  14. package/examples/context-input-evidence/agentgateway-progressive-disclosure-receipt.ndjson +4 -0
  15. package/examples/context-input-evidence/brain-remediation-otel-trace.json +645 -0
  16. package/examples/context-input-evidence/brain-remediation-receipt.ndjson +7 -0
  17. package/examples/context-input-evidence/claudekit-mcp-manager-otel-trace.json +417 -0
  18. package/examples/context-input-evidence/claudekit-mcp-manager-receipt.ndjson +5 -0
  19. package/examples/context-input-evidence/cli-progressive-disclosure-otel-trace.json +399 -0
  20. package/examples/context-input-evidence/cli-progressive-disclosure-receipt.ndjson +4 -0
  21. package/examples/context-input-evidence/compaction-otel-trace.json +711 -0
  22. package/examples/context-input-evidence/compaction-receipt.ndjson +6 -0
  23. package/examples/context-input-evidence/context-selection-otel-trace.json +627 -0
  24. package/examples/context-input-evidence/context-selection-receipt.ndjson +7 -0
  25. package/examples/context-input-evidence/convert-agent-overlay-log.mjs +156 -0
  26. package/examples/context-input-evidence/convert-agentgateway-progressive-disclosure-log.mjs +251 -0
  27. package/examples/context-input-evidence/convert-brain-remediation-log.mjs +241 -0
  28. package/examples/context-input-evidence/convert-claudekit-mcp-manager-log.mjs +253 -0
  29. package/examples/context-input-evidence/convert-cli-progressive-disclosure-log.mjs +251 -0
  30. package/examples/context-input-evidence/convert-compaction-log.mjs +224 -0
  31. package/examples/context-input-evidence/convert-context-selection-log.mjs +247 -0
  32. package/examples/context-input-evidence/convert-mcp-tool-search-log.mjs +242 -0
  33. package/examples/context-input-evidence/convert-memory-consolidation-log.mjs +240 -0
  34. package/examples/context-input-evidence/convert-memory-governance-delete-log.mjs +223 -0
  35. package/examples/context-input-evidence/convert-memory-log.mjs +226 -0
  36. package/examples/context-input-evidence/convert-memory-provenance-log.mjs +263 -0
  37. package/examples/context-input-evidence/convert-secret-scanning-log.mjs +233 -0
  38. package/examples/context-input-evidence/convert-session-log.mjs +186 -0
  39. package/examples/context-input-evidence/convert-skill-log.mjs +161 -0
  40. package/examples/context-input-evidence/convert-skill-registry-log.mjs +246 -0
  41. package/examples/context-input-evidence/convert-skill-routing-log.mjs +253 -0
  42. package/examples/context-input-evidence/convert-subagent-context-budget-log.mjs +267 -0
  43. package/examples/context-input-evidence/convert-subagent-delegation-log.mjs +264 -0
  44. package/examples/context-input-evidence/export-otel-trace.mjs +128 -0
  45. package/examples/context-input-evidence/generate-receipt.mjs +188 -0
  46. package/examples/context-input-evidence/mcp-tool-search-otel-trace.json +477 -0
  47. package/examples/context-input-evidence/mcp-tool-search-receipt.ndjson +5 -0
  48. package/examples/context-input-evidence/memory-consolidation-otel-trace.json +492 -0
  49. package/examples/context-input-evidence/memory-consolidation-receipt.ndjson +4 -0
  50. package/examples/context-input-evidence/memory-governance-delete-otel-trace.json +614 -0
  51. package/examples/context-input-evidence/memory-governance-delete-receipt.ndjson +5 -0
  52. package/examples/context-input-evidence/memory-otel-trace.json +645 -0
  53. package/examples/context-input-evidence/memory-provenance-otel-trace.json +711 -0
  54. package/examples/context-input-evidence/memory-provenance-receipt.ndjson +5 -0
  55. package/examples/context-input-evidence/memory-receipt.ndjson +4 -0
  56. package/examples/context-input-evidence/otel-trace.json +1119 -0
  57. package/examples/context-input-evidence/receipt.ndjson +6 -0
  58. package/examples/context-input-evidence/sample-agentgateway-progressive-disclosure-log.jsonl +5 -0
  59. package/examples/context-input-evidence/sample-brain-remediation-log.jsonl +9 -0
  60. package/examples/context-input-evidence/sample-claudekit-mcp-manager-log.jsonl +6 -0
  61. package/examples/context-input-evidence/sample-cli-progressive-disclosure-log.jsonl +5 -0
  62. package/examples/context-input-evidence/sample-compaction-log.jsonl +7 -0
  63. package/examples/context-input-evidence/sample-context-selection-log.jsonl +7 -0
  64. package/examples/context-input-evidence/sample-mcp-tool-search-log.jsonl +6 -0
  65. package/examples/context-input-evidence/sample-memory-consolidation-log.jsonl +5 -0
  66. package/examples/context-input-evidence/sample-memory-governance-delete-log.jsonl +6 -0
  67. package/examples/context-input-evidence/sample-memory-provenance-log.jsonl +6 -0
  68. package/examples/context-input-evidence/sample-memory-retrieval-log.jsonl +6 -0
  69. package/examples/context-input-evidence/sample-secret-scanning-log.jsonl +7 -0
  70. package/examples/context-input-evidence/sample-session-log.jsonl +6 -0
  71. package/examples/context-input-evidence/sample-skill-registry-log.jsonl +5 -0
  72. package/examples/context-input-evidence/sample-skill-routing-log.jsonl +7 -0
  73. package/examples/context-input-evidence/sample-subagent-context-budget-log.jsonl +6 -0
  74. package/examples/context-input-evidence/sample-subagent-delegation-log.jsonl +5 -0
  75. package/examples/context-input-evidence/secret-scanning-otel-trace.json +794 -0
  76. package/examples/context-input-evidence/secret-scanning-receipt.ndjson +6 -0
  77. package/examples/context-input-evidence/session-otel-trace.json +411 -0
  78. package/examples/context-input-evidence/session-receipt.ndjson +2 -0
  79. package/examples/context-input-evidence/skill-invocation-log.jsonl +4 -0
  80. package/examples/context-input-evidence/skill-otel-trace.json +548 -0
  81. package/examples/context-input-evidence/skill-receipt.ndjson +3 -0
  82. package/examples/context-input-evidence/skill-registry-otel-trace.json +471 -0
  83. package/examples/context-input-evidence/skill-registry-receipt.ndjson +5 -0
  84. package/examples/context-input-evidence/skill-routing-otel-trace.json +567 -0
  85. package/examples/context-input-evidence/skill-routing-receipt.ndjson +6 -0
  86. package/examples/context-input-evidence/subagent-context-budget-otel-trace.json +507 -0
  87. package/examples/context-input-evidence/subagent-context-budget-receipt.ndjson +5 -0
  88. package/examples/context-input-evidence/subagent-delegation-otel-trace.json +388 -0
  89. package/examples/context-input-evidence/subagent-delegation-receipt.ndjson +4 -0
  90. package/package.json +6 -2
  91. package/schemas/audit-result.schema.json +409 -71
  92. package/src/commands/audit.js +64 -3
  93. package/src/utils/version.js +1 -1
@@ -9,6 +9,7 @@
9
9
 
10
10
  import * as fs from 'fs'
11
11
  import * as path from 'path'
12
+ import { createHash } from 'crypto'
12
13
  import { parsePluribusFile, validateSections, REQUIRED_SECTIONS } from '../utils/parser.js'
13
14
  import { resolveImportsAsync } from '../utils/imports.js'
14
15
  import { renderTemplate, parseSkillFile } from '../utils/renderer.js'
@@ -294,7 +295,9 @@ function buildFidelityReport({ cwd, sections, tools, loadSkill }) {
294
295
  const discovery = inferDiscovery(toolId, outputFiles)
295
296
  const represented = presentSections.filter((name) => representedSections.has(name.toLowerCase()))
296
297
 
298
+ const rendered = renderTemplate(skill.template, sections, 'pluribus.md')
297
299
  const loadEvidence = inferLoadEvidence(toolId, outputFiles, discovery, activation)
300
+ const duplicateLoadEvidence = inferDuplicateLoadEvidence(toolId, outputFiles, loadEvidence, rendered)
298
301
  const effectiveContext = inferEffectiveContext(toolId, outputFiles, loadEvidence)
299
302
 
300
303
  return {
@@ -306,8 +309,9 @@ function buildFidelityReport({ cwd, sections, tools, loadSkill }) {
306
309
  manualActivationRequired: discovery.manualActivationRequired,
307
310
  activation,
308
311
  loadEvidence,
312
+ duplicateLoadEvidence,
309
313
  effectiveContext,
310
- semanticDifference: summarizeSemanticDifference({ unsupportedSections, activation, discovery, effectiveContext, loadEvidence }),
314
+ semanticDifference: summarizeSemanticDifference({ unsupportedSections, activation, discovery, effectiveContext, loadEvidence, duplicateLoadEvidence }),
311
315
  representedSections: represented,
312
316
  unsupportedSections,
313
317
  }
@@ -348,6 +352,14 @@ function buildFidelityReport({ cwd, sections, tools, loadSkill }) {
348
352
  })
349
353
  }
350
354
 
355
+ if (targets.some((target) => target.duplicateLoadEvidence?.duplicateRisk === 'unknown')) {
356
+ warnings.push({
357
+ code: 'duplicate-load-selection-not-proven',
358
+ target: '*',
359
+ message: 'Duplicate load evidence records the Pluribus generated candidate, but does not inspect runtime scanner roots, caches, plugins, or sibling tool directories to prove which duplicate candidate the agent selected or suppressed.',
360
+ })
361
+ }
362
+
351
363
  const advancedSections = ['workflow', 'context', 'examples', 'anti-patterns'].filter((name) => lowerPresentSections.has(name))
352
364
  if (advancedSections.length > 0 && warnings.some((warning) => warning.code === 'section-not-rendered-by-target')) {
353
365
  warnings.push({
@@ -428,6 +440,48 @@ function inferLoadEvidence(toolId, outputFiles, discovery, activation) {
428
440
  }
429
441
  }
430
442
 
443
+
444
+ function inferDuplicateLoadEvidence(toolId, outputFiles, loadEvidence, rendered) {
445
+ const primaryFile = outputFiles[0] || null
446
+ const contentHash = typeof rendered === 'string'
447
+ ? `sha256:${createHash('sha256').update(rendered, 'utf8').digest('hex')}`
448
+ : null
449
+ const candidateLoads = primaryFile
450
+ ? [{
451
+ path: primaryFile,
452
+ contentHash,
453
+ toolOwner: toolId,
454
+ loadedBy: loadEvidence.loadedBy,
455
+ discoveryRoot: inferDiscoveryRoot(primaryFile),
456
+ priority: 'not-modeled',
457
+ source: 'pluribus-generated-output',
458
+ }]
459
+ : []
460
+
461
+ return {
462
+ contentIdentity: contentHash,
463
+ candidateLoads,
464
+ selectedLoad: candidateLoads[0]
465
+ ? {
466
+ ...candidateLoads[0],
467
+ selectionReason: 'only-pluribus-generated-output-for-target',
468
+ }
469
+ : null,
470
+ suppressedLoads: [],
471
+ selectionPolicy: 'not-proven-runtime-selection',
472
+ crossRootScanMode: 'not-inspected',
473
+ duplicateRisk: 'unknown',
474
+ invariant: 'For each session_id + logical context or skill name + content hash, inject at most one effective definition unless the second load is explicitly marked as replace or supplement.',
475
+ note: `${toolId} duplicate-load evidence covers the Pluribus generated output only; verify runtime scanner roots, caches, plugins, hooks, imports, and sibling tool directories before claiming duplicate suppression.`,
476
+ }
477
+ }
478
+
479
+ function inferDiscoveryRoot(file) {
480
+ if (!file) return null
481
+ const dirname = path.dirname(file)
482
+ return dirname === '.' ? 'repo-root' : dirname
483
+ }
484
+
431
485
  function inferEffectiveContext(toolId, outputFiles, loadEvidence) {
432
486
  return {
433
487
  scope: 'repo-root',
@@ -442,7 +496,7 @@ function inferEffectiveContext(toolId, outputFiles, loadEvidence) {
442
496
  }
443
497
  }
444
498
 
445
- function summarizeSemanticDifference({ unsupportedSections, activation, discovery, effectiveContext, loadEvidence }) {
499
+ function summarizeSemanticDifference({ unsupportedSections, activation, discovery, effectiveContext, loadEvidence, duplicateLoadEvidence }) {
446
500
  const differences = []
447
501
 
448
502
  if (unsupportedSections.length > 0) {
@@ -469,6 +523,10 @@ function summarizeSemanticDifference({ unsupportedSections, activation, discover
469
523
  differences.push('runtime-load-dedupe-not-proven')
470
524
  }
471
525
 
526
+ if (duplicateLoadEvidence?.duplicateRisk === 'unknown') {
527
+ differences.push('duplicate-load-selection-not-proven')
528
+ }
529
+
472
530
  return differences.length > 0 ? differences : ['no-known-template-loss']
473
531
  }
474
532
 
@@ -491,10 +549,13 @@ function printFidelityReport(report) {
491
549
  const loadedBy = target.loadEvidence?.loadedBy
492
550
  ? `; loaded by: ${target.loadEvidence.loadedBy}`
493
551
  : ''
552
+ const duplicateSelection = target.duplicateLoadEvidence?.duplicateRisk
553
+ ? `; duplicate selection: ${target.duplicateLoadEvidence.duplicateRisk}`
554
+ : ''
494
555
  const semantics = target.semanticDifference?.length
495
556
  ? `; semantic: ${target.semanticDifference.join(', ')}`
496
557
  : ''
497
- console.log(` • ${target.toolId}: ${target.activation.kind}${discovery}${scope}${loadedBy}${unsupported}${semantics}`)
558
+ console.log(` • ${target.toolId}: ${target.activation.kind}${discovery}${scope}${loadedBy}${duplicateSelection}${unsupported}${semantics}`)
498
559
  }
499
560
 
500
561
  for (const warning of report.warnings) {
@@ -1 +1 @@
1
- export const VERSION = '0.3.22'
1
+ export const VERSION = '0.3.26'