kushi-agents 5.5.0 → 5.5.1

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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "kushi-agents",
3
- "version": "5.5.0",
3
+ "version": "5.5.1",
4
4
  "description": "Install Kushi — multi-source project evidence agent with Comprehensive Structured Capture (CSC) into weekly-only files across Email, Teams, OneNote, Loop, SharePoint, Meetings, CRM, ADO. Meetings retain a sibling verbatim/ audit folder. WorkIQ-only for M365 sources (Graph / m365_* FORBIDDEN as fallbacks; user-paste is first-class). Host-agnostic.",
5
5
  "type": "module",
6
6
  "bin": {
@@ -57,4 +57,5 @@
57
57
  "publishConfig": {
58
58
  "access": "public"
59
59
  }
60
- }
60
+ }
61
+
@@ -65,3 +65,26 @@ Probes D44–D47 will assert:
65
65
  - D45: no SKILL.md contains forbidden phrasings (HTTP verbs, manual path templates, week-math snippets).
66
66
  - D46: every runner has integration tests under `plugin/runners/test/integration/`.
67
67
  - D47: every runner emits a stdout JSON line on the happy path under fixture mode.
68
+
69
+ ## Legacy probe carve-out (v5.5.1)
70
+
71
+ The following pre-v5.5.0 probes assumed SKILL.md inlined doctrine cites, validation loops, and orchestrator checklists. In v5.5.0+ those concerns live in the runner + its tests, so the probes **skip thin-pointer skills** (the same nine listed in `D44` `$v550Map`):
72
+
73
+ | Probe | What it used to require | Where it lives now |
74
+ |-------|------------------------|--------------------|
75
+ | C12 | `evidence-thoroughness` cite in pull-* SKILL.md | runner: thoroughness retry loop |
76
+ | D2 | `snapshot-vs-stream.instructions.md` cite in pull-* SKILL.md | runner JSDoc + integration tests |
77
+ | D3 | "WorkIQ" in pull-* SKILL.md Tools section | runner's discovery code path |
78
+ | D6 | `side-by-side-config` cite in bootstrap/refresh SKILL.md | runner: config-write helper |
79
+ | D11 | `verbatim-by-default` + v3.7.6 contracts cite | runner: `lib/verbatim.mjs` + tests |
80
+ | D12 | `m365-id-registry` tokens in SKILL.md | runner: `lib/id-registry.mjs` |
81
+ | D17 | `fuzzy-disambiguation` cite in name→ID skills | runner: name→ID resolver |
82
+ | D18 | `per-source-verification-gate` cite | runner: gate check before write |
83
+ | D26 | `issue-recovery` cite | runner: error-classification helper |
84
+ | D30.references-layout | `Load references/...` pointer when `references/` exists | runner loads its own packs |
85
+ | D30.checklist-orchestrators | `- [ ]` items in orchestrator SKILL.md | `refresh.mjs` orchestrates |
86
+ | D30.validation-loop | `## Validation loop` in writer SKILL.md | runner integration tests |
87
+ | D34.retrofit-clean | skill-checker `--retrofit` non-additive gaps == 0 | n/a for thin-pointers |
88
+
89
+ Non-thin-pointer skills (e.g. `pull-loop`, `pull-misc`, `aggregate-project`, `consolidate-evidence`) still get all of these checks.
90
+
@@ -279,6 +279,13 @@ $agentFile = Join-Path $pluginDir 'agents\kushi.agent.md'
279
279
  $readmeFile = Join-Path $Root 'README.md'
280
280
  $wtlFile = Join-Path $Root 'docs\reference\where-things-live.md'
281
281
 
