pluribus-context 0.3.21 → 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 +31 -3
  2. package/README.md +2 -2
  3. package/docs/community-review-packet.md +4 -2
  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 +10 -6
  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 +468 -43
  92. package/src/commands/audit.js +105 -5
  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,10 @@ 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
 
297
- const effectiveContext = inferEffectiveContext(toolId, outputFiles)
298
+ const rendered = renderTemplate(skill.template, sections, 'pluribus.md')
299
+ const loadEvidence = inferLoadEvidence(toolId, outputFiles, discovery, activation)
300
+ const duplicateLoadEvidence = inferDuplicateLoadEvidence(toolId, outputFiles, loadEvidence, rendered)
301
+ const effectiveContext = inferEffectiveContext(toolId, outputFiles, loadEvidence)
298
302
 
299
303
  return {
300
304
  toolId,
@@ -304,8 +308,10 @@ function buildFidelityReport({ cwd, sections, tools, loadSkill }) {
304
308
  genericFallback: discovery.genericFallback,
305
309
  manualActivationRequired: discovery.manualActivationRequired,
306
310
  activation,
311
+ loadEvidence,
312
+ duplicateLoadEvidence,
307
313
  effectiveContext,
308
- semanticDifference: summarizeSemanticDifference({ unsupportedSections, activation, discovery, effectiveContext }),
314
+ semanticDifference: summarizeSemanticDifference({ unsupportedSections, activation, discovery, effectiveContext, loadEvidence, duplicateLoadEvidence }),
309
315
  representedSections: represented,
310
316
  unsupportedSections,
311
317
  }
@@ -338,6 +344,22 @@ function buildFidelityReport({ cwd, sections, tools, loadSkill }) {
338
344
  })
339
345
  }
340
346
 
347
+ if (targets.some((target) => target.loadEvidence?.dedupeRisk === 'unknown')) {
348
+ warnings.push({
349
+ code: 'load-dedupe-not-proven',
350
+ target: '*',
351
+ message: 'Load evidence records the expected delivery path, but Pluribus does not currently prove runtime deduplication across native files, hooks, generated imports, or manual injection.',
352
+ })
353
+ }
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
+
341
363
  const advancedSections = ['workflow', 'context', 'examples', 'anti-patterns'].filter((name) => lowerPresentSections.has(name))
342
364
  if (advancedSections.length > 0 && warnings.some((warning) => warning.code === 'section-not-rendered-by-target')) {
343
365
  warnings.push({
@@ -398,7 +420,69 @@ function inferDiscovery(toolId, outputFiles) {
398
420
  }
399
421
  }
400
422
 
401
- function inferEffectiveContext(toolId, outputFiles) {
423
+ function inferLoadEvidence(toolId, outputFiles, discovery, activation) {
424
+ const primaryFile = outputFiles[0] || null
425
+ const loadedBy = discovery.genericFallback ? 'generic-agent-file' : 'native-file-discovery'
426
+
427
+ return {
428
+ loadedBy,
429
+ effectiveSource: primaryFile,
430
+ deliveryPath: primaryFile,
431
+ deliveryMechanism: discovery.genericFallback ? 'generated-generic-fallback' : 'generated-native-surface',
432
+ hookInstalled: false,
433
+ injectedOnSessionStart: false,
434
+ manualInjectionRequired: discovery.manualActivationRequired,
435
+ resumeBehavior: 'not-proven',
436
+ dedupeKey: primaryFile ? `${toolId}:${loadedBy}:${primaryFile}` : `${toolId}:${loadedBy}:unknown`,
437
+ dedupeRisk: 'unknown',
438
+ evidence: outputFiles,
439
+ note: `${toolId} load path is inferred from generated files and known discovery surfaces; verify runtime loading/deduplication in the target agent when hooks, imports, or manual injection are also used.`,
440
+ }
441
+ }
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
+
485
+ function inferEffectiveContext(toolId, outputFiles, loadEvidence) {
402
486
  return {
403
487
  scope: 'repo-root',
404
488
  pathScoped: false,
@@ -406,11 +490,13 @@ function inferEffectiveContext(toolId, outputFiles) {
406
490
  overrideBehavior: 'none-modeled',
407
491
  isolationEvidence: 'not-modeled',
408
492
  entrypoints: outputFiles,
493
+ loadedBy: loadEvidence.loadedBy,
494
+ effectiveSource: loadEvidence.effectiveSource,
409
495
  note: `${toolId} output is audited as repo-root context only; verify subdirectory load order separately in monorepos.`,
410
496
  }
411
497
  }
412
498
 
413
- function summarizeSemanticDifference({ unsupportedSections, activation, discovery, effectiveContext }) {
499
+ function summarizeSemanticDifference({ unsupportedSections, activation, discovery, effectiveContext, loadEvidence, duplicateLoadEvidence }) {
414
500
  const differences = []
415
501
 
416
502
  if (unsupportedSections.length > 0) {
@@ -433,6 +519,14 @@ function summarizeSemanticDifference({ unsupportedSections, activation, discover
433
519
  differences.push('manual-activation-required')
434
520
  }
435
521
 
522
+ if (loadEvidence?.dedupeRisk === 'unknown') {
523
+ differences.push('runtime-load-dedupe-not-proven')
524
+ }
525
+
526
+ if (duplicateLoadEvidence?.duplicateRisk === 'unknown') {
527
+ differences.push('duplicate-load-selection-not-proven')
528
+ }
529
+
436
530
  return differences.length > 0 ? differences : ['no-known-template-loss']
437
531
  }
438
532
 
@@ -452,10 +546,16 @@ function printFidelityReport(report) {
452
546
  const scope = target.effectiveContext?.scope
453
547
  ? `; effective context: ${target.effectiveContext.scope}`
454
548
  : ''
549
+ const loadedBy = target.loadEvidence?.loadedBy
550
+ ? `; loaded by: ${target.loadEvidence.loadedBy}`
551
+ : ''
552
+ const duplicateSelection = target.duplicateLoadEvidence?.duplicateRisk
553
+ ? `; duplicate selection: ${target.duplicateLoadEvidence.duplicateRisk}`
554
+ : ''
455
555
  const semantics = target.semanticDifference?.length
456
556
  ? `; semantic: ${target.semanticDifference.join(', ')}`
457
557
  : ''
458
- console.log(` • ${target.toolId}: ${target.activation.kind}${discovery}${scope}${unsupported}${semantics}`)
558
+ console.log(` • ${target.toolId}: ${target.activation.kind}${discovery}${scope}${loadedBy}${duplicateSelection}${unsupported}${semantics}`)
459
559
  }
460
560
 
461
561
  for (const warning of report.warnings) {
@@ -1 +1 @@
1
- export const VERSION = '0.3.21'
1
+ export const VERSION = '0.3.26'