ultimate-pi 0.13.0 → 0.14.0

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 (39) hide show
  1. package/{.pi → .agents}/skills/ccc/SKILL.md +1 -7
  2. package/.agents/skills/ccc/references/settings.md +126 -0
  3. package/.agents/skills/harness-debate-plan/SKILL.md +61 -21
  4. package/.agents/skills/harness-orchestration/SKILL.md +1 -1
  5. package/.pi/agents/harness/planning/plan-adversary.md +2 -2
  6. package/.pi/agents/harness/planning/plan-evaluator.md +3 -1
  7. package/.pi/agents/harness/planning/review-integrator.md +4 -2
  8. package/.pi/extensions/debate-orchestrator.ts +39 -435
  9. package/.pi/extensions/harness-debate-tools.ts +519 -0
  10. package/.pi/extensions/harness-plan-approval.ts +41 -17
  11. package/.pi/extensions/harness-run-context.ts +18 -0
  12. package/.pi/extensions/lib/debate-bus-core.ts +434 -0
  13. package/.pi/extensions/lib/debate-bus-state.ts +58 -0
  14. package/.pi/extensions/lib/harness-spawn-budget.ts +5 -25
  15. package/.pi/extensions/lib/plan-approval/dialog.ts +33 -272
  16. package/.pi/extensions/lib/plan-approval/format-plan.ts +12 -85
  17. package/.pi/extensions/lib/plan-approval/plan-review.ts +6 -6
  18. package/.pi/extensions/lib/plan-approval/render.ts +6 -0
  19. package/.pi/extensions/lib/plan-approval/validate.ts +1 -1
  20. package/.pi/extensions/lib/plan-debate-envelope.ts +2 -0
  21. package/.pi/extensions/lib/plan-debate-gate.ts +155 -0
  22. package/.pi/extensions/lib/plan-debate-id.ts +39 -0
  23. package/.pi/extensions/lib/plan-debate-lane.ts +220 -0
  24. package/.pi/extensions/lib/plan-debate-round-status.ts +94 -0
  25. package/.pi/extensions/lib/plan-debate-write-guard.ts +20 -0
  26. package/.pi/extensions/lib/plan-messenger.ts +276 -0
  27. package/.pi/extensions/lib/plan-review-integrator-rules.ts +119 -0
  28. package/.pi/extensions/lib/plan-scope-guard.ts +89 -0
  29. package/.pi/harness/agents.manifest.json +7 -7
  30. package/.pi/prompts/harness-plan.md +22 -12
  31. package/CHANGELOG.md +18 -0
  32. package/THIRD_PARTY_NOTICES.md +1 -1
  33. package/package.json +3 -3
  34. package/.agents/skills/ck-search/SKILL.md +0 -23
  35. package/.agents/skills/cocoindex-search/SKILL.md +0 -35
  36. package/.agents/skills/obsidian-bases/SKILL.md +0 -299
  37. package/.agents/skills/obsidian-markdown/SKILL.md +0 -237
  38. package/.pi/extensions/lib/plan-approval/fallback.ts +0 -50
  39. /package/{.pi → .agents}/skills/ccc/references/management.md +0 -0
