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,240 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* test-diff-integrity — detect suspicious test edits.
|
|
3
|
+
*
|
|
4
|
+
* Flags:
|
|
5
|
+
* - assertion removal patterns
|
|
6
|
+
* - skip inflation (`it.skip`, `describe.skip`, `xit`, `xdescribe`)
|
|
7
|
+
* - disabled/no-test bypass flags in bash
|
|
8
|
+
*
|
|
9
|
+
* On detection, this extension emits escalation records so adversarial review
|
|
10
|
+
* becomes mandatory in downstream policy gates.
|
|
11
|
+
*/
|
|
12
|
+
|
|
13
|
+
import { appendFile, mkdir } from "node:fs/promises";
|
|
14
|
+
import { join } from "node:path";
|
|
15
|
+
import type { ExtensionAPI } from "@mariozechner/pi-coding-agent";
|
|
16
|
+
|
|
17
|
+
const INCIDENTS_DIR = join(process.cwd(), ".pi", "harness", "incidents");
|
|
18
|
+
const INCIDENT_FILE = join(INCIDENTS_DIR, "test-diff-integrity.jsonl");
|
|
19
|
+
|
|
20
|
+
interface IntegrityFlag {
|
|
21
|
+
timestamp: string;
|
|
22
|
+
tool_name: string;
|
|
23
|
+
file_path?: string;
|
|
24
|
+
severity: "medium" | "high";
|
|
25
|
+
reasons: string[];
|
|
26
|
+
force_adversary: boolean;
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
interface EditWriteInputLike {
|
|
30
|
+
filePath?: unknown;
|
|
31
|
+
oldString?: unknown;
|
|
32
|
+
newString?: unknown;
|
|
33
|
+
content?: unknown;
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
function nowIso(): string {
|
|
37
|
+
return new Date().toISOString();
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
function looksLikeTestPath(path: string): boolean {
|
|
41
|
+
const p = path.toLowerCase();
|
|
42
|
+
return (
|
|
43
|
+
p.includes("/test/") ||
|
|
44
|
+
p.includes("/tests/") ||
|
|
45
|
+
p.endsWith(".test.ts") ||
|
|
46
|
+
p.endsWith(".test.tsx") ||
|
|
47
|
+
p.endsWith(".spec.ts") ||
|
|
48
|
+
p.endsWith(".spec.tsx") ||
|
|
49
|
+
p.endsWith(".test.js") ||
|
|
50
|
+
p.endsWith(".spec.js")
|
|
51
|
+
);
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
function countAssertions(content: string): number {
|
|
55
|
+
const patterns = [
|
|
56
|
+
/\bexpect\s*\(/g,
|
|
57
|
+
/\bassert(?:ion)?\b/g,
|
|
58
|
+
/\bto(be|equal|strict)/g,
|
|
59
|
+
];
|
|
60
|
+
let total = 0;
|
|
61
|
+
for (const pattern of patterns) {
|
|
62
|
+
total += (content.match(pattern) ?? []).length;
|
|
63
|
+
}
|
|
64
|
+
return total;
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
function countSkipTokens(content: string): number {
|
|
68
|
+
const patterns = [
|
|
69
|
+
/\bit\.skip\s*\(/g,
|
|
70
|
+
/\bdescribe\.skip\s*\(/g,
|
|
71
|
+
/\bxit\s*\(/g,
|
|
72
|
+
/\bxdescribe\s*\(/g,
|
|
73
|
+
/\btest\.skip\s*\(/g,
|
|
74
|
+
];
|
|
75
|
+
let total = 0;
|
|
76
|
+
for (const pattern of patterns)
|
|
77
|
+
total += (content.match(pattern) ?? []).length;
|
|
78
|
+
return total;
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
function inspectEditLikeChange(
|
|
82
|
+
oldText: string,
|
|
83
|
+
newText: string,
|
|
84
|
+
): { reasons: string[]; severity: "medium" | "high" | null } {
|
|
85
|
+
const reasons: string[] = [];
|
|
86
|
+
let severity: "medium" | "high" | null = null;
|
|
87
|
+
|
|
88
|
+
const oldAssertions = countAssertions(oldText);
|
|
89
|
+
const newAssertions = countAssertions(newText);
|
|
90
|
+
if (oldAssertions > 0 && newAssertions < oldAssertions) {
|
|
91
|
+
reasons.push(`assertions decreased (${oldAssertions} -> ${newAssertions})`);
|
|
92
|
+
severity = "high";
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
const oldSkips = countSkipTokens(oldText);
|
|
96
|
+
const newSkips = countSkipTokens(newText);
|
|
97
|
+
if (newSkips > oldSkips) {
|
|
98
|
+
reasons.push(`skip markers increased (${oldSkips} -> ${newSkips})`);
|
|
99
|
+
if (!severity) severity = "medium";
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
if (/\b(passWithNoTests|--pass-with-no-tests)\b/i.test(newText)) {
|
|
103
|
+
reasons.push("contains no-tests bypass token");
|
|
104
|
+
if (!severity) severity = "medium";
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
return { reasons, severity };
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
function inspectBashCommand(command: string): {
|
|
111
|
+
reasons: string[];
|
|
112
|
+
severity: "medium" | "high" | null;
|
|
113
|
+
} {
|
|
114
|
+
const reasons: string[] = [];
|
|
115
|
+
let severity: "medium" | "high" | null = null;
|
|
116
|
+
const c = command.toLowerCase();
|
|
117
|
+
|
|
118
|
+
if (c.includes("--passwithnotests") || c.includes("--pass-with-no-tests")) {
|
|
119
|
+
reasons.push("test command uses --passWithNoTests");
|
|
120
|
+
severity = "high";
|
|
121
|
+
}
|
|
122
|
+
if (c.includes("|| true")) {
|
|
123
|
+
reasons.push("test command includes '|| true' bypass");
|
|
124
|
+
if (!severity) severity = "medium";
|
|
125
|
+
}
|
|
126
|
+
if (/\b(skipping tests|disable tests)\b/.test(c)) {
|
|
127
|
+
reasons.push("test disablement phrase detected");
|
|
128
|
+
if (!severity) severity = "medium";
|
|
129
|
+
}
|
|
130
|
+
return { reasons, severity };
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
async function recordIntegrityFlag(flag: IntegrityFlag): Promise<void> {
|
|
134
|
+
await mkdir(INCIDENTS_DIR, { recursive: true });
|
|
135
|
+
await appendFile(INCIDENT_FILE, `${JSON.stringify(flag)}\n`, "utf-8");
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
export default function testDiffIntegrity(pi: ExtensionAPI) {
|
|
139
|
+
pi.on("tool_call", async (event) => {
|
|
140
|
+
if (event.toolName === "bash") {
|
|
141
|
+
const command = String(event.input.command ?? "");
|
|
142
|
+
const { reasons, severity } = inspectBashCommand(command);
|
|
143
|
+
if (!severity) return undefined;
|
|
144
|
+
const flag: IntegrityFlag = {
|
|
145
|
+
timestamp: nowIso(),
|
|
146
|
+
tool_name: "bash",
|
|
147
|
+
severity,
|
|
148
|
+
reasons,
|
|
149
|
+
force_adversary: true,
|
|
150
|
+
};
|
|
151
|
+
await recordIntegrityFlag(flag);
|
|
152
|
+
pi.appendEntry("harness-test-integrity-flag", flag);
|
|
153
|
+
pi.appendEntry("harness-policy-escalation", {
|
|
154
|
+
timestamp: nowIso(),
|
|
155
|
+
reason: "test_diff_integrity",
|
|
156
|
+
force_adversary: true,
|
|
157
|
+
risk_level: "high",
|
|
158
|
+
});
|
|
159
|
+
return undefined;
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
if (event.toolName !== "edit" && event.toolName !== "write")
|
|
163
|
+
return undefined;
|
|
164
|
+
const input = event.input as EditWriteInputLike;
|
|
165
|
+
const filePath = String(input.filePath ?? "");
|
|
166
|
+
if (!filePath || !looksLikeTestPath(filePath)) return undefined;
|
|
167
|
+
|
|
168
|
+
const oldText = String(input.oldString ?? "");
|
|
169
|
+
const newText =
|
|
170
|
+
String(input.newString ?? "") || String(input.content ?? "");
|
|
171
|
+
|
|
172
|
+
const { reasons, severity } = inspectEditLikeChange(oldText, newText);
|
|
173
|
+
if (!severity) return undefined;
|
|
174
|
+
|
|
175
|
+
const flag: IntegrityFlag = {
|
|
176
|
+
timestamp: nowIso(),
|
|
177
|
+
tool_name: event.toolName,
|
|
178
|
+
file_path: filePath,
|
|
179
|
+
severity,
|
|
180
|
+
reasons,
|
|
181
|
+
force_adversary: true,
|
|
182
|
+
};
|
|
183
|
+
await recordIntegrityFlag(flag);
|
|
184
|
+
pi.appendEntry("harness-test-integrity-flag", flag);
|
|
185
|
+
pi.appendEntry("harness-policy-escalation", {
|
|
186
|
+
timestamp: nowIso(),
|
|
187
|
+
reason: "test_diff_integrity",
|
|
188
|
+
force_adversary: true,
|
|
189
|
+
risk_level: severity === "high" ? "high" : "med",
|
|
190
|
+
file_path: filePath,
|
|
191
|
+
});
|
|
192
|
+
|
|
193
|
+
if (
|
|
194
|
+
severity === "high" &&
|
|
195
|
+
process.env.HARNESS_TEST_INTEGRITY_BLOCK === "true"
|
|
196
|
+
) {
|
|
197
|
+
return {
|
|
198
|
+
block: true,
|
|
199
|
+
reason: `test-diff-integrity: blocked suspicious test edit (${reasons.join("; ")})`,
|
|
200
|
+
};
|
|
201
|
+
}
|
|
202
|
+
return undefined;
|
|
203
|
+
});
|
|
204
|
+
|
|
205
|
+
pi.registerCommand("harness-test-integrity-last", {
|
|
206
|
+
description: "Show latest test-diff-integrity escalation",
|
|
207
|
+
handler: async (_args, ctx) => {
|
|
208
|
+
const entries = ctx.sessionManager.getEntries();
|
|
209
|
+
for (let i = entries.length - 1; i >= 0; i--) {
|
|
210
|
+
const entry = entries[i];
|
|
211
|
+
if (
|
|
212
|
+
entry.type !== "custom" ||
|
|
213
|
+
entry.customType !== "harness-test-integrity-flag"
|
|
214
|
+
) {
|
|
215
|
+
continue;
|
|
216
|
+
}
|
|
217
|
+
const data = entry.data as IntegrityFlag;
|
|
218
|
+
const msg = [
|
|
219
|
+
"Latest test integrity flag:",
|
|
220
|
+
` severity: ${data.severity}`,
|
|
221
|
+
` tool: ${data.tool_name}`,
|
|
222
|
+
` file: ${data.file_path ?? "(n/a)"}`,
|
|
223
|
+
` reasons: ${data.reasons.join("; ")}`,
|
|
224
|
+
].join("\n");
|
|
225
|
+
if (ctx.hasUI) {
|
|
226
|
+
ctx.ui.notify(msg, data.severity === "high" ? "warning" : "info");
|
|
227
|
+
} else {
|
|
228
|
+
pi.sendMessage({
|
|
229
|
+
customType: "harness-test-integrity-last",
|
|
230
|
+
content: msg,
|
|
231
|
+
display: true,
|
|
232
|
+
});
|
|
233
|
+
}
|
|
234
|
+
return;
|
|
235
|
+
}
|
|
236
|
+
if (ctx.hasUI)
|
|
237
|
+
ctx.ui.notify("No test integrity flags in this session.", "info");
|
|
238
|
+
},
|
|
239
|
+
});
|
|
240
|
+
}
|
|
@@ -0,0 +1,315 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* trace-recorder — append-only run tracing with correlation ids.
|
|
3
|
+
*
|
|
4
|
+
* Writes:
|
|
5
|
+
* - `.pi/harness/runs/<run_id>/events.jsonl` (full payload refs/events)
|
|
6
|
+
* - `.pi/harness/runs/<run_id>/trace.json` (RunTrace-like summary)
|
|
7
|
+
* - `.pi/harness/runs/index.jsonl` (compact trace index)
|
|
8
|
+
*/
|
|
9
|
+
|
|
10
|
+
import { appendFile, mkdir, readFile, writeFile } from "node:fs/promises";
|
|
11
|
+
import { join } from "node:path";
|
|
12
|
+
import type { ExtensionAPI } from "@mariozechner/pi-coding-agent";
|
|
13
|
+
|
|
14
|
+
type HarnessPhase = "plan" | "execute" | "evaluate" | "adversary" | "merge";
|
|
15
|
+
|
|
16
|
+
interface ToolSpan {
|
|
17
|
+
tool_call_id: string;
|
|
18
|
+
tool_name: string;
|
|
19
|
+
started_at: string;
|
|
20
|
+
ended_at: string;
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
interface ActiveRun {
|
|
24
|
+
runId: string;
|
|
25
|
+
planId: string;
|
|
26
|
+
phase: HarnessPhase;
|
|
27
|
+
toolSpans: Map<string, ToolSpan>;
|
|
28
|
+
artifactRefs: Set<string>;
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
interface SessionEntryLike {
|
|
32
|
+
type?: string;
|
|
33
|
+
customType?: string;
|
|
34
|
+
data?: { phase?: HarnessPhase; planId?: string };
|
|
35
|
+
message?: {
|
|
36
|
+
role?: string;
|
|
37
|
+
usage?: { input?: number; output?: number };
|
|
38
|
+
};
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
interface ToolEventLike {
|
|
42
|
+
input?: Record<string, unknown>;
|
|
43
|
+
details?: unknown;
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
const RUNS_ROOT = join(process.cwd(), ".pi", "harness", "runs");
|
|
47
|
+
const INDEX_PATH = join(RUNS_ROOT, "index.jsonl");
|
|
48
|
+
|
|
49
|
+
function nowIso(): string {
|
|
50
|
+
return new Date().toISOString();
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
function makeRunId(sessionId: string): string {
|
|
54
|
+
return `${sessionId}-${Date.now()}`;
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
function parsePhase(ctx: {
|
|
58
|
+
sessionManager: { getEntries(): unknown[] };
|
|
59
|
+
}): HarnessPhase {
|
|
60
|
+
const entries = ctx.sessionManager.getEntries() as SessionEntryLike[];
|
|
61
|
+
for (let i = entries.length - 1; i >= 0; i--) {
|
|
62
|
+
const entry = entries[i];
|
|
63
|
+
if (
|
|
64
|
+
entry.type === "custom" &&
|
|
65
|
+
entry.customType === "harness-policy-state"
|
|
66
|
+
) {
|
|
67
|
+
const phase = entry.data?.phase;
|
|
68
|
+
if (
|
|
69
|
+
phase === "plan" ||
|
|
70
|
+
phase === "execute" ||
|
|
71
|
+
phase === "evaluate" ||
|
|
72
|
+
phase === "adversary" ||
|
|
73
|
+
phase === "merge"
|
|
74
|
+
) {
|
|
75
|
+
return phase;
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
return "plan";
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
function parsePlanId(ctx: {
|
|
83
|
+
sessionManager: { getEntries(): unknown[] };
|
|
84
|
+
}): string {
|
|
85
|
+
const entries = ctx.sessionManager.getEntries() as SessionEntryLike[];
|
|
86
|
+
for (let i = entries.length - 1; i >= 0; i--) {
|
|
87
|
+
const entry = entries[i];
|
|
88
|
+
if (
|
|
89
|
+
entry.type === "custom" &&
|
|
90
|
+
entry.customType === "harness-policy-state"
|
|
91
|
+
) {
|
|
92
|
+
const planId = entry.data?.planId;
|
|
93
|
+
if (typeof planId === "string" && planId.length > 0) return planId;
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
return "plan-unknown";
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
function usageTotals(ctx: { sessionManager: { getEntries(): unknown[] } }): {
|
|
100
|
+
input_tokens: number;
|
|
101
|
+
output_tokens: number;
|
|
102
|
+
total_tokens: number;
|
|
103
|
+
} {
|
|
104
|
+
const entries = ctx.sessionManager.getEntries() as SessionEntryLike[];
|
|
105
|
+
let input = 0;
|
|
106
|
+
let output = 0;
|
|
107
|
+
for (const entry of entries) {
|
|
108
|
+
if (entry.type !== "message" || entry.message?.role !== "assistant")
|
|
109
|
+
continue;
|
|
110
|
+
const usage = entry.message.usage ?? {};
|
|
111
|
+
input += Number(usage.input ?? 0);
|
|
112
|
+
output += Number(usage.output ?? 0);
|
|
113
|
+
}
|
|
114
|
+
return {
|
|
115
|
+
input_tokens: input,
|
|
116
|
+
output_tokens: output,
|
|
117
|
+
total_tokens: input + output,
|
|
118
|
+
};
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
function pullArtifactRefs(event: ToolEventLike): string[] {
|
|
122
|
+
const refs: string[] = [];
|
|
123
|
+
const input = event.input ?? {};
|
|
124
|
+
const details =
|
|
125
|
+
event.details && typeof event.details === "object"
|
|
126
|
+
? (event.details as Record<string, unknown>)
|
|
127
|
+
: {};
|
|
128
|
+
const maybePaths = [
|
|
129
|
+
input.filePath,
|
|
130
|
+
input.path,
|
|
131
|
+
input.targetPath,
|
|
132
|
+
details?.path,
|
|
133
|
+
details?.targetPath,
|
|
134
|
+
];
|
|
135
|
+
for (const candidate of maybePaths) {
|
|
136
|
+
if (typeof candidate === "string" && candidate.length > 0)
|
|
137
|
+
refs.push(candidate);
|
|
138
|
+
}
|
|
139
|
+
return refs;
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
async function ensureRunDir(runId: string): Promise<string> {
|
|
143
|
+
const runDir = join(RUNS_ROOT, runId);
|
|
144
|
+
await mkdir(runDir, { recursive: true });
|
|
145
|
+
return runDir;
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
async function readRunTraceSchemaVersion(): Promise<string> {
|
|
149
|
+
try {
|
|
150
|
+
const schemaPath = join(
|
|
151
|
+
process.cwd(),
|
|
152
|
+
".pi",
|
|
153
|
+
"harness",
|
|
154
|
+
"specs",
|
|
155
|
+
"run-trace.schema.json",
|
|
156
|
+
);
|
|
157
|
+
const parsed = JSON.parse(await readFile(schemaPath, "utf-8")) as {
|
|
158
|
+
properties?: { schema_version?: { const?: string } };
|
|
159
|
+
};
|
|
160
|
+
return String(parsed?.properties?.schema_version?.const ?? "1.0.0");
|
|
161
|
+
} catch {
|
|
162
|
+
return "1.0.0";
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
export default function traceRecorder(pi: ExtensionAPI) {
|
|
167
|
+
let activeRun: ActiveRun | null = null;
|
|
168
|
+
|
|
169
|
+
async function writeEvent(
|
|
170
|
+
runId: string,
|
|
171
|
+
payload: Record<string, unknown>,
|
|
172
|
+
): Promise<void> {
|
|
173
|
+
const runDir = await ensureRunDir(runId);
|
|
174
|
+
await appendFile(
|
|
175
|
+
join(runDir, "events.jsonl"),
|
|
176
|
+
`${JSON.stringify({ timestamp: nowIso(), ...payload })}\n`,
|
|
177
|
+
"utf-8",
|
|
178
|
+
);
|
|
179
|
+
}
|
|
180
|
+
|
|
181
|
+
pi.on("agent_start", async (_event, ctx) => {
|
|
182
|
+
const runId = makeRunId(ctx.sessionManager.getSessionId());
|
|
183
|
+
activeRun = {
|
|
184
|
+
runId,
|
|
185
|
+
planId: parsePlanId(ctx),
|
|
186
|
+
phase: parsePhase(ctx),
|
|
187
|
+
toolSpans: new Map(),
|
|
188
|
+
artifactRefs: new Set(),
|
|
189
|
+
};
|
|
190
|
+
pi.appendEntry("harness-trace-state", {
|
|
191
|
+
run_id: runId,
|
|
192
|
+
plan_id: activeRun.planId,
|
|
193
|
+
phase: activeRun.phase,
|
|
194
|
+
started_at: nowIso(),
|
|
195
|
+
});
|
|
196
|
+
await writeEvent(runId, {
|
|
197
|
+
type: "run_start",
|
|
198
|
+
run_id: runId,
|
|
199
|
+
plan_id: activeRun.planId,
|
|
200
|
+
phase: activeRun.phase,
|
|
201
|
+
});
|
|
202
|
+
});
|
|
203
|
+
|
|
204
|
+
pi.on("tool_execution_start", async (event) => {
|
|
205
|
+
if (!activeRun) return;
|
|
206
|
+
activeRun.toolSpans.set(event.toolCallId, {
|
|
207
|
+
tool_call_id: event.toolCallId,
|
|
208
|
+
tool_name: event.toolName,
|
|
209
|
+
started_at: nowIso(),
|
|
210
|
+
ended_at: nowIso(),
|
|
211
|
+
});
|
|
212
|
+
await writeEvent(activeRun.runId, {
|
|
213
|
+
type: "tool_start",
|
|
214
|
+
run_id: activeRun.runId,
|
|
215
|
+
tool_call_id: event.toolCallId,
|
|
216
|
+
tool_name: event.toolName,
|
|
217
|
+
});
|
|
218
|
+
});
|
|
219
|
+
|
|
220
|
+
pi.on("tool_result", async (event) => {
|
|
221
|
+
if (!activeRun) return;
|
|
222
|
+
const span = activeRun.toolSpans.get(event.toolCallId);
|
|
223
|
+
if (span) {
|
|
224
|
+
span.ended_at = nowIso();
|
|
225
|
+
}
|
|
226
|
+
for (const ref of pullArtifactRefs(event)) activeRun.artifactRefs.add(ref);
|
|
227
|
+
await writeEvent(activeRun.runId, {
|
|
228
|
+
type: "tool_result",
|
|
229
|
+
run_id: activeRun.runId,
|
|
230
|
+
tool_call_id: event.toolCallId,
|
|
231
|
+
tool_name: event.toolName,
|
|
232
|
+
is_error: event.isError,
|
|
233
|
+
});
|
|
234
|
+
});
|
|
235
|
+
|
|
236
|
+
pi.on("agent_end", async (_event, ctx) => {
|
|
237
|
+
if (!activeRun) return;
|
|
238
|
+
activeRun.phase = parsePhase(ctx);
|
|
239
|
+
|
|
240
|
+
const schemaVersion = await readRunTraceSchemaVersion();
|
|
241
|
+
const usage = usageTotals(ctx);
|
|
242
|
+
const runDir = await ensureRunDir(activeRun.runId);
|
|
243
|
+
const toolSpans = Array.from(activeRun.toolSpans.values());
|
|
244
|
+
const summary = {
|
|
245
|
+
schema_version: schemaVersion,
|
|
246
|
+
contract_version: "1.0.0",
|
|
247
|
+
run_id: activeRun.runId,
|
|
248
|
+
plan_id: activeRun.planId,
|
|
249
|
+
agent_id: ctx.sessionManager.getSessionId(),
|
|
250
|
+
phase: activeRun.phase,
|
|
251
|
+
model: ctx.model?.id ?? "unknown",
|
|
252
|
+
thinking_level:
|
|
253
|
+
pi.getThinkingLevel() === "minimal" ? "off" : pi.getThinkingLevel(),
|
|
254
|
+
tool_spans: toolSpans,
|
|
255
|
+
artifact_refs: Array.from(activeRun.artifactRefs.values()),
|
|
256
|
+
cost: usage,
|
|
257
|
+
};
|
|
258
|
+
|
|
259
|
+
await writeFile(
|
|
260
|
+
join(runDir, "trace.json"),
|
|
261
|
+
`${JSON.stringify(summary, null, 2)}\n`,
|
|
262
|
+
"utf-8",
|
|
263
|
+
);
|
|
264
|
+
await appendFile(
|
|
265
|
+
INDEX_PATH,
|
|
266
|
+
`${JSON.stringify({
|
|
267
|
+
timestamp: nowIso(),
|
|
268
|
+
run_id: activeRun.runId,
|
|
269
|
+
plan_id: activeRun.planId,
|
|
270
|
+
phase: activeRun.phase,
|
|
271
|
+
trace_file: join(runDir, "trace.json"),
|
|
272
|
+
})}\n`,
|
|
273
|
+
"utf-8",
|
|
274
|
+
);
|
|
275
|
+
|
|
276
|
+
pi.appendEntry("harness-run-trace", summary);
|
|
277
|
+
await writeEvent(activeRun.runId, {
|
|
278
|
+
type: "run_end",
|
|
279
|
+
run_id: activeRun.runId,
|
|
280
|
+
phase: activeRun.phase,
|
|
281
|
+
tool_span_count: toolSpans.length,
|
|
282
|
+
artifact_ref_count: activeRun.artifactRefs.size,
|
|
283
|
+
});
|
|
284
|
+
|
|
285
|
+
activeRun = null;
|
|
286
|
+
});
|
|
287
|
+
|
|
288
|
+
pi.registerCommand("harness-trace-last", {
|
|
289
|
+
description: "Show last recorded run trace id",
|
|
290
|
+
handler: async (_args, ctx) => {
|
|
291
|
+
const entries = ctx.sessionManager.getEntries();
|
|
292
|
+
for (let i = entries.length - 1; i >= 0; i--) {
|
|
293
|
+
const entry = entries[i];
|
|
294
|
+
if (
|
|
295
|
+
entry.type === "custom" &&
|
|
296
|
+
entry.customType === "harness-run-trace"
|
|
297
|
+
) {
|
|
298
|
+
const data = entry.data as { run_id?: string } | undefined;
|
|
299
|
+
const msg = `Last run trace: ${data?.run_id ?? "(unknown)"}`;
|
|
300
|
+
if (ctx.hasUI) {
|
|
301
|
+
ctx.ui.notify(msg, "info");
|
|
302
|
+
} else {
|
|
303
|
+
pi.sendMessage({
|
|
304
|
+
customType: "harness-trace-last",
|
|
305
|
+
content: msg,
|
|
306
|
+
display: true,
|
|
307
|
+
});
|
|
308
|
+
}
|
|
309
|
+
return;
|
|
310
|
+
}
|
|
311
|
+
}
|
|
312
|
+
if (ctx.hasUI) ctx.ui.notify("No harness trace recorded yet.", "warning");
|
|
313
|
+
},
|
|
314
|
+
});
|
|
315
|
+
}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
# Harness Scaffolding
|
|
2
|
+
|
|
3
|
+
Phase 1 scaffold for the Pi harness runtime surfaces.
|
|
4
|
+
|
|
5
|
+
- `specs/` - machine-readable schema contracts and contract notes.
|
|
6
|
+
- `runs/` - per-run metadata and trace indexes.
|
|
7
|
+
- `incidents/` - incident, override, and rollback trail records.
|
|
8
|
+
- `debates/` - debate round artifacts and consensus packets.
|
|
9
|
+
|
|
10
|
+
This scaffold is intentionally minimal and safe to adopt incrementally.
|
|
11
|
+
|
|
12
|
+
## Governance Extensions
|
|
13
|
+
|
|
14
|
+
Governance/runtime enforcement for this harness is implemented as Pi extensions
|
|
15
|
+
under `.pi/extensions/` and auto-loaded through the package `pi.extensions`
|
|
16
|
+
manifest (`package.json`).
|
|
17
|
+
|
|
18
|
+
- `policy-gate.ts` - phase state machine + plan-before-mutate enforcement
|
|
19
|
+
- `budget-guard.ts` - hard-stop token budget checks + budget exhausted artifacts
|
|
20
|
+
- `trace-recorder.ts` - append-only run traces + compact index files
|
|
21
|
+
- `review-integrity.ts` - executor/reviewer session-isolation enforcement
|
|
22
|
+
- `test-diff-integrity.ts` - suspicious test-diff detection + adversary escalation
|
|
23
|
+
- `debate-orchestrator.ts` - headless debate bus + consensus packet emission
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
# Router Tuning Flow
|
|
2
|
+
|
|
3
|
+
Router tuning is intentionally split into two steps:
|
|
4
|
+
|
|
5
|
+
1. **Propose** (`propose-router-tuning.mjs`)
|
|
6
|
+
2. **Approve + apply** (`apply-router-proposal.mjs`)
|
|
7
|
+
|
|
8
|
+
Blind writes to `.pi/model-router.json` are prohibited by design.
|
|
9
|
+
|
|
10
|
+
## Proposal
|
|
11
|
+
|
|
12
|
+
```bash
|
|
13
|
+
node .pi/harness/router/propose-router-tuning.mjs \
|
|
14
|
+
--evidence /path/to/evidence.json \
|
|
15
|
+
--candidate /path/to/candidate-router.json \
|
|
16
|
+
--proposal-out .pi/harness/router/proposals/proposal-001.json
|
|
17
|
+
```
|
|
18
|
+
|
|
19
|
+
## Apply (requires explicit human approval + justification)
|
|
20
|
+
|
|
21
|
+
```bash
|
|
22
|
+
node .pi/harness/router/apply-router-proposal.mjs \
|
|
23
|
+
--proposal .pi/harness/router/proposals/proposal-001.json \
|
|
24
|
+
--approve-by "human.name" \
|
|
25
|
+
--justification "why this is safe" \
|
|
26
|
+
--write
|
|
27
|
+
```
|
|
28
|
+
|
|
29
|
+
## Safety checks
|
|
30
|
+
|
|
31
|
+
- Evidence threshold must pass (`sample_count >= min_sample_count`)
|
|
32
|
+
- Regression guard must pass
|
|
33
|
+
- Base router hash in proposal must match current `.pi/model-router.json`
|
|
34
|
+
- Apply requires explicit approver and justification
|
|
35
|
+
- Current router file is backed up before write
|