ultimate-pi 0.1.7 → 0.2.2
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/.agents/skills/graphify/.graphify_version +1 -0
- package/.agents/skills/graphify/SKILL.md +1204 -0
- package/.agents/skills/wiki-autoresearch/SKILL.md +225 -97
- package/.agents/skills/wiki-autoresearch/references/program.md +28 -62
- package/.agents/skills/wiki-autoresearch/references/quality-sites.md +32 -0
- package/.env.example +5 -1
- package/.gitattributes +1 -0
- package/.github/workflows/publish-github-packages.yml +1 -1
- package/.pi/SYSTEM.md +72 -18
- package/.pi/agents/harness/adversary.md +32 -0
- package/.pi/agents/harness/evaluator.md +32 -0
- package/.pi/agents/harness/executor.md +34 -0
- package/.pi/agents/harness/meta-optimizer.md +33 -0
- package/.pi/agents/harness/planner.md +33 -0
- package/.pi/agents/harness/tie-breaker.md +35 -0
- package/.pi/agents/harness/trace-librarian.md +32 -0
- package/.pi/extensions/banner.png +0 -0
- package/.pi/extensions/budget-guard.ts +265 -0
- package/.pi/extensions/custom-footer.ts +194 -22
- package/.pi/extensions/custom-header.ts +47 -9
- package/.pi/extensions/debate-orchestrator.ts +479 -0
- package/.pi/extensions/harness-live-widget.ts +438 -0
- package/.pi/extensions/policy-gate.ts +349 -0
- package/.pi/extensions/review-integrity.ts +198 -0
- package/.pi/extensions/test-diff-integrity.ts +240 -0
- package/.pi/extensions/trace-recorder.ts +315 -0
- package/.pi/harness/README.md +23 -0
- package/.pi/harness/router/README.md +35 -0
- package/.pi/harness/router/apply-router-proposal.mjs +153 -0
- package/.pi/harness/router/propose-router-tuning.mjs +149 -0
- package/.pi/harness/specs/README.md +37 -0
- package/.pi/harness/specs/adversary-report.schema.json +53 -0
- package/.pi/harness/specs/budget-exhausted-event.schema.json +93 -0
- package/.pi/harness/specs/consensus-packet.schema.json +175 -0
- package/.pi/harness/specs/eval-verdict.schema.json +59 -0
- package/.pi/harness/specs/incident-record.schema.json +84 -0
- package/.pi/harness/specs/plan-packet.schema.json +90 -0
- package/.pi/harness/specs/round-result.schema.json +126 -0
- package/.pi/harness/specs/router-tuning-proposal.schema.json +114 -0
- package/.pi/harness/specs/run-trace.schema.json +107 -0
- package/.pi/lib/harness-ui-state.ts +311 -0
- package/.pi/mcp.json +4 -0
- package/.pi/model-router.json +93 -93
- package/.pi/prompts/graphify.md +23 -0
- package/.pi/prompts/harness-abort.md +41 -0
- package/.pi/prompts/harness-auto.md +83 -0
- package/.pi/prompts/harness-critic.md +52 -0
- package/.pi/prompts/harness-eval.md +51 -0
- package/.pi/prompts/harness-incident.md +51 -0
- package/.pi/prompts/harness-plan.md +64 -0
- package/.pi/prompts/harness-review.md +52 -0
- package/.pi/prompts/harness-router-tune.md +74 -0
- package/.pi/prompts/harness-run.md +59 -0
- package/.pi/prompts/harness-setup.md +316 -216
- package/.pi/prompts/harness-trace.md +51 -0
- package/.pi/prompts/wiki-autoresearch.md +9 -7
- package/.pi/prompts/wiki-save.md +20 -0
- package/.pi/skills/agent-router/SKILL.md +2 -4
- package/.pi/skills/ast-grep/SKILL.md +354 -0
- package/.pi/sounds/project-sounds.json +18 -24
- package/AGENTS.md +30 -0
- package/CHANGELOG.md +89 -0
- package/CONTRIBUTING.md +51 -1
- package/README.md +264 -20
- package/biome.json +8 -2
- package/lefthook.yml +3 -2
- package/node_modules/@sting8k/pi-vcc/README.md +200 -0
- package/node_modules/@sting8k/pi-vcc/index.ts +14 -0
- package/node_modules/@sting8k/pi-vcc/package.json +26 -0
- package/node_modules/@sting8k/pi-vcc/scripts/audit-sessions.ts +88 -0
- package/node_modules/@sting8k/pi-vcc/scripts/benchmark-real-sessions.ts +25 -0
- package/node_modules/@sting8k/pi-vcc/scripts/compare-before-after.ts +36 -0
- package/node_modules/@sting8k/pi-vcc/scripts/dump-branch-output.ts +20 -0
- package/node_modules/@sting8k/pi-vcc/src/commands/pi-vcc.ts +36 -0
- package/node_modules/@sting8k/pi-vcc/src/commands/vcc-recall.ts +65 -0
- package/node_modules/@sting8k/pi-vcc/src/core/brief.ts +381 -0
- package/node_modules/@sting8k/pi-vcc/src/core/build-sections.ts +79 -0
- package/node_modules/@sting8k/pi-vcc/src/core/content.ts +60 -0
- package/node_modules/@sting8k/pi-vcc/src/core/filter-noise.ts +42 -0
- package/node_modules/@sting8k/pi-vcc/src/core/format-recall.ts +27 -0
- package/node_modules/@sting8k/pi-vcc/src/core/format.ts +49 -0
- package/node_modules/@sting8k/pi-vcc/src/core/lineage.ts +26 -0
- package/node_modules/@sting8k/pi-vcc/src/core/load-messages.ts +41 -0
- package/node_modules/@sting8k/pi-vcc/src/core/normalize.ts +66 -0
- package/node_modules/@sting8k/pi-vcc/src/core/recall-scope.ts +14 -0
- package/node_modules/@sting8k/pi-vcc/src/core/render-entries.ts +55 -0
- package/node_modules/@sting8k/pi-vcc/src/core/report.ts +237 -0
- package/node_modules/@sting8k/pi-vcc/src/core/sanitize.ts +5 -0
- package/node_modules/@sting8k/pi-vcc/src/core/search-entries.ts +221 -0
- package/node_modules/@sting8k/pi-vcc/src/core/settings.ts +77 -0
- package/node_modules/@sting8k/pi-vcc/src/core/skill-collapse.ts +35 -0
- package/node_modules/@sting8k/pi-vcc/src/core/summarize.ts +157 -0
- package/node_modules/@sting8k/pi-vcc/src/core/tool-args.ts +14 -0
- package/node_modules/@sting8k/pi-vcc/src/details.ts +7 -0
- package/node_modules/@sting8k/pi-vcc/src/extract/commits.ts +69 -0
- package/node_modules/@sting8k/pi-vcc/src/extract/files.ts +80 -0
- package/node_modules/@sting8k/pi-vcc/src/extract/goals.ts +79 -0
- package/node_modules/@sting8k/pi-vcc/src/extract/preferences.ts +55 -0
- package/node_modules/@sting8k/pi-vcc/src/hooks/before-compact.ts +322 -0
- package/node_modules/@sting8k/pi-vcc/src/sections.ts +12 -0
- package/node_modules/@sting8k/pi-vcc/src/tools/recall.ts +109 -0
- package/node_modules/@sting8k/pi-vcc/src/types.ts +14 -0
- package/node_modules/@sting8k/pi-vcc/tests/before-compact-hook.test.ts +181 -0
- package/node_modules/@sting8k/pi-vcc/tests/before-compact.test.ts +140 -0
- package/node_modules/@sting8k/pi-vcc/tests/brief.test.ts +206 -0
- package/node_modules/@sting8k/pi-vcc/tests/build-sections.test.ts +59 -0
- package/node_modules/@sting8k/pi-vcc/tests/compile.test.ts +80 -0
- package/node_modules/@sting8k/pi-vcc/tests/content.test.ts +31 -0
- package/node_modules/@sting8k/pi-vcc/tests/extract-goals.test.ts +86 -0
- package/node_modules/@sting8k/pi-vcc/tests/extract-preferences.test.ts +30 -0
- package/node_modules/@sting8k/pi-vcc/tests/filter-noise.test.ts +61 -0
- package/node_modules/@sting8k/pi-vcc/tests/fixtures.ts +61 -0
- package/node_modules/@sting8k/pi-vcc/tests/format-recall.test.ts +30 -0
- package/node_modules/@sting8k/pi-vcc/tests/format.test.ts +62 -0
- package/node_modules/@sting8k/pi-vcc/tests/lineage.test.ts +33 -0
- package/node_modules/@sting8k/pi-vcc/tests/load-messages.test.ts +51 -0
- package/node_modules/@sting8k/pi-vcc/tests/normalize.test.ts +97 -0
- package/node_modules/@sting8k/pi-vcc/tests/real-sessions.test.ts +38 -0
- package/node_modules/@sting8k/pi-vcc/tests/recall-expand.test.ts +15 -0
- package/node_modules/@sting8k/pi-vcc/tests/recall-scope.test.ts +32 -0
- package/node_modules/@sting8k/pi-vcc/tests/recall-tool-scope.test.ts +67 -0
- package/node_modules/@sting8k/pi-vcc/tests/render-entries.test.ts +62 -0
- package/node_modules/@sting8k/pi-vcc/tests/report.test.ts +44 -0
- package/node_modules/@sting8k/pi-vcc/tests/sanitize.test.ts +24 -0
- package/node_modules/@sting8k/pi-vcc/tests/search-entries.test.ts +144 -0
- package/node_modules/@sting8k/pi-vcc/tests/support/load-session.ts +23 -0
- package/node_modules/@sting8k/pi-vcc/tests/support/real-sessions.ts +51 -0
- package/package.json +15 -4
- package/scripts/__pycache__/merge_graphify_corpora.cpython-314.pyc +0 -0
- package/scripts/index_youtube_urls.py +376 -0
- package/scripts/merge_graphify_corpora.py +398 -0
- package/scripts/regen_graphify_html.py +46 -0
- package/.agents/skills/defuddle/SKILL.md +0 -90
- package/.agents/skills/wiki/SKILL.md +0 -215
- package/.agents/skills/wiki/references/css-snippets.md +0 -122
- package/.agents/skills/wiki/references/frontmatter.md +0 -107
- package/.agents/skills/wiki/references/git-setup.md +0 -58
- package/.agents/skills/wiki/references/mcp-setup.md +0 -149
- package/.agents/skills/wiki/references/modes.md +0 -259
- package/.agents/skills/wiki/references/plugins.md +0 -96
- package/.agents/skills/wiki/references/rest-api.md +0 -124
- package/.agents/skills/wiki-fold/SKILL.md +0 -204
- package/.agents/skills/wiki-fold/references/fold-template.md +0 -133
- package/.agents/skills/wiki-ingest/SKILL.md +0 -288
- package/.agents/skills/wiki-lint/SKILL.md +0 -183
- package/.agents/skills/wiki-query/SKILL.md +0 -176
- package/.pi/agents/rethink.md +0 -140
- package/.pi/agents/wiki-ingest.md +0 -67
- package/.pi/agents/wiki-lint.md +0 -75
- package/.pi/internal/cursor-sdk-transcript-parser.ts +0 -59
- package/.pi/prompts/save.md +0 -16
- package/.pi/prompts/wiki.md +0 -23
- package/.pi/providers/cursor-sdk-provider.test.mjs +0 -476
- package/.pi/providers/cursor-sdk-provider.ts +0 -1085
- package/vault/AGENTS.md +0 -37
- package/vault/wiki/_templates/comparison.md +0 -39
- package/vault/wiki/_templates/concept.md +0 -40
- package/vault/wiki/_templates/decision.md +0 -21
- package/vault/wiki/_templates/entity.md +0 -32
- package/vault/wiki/_templates/flow.md +0 -14
- package/vault/wiki/_templates/module.md +0 -18
- package/vault/wiki/_templates/question.md +0 -31
- package/vault/wiki/_templates/source.md +0 -39
- package/vault/wiki/concepts/AST-Aware Code Chunking.md +0 -44
- package/vault/wiki/concepts/Build-Time Prompt Compilation.md +0 -107
- package/vault/wiki/concepts/Context Engine (AI Coding).md +0 -47
- package/vault/wiki/concepts/Context-Aware System Reminders.md +0 -61
- package/vault/wiki/concepts/Contextualized Text Embedding.md +0 -42
- package/vault/wiki/concepts/Contractor vs Employee AI Model.md +0 -55
- package/vault/wiki/concepts/Dual-Model Agent Architecture.md +0 -65
- package/vault/wiki/concepts/Late Chunking vs Early Chunking.md +0 -43
- package/vault/wiki/concepts/Majority Vote Ensembling.md +0 -68
- package/vault/wiki/concepts/Meta-Harness.md +0 -16
- package/vault/wiki/concepts/Multi-Agent AI Coding Architecture.md +0 -75
- package/vault/wiki/concepts/Prompt Enhancement.md +0 -90
- package/vault/wiki/concepts/Prompt Renderer.md +0 -89
- package/vault/wiki/concepts/Semantic Codebase Indexing.md +0 -67
- package/vault/wiki/concepts/additive-config-hierarchy.md +0 -16
- package/vault/wiki/concepts/agent-artifacts-verifiable-deliverables.md +0 -71
- package/vault/wiki/concepts/agent-browser-browser-automation.md +0 -99
- package/vault/wiki/concepts/agent-codebase-interface.md +0 -43
- package/vault/wiki/concepts/agent-harness-architecture.md +0 -67
- package/vault/wiki/concepts/agent-loop-detection-patterns.md +0 -133
- package/vault/wiki/concepts/agent-search-enforcement.md +0 -126
- package/vault/wiki/concepts/agent-skills-ecosystem.md +0 -74
- package/vault/wiki/concepts/agent-skills-pattern.md +0 -68
- package/vault/wiki/concepts/agentic-harness-context-enforcement.md +0 -91
- package/vault/wiki/concepts/agentic-harness.md +0 -34
- package/vault/wiki/concepts/agentic-orchestration-pipeline.md +0 -56
- package/vault/wiki/concepts/agentic-search-no-embeddings.md +0 -18
- package/vault/wiki/concepts/anthropic-context-engineering.md +0 -13
- package/vault/wiki/concepts/antigravity-agent-first-architecture.md +0 -61
- package/vault/wiki/concepts/ast-compression.md +0 -19
- package/vault/wiki/concepts/ast-truncation.md +0 -66
- package/vault/wiki/concepts/barrel-files.md +0 -37
- package/vault/wiki/concepts/browser-harness-agent.md +0 -41
- package/vault/wiki/concepts/browser-subagent-visual-verification.md +0 -82
- package/vault/wiki/concepts/codebase-intelligence-ecosystem-comparison.md +0 -192
- package/vault/wiki/concepts/codebase-intelligence-harness-integration.md +0 -161
- package/vault/wiki/concepts/codebase-to-context-ingestion.md +0 -46
- package/vault/wiki/concepts/codex-harness-innovations.md +0 -147
- package/vault/wiki/concepts/consensus-debate-flow.md +0 -17
- package/vault/wiki/concepts/consensus-debate.md +0 -206
- package/vault/wiki/concepts/content-addressed-spec-identity.md +0 -166
- package/vault/wiki/concepts/context-anxiety.md +0 -57
- package/vault/wiki/concepts/context-compression-techniques.md +0 -19
- package/vault/wiki/concepts/context-continuity.md +0 -22
- package/vault/wiki/concepts/context-drift-in-agents.md +0 -106
- package/vault/wiki/concepts/context-engineering.md +0 -62
- package/vault/wiki/concepts/context-folding.md +0 -67
- package/vault/wiki/concepts/context-mode.md +0 -38
- package/vault/wiki/concepts/cursor-harness-innovations.md +0 -107
- package/vault/wiki/concepts/deterministic-session-compaction.md +0 -79
- package/vault/wiki/concepts/drift-detection-unified.md +0 -296
- package/vault/wiki/concepts/execution-feedback-loop.md +0 -46
- package/vault/wiki/concepts/feedforward-feedback-harness.md +0 -60
- package/vault/wiki/concepts/five-root-cause-metrics-sentrux.md +0 -40
- package/vault/wiki/concepts/fork-safe-spec-storage.md +0 -89
- package/vault/wiki/concepts/fts5-sandbox.md +0 -19
- package/vault/wiki/concepts/fuzzy-edit-matching.md +0 -71
- package/vault/wiki/concepts/gemini-cli-architecture.md +0 -104
- package/vault/wiki/concepts/generator-evaluator-architecture.md +0 -64
- package/vault/wiki/concepts/guardian-agent-pattern.md +0 -67
- package/vault/wiki/concepts/harness-configuration-layers.md +0 -89
- package/vault/wiki/concepts/harness-control-frameworks.md +0 -155
- package/vault/wiki/concepts/harness-engineering-first-principles.md +0 -90
- package/vault/wiki/concepts/harness-h-formalism.md +0 -53
- package/vault/wiki/concepts/hybrid-code-search.md +0 -61
- package/vault/wiki/concepts/inline-post-edit-validation.md +0 -112
- package/vault/wiki/concepts/legendary-engineering-patterns-harness.md +0 -110
- package/vault/wiki/concepts/lifecycle-hooks.md +0 -94
- package/vault/wiki/concepts/mcp-tool-routing.md +0 -102
- package/vault/wiki/concepts/memory-system-of-record-vs-ephemeral-cache.md +0 -47
- package/vault/wiki/concepts/meta-agent-context-pruning.md +0 -151
- package/vault/wiki/concepts/model-adaptive-harness.md +0 -122
- package/vault/wiki/concepts/model-routing-agents.md +0 -101
- package/vault/wiki/concepts/monorepo-architecture.md +0 -45
- package/vault/wiki/concepts/multi-agent-specialization.md +0 -61
- package/vault/wiki/concepts/permission-subsystem.md +0 -16
- package/vault/wiki/concepts/pi-messenger-analysis.md +0 -243
- package/vault/wiki/concepts/pi-vscode-extension-landscape.md +0 -37
- package/vault/wiki/concepts/policy-engine-pattern.md +0 -78
- package/vault/wiki/concepts/progressive-disclosure-agents.md +0 -53
- package/vault/wiki/concepts/progressive-skill-disclosure.md +0 -17
- package/vault/wiki/concepts/provider-native-prompting.md +0 -203
- package/vault/wiki/concepts/quality-signal-sentrux.md +0 -37
- package/vault/wiki/concepts/repo-map-ranking.md +0 -42
- package/vault/wiki/concepts/result-monad-error-handling.md +0 -47
- package/vault/wiki/concepts/safety-defense-in-depth.md +0 -83
- package/vault/wiki/concepts/sandbox-os-enforcement.md +0 -18
- package/vault/wiki/concepts/selective-debate-routing.md +0 -70
- package/vault/wiki/concepts/self-evolving-harness.md +0 -60
- package/vault/wiki/concepts/sentrux-mcp-integration.md +0 -36
- package/vault/wiki/concepts/sentrux-rules-engine.md +0 -49
- package/vault/wiki/concepts/shell-pattern-compression.md +0 -24
- package/vault/wiki/concepts/skill-first-architecture.md +0 -166
- package/vault/wiki/concepts/structured-compaction.md +0 -78
- package/vault/wiki/concepts/subagent-orchestration.md +0 -17
- package/vault/wiki/concepts/subagent-worktree-isolation.md +0 -68
- package/vault/wiki/concepts/superpowers-methodology.md +0 -78
- package/vault/wiki/concepts/think-in-code.md +0 -73
- package/vault/wiki/concepts/ts-execution-layer.md +0 -100
- package/vault/wiki/concepts/typescript-strict-mode.md +0 -37
- package/vault/wiki/concepts/vcc-conversation-compaction-for-pi.md +0 -53
- package/vault/wiki/concepts/verification-drift-detection.md +0 -19
- package/vault/wiki/consensus/consensus-records.md +0 -58
- package/vault/wiki/decisions/2026-04-30-pi-lean-ctx-native.md +0 -122
- package/vault/wiki/decisions/2026-05-07-replace-lean-ctx-with-context-mode.md +0 -59
- package/vault/wiki/decisions/adr-008.md +0 -40
- package/vault/wiki/decisions/adr-009.md +0 -46
- package/vault/wiki/decisions/adr-010.md +0 -55
- package/vault/wiki/decisions/adr-011.md +0 -165
- package/vault/wiki/decisions/adr-012.md +0 -102
- package/vault/wiki/decisions/adr-013.md +0 -59
- package/vault/wiki/decisions/adr-014.md +0 -73
- package/vault/wiki/decisions/adr-015.md +0 -81
- package/vault/wiki/decisions/adr-016.md +0 -91
- package/vault/wiki/decisions/adr-017.md +0 -79
- package/vault/wiki/decisions/adr-018.md +0 -100
- package/vault/wiki/decisions/adr-019.md +0 -75
- package/vault/wiki/decisions/adr-020.md +0 -106
- package/vault/wiki/decisions/adr-021.md +0 -86
- package/vault/wiki/decisions/adr-022.md +0 -113
- package/vault/wiki/decisions/adr-023.md +0 -113
- package/vault/wiki/decisions/adr-024.md +0 -73
- package/vault/wiki/decisions/adr-025.md +0 -130
- package/vault/wiki/decisions/adr-026.md +0 -56
- package/vault/wiki/decisions/adr-027.md +0 -94
- package/vault/wiki/decisions/colocate-wiki.md +0 -34
- package/vault/wiki/entities/Anders Hejlsberg.md +0 -29
- package/vault/wiki/entities/Anthropic.md +0 -17
- package/vault/wiki/entities/Augment Code.md +0 -49
- package/vault/wiki/entities/Bjarne Stroustrup.md +0 -26
- package/vault/wiki/entities/Bolt.new (StackBlitz).md +0 -39
- package/vault/wiki/entities/Boris Cherny.md +0 -11
- package/vault/wiki/entities/Claude Code.md +0 -19
- package/vault/wiki/entities/Dennis Ritchie.md +0 -26
- package/vault/wiki/entities/Emergent Labs.md +0 -32
- package/vault/wiki/entities/Google Cloud.md +0 -16
- package/vault/wiki/entities/Guido van Rossum.md +0 -28
- package/vault/wiki/entities/Ken Thompson.md +0 -28
- package/vault/wiki/entities/Lee et al.md +0 -16
- package/vault/wiki/entities/Linus Torvalds.md +0 -28
- package/vault/wiki/entities/Lovable (company).md +0 -40
- package/vault/wiki/entities/Martin Fowler.md +0 -16
- package/vault/wiki/entities/Meng et al.md +0 -16
- package/vault/wiki/entities/OpenAI.md +0 -16
- package/vault/wiki/entities/Rocket.new.md +0 -38
- package/vault/wiki/entities/VILA-Lab.md +0 -15
- package/vault/wiki/entities/autodev-codebase.md +0 -18
- package/vault/wiki/entities/ck-tool.md +0 -59
- package/vault/wiki/entities/codesearch.md +0 -18
- package/vault/wiki/entities/disler-indydevdan.md +0 -33
- package/vault/wiki/entities/gsd-get-shit-done.md +0 -56
- package/vault/wiki/entities/javascript-runtimes.md +0 -48
- package/vault/wiki/entities/jesse-vincent.md +0 -38
- package/vault/wiki/entities/lean-ctx.md +0 -32
- package/vault/wiki/entities/opendev.md +0 -41
- package/vault/wiki/entities/ops-codegraph-tool.md +0 -18
- package/vault/wiki/entities/pi-coding-agent.md +0 -53
- package/vault/wiki/entities/sentrux.md +0 -54
- package/vault/wiki/entities/vgrep-tool.md +0 -57
- package/vault/wiki/entities/vitest.md +0 -41
- package/vault/wiki/flows/harness-wiki-pipeline.md +0 -204
- package/vault/wiki/hot.md +0 -932
- package/vault/wiki/index.md +0 -437
- package/vault/wiki/log.md +0 -422
- package/vault/wiki/meta/dashboard.md +0 -30
- package/vault/wiki/meta/lint-report-2026-04-30.md +0 -86
- package/vault/wiki/meta/lint-report-2026-05-02.md +0 -251
- package/vault/wiki/meta/overview.canvas +0 -43
- package/vault/wiki/modules/adversarial-verification.md +0 -57
- package/vault/wiki/modules/automated-observability.md +0 -54
- package/vault/wiki/modules/bench.md +0 -20
- package/vault/wiki/modules/extensions.md +0 -23
- package/vault/wiki/modules/grounding-checkpoints.md +0 -62
- package/vault/wiki/modules/harness-implementation-plan.md +0 -345
- package/vault/wiki/modules/harness-wiki-skill-mapping.md +0 -135
- package/vault/wiki/modules/harness.md +0 -86
- package/vault/wiki/modules/persistent-memory.md +0 -85
- package/vault/wiki/modules/schema-orchestration.md +0 -68
- package/vault/wiki/modules/skills.md +0 -27
- package/vault/wiki/modules/spec-hardening.md +0 -58
- package/vault/wiki/modules/structured-planning.md +0 -53
- package/vault/wiki/modules/think-in-code-enforcement.md +0 -153
- package/vault/wiki/modules/wiki-query-interface.md +0 -64
- package/vault/wiki/overview.md +0 -51
- package/vault/wiki/questions/Research-pi-vs-claude-code-agentic-orchestration-pipeline.md +0 -87
- package/vault/wiki/questions/Research-sentrux-dev.md +0 -123
- package/vault/wiki/questions/Research-superpowers-skill-for-agentic-coding-agents.md +0 -164
- package/vault/wiki/questions/Research: Augment Code Context Engine.md +0 -244
- package/vault/wiki/questions/Research: Automating Software Engineering - Lovable, Bolt, Emergent, Rocket.md +0 -112
- package/vault/wiki/questions/Research: Claude Code State-of-the-Art Harness Improvements.md +0 -209
- package/vault/wiki/questions/Research: Codex State-of-the-Art Harness Improvements.md +0 -99
- package/vault/wiki/questions/Research: Engineering Workflows of Legendary Programmers and AI Harness Mapping.md +0 -107
- package/vault/wiki/questions/Research: Fallow Codebase Intelligence Harness Integration.md +0 -72
- package/vault/wiki/questions/Research: Gemini CLI SOTA Harness Integration.md +0 -166
- package/vault/wiki/questions/Research: GitHub Issues as Harness Spec Storage.md +0 -188
- package/vault/wiki/questions/Research: Google Antigravity Harness Integration.md +0 -120
- package/vault/wiki/questions/Research: Meta-Agent Context Drift Detection.md +0 -236
- package/vault/wiki/questions/Research: Model-Adaptive Agent Harness Design.md +0 -95
- package/vault/wiki/questions/Research: Model-Specific Prompting Guides.md +0 -165
- package/vault/wiki/questions/Research: Prompt Renderer for Multi-Model Agent Harness.md +0 -216
- package/vault/wiki/questions/Research: Skill-First Harness Architecture.md +0 -91
- package/vault/wiki/questions/Research: TypeScript Best Practices and Codebase Structure.md +0 -88
- package/vault/wiki/questions/Research: TypeScript Execution Layer for Agent Tool Calling.md +0 -81
- package/vault/wiki/questions/Research: claude-mem over Obsidian for Harness Layer.md +0 -71
- package/vault/wiki/questions/Research: claude-mem over obsidian wiki as the knowledge base for our agentic harness pipeline. think from first principles. does this replace or complement our current setup? no hard feelings about previous decisions. gimme accurate points.md +0 -80
- package/vault/wiki/questions/Research: context-mode vs lean-ctx.md +0 -72
- package/vault/wiki/questions/Research: cursor.sh Harness Innovations.md +0 -92
- package/vault/wiki/questions/Research: executor.sh Harness Integration.md +0 -170
- package/vault/wiki/questions/Research: how GSD fits into our coding harness setup.md +0 -97
- package/vault/wiki/questions/Research: how claude-mem fits into our workflow. and whether it should replace obsidian in the codebase. no hard feelings about previous actions, rethink from first principles always.md +0 -80
- package/vault/wiki/questions/Research: pi-vcc.md +0 -113
- package/vault/wiki/questions/Research: semantic code search tools.md +0 -69
- package/vault/wiki/questions/Research: vcc extension for pi coding agent.md +0 -73
- package/vault/wiki/questions/how-to-enable-semantic-code-search-now.md +0 -111
- package/vault/wiki/questions/mvp-implementation-blueprint.md +0 -552
- package/vault/wiki/questions/research-agent-first-codebase-exploration.md +0 -199
- package/vault/wiki/questions/research-agentic-coding-harness-latest-papers.md +0 -142
- package/vault/wiki/questions/research-gitingest-gitreverse-integration.md +0 -100
- package/vault/wiki/questions/research-wozcode-token-reduction.md +0 -67
- package/vault/wiki/questions/resolved-context-pruning-inplace-vs-restart.md +0 -95
- package/vault/wiki/questions/resolved-context-window-economics.md +0 -167
- package/vault/wiki/questions/resolved-imad-debate-gating-transfer.md +0 -126
- package/vault/wiki/questions/resolved-mcp-tool-preference.md +0 -112
- package/vault/wiki/questions/resolved-small-model-meta-agents.md +0 -107
- package/vault/wiki/questions/resolved-treesitter-dynamic-languages.md +0 -95
- package/vault/wiki/sources/Auggie Context MCP Server.md +0 -63
- package/vault/wiki/sources/Augment Code Codacy AI Giants.md +0 -61
- package/vault/wiki/sources/Augment Code MCP SiliconAngle.md +0 -49
- package/vault/wiki/sources/Augment Code WorkOS ERC 2025.md +0 -55
- package/vault/wiki/sources/Augment Context Engine Official.md +0 -71
- package/vault/wiki/sources/Augment SWE-bench Agent GitHub.md +0 -74
- package/vault/wiki/sources/Augment SWE-bench Pro Blog.md +0 -58
- package/vault/wiki/sources/Source: AgentBus Jinja2 Prompt Pipelines.md +0 -75
- package/vault/wiki/sources/Source: Arxiv /342/200/224 Don't Break the Cache.md" +0 -85
- package/vault/wiki/sources/Source: Augment - Harness Engineering for AI Coding Agents.md +0 -58
- package/vault/wiki/sources/Source: Blake Crosley Agent Architecture Guide.md +0 -100
- package/vault/wiki/sources/Source: Bolt.new Architecture & Case Study.md +0 -75
- package/vault/wiki/sources/Source: Build-Time Prompt Compilation Architecture.md +0 -107
- package/vault/wiki/sources/Source: Claude API Agent Skills Overview.md +0 -70
- package/vault/wiki/sources/Source: Gemini CLI Changelogs.md +0 -88
- package/vault/wiki/sources/Source: Google Blog - Gemini CLI Announcement.md +0 -57
- package/vault/wiki/sources/Source: Google Gemini CLI Architecture Docs.md +0 -53
- package/vault/wiki/sources/Source: LangChain - Anatomy of Agent Harness.md +0 -65
- package/vault/wiki/sources/Source: Lovable Architecture & Clone Analysis.md +0 -83
- package/vault/wiki/sources/Source: Martin Fowler - Harness Engineering.md +0 -70
- package/vault/wiki/sources/Source: OpenAI Harness Engineering Five Principles.md +0 -58
- package/vault/wiki/sources/Source: OpenAI Harness Engineering /342/200/224 0 Lines of Human Code.md" +0 -101
- package/vault/wiki/sources/Source: OpenDev /342/200/224 Building AI Coding Agents for the Terminal.md" +0 -100
- package/vault/wiki/sources/Source: Render AI Coding Agents Benchmark 2025.md +0 -53
- package/vault/wiki/sources/Source: Rocket.new /342/200/224 Vibe Solutioning Platform.md" +0 -70
- package/vault/wiki/sources/Source: SwirlAI Agent Skills Progressive Disclosure.md +0 -71
- package/vault/wiki/sources/Source: TianPan Prompt Caching Architecture.md +0 -89
- package/vault/wiki/sources/Source: Vercel Labs agent-browser.md +0 -155
- package/vault/wiki/sources/Source: browser-harness CDP Harness.md +0 -126
- package/vault/wiki/sources/agent-drift-academic-paper.md +0 -79
- package/vault/wiki/sources/aider-repomap-tree-sitter.md +0 -42
- package/vault/wiki/sources/anthropic-compaction-api.md +0 -58
- package/vault/wiki/sources/anthropic-effective-harnesses.md +0 -42
- package/vault/wiki/sources/anthropic-prompt-best-practices.md +0 -100
- package/vault/wiki/sources/anthropic2026-harness-design.md +0 -63
- package/vault/wiki/sources/barrel-files-tkdodo.md +0 -38
- package/vault/wiki/sources/birth-of-unix-kernighan-interview.md +0 -57
- package/vault/wiki/sources/bockeler2026-harness-engineering.md +0 -69
- package/vault/wiki/sources/cast-code-chunking-paper.md +0 -50
- package/vault/wiki/sources/ck-semantic-search.md +0 -78
- package/vault/wiki/sources/claude-code-architecture-karaxai-2026.md +0 -71
- package/vault/wiki/sources/claude-code-architecture-qubytes-2026.md +0 -50
- package/vault/wiki/sources/claude-code-architecture-vila-lab-2026.md +0 -64
- package/vault/wiki/sources/claude-code-security-architecture-penligent-2026.md +0 -70
- package/vault/wiki/sources/claude-context-editing-docs.md +0 -13
- package/vault/wiki/sources/cloudflare-codemode.md +0 -63
- package/vault/wiki/sources/code-chunk-library-supermemory.md +0 -63
- package/vault/wiki/sources/codeact-apple-2024.md +0 -62
- package/vault/wiki/sources/codex-dsc-rfc-8573.md +0 -41
- package/vault/wiki/sources/codex-open-source-agent-2026.md +0 -110
- package/vault/wiki/sources/coir-code-retrieval-benchmark.md +0 -51
- package/vault/wiki/sources/colinmcnamara-context-optimization-codemode.md +0 -48
- package/vault/wiki/sources/context-folding-paper.md +0 -61
- package/vault/wiki/sources/context-mode-website.md +0 -63
- package/vault/wiki/sources/cursor-agent-best-practices-2026.md +0 -62
- package/vault/wiki/sources/cursor-fork-29b-2025.md +0 -50
- package/vault/wiki/sources/cursor-harness-april-2026.md +0 -76
- package/vault/wiki/sources/cursor-instant-apply-2024.md +0 -45
- package/vault/wiki/sources/cursor-shadow-workspace-2024.md +0 -52
- package/vault/wiki/sources/cursor-shipped-coding-agent-2026.md +0 -53
- package/vault/wiki/sources/cursor-vs-antigravity-2026.md +0 -51
- package/vault/wiki/sources/disler-pi-vs-claude-code.md +0 -69
- package/vault/wiki/sources/distill-deterministic-context-compression.md +0 -53
- package/vault/wiki/sources/embedding-models-benchmark-supermemory-2025.md +0 -48
- package/vault/wiki/sources/executor-rhyssullivan.md +0 -122
- package/vault/wiki/sources/fallow-rs-codebase-intelligence.md +0 -125
- package/vault/wiki/sources/fan2025-imad.md +0 -60
- package/vault/wiki/sources/forgecode-gpt5-agent-improvements.md +0 -63
- package/vault/wiki/sources/gemini-3-prompting-guide.md +0 -78
- package/vault/wiki/sources/gh-cli-sub-issue-rfc.md +0 -50
- package/vault/wiki/sources/gh-sub-issue-extension.md +0 -72
- package/vault/wiki/sources/github-fork-issues-discussion.md +0 -44
- package/vault/wiki/sources/github-issue-dependencies-docs.md +0 -49
- package/vault/wiki/sources/github-sub-issues-docs.md +0 -51
- package/vault/wiki/sources/gitingest.md +0 -91
- package/vault/wiki/sources/gitreverse.md +0 -63
- package/vault/wiki/sources/google-antigravity-official-blog.md +0 -47
- package/vault/wiki/sources/google-antigravity-wikipedia.md +0 -53
- package/vault/wiki/sources/gsd-codecentric-deep-dive.md +0 -57
- package/vault/wiki/sources/gsd-github-repo.md +0 -51
- package/vault/wiki/sources/gsd-hn-discussion.md +0 -59
- package/vault/wiki/sources/guido-python-design-philosophy.md +0 -56
- package/vault/wiki/sources/hejlsberg-7-learnings.md +0 -48
- package/vault/wiki/sources/ironclaw-drift-monitor.md +0 -80
- package/vault/wiki/sources/langsight-loop-detection.md +0 -80
- package/vault/wiki/sources/leanctx-website.md +0 -69
- package/vault/wiki/sources/lee2026-meta-harness.md +0 -59
- package/vault/wiki/sources/linux-kernel-coding-workflow.md +0 -50
- package/vault/wiki/sources/lou2026-autoharness.md +0 -53
- package/vault/wiki/sources/martin-fowler-harness-engineering.md +0 -73
- package/vault/wiki/sources/mcp-architecture-docs.md +0 -13
- package/vault/wiki/sources/meng2026-agent-harness-survey.md +0 -79
- package/vault/wiki/sources/mindstudio-four-agent-types.md +0 -68
- package/vault/wiki/sources/ms-chat-history-management.md +0 -13
- package/vault/wiki/sources/openai-prompt-guidance.md +0 -104
- package/vault/wiki/sources/openclaw-session-pruning.md +0 -13
- package/vault/wiki/sources/opencode-dcp.md +0 -13
- package/vault/wiki/sources/opendev-arxiv-2603.05344v1.md +0 -79
- package/vault/wiki/sources/openhands-platform.md +0 -39
- package/vault/wiki/sources/oss-guide-codebase-exploration.md +0 -53
- package/vault/wiki/sources/pi-compaction-extensions-ecosystem.md +0 -102
- package/vault/wiki/sources/pi-context-prune-github-repo.md +0 -38
- package/vault/wiki/sources/pi-mono-compaction-docs.md +0 -38
- package/vault/wiki/sources/pi-omni-compact-github-repo.md +0 -50
- package/vault/wiki/sources/pi-rtk-optimizer-github-repo.md +0 -45
- package/vault/wiki/sources/pi-vcc-github-repo.md +0 -69
- package/vault/wiki/sources/pi-vscode-marketplace.md +0 -41
- package/vault/wiki/sources/pi-vscode-model-provider-marketplace.md +0 -39
- package/vault/wiki/sources/py-tree-sitter.md +0 -13
- package/vault/wiki/sources/sentrux-dev-landing.md +0 -40
- package/vault/wiki/sources/sentrux-docs-pro-architecture.md +0 -75
- package/vault/wiki/sources/sentrux-docs-quality-signal.md +0 -46
- package/vault/wiki/sources/sentrux-docs-root-cause-metrics.md +0 -57
- package/vault/wiki/sources/sentrux-docs-rules-engine.md +0 -58
- package/vault/wiki/sources/sentrux-github-repo.md +0 -56
- package/vault/wiki/sources/superpowers-github-repo.md +0 -56
- package/vault/wiki/sources/superpowers-release-blog.md +0 -54
- package/vault/wiki/sources/superpowers-termdock-analysis.md +0 -45
- package/vault/wiki/sources/swe-agent-aci.md +0 -42
- package/vault/wiki/sources/swe-bench.md +0 -45
- package/vault/wiki/sources/swe-pruner-context-pruning.md +0 -13
- package/vault/wiki/sources/think-in-code-blog.md +0 -48
- package/vault/wiki/sources/tree-sitter-docs.md +0 -13
- package/vault/wiki/sources/ts-best-practices-2025-devto.md +0 -42
- package/vault/wiki/sources/ts-folder-structure-mingyang.md +0 -58
- package/vault/wiki/sources/ts-monorepo-koerselman.md +0 -44
- package/vault/wiki/sources/ts-result-error-handling-kkalamarski.md +0 -52
- package/vault/wiki/sources/ts-runtimes-comparison-betterstack.md +0 -42
- package/vault/wiki/sources/ts-strict-mode-rishikc.md +0 -43
- package/vault/wiki/sources/unix-philosophy.md +0 -48
- package/vault/wiki/sources/vectara-chunking-vs-embedding-naacl2025.md +0 -39
- package/vault/wiki/sources/vectara-guardian-agents.md +0 -79
- package/vault/wiki/sources/vgrep-semantic-search.md +0 -76
- package/vault/wiki/sources/vitest-official.md +0 -41
- package/vault/wiki/sources/vscode-pi-community-extension.md +0 -40
- package/vault/wiki/sources/wozcode.md +0 -79
|
@@ -0,0 +1,349 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* policy-gate — plan-before-mutate and phase enforcement.
|
|
3
|
+
*
|
|
4
|
+
* Pi-compatible patterns:
|
|
5
|
+
* - default extension factory
|
|
6
|
+
* - state persisted via pi.appendEntry()
|
|
7
|
+
* - enforcement via before_agent_start + tool_call hooks
|
|
8
|
+
* - command surface via pi.registerCommand()
|
|
9
|
+
*/
|
|
10
|
+
|
|
11
|
+
import type { ExtensionAPI } from "@mariozechner/pi-coding-agent";
|
|
12
|
+
|
|
13
|
+
type HarnessPhase = "plan" | "execute" | "evaluate" | "adversary" | "merge";
|
|
14
|
+
|
|
15
|
+
interface PolicyState {
|
|
16
|
+
phase: HarnessPhase;
|
|
17
|
+
approvedPlan: boolean;
|
|
18
|
+
planId: string | null;
|
|
19
|
+
budgetBypass: boolean;
|
|
20
|
+
aborted: boolean;
|
|
21
|
+
abortReason: string | null;
|
|
22
|
+
abortedAt: string | null;
|
|
23
|
+
updatedAt: string;
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
interface SessionEntryLike {
|
|
27
|
+
type?: string;
|
|
28
|
+
customType?: string;
|
|
29
|
+
data?: unknown;
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
const PHASE_ORDER: HarnessPhase[] = [
|
|
33
|
+
"plan",
|
|
34
|
+
"execute",
|
|
35
|
+
"evaluate",
|
|
36
|
+
"adversary",
|
|
37
|
+
"merge",
|
|
38
|
+
];
|
|
39
|
+
|
|
40
|
+
const MUTATING_TOOLS = new Set(["write", "edit"]);
|
|
41
|
+
const BASH_MUTATION_PATTERNS = [
|
|
42
|
+
/\bgit\s+commit\b/i,
|
|
43
|
+
/\bgit\s+push\b/i,
|
|
44
|
+
/\bgit\s+merge\b/i,
|
|
45
|
+
/\bgit\s+rebase\b/i,
|
|
46
|
+
/\brm\s+(-rf?|--recursive)\b/i,
|
|
47
|
+
/\bmv\b/i,
|
|
48
|
+
/\bcp\b/i,
|
|
49
|
+
/\bmkdir\b/i,
|
|
50
|
+
/\bchmod\b/i,
|
|
51
|
+
/\bchown\b/i,
|
|
52
|
+
/\bsed\s+-i\b/i,
|
|
53
|
+
/\bperl\s+-i\b/i,
|
|
54
|
+
];
|
|
55
|
+
|
|
56
|
+
function nowIso(): string {
|
|
57
|
+
return new Date().toISOString();
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
function defaultState(): PolicyState {
|
|
61
|
+
return {
|
|
62
|
+
phase: "execute",
|
|
63
|
+
approvedPlan: true,
|
|
64
|
+
planId: null,
|
|
65
|
+
budgetBypass: false,
|
|
66
|
+
aborted: false,
|
|
67
|
+
abortReason: null,
|
|
68
|
+
abortedAt: null,
|
|
69
|
+
updatedAt: nowIso(),
|
|
70
|
+
};
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
function isBootstrapPrompt(prompt: string): boolean {
|
|
74
|
+
const p = prompt.toLowerCase();
|
|
75
|
+
return (
|
|
76
|
+
p.includes("/harness-setup") ||
|
|
77
|
+
p.includes("harness-setup") ||
|
|
78
|
+
p.includes("full harness bootstrap")
|
|
79
|
+
);
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
function inferPhase(prompt: string, current: HarnessPhase): HarnessPhase {
|
|
83
|
+
const p = prompt.toLowerCase();
|
|
84
|
+
if (
|
|
85
|
+
p.includes("/harness-plan") ||
|
|
86
|
+
p.includes("harness-plan") ||
|
|
87
|
+
p.includes("/harness-auto") ||
|
|
88
|
+
p.includes("harness-auto")
|
|
89
|
+
)
|
|
90
|
+
return "plan";
|
|
91
|
+
if (p.includes("/harness-run") || p.includes("harness-run")) return "execute";
|
|
92
|
+
if (p.includes("/harness-eval") || p.includes("harness-eval"))
|
|
93
|
+
return "evaluate";
|
|
94
|
+
if (p.includes("/harness-review") || p.includes("harness-review"))
|
|
95
|
+
return "evaluate";
|
|
96
|
+
if (p.includes("/harness-critic") || p.includes("harness-critic"))
|
|
97
|
+
return "adversary";
|
|
98
|
+
if (p.includes("adversary")) return "adversary";
|
|
99
|
+
if (p.includes("merge gate") || p.includes("policy decision")) return "merge";
|
|
100
|
+
return "execute";
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
function hasApprovedPlanSignal(prompt: string): boolean {
|
|
104
|
+
const p = prompt.toLowerCase();
|
|
105
|
+
return (
|
|
106
|
+
p.includes("planpacket") ||
|
|
107
|
+
p.includes("--plan") ||
|
|
108
|
+
p.includes("approved plan") ||
|
|
109
|
+
p.includes("plan_id")
|
|
110
|
+
);
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
function hasAbortSignal(prompt: string): boolean {
|
|
114
|
+
const p = prompt.toLowerCase();
|
|
115
|
+
return p.includes("/harness-abort") || p.includes("harness-abort");
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
function isValidTransition(from: HarnessPhase, to: HarnessPhase): boolean {
|
|
119
|
+
if (from === to) return true;
|
|
120
|
+
if (to === "plan") return true;
|
|
121
|
+
if (to === "execute") return true;
|
|
122
|
+
const fromIndex = PHASE_ORDER.indexOf(from);
|
|
123
|
+
const toIndex = PHASE_ORDER.indexOf(to);
|
|
124
|
+
return toIndex === fromIndex + 1;
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
function isMutatingBash(command: string): boolean {
|
|
128
|
+
return BASH_MUTATION_PATTERNS.some((pattern) => pattern.test(command));
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
function getLatestPolicyState(ctx: {
|
|
132
|
+
sessionManager: { getEntries(): unknown[] };
|
|
133
|
+
}): PolicyState {
|
|
134
|
+
const entries = ctx.sessionManager.getEntries() as SessionEntryLike[];
|
|
135
|
+
for (let i = entries.length - 1; i >= 0; i--) {
|
|
136
|
+
const entry = entries[i];
|
|
137
|
+
if (
|
|
138
|
+
entry.type !== "custom" ||
|
|
139
|
+
entry.customType !== "harness-policy-state"
|
|
140
|
+
) {
|
|
141
|
+
continue;
|
|
142
|
+
}
|
|
143
|
+
const candidate = entry.data as Partial<PolicyState> | undefined;
|
|
144
|
+
if (
|
|
145
|
+
candidate &&
|
|
146
|
+
typeof candidate.phase === "string" &&
|
|
147
|
+
PHASE_ORDER.includes(candidate.phase as HarnessPhase)
|
|
148
|
+
) {
|
|
149
|
+
return {
|
|
150
|
+
phase: candidate.phase as HarnessPhase,
|
|
151
|
+
approvedPlan: Boolean(candidate.approvedPlan),
|
|
152
|
+
planId: typeof candidate.planId === "string" ? candidate.planId : null,
|
|
153
|
+
budgetBypass: Boolean(candidate.budgetBypass),
|
|
154
|
+
aborted: Boolean(candidate.aborted),
|
|
155
|
+
abortReason:
|
|
156
|
+
typeof candidate.abortReason === "string"
|
|
157
|
+
? candidate.abortReason
|
|
158
|
+
: null,
|
|
159
|
+
abortedAt:
|
|
160
|
+
typeof candidate.abortedAt === "string" ? candidate.abortedAt : null,
|
|
161
|
+
updatedAt:
|
|
162
|
+
typeof candidate.updatedAt === "string"
|
|
163
|
+
? candidate.updatedAt
|
|
164
|
+
: nowIso(),
|
|
165
|
+
};
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
return defaultState();
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
export default function policyGate(pi: ExtensionAPI) {
|
|
172
|
+
let state = defaultState();
|
|
173
|
+
|
|
174
|
+
pi.on("session_start", async (_event, ctx) => {
|
|
175
|
+
state = getLatestPolicyState(ctx);
|
|
176
|
+
});
|
|
177
|
+
|
|
178
|
+
pi.on("before_agent_start", async (event) => {
|
|
179
|
+
const bootstrapPrompt = isBootstrapPrompt(event.prompt);
|
|
180
|
+
const abortSignal = hasAbortSignal(event.prompt);
|
|
181
|
+
if (abortSignal) {
|
|
182
|
+
state.phase = "plan";
|
|
183
|
+
state.approvedPlan = false;
|
|
184
|
+
state.planId = null;
|
|
185
|
+
state.budgetBypass = false;
|
|
186
|
+
state.aborted = true;
|
|
187
|
+
state.abortReason = "harness-abort command";
|
|
188
|
+
state.abortedAt = nowIso();
|
|
189
|
+
state.updatedAt = state.abortedAt;
|
|
190
|
+
pi.appendEntry("harness-policy-state", state);
|
|
191
|
+
return {
|
|
192
|
+
message: {
|
|
193
|
+
customType: "harness-policy-aborted",
|
|
194
|
+
display: true,
|
|
195
|
+
content: [
|
|
196
|
+
"Harness run aborted safely.",
|
|
197
|
+
"Mutating tools are now blocked until a new approved plan is attached.",
|
|
198
|
+
'Next step: /harness-plan "<task>"',
|
|
199
|
+
].join("\n"),
|
|
200
|
+
},
|
|
201
|
+
systemPrompt: `${event.systemPrompt}\n\n[PolicyGate]\nAbort lock active. Mutating tools must remain blocked until a new approved plan is attached.`,
|
|
202
|
+
};
|
|
203
|
+
}
|
|
204
|
+
|
|
205
|
+
const nextPhase = inferPhase(event.prompt, state.phase);
|
|
206
|
+
const planSignal = hasApprovedPlanSignal(event.prompt);
|
|
207
|
+
|
|
208
|
+
if (!isValidTransition(state.phase, nextPhase)) {
|
|
209
|
+
return {
|
|
210
|
+
message: {
|
|
211
|
+
customType: "harness-policy-violation",
|
|
212
|
+
display: true,
|
|
213
|
+
content: [
|
|
214
|
+
`Policy gate blocked invalid phase transition: ${state.phase} -> ${nextPhase}.`,
|
|
215
|
+
"Run /harness-plan first or continue in the current phase.",
|
|
216
|
+
].join("\n"),
|
|
217
|
+
},
|
|
218
|
+
};
|
|
219
|
+
}
|
|
220
|
+
|
|
221
|
+
if (nextPhase === "plan") {
|
|
222
|
+
state.approvedPlan = false;
|
|
223
|
+
state.planId = null;
|
|
224
|
+
}
|
|
225
|
+
|
|
226
|
+
if (nextPhase === "execute" && !state.approvedPlan && !planSignal) {
|
|
227
|
+
// Softened enforcement: flow mode defaults to execute without hard plan requirement.
|
|
228
|
+
state.approvedPlan = true;
|
|
229
|
+
}
|
|
230
|
+
|
|
231
|
+
if (planSignal) {
|
|
232
|
+
state.approvedPlan = true;
|
|
233
|
+
const planMatch = event.prompt.match(
|
|
234
|
+
/plan[_-]?id["'\s:=]+([A-Za-z0-9._:-]+)/i,
|
|
235
|
+
);
|
|
236
|
+
state.planId = planMatch?.[1] ?? state.planId;
|
|
237
|
+
state.aborted = false;
|
|
238
|
+
state.abortReason = null;
|
|
239
|
+
state.abortedAt = null;
|
|
240
|
+
}
|
|
241
|
+
state.budgetBypass = bootstrapPrompt;
|
|
242
|
+
state.phase = nextPhase;
|
|
243
|
+
state.updatedAt = nowIso();
|
|
244
|
+
pi.appendEntry("harness-policy-state", state);
|
|
245
|
+
|
|
246
|
+
return {
|
|
247
|
+
systemPrompt: `${event.systemPrompt}\n\n[PolicyGate]\nPhase=${state.phase}; ApprovedPlan=${state.approvedPlan}; PlanId=${state.planId ?? "none"}; Aborted=${state.aborted}.`,
|
|
248
|
+
};
|
|
249
|
+
});
|
|
250
|
+
|
|
251
|
+
pi.on("tool_call", async (event) => {
|
|
252
|
+
if (state.aborted && MUTATING_TOOLS.has(event.toolName)) {
|
|
253
|
+
return {
|
|
254
|
+
block: true,
|
|
255
|
+
reason:
|
|
256
|
+
"policy-gate: mutating tool blocked because harness-abort lock is active. Attach a new approved plan first.",
|
|
257
|
+
};
|
|
258
|
+
}
|
|
259
|
+
if (MUTATING_TOOLS.has(event.toolName)) {
|
|
260
|
+
if (state.phase !== "execute") {
|
|
261
|
+
return {
|
|
262
|
+
block: true,
|
|
263
|
+
reason: `policy-gate: ${event.toolName} blocked in phase '${state.phase}'. Allowed only in execute phase.`,
|
|
264
|
+
};
|
|
265
|
+
}
|
|
266
|
+
}
|
|
267
|
+
|
|
268
|
+
if (event.toolName === "bash") {
|
|
269
|
+
const command = String(event.input.command ?? "");
|
|
270
|
+
if (!isMutatingBash(command)) return undefined;
|
|
271
|
+
if (state.aborted) {
|
|
272
|
+
return {
|
|
273
|
+
block: true,
|
|
274
|
+
reason:
|
|
275
|
+
"policy-gate: mutating bash command blocked because harness-abort lock is active. Attach a new approved plan first.",
|
|
276
|
+
};
|
|
277
|
+
}
|
|
278
|
+
if (state.phase !== "execute") {
|
|
279
|
+
return {
|
|
280
|
+
block: true,
|
|
281
|
+
reason: `policy-gate: mutating bash command blocked in phase '${state.phase}'.`,
|
|
282
|
+
};
|
|
283
|
+
}
|
|
284
|
+
}
|
|
285
|
+
|
|
286
|
+
return undefined;
|
|
287
|
+
});
|
|
288
|
+
|
|
289
|
+
pi.registerCommand("harness-abort", {
|
|
290
|
+
description: "Safely abort current harness run and reset to plan phase",
|
|
291
|
+
handler: async (args, ctx) => {
|
|
292
|
+
const reason = args.trim();
|
|
293
|
+
state.phase = "plan";
|
|
294
|
+
state.approvedPlan = false;
|
|
295
|
+
state.planId = null;
|
|
296
|
+
state.budgetBypass = false;
|
|
297
|
+
state.aborted = true;
|
|
298
|
+
state.abortReason = reason.length > 0 ? reason : "manual abort";
|
|
299
|
+
state.abortedAt = nowIso();
|
|
300
|
+
state.updatedAt = state.abortedAt;
|
|
301
|
+
pi.appendEntry("harness-policy-state", state);
|
|
302
|
+
|
|
303
|
+
const lines = [
|
|
304
|
+
"Harness run aborted safely.",
|
|
305
|
+
" phase: plan",
|
|
306
|
+
" approvedPlan: false",
|
|
307
|
+
` abortReason: ${state.abortReason}`,
|
|
308
|
+
` abortedAt: ${state.abortedAt}`,
|
|
309
|
+
"Mutating tools are now blocked until a new approved plan is attached.",
|
|
310
|
+
'Next command: /harness-plan "<task>"',
|
|
311
|
+
];
|
|
312
|
+
if (ctx.hasUI) {
|
|
313
|
+
ctx.ui.notify(lines.join("\n"), "warning");
|
|
314
|
+
return;
|
|
315
|
+
}
|
|
316
|
+
pi.sendMessage({
|
|
317
|
+
customType: "harness-policy-aborted",
|
|
318
|
+
content: lines.join("\n"),
|
|
319
|
+
display: true,
|
|
320
|
+
});
|
|
321
|
+
},
|
|
322
|
+
});
|
|
323
|
+
|
|
324
|
+
pi.registerCommand("harness-policy-status", {
|
|
325
|
+
description: "Show current harness policy gate state",
|
|
326
|
+
handler: async (_args, ctx) => {
|
|
327
|
+
const latest = getLatestPolicyState(ctx);
|
|
328
|
+
const lines = [
|
|
329
|
+
"Harness policy gate:",
|
|
330
|
+
` phase: ${latest.phase}`,
|
|
331
|
+
` approvedPlan: ${latest.approvedPlan}`,
|
|
332
|
+
` planId: ${latest.planId ?? "(none)"}`,
|
|
333
|
+
` aborted: ${latest.aborted}`,
|
|
334
|
+
` abortReason: ${latest.abortReason ?? "(none)"}`,
|
|
335
|
+
` abortedAt: ${latest.abortedAt ?? "(none)"}`,
|
|
336
|
+
` updatedAt: ${latest.updatedAt}`,
|
|
337
|
+
];
|
|
338
|
+
if (ctx.hasUI) {
|
|
339
|
+
ctx.ui.notify(lines.join("\n"), "info");
|
|
340
|
+
return;
|
|
341
|
+
}
|
|
342
|
+
pi.sendMessage({
|
|
343
|
+
customType: "harness-policy-status",
|
|
344
|
+
content: lines.join("\n"),
|
|
345
|
+
display: true,
|
|
346
|
+
});
|
|
347
|
+
},
|
|
348
|
+
});
|
|
349
|
+
}
|
|
@@ -0,0 +1,198 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* review-integrity — enforce evaluator/adversary isolation from executor session.
|
|
3
|
+
*
|
|
4
|
+
* If review phases (`evaluate`/`adversary`) run in the same session as execution,
|
|
5
|
+
* tool calls are blocked until the review is isolated (fork/switch session).
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
import { appendFile, mkdir } from "node:fs/promises";
|
|
9
|
+
import { join } from "node:path";
|
|
10
|
+
import type { ExtensionAPI } from "@mariozechner/pi-coding-agent";
|
|
11
|
+
|
|
12
|
+
type HarnessPhase = "plan" | "execute" | "evaluate" | "adversary" | "merge";
|
|
13
|
+
|
|
14
|
+
const INCIDENTS_DIR = join(process.cwd(), ".pi", "harness", "incidents");
|
|
15
|
+
const INCIDENT_FILE = join(INCIDENTS_DIR, "review-integrity.jsonl");
|
|
16
|
+
|
|
17
|
+
interface IsolationState {
|
|
18
|
+
executorSessionId: string | null;
|
|
19
|
+
violationActive: boolean;
|
|
20
|
+
updatedAt: string;
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
interface SessionEntryLike {
|
|
24
|
+
type?: string;
|
|
25
|
+
customType?: string;
|
|
26
|
+
data?: {
|
|
27
|
+
phase?: HarnessPhase;
|
|
28
|
+
executorSessionId?: string;
|
|
29
|
+
violationActive?: boolean;
|
|
30
|
+
updatedAt?: string;
|
|
31
|
+
};
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
function nowIso(): string {
|
|
35
|
+
return new Date().toISOString();
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
function getPhase(ctx: {
|
|
39
|
+
sessionManager: { getEntries(): unknown[] };
|
|
40
|
+
}): HarnessPhase {
|
|
41
|
+
const entries = ctx.sessionManager.getEntries() as SessionEntryLike[];
|
|
42
|
+
for (let i = entries.length - 1; i >= 0; i--) {
|
|
43
|
+
const entry = entries[i];
|
|
44
|
+
if (
|
|
45
|
+
entry.type === "custom" &&
|
|
46
|
+
entry.customType === "harness-policy-state"
|
|
47
|
+
) {
|
|
48
|
+
const phase = entry.data?.phase;
|
|
49
|
+
if (
|
|
50
|
+
phase === "plan" ||
|
|
51
|
+
phase === "execute" ||
|
|
52
|
+
phase === "evaluate" ||
|
|
53
|
+
phase === "adversary" ||
|
|
54
|
+
phase === "merge"
|
|
55
|
+
) {
|
|
56
|
+
return phase;
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
return "plan";
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
function restoreState(ctx: {
|
|
64
|
+
sessionManager: { getEntries(): unknown[] };
|
|
65
|
+
}): IsolationState {
|
|
66
|
+
const entries = ctx.sessionManager.getEntries() as SessionEntryLike[];
|
|
67
|
+
for (let i = entries.length - 1; i >= 0; i--) {
|
|
68
|
+
const entry = entries[i];
|
|
69
|
+
if (
|
|
70
|
+
entry.type !== "custom" ||
|
|
71
|
+
entry.customType !== "harness-review-integrity"
|
|
72
|
+
)
|
|
73
|
+
continue;
|
|
74
|
+
const data = entry.data as Partial<IsolationState> | undefined;
|
|
75
|
+
return {
|
|
76
|
+
executorSessionId:
|
|
77
|
+
typeof data?.executorSessionId === "string"
|
|
78
|
+
? data.executorSessionId
|
|
79
|
+
: null,
|
|
80
|
+
violationActive: Boolean(data?.violationActive),
|
|
81
|
+
updatedAt:
|
|
82
|
+
typeof data?.updatedAt === "string" ? data.updatedAt : nowIso(),
|
|
83
|
+
};
|
|
84
|
+
}
|
|
85
|
+
return {
|
|
86
|
+
executorSessionId: null,
|
|
87
|
+
violationActive: false,
|
|
88
|
+
updatedAt: nowIso(),
|
|
89
|
+
};
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
async function appendIncident(payload: Record<string, unknown>): Promise<void> {
|
|
93
|
+
await mkdir(INCIDENTS_DIR, { recursive: true });
|
|
94
|
+
await appendFile(
|
|
95
|
+
INCIDENT_FILE,
|
|
96
|
+
`${JSON.stringify({ timestamp: nowIso(), ...payload })}\n`,
|
|
97
|
+
"utf-8",
|
|
98
|
+
);
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
export default function reviewIntegrity(pi: ExtensionAPI) {
|
|
102
|
+
let state: IsolationState = {
|
|
103
|
+
executorSessionId: null,
|
|
104
|
+
violationActive: false,
|
|
105
|
+
updatedAt: nowIso(),
|
|
106
|
+
};
|
|
107
|
+
|
|
108
|
+
pi.on("session_start", async (_event, ctx) => {
|
|
109
|
+
state = restoreState(ctx);
|
|
110
|
+
});
|
|
111
|
+
|
|
112
|
+
pi.on("agent_end", async (_event, ctx) => {
|
|
113
|
+
const phase = getPhase(ctx);
|
|
114
|
+
if (phase !== "execute") return;
|
|
115
|
+
state.executorSessionId = ctx.sessionManager.getSessionId();
|
|
116
|
+
state.violationActive = false;
|
|
117
|
+
state.updatedAt = nowIso();
|
|
118
|
+
pi.appendEntry("harness-review-integrity", state);
|
|
119
|
+
});
|
|
120
|
+
|
|
121
|
+
pi.on("before_agent_start", async (_event, ctx) => {
|
|
122
|
+
const phase = getPhase(ctx);
|
|
123
|
+
const currentSessionId = ctx.sessionManager.getSessionId();
|
|
124
|
+
const inReview = phase === "evaluate" || phase === "adversary";
|
|
125
|
+
if (!inReview) {
|
|
126
|
+
state.violationActive = false;
|
|
127
|
+
state.updatedAt = nowIso();
|
|
128
|
+
pi.appendEntry("harness-review-integrity", state);
|
|
129
|
+
return undefined;
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
if (
|
|
133
|
+
!state.executorSessionId ||
|
|
134
|
+
state.executorSessionId !== currentSessionId
|
|
135
|
+
) {
|
|
136
|
+
state.violationActive = false;
|
|
137
|
+
state.updatedAt = nowIso();
|
|
138
|
+
pi.appendEntry("harness-review-integrity", state);
|
|
139
|
+
return undefined;
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
state.violationActive = true;
|
|
143
|
+
state.updatedAt = nowIso();
|
|
144
|
+
pi.appendEntry("harness-review-integrity", state);
|
|
145
|
+
|
|
146
|
+
await appendIncident({
|
|
147
|
+
type: "review_integrity_violation",
|
|
148
|
+
session_id: currentSessionId,
|
|
149
|
+
phase,
|
|
150
|
+
reason:
|
|
151
|
+
"evaluator/adversary session is not isolated from executor session",
|
|
152
|
+
mitigation:
|
|
153
|
+
"fork or switch to a clean review session before running review tools",
|
|
154
|
+
});
|
|
155
|
+
|
|
156
|
+
return {
|
|
157
|
+
message: {
|
|
158
|
+
customType: "harness-review-integrity-block",
|
|
159
|
+
display: true,
|
|
160
|
+
content: [
|
|
161
|
+
"Review integrity violation: evaluator/adversary is sharing executor session context.",
|
|
162
|
+
"Fork/switch session, then rerun review to maintain independent evaluation guarantees.",
|
|
163
|
+
].join("\n"),
|
|
164
|
+
},
|
|
165
|
+
};
|
|
166
|
+
});
|
|
167
|
+
|
|
168
|
+
pi.on("tool_call", async (_event) => {
|
|
169
|
+
if (!state.violationActive) return undefined;
|
|
170
|
+
return {
|
|
171
|
+
block: true,
|
|
172
|
+
reason:
|
|
173
|
+
"review-integrity: tool call blocked because review session is not isolated from executor context.",
|
|
174
|
+
};
|
|
175
|
+
});
|
|
176
|
+
|
|
177
|
+
pi.registerCommand("harness-review-integrity-status", {
|
|
178
|
+
description: "Show current review-integrity isolation state",
|
|
179
|
+
handler: async (_args, ctx) => {
|
|
180
|
+
const latest = restoreState(ctx);
|
|
181
|
+
const lines = [
|
|
182
|
+
"Review integrity status:",
|
|
183
|
+
` executorSessionId: ${latest.executorSessionId ?? "(none)"}`,
|
|
184
|
+
` violationActive: ${latest.violationActive}`,
|
|
185
|
+
` updatedAt: ${latest.updatedAt}`,
|
|
186
|
+
];
|
|
187
|
+
if (ctx.hasUI) {
|
|
188
|
+
ctx.ui.notify(lines.join("\n"), "info");
|
|
189
|
+
return;
|
|
190
|
+
}
|
|
191
|
+
pi.sendMessage({
|
|
192
|
+
customType: "harness-review-integrity-status",
|
|
193
|
+
content: lines.join("\n"),
|
|
194
|
+
display: true,
|
|
195
|
+
});
|
|
196
|
+
},
|
|
197
|
+
});
|
|
198
|
+
}
|