282
+ # v5.5.0 thin-pointer skills — see plugin/instructions/llm-vs-runner.instructions.md
283
+ # "Legacy probe carve-out" table for which probes skip these and why.
284
+ $thinPointerSkills = @(
285
+ 'pull-crm','pull-ado','pull-email','pull-teams','pull-meetings',
286
+ 'pull-onenote','pull-sharepoint','bootstrap-project','refresh-project'
287
+ )
288
+
282
289
  if (-not (Test-Path $pluginDir)) {
283
290
  Write-Error "plugin/ not found at $pluginDir — run from kushi repo root or pass -Root."
284
291
  exit 2
@@ -513,7 +520,8 @@ foreach ($name in $fdeSkills) {
513
520
  }
514
521
 
515
522
  # === C12: pull-* skills must reference evidence-thoroughness (merged thoroughness-detector v4.4.9) ===
516
- foreach ($d in $skillDirs | Where-Object { $_.Name -like 'pull-*' }) {
523
+ # Skip thin-pointers runner owns thoroughness retry in v5.5.0.
524
+ foreach ($d in $skillDirs | Where-Object { $_.Name -like 'pull-*' -and ($thinPointerSkills -notcontains $_.Name) }) {
517
525
  $f = Join-Path $d.FullName 'SKILL.md'
518
526
  $text = $mdText[$f]
519
527
  if (-not $text) { continue }
@@ -545,6 +553,11 @@ if (-not (Test-Path $detectorFile)) {
545
553
 
546
554
  # === Deep checks ===
547
555
  if ($Deep) {
556
+ # See module-level $thinPointerSkills (line ~282) and
557
+ # plugin/instructions/llm-vs-runner.instructions.md for the rationale on
558
+ # why pre-v5.5.0 probes skip thin-pointer SKILL.md files. Coverage for
559
+ # those skills lives in D44–D47 V550Runners probes lower in this file.
560
+
548
561
  # D1: templates referenced from skills exist
549
562
  $templatesDir = Join-Path $pluginDir 'templates'
550
563
  foreach ($d in $skillDirs) {
@@ -559,16 +572,16 @@ if ($Deep) {
559
572
  }
560
573
  }
561
574
  }
562
- # D2: pull-* skills must reference snapshot-vs-stream
563
- foreach ($d in $skillDirs | Where-Object { $_.Name -like 'pull-*' }) {
575
+ # D2: pull-* skills must reference snapshot-vs-stream (skip thin-pointers; runner owns this contract in v5.5.0)
576
+ foreach ($d in $skillDirs | Where-Object { $_.Name -like 'pull-*' -and ($thinPointerSkills -notcontains $_.Name) }) {
564
577
  $f = Join-Path $d.FullName 'SKILL.md'
565
578
  $text = $mdText[$f]
566
579
  if ($text -notmatch 'snapshot-vs-stream\.instructions\.md') {
567
580
  Add-Finding D2 'Snapshot/Stream' 'warning' "Skill $($d.Name) doesn't cite snapshot-vs-stream.instructions.md" "Add a reference (e.g. 'per snapshot-vs-stream.instructions.md') in the skill body." $f 0
568
581
  }
569
582
  }
570
- # D3: pull-* must list WorkIQ in Tools section (order is the skill's choice; some skills correctly prefer REST/host first when WorkIQ summarizes — see pull-crm/email/onenote v3.7.x)
571
- foreach ($d in $skillDirs | Where-Object { $_.Name -like 'pull-*' }) {
583
+ # D3: pull-* must list WorkIQ in Tools section (skip thin-pointers; runner owns discovery + capture in v5.5.0)
584
+ foreach ($d in $skillDirs | Where-Object { $_.Name -like 'pull-*' -and ($thinPointerSkills -notcontains $_.Name) }) {
572
585
  $f = Join-Path $d.FullName 'SKILL.md'
573
586
  $text = $mdText[$f]
574
587
  if ($text -notmatch '(?ms)\bWorkIQ\b') {
@@ -642,7 +655,7 @@ if ($Deep) {
642
655
  }
643
656
  }
644
657
  # D6: side-by-side rule cited where user config is touched
645
- $configTouchers = @('bootstrap-project','refresh-project') # heuristic
658
+ $configTouchers = @('bootstrap-project','refresh-project') | Where-Object { $thinPointerSkills -notcontains $_ } # v5.5.0: runner owns side-by-side config writes
646
659
  foreach ($name in $configTouchers) {
647
660
  $f = Join-Path $skillsDir "$name\SKILL.md"
648
661
  if (Test-Path $f) {
@@ -740,8 +753,8 @@ if ($Deep) {
740
753
  }
741
754
  }
742
755
 
743
- # D11: pull-* skills SKILL.md cite verbatim-by-default contract in front blockquote
744
- $pullSkillDirs = Get-ChildItem -Path (Join-Path $pluginDir 'skills') -Directory | Where-Object { $_.Name -like 'pull-*' -or $_.Name -in @('bootstrap-project','refresh-project') }
756
+ # D11: pull-* skills SKILL.md cite verbatim-by-default contract in front blockquote (skip thin-pointers; runner owns verbatim doctrine in v5.5.0)
757
+ $pullSkillDirs = Get-ChildItem -Path (Join-Path $pluginDir 'skills') -Directory | Where-Object { ($_.Name -like 'pull-*' -or $_.Name -in @('bootstrap-project','refresh-project')) -and ($thinPointerSkills -notcontains $_.Name) }
745
758
  foreach ($sd in $pullSkillDirs) {
746
759
  $sf = Join-Path $sd.FullName 'SKILL.md'
747
760
  if (Test-Path $sf) {
@@ -765,7 +778,7 @@ if ($Deep) {
765
778
  @{ name='refresh-project'; required=@('m365-id-registry','knownSections') },
766
779
  @{ name='pull-onenote'; required=@('m365-id-registry','one_pages', 'webPageId', 'auth-required', 'playwright-profile') },
767
780
  @{ name='pull-misc'; required=@('m365-id-registry','external-links', 'misc_links', 'placeholder', 'delegated') }
768
- )
781
+ ) | Where-Object { $thinPointerSkills -notcontains $_.name } # v5.5.0: runner owns these tokens
769
782
  foreach ($rc in $registryConsumers) {
770
783
  $sf = Join-Path $pluginDir "skills\$($rc.name)\SKILL.md"
771
784
  if (Test-Path $sf) {
@@ -966,7 +979,7 @@ if ($Deep) {
966
979
  $fuzzyCallers = @(
967
980
  'pull-onenote','pull-sharepoint','pull-teams','pull-crm','pull-ado','pull-email',
968
981
  'engagement-root-resolution.instructions.md','ask-project'
969
- )
982
+ ) | Where-Object { $thinPointerSkills -notcontains $_ } # v5.5.0: runner owns name→ID resolution
970
983
  foreach ($caller in $fuzzyCallers) {
971
984
  $candidate = if ($caller -like '*.instructions.md') {
972
985
  Join-Path $instructionsDir $caller
@@ -988,6 +1001,7 @@ if ($Deep) {
988
1001
  Add-Finding D18 'Verification gate' 'warning' "plugin/instructions/per-source-verification-gate.instructions.md is missing" "Restore the v4.4.7 verification-gate doctrine." $gateInst 0
989
1002
  } else {
990
1003
  $gateCallers = @('bootstrap-project','refresh-project','aggregate-project') + (Get-ChildItem $skillsDir -Directory | Where-Object { $_.Name -like 'pull-*' } | Select-Object -ExpandProperty Name)
1004
+ $gateCallers = $gateCallers | Where-Object { $thinPointerSkills -notcontains $_ } # v5.5.0: runner enforces the gate
991
1005
  foreach ($caller in $gateCallers) {
992
1006
  $sf = Join-Path (Join-Path $skillsDir $caller) 'SKILL.md'
993
1007
  if (Test-Path $sf) {
@@ -1182,7 +1196,7 @@ if ($Deep) {
1182
1196
  'aggregate-project','consolidate-evidence',
1183
1197
  'bootstrap-project','refresh-project',
1184
1198
  'apply-ado-update','propose-ado-update'
1185
- )
1199
+ ) | Where-Object { $thinPointerSkills -notcontains $_ } # v5.5.0: runner cites issue-recovery
1186
1200
  foreach ($skillName in $recoveryRequired) {
1187
1201
  $skillFile = Join-Path $skillsDir "$skillName\SKILL.md"
1188
1202
  if (-not (Test-Path $skillFile)) { continue }
@@ -1664,9 +1678,9 @@ if ($Deep) {
1664
1678
  Add-Finding 'D30.skill-size' 'Spec compliance' 'warning' "$($d.Name)/SKILL.md is ~$skillTokens tokens (cap 5000)" "Split bulk content into plugin/skills/$($d.Name)/references/<topic>.md per agentskills-compliance.instructions.md." $skillFile 0
1665
1679
  }
1666
1680
 
1667
- # D30.references-layout — if references/ exists, SKILL.md must cite at least one "Load references/..." pointer.
1681
+ # D30.references-layout — if references/ exists, SKILL.md must cite at least one "Load references/..." pointer. (skip thin-pointers; runner owns the reference packs)
1668
1682
  $refsDir = Join-Path $d.FullName 'references'
1669
- if (Test-Path $refsDir) {
1683
+ if ((Test-Path $refsDir) -and ($thinPointerSkills -notcontains $d.Name)) {
1670
1684
  $hasRefMention = $skillText -match 'references/[A-Za-z0-9_\-]+\.md'
1671
1685
  if (-not $hasRefMention) {
1672
1686
  Add-Finding 'D30.references-layout' 'Spec compliance' 'warning' "$($d.Name)/ has a references/ folder but SKILL.md never cites any references/<file>.md" "Add explicit load-on-trigger pointers, e.g. 'Load references/canonical-prompts.md when constructing the WorkIQ query.'" $skillFile 0
@@ -1680,15 +1694,15 @@ if ($Deep) {
1680
1694
  }
1681
1695
  }
1682
1696
 
1683
- # D30.checklist-orchestrators — orchestrators contain at least one `- [ ]` checklist item.
1684
- if ($orchestratorSkills -contains $d.Name) {
1697
+ # D30.checklist-orchestrators — orchestrators contain at least one `- [ ]` checklist item. (skip thin-pointers; orchestration moved into refresh.mjs in v5.5.0)
1698
+ if (($orchestratorSkills -contains $d.Name) -and ($thinPointerSkills -notcontains $d.Name)) {
1685
1699
  if ($skillText -notmatch '(?m)^\s*-\s+\[ \]') {
1686
1700
  Add-Finding 'D30.checklist-orchestrators' 'Spec compliance' 'warning' "$($d.Name)/SKILL.md is an orchestrator but contains no '- [ ]' checklist items" "Convert the numbered/prose step list to GitHub checkbox syntax per agentskills-compliance.instructions.md rule 4." $skillFile 0
1687
1701
  }
1688
1702
  }
1689
1703
 
1690
- # D30.validation-loop — writer skills contain a `## Validation loop` heading.
1691
- if ($writerSkills -contains $d.Name) {
1704
+ # D30.validation-loop — writer skills contain a `## Validation loop` heading. (skip thin-pointers; runner integration tests are the validation loop in v5.5.0)
1705
+ if (($writerSkills -contains $d.Name) -and ($thinPointerSkills -notcontains $d.Name)) {
1692
1706
  if ($skillText -notmatch '(?m)^##\s+Validation loop\b') {
1693
1707
  Add-Finding 'D30.validation-loop' 'Spec compliance' 'warning' "$($d.Name)/SKILL.md is a writer skill but is missing a '## Validation loop' section" "Append the standard validation loop (do → self-check -Targeted → fix → repeat → log success) per agentskills-compliance.instructions.md rule 5." $skillFile 0
1694
1708
  }
@@ -1962,6 +1976,8 @@ process.stdout.write(JSON.stringify(out));
1962
1976
  try { $allParsed = $allJson | ConvertFrom-Json } catch {}
1963
1977
  if ($allParsed -and $allParsed.skills) {
1964
1978
  foreach ($s in $allParsed.skills) {
1979
+ # v5.5.0: thin-pointer skills are intentionally minimal; retrofit gaps don't apply.
1980
+ if ($thinPointerSkills -contains $s.name) { continue }
1965
1981
  if ($s.non_additive_count -gt 0) {
1966
1982
  Add-Finding 'D34.retrofit-clean' 'Creator conformance' 'warning' "Skill '$($s.name)' has $($s.non_additive_count) non-additive gap(s) that retrofit cannot auto-fix" "Inspect Evidence/_skill-checker/$($s.name)/fix-plan.json and document/fix manually. See docs/audits/v5.0.4-skill-creator-dogfood.md for known exceptions." (Join-Path $Root "plugin/skills/$($s.name)/SKILL.md") 0
1967
1983
  }