@@ -0,0 +1,119 @@
1
+ /**
2
+ * P1 — integrator draft rules (disputes required when checks fail).
3
+ */
4
+
5
+ import { readFile } from "node:fs/promises";
6
+ import { join } from "node:path";
7
+ import { parse as parseYaml } from "yaml";
8
+
9
+ export interface IntegratorValidationResult {
10
+ ok: boolean;
11
+ review_gate_ready: boolean;
12
+ errors: string[];
13
+ warnings: string[];
14
+ }
15
+
16
+ function hasFailedChecks(doc: Record<string, unknown>): boolean {
17
+ const pe = doc.plan_evaluation as Record<string, unknown> | undefined;
18
+ if (!pe) return false;
19
+ for (const [key, val] of Object.entries(pe)) {
20
+ if (key === "source") continue;
21
+ const block = val as Record<string, unknown> | undefined;
22
+ if (block && block.passes === false) return true;
23
+ const checks = block?.issues as unknown[] | undefined;
24
+ if (Array.isArray(checks) && checks.length > 0) {
25
+ // issues on passing blocks are warnings only
26
+ }
27
+ }
28
+ const hv = doc.hypothesis_validation as Record<string, unknown> | undefined;
29
+ if (hv?.revision_recommended === true) return true;
30
+ if (
31
+ hv?.relevance &&
32
+ (hv.relevance as { passes?: boolean }).passes === false
33
+ ) {
34
+ return true;
35
+ }
36
+ return false;
37
+ }
38
+
39
+ function adversarySeverityHigh(doc: Record<string, unknown>): boolean {
40
+ const ab = doc.adversary_brief as Record<string, unknown> | undefined;
41
+ const sev = String(ab?.severity ?? "").toLowerCase();
42
+ return sev === "high" || sev === "critical";
43
+ }
44
+
45
+ export function validateIntegratorDraft(
46
+ draft: Record<string, unknown>,
47
+ opts?: { validationTurn?: Record<string, unknown> | null },
48
+ ): IntegratorValidationResult {
49
+ const errors: string[] = [];
50
+ const warnings: string[] = [];
51
+ const disputes = Array.isArray(draft.disputes)
52
+ ? (draft.disputes as string[]).filter(Boolean)
53
+ : [];
54
+ const unresolved = (
55
+ draft.review_integrator_summary as Record<string, unknown> | undefined
56
+ )?.debate_health as Record<string, unknown> | undefined;
57
+ const unresolvedTensions = Array.isArray(unresolved?.unresolved_tensions)
58
+ ? (unresolved.unresolved_tensions as string[])
59
+ : [];
60
+ let review_gate_ready = draft.review_gate_ready === true;
61
+
62
+ const failedInDraft = hasFailedChecks(draft);
63
+ const failedInTurn =
64
+ opts?.validationTurn?.overall_ready === false ||
65
+ (Array.isArray(opts?.validationTurn?.checks) &&
66
+ (opts.validationTurn.checks as { status?: string }[]).some(
67
+ (c) => c.status === "fail",
68
+ ));
69
+
70
+ if (failedInDraft || failedInTurn) {
71
+ if (disputes.length === 0) {
72
+ errors.push(
73
+ "evaluator reported failed/warn checks but disputes[] is empty — document tension",
74
+ );
75
+ review_gate_ready = false;
76
+ }
77
+ if (unresolvedTensions.length === 0 && disputes.length > 0) {
78
+ warnings.push(
79
+ "disputes present but unresolved_tensions empty — prefer listing open items",
80
+ );
81
+ }
82
+ }
83
+
84
+ if (adversarySeverityHigh(draft) && disputes.length === 0) {
85
+ errors.push("adversary severity is high but no disputes recorded");
86
+ review_gate_ready = false;
87
+ }
88
+
89
+ if (
90
+ review_gate_ready &&
91
+ (failedInDraft || failedInTurn) &&
92
+ disputes.length === 0
93
+ ) {
94
+ errors.push(
95
+ "review_gate_ready cannot be true without disputes when checks fail",
96
+ );
97
+ review_gate_ready = false;
98
+ }
99
+
100
+ return {
101
+ ok: errors.length === 0,
102
+ review_gate_ready,
103
+ errors,
104
+ warnings,
105
+ };
106
+ }
107
+
108
+ export async function loadValidationTurnYaml(
109
+ runDir: string,
110
+ roundIndex: number,
111
+ ): Promise<Record<string, unknown> | null> {
112
+ const path = join(runDir, "artifacts", `validation-turn-r${roundIndex}.yaml`);
113
+ try {
114
+ const raw = await readFile(path, "utf-8");
115
+ return parseYaml(raw) as Record<string, unknown>;
116
+ } catch {
117
+ return null;
118
+ }
119
+ }
@@ -0,0 +1,89 @@
1
+ /**
2
+ * P2 — detect material scope drift between task_summary and decomposition.
3
+ */
4
+
5
+ export interface ScopeGuardResult {
6
+ material_drift: boolean;
7
+ overlap_score: number;
8
+ summary: string;
9
+ suggested_ask_user: boolean;
10
+ }
11
+
12
+ const PRODUCT_OS_MARKERS = [
13
+ "product os",
14
+ "product operating system",
15
+ "knowledge base",
16
+ "multi-source",
17
+ "synthesiz",
18
+ "papers",
19
+ "youtube",
20
+ "transcripts",
21
+ "news",
22
+ "books",
23
+ "decisions",
24
+ ];
25
+
26
+ const INFRA_MARKERS = [
27
+ "cron",
28
+ "systemd",
29
+ "graphify add",
30
+ "graphify update",
31
+ "ingest",
32
+ "lockfile",
33
+ "feeds.yaml",
34
+ "polling",
35
+ "timer",
36
+ ];
37
+
38
+ function tokenize(text: string): Set<string> {
39
+ const lower = text.toLowerCase();
40
+ const words = lower.match(/[a-z][a-z0-9_-]{2,}/g) ?? [];
41
+ return new Set(words);
42
+ }
43
+
44
+ function markerHits(text: string, markers: string[]): number {
45
+ const lower = text.toLowerCase();
46
+ return markers.filter((m) => lower.includes(m)).length;
47
+ }
48
+
49
+ export function assessPlanScopeDrift(
50
+ taskSummary: string,
51
+ decompositionText: string,
52
+ ): ScopeGuardResult {
53
+ const taskTokens = tokenize(taskSummary);
54
+ const decompTokens = tokenize(decompositionText);
55
+ let overlap = 0;
56
+ for (const t of taskTokens) {
57
+ if (decompTokens.has(t)) overlap += 1;
58
+ }
59
+ const overlapScore = taskTokens.size === 0 ? 1 : overlap / taskTokens.size;
60
+
61
+ const taskProduct = markerHits(taskSummary, PRODUCT_OS_MARKERS);
62
+ const decompProduct = markerHits(decompositionText, PRODUCT_OS_MARKERS);
63
+ const _taskInfra = markerHits(taskSummary, INFRA_MARKERS);
64
+ const decompInfra = markerHits(decompositionText, INFRA_MARKERS);
65
+
66
+ const productIntent = taskProduct >= 2;
67
+ const narrowedToInfra =
68
+ productIntent && decompInfra >= 3 && decompProduct < taskProduct;
69
+ const lowOverlap = productIntent && overlapScore < 0.08;
70
+
71
+ const material_drift = narrowedToInfra || lowOverlap;
72
+ let summary: string;
73
+ if (narrowedToInfra) {
74
+ summary =
75
+ "Decomposition reads as infrastructure/cron/graphify-ingest while the task asked for a broader product-OS knowledge base — confirm scope with the user.";
76
+ } else if (lowOverlap) {
77
+ summary =
78
+ "Decomposition shares almost no vocabulary with the task summary — verify the plan targets the right problem.";
79
+ } else {
80
+ summary = "Scope alignment looks acceptable.";
81
+ }
82
+
83
+ return {
84
+ material_drift,
85
+ overlap_score: overlapScore,
86
+ summary,
87
+ suggested_ask_user: material_drift,
88
+ };
89
+ }
@@ -1,8 +1,8 @@
1
1
  {
2
2
  "schema_version": "1.0.0",
3
3
  "package": "ultimate-pi",
4
- "package_version": "0.11.0",
5
- "generated_at": "2026-05-18T09:43:44.563Z",
4
+ "package_version": "0.13.1",
5
+ "generated_at": "2026-05-18T17:22:10.311Z",
6
6
  "agents": {
7
7
  "pi-pi/agent-expert": {
8
8
  "path": ".pi/agents/pi-pi/agent-expert.md",
@@ -94,23 +94,23 @@
94
94
  },
95
95
  "harness/planning/plan-adversary": {
96
96
  "path": ".pi/agents/harness/planning/plan-adversary.md",
97
- "sha256": "685926c638ae1377361d7cafda5e400be19cb3880510d8f6d389a5876647575f"
97
+ "sha256": "84c7fa63d38c39e32000c90093688a45bc2b96a2c6209037342222eae0c854f9"
98
98
  },
99
99
  "harness/planning/plan-evaluator": {
100
100
  "path": ".pi/agents/harness/planning/plan-evaluator.md",
101
- "sha256": "44fd52389d7e43dd5093653cba9694900561318ee5f00e3bc05c3ecef5d43621"
101
+ "sha256": "580d8c7a31f7a6ecd9e627460459d600650580b5df63d129278beefd3f3e347c"
102
102
  },
103
103
  "harness/planning/review-integrator": {
104
104
  "path": ".pi/agents/harness/planning/review-integrator.md",
105
- "sha256": "d0e8214539d0a78b9e5add70e61dd4e4de36def64172cda18d9b70727e7600ca"
105
+ "sha256": "cd1e5d10f0cb8b7a4197d2e92489023c285e90e250f1badc371470165aeb8cfd"
106
106
  },
107
107
  "harness/planning/scout-graphify": {
108
108
  "path": ".pi/agents/harness/planning/scout-graphify.md",
109
- "sha256": "b59916a26afccfe105e29c0bd8637ac54275e8afef1c6cc88a58bd05b0325473"
109
+ "sha256": "8a5ff68306a5eedf1a62067ac8812eac4ac1fe2016cba63337ef4e90b5136e00"
110
110
  },
111
111
  "harness/planning/scout-semantic": {
112
112
  "path": ".pi/agents/harness/planning/scout-semantic.md",
113
- "sha256": "47b7ea3e65b20a65e6d0ff11b6d5daff59b47a9ed618b8a3b6282f2eb0460572"
113
+ "sha256": "36bd424ebd422bda82bd447b22f591f99f32ec897ea43f385586119da5c26caa"
114
114
  },
115
115
  "harness/planning/scout-structure": {
116
116
  "path": ".pi/agents/harness/planning/scout-structure.md",
@@ -31,7 +31,7 @@ Read **harness-debate-plan** skill before Review Gate rounds.
31
31
  1. Use `subagent` with `agentScope: "both"` and parallel `tasks` where lanes are independent.
32
32
  2. Each `subagent` call blocks until subprocesses finish — batch parallel scouts in one `tasks` array.
33
33
  3. Do **not** set `timeoutMs` unless the user explicitly requests a cap — subagents run until natural completion (optional backstop: `PI_SUBAGENT_TIMEOUT_MS`).
34
- 4. Cap: **12** harness subagent invocations per parent session (extension-enforced).
34
+ 4. No harness subagent spawn cap run the full scout + debate pipeline without skipping lanes for budget.
35
35
  5. Compact task text: embed `HarnessSpawnContext` JSON + lane-specific instructions only.
36
36
 
37
37
  ## Step 0 — Parse `$ARGUMENTS`
@@ -102,21 +102,31 @@ node .pi/scripts/validate-plan-dag.mjs --packet .pi/harness/runs/<run_id>/plan-p
102
102
 
103
103
  Must **pass** before debate. On fail: fix via author or parent patches, re-run.
104
104
 
105
- ## Phase 5 — Review Gate debate (4 rounds, even with `--quick`)
105
+ ## Phase 5 — Review Gate debate (4 rounds, pi-messenger, even with `--quick`)
106
106
 
107
- 1. `/harness-debate-open plan-<run_id>`
108
- 2. For rounds 1–4 (`debate_round_focus`: spec, wbs, schedule, quality):
107
+ 1. `harness_debate_open` (debate id normalized to `plan-<run_id>`; creates `debate-messenger/` inboxes + threads).
108
+ 2. Optional: `harness_plan_scope_check` after decomposition — if `material_drift`, `ask_user` before continuing.
109
+ 3. For rounds 1–4 (`debate_round_focus`: spec, wbs, schedule, quality):
109
110
 
110
- | Round | Extra spawns (before integrator) |
111
- |-------|----------------------------------|
112
- | 1 | `hypothesis-validator` (blind: task + hypothesis only) → `plan-evaluator` → `plan-adversary` |
113
- | 2 | `plan-evaluator` → `plan-adversary` (optional `sprint-contract-auditor` if done_criteria thin) |
114
- | 3 | `plan-evaluator` → `plan-adversary` |
115
- | 4 | `plan-evaluator` → `plan-adversary` → **`sprint-contract-auditor` (required)** |
111
+ | Round | Lane spawns (sequential) | Messenger |
112
+ |-------|--------------------------|-----------|
113
+ | 1 | `hypothesis-validator` (blind) → `plan-evaluator` → `plan-adversary` | evaluator `claim` → adversary `rebuttal` (`in_reply_to` claim ids) |
114
+ | 2 | `plan-evaluator` → `plan-adversary` | same |
115
+ | 3 | `plan-evaluator` → `plan-adversary` | same |
116
+ | 4 | `plan-evaluator` → `plan-adversary` → **`sprint-contract-auditor`** | same + audit message optional |
116
117
 
117
- Then `review-integrator` `write_harness_yaml` `artifacts/review-round-r{N}.yaml` build bus envelope `/harness-debate-round '<json>'`.
118
+ Lane YAML + messenger claims/rebuttals are **auto-applied** when each debate subagent completes (`harness-debate-lane-applied` entry). You may also call `harness_debate_apply_lane` if fenced YAML was truncated.
118
119
 
119
- 3. `/harness-debate-consensus` after round 4.
120
+ Per round (no prose-only turns **always call a tool**):
121
+
122
+ 1. Spawn lane agents (evaluator → adversary → integrator; R1/R4 extras per table).
123
+ 2. After each subagent: verify `harness-debate-next-step` message or run `harness_debate_round_status({ round_index: N })`.
124
+ 3. Before adversary: `harness_messenger_read_round` → include transcript in adversary task.
125
+ 4. After integrator: `harness_debate_submit_round({ round_index, integrator_draft })` (writes review-round + bus round + integrate message — **do not** `write_harness_yaml` review-round paths).
126
+
127
+ 5. `harness_debate_consensus` after round 4.
128
+
129
+ **Never** echo `/harness-debate-*` in bash. **Never** end a turn during Phase 5 with only narration (e.g. "Let me post claims") — the next tool call must be in the **same** assistant message or immediately after `harness-debate-next-step`.
120
130
 
121
131
  **R1 blind rule:** hypothesis-validator prompt must exclude decomposition, scouts, PlanPacket, prior debate.
122
132
 
package/CHANGELOG.md CHANGED
@@ -4,6 +4,24 @@ All notable changes to this project are documented in this file.
4
4
 
5
5
  ## [Unreleased]
6
6
 
7
+ ## [v0.14.0] — 2026-05-18
8
+
9
+ ### ✨ Features
10
+
11
+ - **Plan debate (pi-messenger):** `harness_debate_open`, `harness_messenger_post`, lane auto-apply after subagent returns, consensus gates on `approve_plan`, and blocks on parent `review-round-r*.yaml` writes.
12
+ - **Spawn budget:** remove harness subagent spawn cap (spawns always allowed).
13
+ - **Skills:** symlink `.pi/skills/*` to `.agents/skills` (harness, ccc, scrapling-web, wiki-save).
14
+
15
+ ### 🔧 Chores
16
+
17
+ - Refresh planning agent prompts and `agents.manifest.json`; biome unused-import cleanup.
18
+
19
+ ## [v0.13.1] — 2026-05-18
20
+
21
+ ### 🔧 Chores
22
+
23
+ - Consolidate vendored `ccc` skill under `.agents/skills/ccc`; remove redundant `cocoindex-search`, `ck-search`, and duplicate Obsidian skills from the package.
24
+
7
25
  ## [v0.13.0] — 2026-05-18
8
26
 
9
27
  ### ✨ Features
@@ -28,4 +28,4 @@
28
28
  - **Project:** https://github.com/cocoindex-io/cocoindex-code
29
29
  - **License:** Apache-2.0
30
30
  - **Install:** `uv tool install 'cocoindex-code[full]'` (see `/harness-setup` §2.4)
31
- - ultimate-pi vendors the upstream agent skill at [`.pi/skills/ccc/`](.pi/skills/ccc/) and bootstraps indexes via [`.pi/scripts/harness-cocoindex-bootstrap.sh`](.pi/scripts/harness-cocoindex-bootstrap.sh). Replaces deprecated `@beaconbay/ck-search`.
31
+ - ultimate-pi vendors the upstream agent skill at [`.agents/skills/ccc/`](.agents/skills/ccc/) and bootstraps indexes via [`.pi/scripts/harness-cocoindex-bootstrap.sh`](.pi/scripts/harness-cocoindex-bootstrap.sh). Replaces deprecated `@beaconbay/ck-search`.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "ultimate-pi",
3
- "version": "0.13.0",
3
+ "version": "0.14.0",
4
4
  "description": "Ultimate AI coding harness for pi.dev — extensible skills, Obsidian wiki knowledge layer, compressed context, deterministic output",
5
5
  "keywords": [
6
6
  "pi-package",
@@ -74,7 +74,7 @@
74
74
  "@earendil-works/pi-coding-agent": "*"
75
75
  },
76
76
  "scripts": {
77
- "check:ts": "tsc --noEmit --target ES2023 --lib ES2023 --moduleResolution nodenext --module nodenext --skipLibCheck .pi/extensions/custom-system-prompt.ts .pi/lib/harness-run-context.ts .pi/lib/harness-ui-state.ts .pi/extensions/harness-run-context.ts .pi/extensions/lib/harness-vcc-settings.ts .pi/extensions/dotenv-loader.ts .pi/extensions/lib/posthog-node.d.ts .pi/extensions/lib/harness-posthog.ts .pi/extensions/lib/harness-paths.ts .pi/extensions/pi-model-router-harness.ts .pi/extensions/provider-payload-sanitize.ts .pi/extensions/harness-telemetry.ts .pi/extensions/harness-ask-user.ts .pi/extensions/harness-plan-approval.ts .pi/extensions/lib/ask-user/schema.ts .pi/extensions/lib/ask-user/types.ts .pi/extensions/lib/ask-user/validate.ts .pi/extensions/lib/ask-user/dialog.ts .pi/extensions/lib/ask-user/fallback.ts .pi/extensions/lib/ask-user/render.ts .pi/extensions/lib/plan-approval/types.ts .pi/extensions/lib/plan-approval/schema.ts .pi/extensions/lib/plan-approval/validate.ts .pi/extensions/lib/plan-approval/format-plan.ts .pi/extensions/lib/plan-approval/dialog.ts .pi/extensions/lib/plan-approval/fallback.ts .pi/extensions/lib/plan-approval/render.ts .pi/extensions/lib/plan-approval/create-plan.ts .pi/extensions/harness-subagents.ts .pi/extensions/lib/harness-subagents-bridge.ts .pi/extensions/lib/harness-cocoindex-refresh.ts .pi/extensions/lib/harness-subagent-auth.ts .pi/extensions/lib/harness-subagent-policy.ts .pi/extensions/lib/harness-subagent-precheck.ts .pi/extensions/lib/harness-spawn-budget.ts .pi/extensions/lib/spawn-policy.ts vendor/pi-subagents/src/agents.ts vendor/pi-subagents/src/subagents.ts .pi/extensions/trace-recorder.ts .pi/extensions/observation-bus.ts .pi/extensions/drift-monitor.ts .pi/extensions/policy-gate.ts .pi/extensions/budget-guard.ts .pi/extensions/debate-orchestrator.ts .pi/extensions/harness-live-widget.ts .pi/extensions/sentrux-rules-sync.ts .pi/extensions/custom-header.ts .pi/extensions/harness-web-tools.ts .pi/extensions/harness-web-guard.ts .pi/extensions/lib/harness-web/run-cli.ts",
77
+ "check:ts": "tsc --noEmit --target ES2023 --lib ES2023 --moduleResolution nodenext --module nodenext --skipLibCheck .pi/extensions/custom-system-prompt.ts .pi/lib/harness-run-context.ts .pi/lib/harness-ui-state.ts .pi/extensions/harness-run-context.ts .pi/extensions/lib/harness-vcc-settings.ts .pi/extensions/dotenv-loader.ts .pi/extensions/lib/posthog-node.d.ts .pi/extensions/lib/harness-posthog.ts .pi/extensions/lib/harness-paths.ts .pi/extensions/pi-model-router-harness.ts .pi/extensions/provider-payload-sanitize.ts .pi/extensions/harness-telemetry.ts .pi/extensions/harness-ask-user.ts .pi/extensions/harness-plan-approval.ts .pi/extensions/lib/ask-user/schema.ts .pi/extensions/lib/ask-user/types.ts .pi/extensions/lib/ask-user/validate.ts .pi/extensions/lib/ask-user/dialog.ts .pi/extensions/lib/ask-user/fallback.ts .pi/extensions/lib/ask-user/render.ts .pi/extensions/lib/plan-approval/types.ts .pi/extensions/lib/plan-approval/schema.ts .pi/extensions/lib/plan-approval/validate.ts .pi/extensions/lib/plan-approval/format-plan.ts .pi/extensions/lib/plan-approval/dialog.ts .pi/extensions/lib/plan-approval/render.ts .pi/extensions/lib/plan-approval/create-plan.ts .pi/extensions/harness-subagents.ts .pi/extensions/lib/harness-subagents-bridge.ts .pi/extensions/lib/harness-cocoindex-refresh.ts .pi/extensions/lib/harness-subagent-auth.ts .pi/extensions/lib/harness-subagent-policy.ts .pi/extensions/lib/harness-subagent-precheck.ts .pi/extensions/lib/harness-spawn-budget.ts .pi/extensions/lib/spawn-policy.ts vendor/pi-subagents/src/agents.ts vendor/pi-subagents/src/subagents.ts .pi/extensions/trace-recorder.ts .pi/extensions/observation-bus.ts .pi/extensions/drift-monitor.ts .pi/extensions/policy-gate.ts .pi/extensions/budget-guard.ts .pi/extensions/debate-orchestrator.ts .pi/extensions/harness-debate-tools.ts .pi/extensions/lib/debate-bus-core.ts .pi/extensions/lib/debate-bus-state.ts .pi/extensions/lib/plan-debate-gate.ts .pi/extensions/lib/plan-debate-id.ts .pi/extensions/lib/plan-messenger.ts .pi/extensions/lib/plan-debate-envelope.ts .pi/extensions/lib/plan-review-integrator-rules.ts .pi/extensions/lib/plan-scope-guard.ts .pi/extensions/lib/plan-debate-write-guard.ts .pi/extensions/lib/plan-debate-lane.ts .pi/extensions/lib/plan-debate-round-status.ts .pi/extensions/harness-live-widget.ts .pi/extensions/sentrux-rules-sync.ts .pi/extensions/custom-header.ts .pi/extensions/harness-web-tools.ts .pi/extensions/harness-web-guard.ts .pi/extensions/lib/harness-web/run-cli.ts",
78
78
  "vendor:sync-router": "bash .pi/scripts/vendor-sync-pi-model-router.sh",
79
79
  "vendor:sync-vcc": "bash .pi/scripts/vendor-sync-pi-vcc.sh",
80
80
  "vendor:sync-subagents": "bash .pi/scripts/vendor-sync-pi-subagents.sh",
@@ -84,7 +84,7 @@
84
84
  "format": "biome format --write",
85
85
  "format:check": "biome format",
86
86
  "prepare": "lefthook install",
87
- "test": "node --test test/harness-verify.test.mjs test/harness-ask-user.test.mjs test/harness-subagents-loader.test.mjs test/harness-subagent-precheck.test.mjs test/sentrux-rules-sync.test.mjs test/harness-budget-guard.test.mjs && node .pi/harness/evals/smoke/smoke-harness-plan.mjs --fixture && npx -y tsx --test test/harness-vcc-settings.test.ts test/harness-plan-phase-policy.test.mjs test/harness-subagent-policy.test.mjs test/harness-spawn-budget.test.mjs test/harness-turn-routing.test.mjs test/plan-approval-format.test.mjs test/plan-approval-dialog.test.mjs test/plan-approval-sync.test.mjs test/plan-create-plan.test.mjs test/plan-review-format.test.mjs test/debate-plan-phase.test.mjs",
87
+ "test": "node --test test/harness-verify.test.mjs test/harness-ask-user.test.mjs test/harness-subagents-loader.test.mjs test/harness-subagent-precheck.test.mjs test/sentrux-rules-sync.test.mjs test/harness-budget-guard.test.mjs && node .pi/harness/evals/smoke/smoke-harness-plan.mjs --fixture && npx -y tsx --test test/harness-vcc-settings.test.ts test/harness-plan-phase-policy.test.mjs test/harness-subagent-policy.test.mjs test/harness-spawn-budget.test.mjs test/harness-turn-routing.test.mjs test/plan-approval-format.test.mjs test/plan-approval-dialog.test.mjs test/plan-approval-sync.test.mjs test/plan-create-plan.test.mjs test/plan-review-format.test.mjs test/debate-plan-phase.test.mjs test/plan-messenger-gate.test.mjs test/plan-debate-lane-apply.test.mjs",
88
88
  "test:vcc": "npx -y tsx --test vendor/pi-vcc/tests/*.test.ts",
89
89
  "harness:sentrux-bootstrap": "node .pi/scripts/harness-sentrux-bootstrap.mjs",
90
90
  "harness:sentrux-sync": "node .pi/scripts/sentrux-rules-sync.mjs --force",
@@ -1,23 +0,0 @@
1
- ---
2
- name: ck-search
3
- description: "DEPRECATED — ck-search was removed from ultimate-pi. Use cocoindex-search or /skill:ccc instead. Triggers retained for backward compatibility: ck, ck-search, semantic search."
4
- ---
5
-
6
- # ck-search (deprecated)
7
-
8
- **`ck` / `@beaconbay/ck-search` is no longer used in this harness.**
9
-
10
- Use instead:
11
-
12
- - **`/skill:cocoindex-search`** or **`/skill:ccc`** — CocoIndex Code (`ccc search`)
13
- - **graphify** — architecture, callers, communities (`graphify query`, `explain`, `path`)
14
-
15
- ## Migration
16
-
17
- ```bash
18
- uv tool install 'cocoindex-code[full]'
19
- bash "$UP_PKG/.pi/scripts/harness-cocoindex-bootstrap.sh"
20
- ccc search --limit 10 "your query"
21
- ```
22
-
23
- Remove legacy index: `rm -rf .ck` (optional).
@@ -1,35 +0,0 @@
1
- ---
2
- name: cocoindex-search
3
- description: "Semantic code search using CocoIndex Code (ccc). Use when exploring codebases, finding related implementation by meaning, or replacing legacy ck-search. Triggers on: semantic code search, ccc, cocoindex, cocoindex-code, find code related to, search the codebase for implementation, /skill:ck-search."
4
- ---
5
-
6
- # cocoindex-search
7
-
8
- CocoIndex Code (`ccc`) provides offline, AST-aware semantic search over the project codebase.
9
-
10
- ## Quick start
11
-
12
- ```bash
13
- ccc search --limit 10 "harness subagent policy"
14
- ccc status
15
- ```
16
-
17
- ## Full reference
18
-
19
- Load the vendored skill: **`/skill:ccc`** (`.pi/skills/ccc/SKILL.md`).
20
-
21
- ## Harness lanes
22
-
23
- | Question type | Tool |
24
- |---------------|------|
25
- | Callers, callees, cross-module paths | `graphify explain` / `graphify path` |
26
- | Implementation by meaning | `ccc search --limit N "…"` |
27
- | Structural patterns | `sg -p '…'` |
28
-
29
- ## Setup
30
-
31
- ```bash
32
- bash "$UP_PKG/.pi/scripts/harness-cocoindex-bootstrap.sh"
33
- ```
34
-
35
- Indexing before harness scouts is automatic — do not run `ccc index` or `ccc search --refresh` in `scout-semantic`.