@xingular/harness 0.1.7 → 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +97 -1
- package/LICENSE +202 -0
- package/NOTICE.md +22 -0
- package/README.md +187 -85
- package/THIRD_PARTY_LICENSES.md +942 -0
- package/dist/cli.js +13701 -13498
- package/dist/sdk/accounts/accounts.d.ts +165 -0
- package/dist/sdk/accounts/accounts.js +730 -0
- package/dist/sdk/accounts/choices.d.ts +23 -0
- package/dist/sdk/accounts/choices.js +62 -0
- package/dist/sdk/accounts/env.d.ts +78 -0
- package/dist/sdk/accounts/env.js +294 -0
- package/dist/sdk/accounts/secrets.d.ts +16 -0
- package/dist/sdk/accounts/secrets.js +40 -0
- package/dist/sdk/accounts/store.d.ts +114 -0
- package/dist/sdk/accounts/store.js +255 -0
- package/dist/sdk/browser/config.d.ts +16 -0
- package/dist/sdk/browser/config.js +22 -0
- package/dist/sdk/browser/diagnostics.d.ts +4 -0
- package/dist/sdk/browser/diagnostics.js +38 -0
- package/dist/sdk/browser/index.d.ts +17 -0
- package/dist/sdk/browser/index.js +65 -0
- package/dist/sdk/browser/network.d.ts +10 -0
- package/dist/sdk/browser/network.js +59 -0
- package/dist/sdk/browser/session.d.ts +84 -0
- package/dist/sdk/browser/session.js +192 -0
- package/dist/sdk/browser/tools.d.ts +8 -0
- package/dist/sdk/browser/tools.js +329 -0
- package/dist/sdk/capabilities/api.d.ts +22 -0
- package/dist/sdk/capabilities/api.js +54 -0
- package/dist/sdk/capabilities/runSnapshot.d.ts +18 -0
- package/dist/sdk/capabilities/runSnapshot.js +47 -0
- package/dist/sdk/capabilities/types.d.ts +29 -0
- package/dist/sdk/capabilities/types.js +1 -0
- package/dist/sdk/cli.d.ts +2 -0
- package/dist/sdk/cli.js +142 -0
- package/dist/sdk/core/bus.d.ts +23 -0
- package/dist/sdk/core/bus.js +76 -0
- package/dist/sdk/core/caller.d.ts +22 -0
- package/dist/sdk/core/caller.js +16 -0
- package/dist/sdk/core/changes.d.ts +15 -0
- package/dist/sdk/core/changes.js +15 -0
- package/dist/sdk/core/effort.d.ts +2 -0
- package/dist/sdk/core/effort.js +1 -0
- package/dist/sdk/core/env.d.ts +18 -0
- package/dist/sdk/core/env.js +8 -0
- package/dist/sdk/core/errors.d.ts +15 -0
- package/dist/sdk/core/errors.js +24 -0
- package/dist/sdk/core/frontmatter.d.ts +12 -0
- package/dist/sdk/core/frontmatter.js +50 -0
- package/dist/sdk/core/fs.d.ts +18 -0
- package/dist/sdk/core/fs.js +106 -0
- package/dist/sdk/core/index.d.ts +24 -0
- package/dist/sdk/core/index.js +187 -0
- package/dist/sdk/core/path.d.ts +7 -0
- package/dist/sdk/core/path.js +79 -0
- package/dist/sdk/core/projects.d.ts +18 -0
- package/dist/sdk/core/projects.js +67 -0
- package/dist/sdk/core/secrets.d.ts +2 -0
- package/dist/sdk/core/secrets.js +5 -0
- package/dist/sdk/core/text.d.ts +7 -0
- package/dist/sdk/core/text.js +40 -0
- package/dist/sdk/doctor/checks.d.ts +5 -0
- package/dist/sdk/doctor/checks.js +208 -0
- package/dist/sdk/doctor/probe.d.ts +4 -0
- package/dist/sdk/doctor/probe.js +92 -0
- package/dist/sdk/doctor/service.d.ts +23 -0
- package/dist/sdk/doctor/service.js +144 -0
- package/dist/sdk/doctor/types.d.ts +141 -0
- package/dist/sdk/doctor/types.js +29 -0
- package/dist/sdk/harness.d.ts +133 -0
- package/dist/sdk/harness.js +299 -0
- package/dist/sdk/history/lessonPrompt.d.ts +2 -0
- package/dist/sdk/history/lessonPrompt.js +15 -0
- package/dist/sdk/history/lessons.d.ts +52 -0
- package/dist/sdk/history/lessons.js +173 -0
- package/dist/sdk/history/recall.d.ts +68 -0
- package/dist/sdk/history/recall.js +199 -0
- package/dist/sdk/history/trajectory.d.ts +7 -0
- package/dist/sdk/history/trajectory.js +216 -0
- package/dist/sdk/hub/catalog.json +123 -0
- package/dist/sdk/hub/cli.d.ts +7 -0
- package/dist/sdk/hub/cli.js +81 -0
- package/dist/sdk/hub/hub.d.ts +74 -0
- package/dist/sdk/hub/hub.js +474 -0
- package/dist/sdk/hub/schema.d.ts +280 -0
- package/dist/sdk/hub/schema.js +78 -0
- package/dist/sdk/index.d.ts +63 -0
- package/dist/sdk/index.js +48 -0
- package/dist/sdk/mcp/connections.d.ts +83 -0
- package/dist/sdk/mcp/connections.js +669 -0
- package/dist/sdk/mcp/manager.d.ts +26 -0
- package/dist/sdk/mcp/manager.js +124 -0
- package/dist/sdk/mcp/oauth.d.ts +35 -0
- package/dist/sdk/mcp/oauth.js +171 -0
- package/dist/sdk/mcp/scopeMigration.d.ts +19 -0
- package/dist/sdk/mcp/scopeMigration.js +198 -0
- package/dist/sdk/mcp/service.d.ts +160 -0
- package/dist/sdk/mcp/service.js +510 -0
- package/dist/sdk/mcp/types.d.ts +131 -0
- package/dist/sdk/mcp/types.js +49 -0
- package/dist/sdk/pi/runtime.d.ts +13 -0
- package/dist/sdk/pi/runtime.js +31 -0
- package/dist/sdk/plugins/api.d.ts +66 -0
- package/dist/sdk/plugins/api.js +155 -0
- package/dist/sdk/plugins/attachments.d.ts +46 -0
- package/dist/sdk/plugins/attachments.js +111 -0
- package/dist/sdk/plugins/builtin.d.ts +6 -0
- package/dist/sdk/plugins/builtin.js +68 -0
- package/dist/sdk/plugins/catalogue.d.ts +29 -0
- package/dist/sdk/plugins/catalogue.js +196 -0
- package/dist/sdk/plugins/cli.d.ts +13 -0
- package/dist/sdk/plugins/cli.js +187 -0
- package/dist/sdk/plugins/discover.d.ts +42 -0
- package/dist/sdk/plugins/discover.js +115 -0
- package/dist/sdk/plugins/firstParty.d.ts +50 -0
- package/dist/sdk/plugins/firstParty.js +113 -0
- package/dist/sdk/plugins/hooks.d.ts +94 -0
- package/dist/sdk/plugins/hooks.js +162 -0
- package/dist/sdk/plugins/identity.d.ts +19 -0
- package/dist/sdk/plugins/identity.js +48 -0
- package/dist/sdk/plugins/install.d.ts +20 -0
- package/dist/sdk/plugins/install.js +110 -0
- package/dist/sdk/plugins/inventory.d.ts +22 -0
- package/dist/sdk/plugins/inventory.js +110 -0
- package/dist/sdk/plugins/manifest.d.ts +13 -0
- package/dist/sdk/plugins/manifest.js +56 -0
- package/dist/sdk/plugins/plugins.d.ts +104 -0
- package/dist/sdk/plugins/plugins.js +164 -0
- package/dist/sdk/plugins/runtime.d.ts +9 -0
- package/dist/sdk/plugins/runtime.js +95 -0
- package/dist/sdk/plugins/trust.d.ts +44 -0
- package/dist/sdk/plugins/trust.js +120 -0
- package/dist/sdk/plugins/types.d.ts +159 -0
- package/dist/sdk/plugins/types.js +7 -0
- package/dist/sdk/prompt/compile.d.ts +174 -0
- package/dist/sdk/prompt/compile.js +396 -0
- package/dist/sdk/refine/cli.d.ts +4 -0
- package/dist/sdk/refine/cli.js +186 -0
- package/dist/sdk/refine/demo.d.ts +21 -0
- package/dist/sdk/refine/demo.js +114 -0
- package/dist/sdk/refine/evidence.d.ts +55 -0
- package/dist/sdk/refine/evidence.js +330 -0
- package/dist/sdk/refine/host.d.ts +51 -0
- package/dist/sdk/refine/host.js +76 -0
- package/dist/sdk/refine/ledger.d.ts +48 -0
- package/dist/sdk/refine/ledger.js +76 -0
- package/dist/sdk/refine/library.d.ts +55 -0
- package/dist/sdk/refine/library.js +177 -0
- package/dist/sdk/refine/pi.d.ts +72 -0
- package/dist/sdk/refine/pi.js +248 -0
- package/dist/sdk/refine/prompts.d.ts +45 -0
- package/dist/sdk/refine/prompts.js +390 -0
- package/dist/sdk/refine/recursion.d.ts +113 -0
- package/dist/sdk/refine/recursion.js +258 -0
- package/dist/sdk/refine/runner.d.ts +81 -0
- package/dist/sdk/refine/runner.js +150 -0
- package/dist/sdk/refine/selection.d.ts +57 -0
- package/dist/sdk/refine/selection.js +251 -0
- package/dist/sdk/refine/service.d.ts +84 -0
- package/dist/sdk/refine/service.js +165 -0
- package/dist/sdk/refine/suite.d.ts +67 -0
- package/dist/sdk/refine/suite.js +174 -0
- package/dist/sdk/refine/trajectory.d.ts +9 -0
- package/dist/sdk/refine/trajectory.js +68 -0
- package/dist/sdk/refine/types.d.ts +77 -0
- package/dist/sdk/refine/types.js +10 -0
- package/dist/sdk/server/methods.d.ts +3 -0
- package/dist/sdk/server/methods.js +370 -0
- package/dist/sdk/server/remote.d.ts +19 -0
- package/dist/sdk/server/remote.js +84 -0
- package/dist/sdk/server/rpc.d.ts +20 -0
- package/dist/sdk/server/rpc.js +102 -0
- package/dist/sdk/server/serve.d.ts +10 -0
- package/dist/sdk/server/serve.js +18 -0
- package/dist/sdk/sessions/approvals.d.ts +47 -0
- package/dist/sdk/sessions/approvals.js +119 -0
- package/dist/sdk/sessions/continuation.d.ts +48 -0
- package/dist/sdk/sessions/continuation.js +85 -0
- package/dist/sdk/sessions/contracts.d.ts +534 -0
- package/dist/sdk/sessions/contracts.js +299 -0
- package/dist/sdk/sessions/extensionUi.d.ts +19 -0
- package/dist/sdk/sessions/extensionUi.js +64 -0
- package/dist/sdk/sessions/history.d.ts +16 -0
- package/dist/sdk/sessions/history.js +68 -0
- package/dist/sdk/sessions/lineageJoin.d.ts +2 -0
- package/dist/sdk/sessions/lineageJoin.js +61 -0
- package/dist/sdk/sessions/planMode.d.ts +36 -0
- package/dist/sdk/sessions/planMode.js +84 -0
- package/dist/sdk/sessions/policy.d.ts +43 -0
- package/dist/sdk/sessions/policy.js +1 -0
- package/dist/sdk/sessions/pricing.d.ts +34 -0
- package/dist/sdk/sessions/pricing.js +40 -0
- package/dist/sdk/sessions/reasoningSummaries.d.ts +11 -0
- package/dist/sdk/sessions/reasoningSummaries.js +61 -0
- package/dist/sdk/sessions/registry.d.ts +102 -0
- package/dist/sdk/sessions/registry.js +383 -0
- package/dist/sdk/sessions/runIndex.d.ts +21 -0
- package/dist/sdk/sessions/runIndex.js +65 -0
- package/dist/sdk/sessions/runStore.d.ts +66 -0
- package/dist/sdk/sessions/runStore.js +335 -0
- package/dist/sdk/sessions/runner.d.ts +213 -0
- package/dist/sdk/sessions/runner.js +589 -0
- package/dist/sdk/sessions/sessions.d.ts +140 -0
- package/dist/sdk/sessions/sessions.js +394 -0
- package/dist/sdk/sessions/subagentService.d.ts +41 -0
- package/dist/sdk/sessions/subagentService.js +247 -0
- package/dist/sdk/sessions/subagents.d.ts +50 -0
- package/dist/sdk/sessions/subagents.js +68 -0
- package/dist/sdk/terminal/accountsMenu.d.ts +46 -0
- package/dist/sdk/terminal/accountsMenu.js +392 -0
- package/dist/sdk/terminal/cli.d.ts +20 -0
- package/dist/sdk/terminal/cli.js +121 -0
- package/dist/sdk/terminal/client.d.ts +15 -0
- package/dist/sdk/terminal/client.js +126 -0
- package/dist/sdk/terminal/control.d.ts +4 -0
- package/dist/sdk/terminal/control.js +25 -0
- package/dist/sdk/terminal/controller.d.ts +72 -0
- package/dist/sdk/terminal/controller.js +351 -0
- package/dist/sdk/terminal/hubMenu.d.ts +10 -0
- package/dist/sdk/terminal/hubMenu.js +34 -0
- package/dist/sdk/terminal/launch.d.ts +5 -0
- package/dist/sdk/terminal/launch.js +27 -0
- package/dist/sdk/terminal/logs.d.ts +14 -0
- package/dist/sdk/terminal/logs.js +59 -0
- package/dist/sdk/terminal/piExtension.d.ts +6 -0
- package/dist/sdk/terminal/piExtension.js +392 -0
- package/dist/sdk/terminal/pluginMenu.d.ts +34 -0
- package/dist/sdk/terminal/pluginMenu.js +101 -0
- package/dist/sdk/terminal/socket.d.ts +70 -0
- package/dist/sdk/terminal/socket.js +256 -0
- package/dist/sdk/terminal/standalone.d.ts +18 -0
- package/dist/sdk/terminal/standalone.js +146 -0
- package/dist/sdk/terminal/terminals.d.ts +176 -0
- package/dist/sdk/terminal/terminals.js +767 -0
- package/dist/sdk/terminal/trajectory.d.ts +10 -0
- package/dist/sdk/terminal/trajectory.js +30 -0
- package/dist/sdk/terminal/tui/chrome.d.ts +64 -0
- package/dist/sdk/terminal/tui/chrome.js +169 -0
- package/dist/sdk/terminal/tui/clipboardFiles.d.ts +11 -0
- package/dist/sdk/terminal/tui/clipboardFiles.js +74 -0
- package/dist/sdk/terminal/tui/commandPages.d.ts +7 -0
- package/dist/sdk/terminal/tui/commandPages.js +63 -0
- package/dist/sdk/terminal/tui/commands.d.ts +42 -0
- package/dist/sdk/terminal/tui/commands.js +276 -0
- package/dist/sdk/terminal/tui/dialogGeometry.d.ts +27 -0
- package/dist/sdk/terminal/tui/dialogGeometry.js +50 -0
- package/dist/sdk/terminal/tui/dialogs.d.ts +75 -0
- package/dist/sdk/terminal/tui/dialogs.js +363 -0
- package/dist/sdk/terminal/tui/keybindings.d.ts +11 -0
- package/dist/sdk/terminal/tui/keybindings.js +49 -0
- package/dist/sdk/terminal/tui/list.d.ts +73 -0
- package/dist/sdk/terminal/tui/list.js +196 -0
- package/dist/sdk/terminal/tui/modeChoices.d.ts +42 -0
- package/dist/sdk/terminal/tui/modeChoices.js +70 -0
- package/dist/sdk/terminal/tui/modelPicker.d.ts +55 -0
- package/dist/sdk/terminal/tui/modelPicker.js +155 -0
- package/dist/sdk/terminal/tui/mouse.d.ts +3 -0
- package/dist/sdk/terminal/tui/mouse.js +3 -0
- package/dist/sdk/terminal/tui/page.d.ts +14 -0
- package/dist/sdk/terminal/tui/page.js +1 -0
- package/dist/sdk/terminal/tui/pageOverlay.d.ts +27 -0
- package/dist/sdk/terminal/tui/pageOverlay.js +145 -0
- package/dist/sdk/terminal/tui/pages/accountsPage.d.ts +54 -0
- package/dist/sdk/terminal/tui/pages/accountsPage.js +181 -0
- package/dist/sdk/terminal/tui/pages/componentsPage.d.ts +47 -0
- package/dist/sdk/terminal/tui/pages/componentsPage.js +119 -0
- package/dist/sdk/terminal/tui/pages/doctorPage.d.ts +37 -0
- package/dist/sdk/terminal/tui/pages/doctorPage.js +145 -0
- package/dist/sdk/terminal/tui/pages/hubPage.d.ts +39 -0
- package/dist/sdk/terminal/tui/pages/hubPage.js +128 -0
- package/dist/sdk/terminal/tui/pages/logPage.d.ts +38 -0
- package/dist/sdk/terminal/tui/pages/logPage.js +189 -0
- package/dist/sdk/terminal/tui/pages/permissionsPage.d.ts +44 -0
- package/dist/sdk/terminal/tui/pages/permissionsPage.js +124 -0
- package/dist/sdk/terminal/tui/pages/pluginsPage.d.ts +57 -0
- package/dist/sdk/terminal/tui/pages/pluginsPage.js +243 -0
- package/dist/sdk/terminal/tui/pages/settingsPage.d.ts +55 -0
- package/dist/sdk/terminal/tui/pages/settingsPage.js +88 -0
- package/dist/sdk/terminal/tui/pages/trajectoryPage.d.ts +58 -0
- package/dist/sdk/terminal/tui/pages/trajectoryPage.js +377 -0
- package/dist/sdk/terminal/tui/piAdapter.d.ts +18 -0
- package/dist/sdk/terminal/tui/piAdapter.js +48 -0
- package/dist/sdk/terminal/tui/planMode.d.ts +2 -0
- package/dist/sdk/terminal/tui/planMode.js +2 -0
- package/dist/sdk/terminal/tui/questionPicker.d.ts +20 -0
- package/dist/sdk/terminal/tui/questionPicker.js +150 -0
- package/dist/sdk/terminal/tui/questions.d.ts +19 -0
- package/dist/sdk/terminal/tui/questions.js +42 -0
- package/dist/sdk/terminal/tui/runtime.d.ts +114 -0
- package/dist/sdk/terminal/tui/runtime.js +441 -0
- package/dist/sdk/terminal/tui/search.d.ts +22 -0
- package/dist/sdk/terminal/tui/search.js +60 -0
- package/dist/sdk/terminal/tui/selection.d.ts +16 -0
- package/dist/sdk/terminal/tui/selection.js +16 -0
- package/dist/sdk/terminal/tui/sessionUi.d.ts +3 -0
- package/dist/sdk/terminal/tui/sessionUi.js +30 -0
- package/dist/sdk/terminal/tui/settingsModel.d.ts +12 -0
- package/dist/sdk/terminal/tui/settingsModel.js +84 -0
- package/dist/sdk/terminal/tui/sideQuestion.d.ts +53 -0
- package/dist/sdk/terminal/tui/sideQuestion.js +197 -0
- package/dist/sdk/terminal/tui/skillInvocation.d.ts +9 -0
- package/dist/sdk/terminal/tui/skillInvocation.js +43 -0
- package/dist/sdk/terminal/tui/status.d.ts +18 -0
- package/dist/sdk/terminal/tui/status.js +67 -0
- package/dist/sdk/terminal/tui/theme.d.ts +45 -0
- package/dist/sdk/terminal/tui/theme.js +176 -0
- package/dist/sdk/terminal/tui/treeModel.d.ts +79 -0
- package/dist/sdk/terminal/tui/treeModel.js +483 -0
- package/dist/sdk/terminal/tui/treePicker.d.ts +49 -0
- package/dist/sdk/terminal/tui/treePicker.js +251 -0
- package/dist/sdk/terminal/tui/ui.d.ts +47 -0
- package/dist/sdk/terminal/tui/ui.js +148 -0
- package/dist/sdk/terminal/tui/workingStatus.d.ts +9 -0
- package/dist/sdk/terminal/tui/workingStatus.js +229 -0
- package/dist/sdk/tools/askUser.d.ts +6 -0
- package/dist/sdk/tools/askUser.js +74 -0
- package/dist/sdk/tools/checklist.d.ts +9 -0
- package/dist/sdk/tools/checklist.js +54 -0
- package/dist/sdk/tools/definitions.d.ts +30 -0
- package/dist/sdk/tools/definitions.js +117 -0
- package/dist/sdk/tools/dispatch.d.ts +16 -0
- package/dist/sdk/tools/dispatch.js +67 -0
- package/dist/sdk/tools/harnessTools.d.ts +6 -0
- package/dist/sdk/tools/harnessTools.js +20 -0
- package/dist/sdk/tools/sessionName.d.ts +7 -0
- package/dist/sdk/tools/sessionName.js +31 -0
- package/dist/sdk/tools/spawnSubagent.d.ts +4 -0
- package/dist/sdk/tools/spawnSubagent.js +49 -0
- package/dist/sdk/tools/types.d.ts +48 -0
- package/dist/sdk/tools/types.js +1 -0
- package/dist/sdk/variant/components.d.ts +34 -0
- package/dist/sdk/variant/components.js +230 -0
- package/dist/sdk/variant/materialise.d.ts +66 -0
- package/dist/sdk/variant/materialise.js +81 -0
- package/dist/sdk/variant/migrate.d.ts +4 -0
- package/dist/sdk/variant/migrate.js +41 -0
- package/dist/sdk/variant/seed.d.ts +20 -0
- package/dist/sdk/variant/seed.js +116 -0
- package/dist/sdk/variant/store.d.ts +82 -0
- package/dist/sdk/variant/store.js +151 -0
- package/dist/sdk/variant/surface.d.ts +56 -0
- package/dist/sdk/variant/surface.js +81 -0
- package/dist/sdk/variant/trust.d.ts +27 -0
- package/dist/sdk/variant/trust.js +64 -0
- package/dist/sdk/variant/variant.d.ts +71 -0
- package/dist/sdk/variant/variant.js +331 -0
- package/dist/sdk/web/markdown.d.ts +10 -0
- package/dist/sdk/web/markdown.js +66 -0
- package/dist/sdk/web/safeRequest.d.ts +34 -0
- package/dist/sdk/web/safeRequest.js +175 -0
- package/dist/sdk/web/search.d.ts +53 -0
- package/dist/sdk/web/search.js +168 -0
- package/dist/sdk/web/text.d.ts +2 -0
- package/dist/sdk/web/text.js +7 -0
- package/dist/sdk/web/tools.d.ts +22 -0
- package/dist/sdk/web/tools.js +195 -0
- package/dist/sdk/web/turndown-plugin-gfm.d.ts +4 -0
- package/dist/sdk/wiki/notes.d.ts +68 -0
- package/dist/sdk/wiki/notes.js +297 -0
- package/dist/sdk/world/actions.d.ts +23 -0
- package/dist/sdk/world/actions.js +31 -0
- package/dist/sdk/world/cli.d.ts +12 -0
- package/dist/sdk/world/cli.js +166 -0
- package/dist/sdk/world/images.d.ts +20 -0
- package/dist/sdk/world/images.js +48 -0
- package/dist/sdk/world/untrusted.d.ts +12 -0
- package/dist/sdk/world/untrusted.js +20 -0
- package/dist/sdk/world/world.d.ts +65 -0
- package/dist/sdk/world/world.js +80 -0
- package/dist/terminal-opentui.js +13612 -0
- package/dist/terminal-pi.js +808 -151
- package/docs/README.md +22 -0
- package/docs/architecture/00-overview.md +159 -0
- package/docs/architecture/01-extension-points.md +78 -0
- package/docs/architecture/02-sessions-and-runs.md +146 -0
- package/docs/architecture/03-variants.md +95 -0
- package/docs/architecture/04-prompt.md +102 -0
- package/docs/architecture/05-refinement.md +107 -0
- package/docs/architecture/06-plugins-and-capabilities.md +93 -0
- package/docs/architecture/07-tools-and-gate.md +88 -0
- package/docs/architecture/08-memory-and-history.md +94 -0
- package/docs/architecture/09-accounts-and-connectors.md +90 -0
- package/docs/architecture/10-server-protocol.md +84 -0
- package/docs/architecture/11-terminal.md +81 -0
- package/docs/architecture/12-storage.md +61 -0
- package/docs/architecture/13-world-tools.md +23 -0
- package/docs/architecture/README.md +114 -0
- package/docs/architecture/proposals/PROP-0001-reporting-section.md +106 -0
- package/docs/architecture/proposals/PROP-0002-retain-rollout-workspaces.md +104 -0
- package/docs/architecture/proposals/PROP-0003-executor-settings.md +81 -0
- package/docs/architecture/proposals/PROP-0004-flexible-reporting-guidance.md +71 -0
- package/docs/architecture/proposals/PROP-0005-xharness-cli-name.md +78 -0
- package/docs/architecture/proposals/PROP-0006-run-checklist.md +68 -0
- package/docs/architecture/proposals/PROP-0007-run-continuation.md +80 -0
- package/docs/architecture/proposals/PROP-0008-lessons-from-runs.md +80 -0
- package/docs/architecture/proposals/PROP-0009-foundation-and-variants.md +78 -0
- package/docs/architecture/proposals/PROP-0010-session-names.md +73 -0
- package/docs/architecture/proposals/PROP-0011-doctor.md +63 -0
- package/docs/architecture/proposals/PROP-0012-release-baseline.md +56 -0
- package/docs/architecture/proposals/README.md +76 -0
- package/docs/decisions/ADR-0002-native-subagent-lifecycle.md +49 -0
- package/docs/decisions/ADR-0003-shared-asynchronous-subagents.md +70 -0
- package/docs/decisions/ADR-0004-fullscreen-terminal-layout.md +50 -0
- package/docs/decisions/ADR-0005-app-provided-oauth-clients.md +54 -0
- package/docs/decisions/ADR-0006-opentui-only-terminal.md +47 -0
- package/docs/decisions/ADR-0007-reporting-section.md +33 -0
- package/docs/decisions/ADR-0008-flexible-reporting-guidance.md +38 -0
- package/docs/decisions/ADR-0009-xharness-command.md +38 -0
- package/docs/decisions/ADR-0010-lessons-in-the-wiki.md +31 -0
- package/docs/decisions/ADR-0011-foundation-and-variants.md +28 -0
- package/docs/decisions/ADR-0012-native-session-names.md +34 -0
- package/docs/decisions/ADR-0013-doctor.md +27 -0
- package/docs/decisions/ADR-0014-public-release-baseline.md +21 -0
- package/docs/doctor.md +74 -0
- package/docs/experiments/EXP-0001-terminal-input-latency/plan.md +81 -0
- package/docs/experiments/EXP-0001-terminal-input-latency/results.md +46 -0
- package/docs/experiments/EXP-0002-opentui-typing-latency/plan.md +70 -0
- package/docs/experiments/EXP-0002-opentui-typing-latency/results.md +92 -0
- package/docs/features/README.md +20 -0
- package/docs/features/automations/README.md +41 -0
- package/docs/features/cores/README.md +39 -0
- package/docs/features/google-harness2/README.md +52 -0
- package/docs/features/integrations/README.md +40 -0
- package/docs/features/interfaces/README.md +29 -0
- package/docs/features/memory/README.md +28 -0
- package/docs/releases/1.0.0.md +40 -0
- package/docs/releases/README.md +36 -0
- package/docs/study/00-index.md +78 -0
- package/docs/study/arms/00-matrix.md +20 -0
- package/docs/study/arms/01-system-prompt.md +211 -0
- package/docs/study/arms/02-tools.md +79 -0
- package/docs/study/arms/03-subagents.md +90 -0
- package/docs/study/arms/04-skills.md +75 -0
- package/docs/study/arms/05-context-management.md +90 -0
- package/docs/study/arms/06-memory.md +90 -0
- package/docs/study/arms/07-governance.md +71 -0
- package/docs/study/arms/08-execution.md +69 -0
- package/docs/study/arms/09-observability.md +60 -0
- package/docs/study/arms/10-refinement.md +110 -0
- package/docs/study/btw-comparison.md +37 -0
- package/docs/study/feature-gap-review.md +42 -0
- package/docs/study/insights.md +123 -0
- package/docs/study/roadmap.md +72 -0
- package/docs/study/sources/claude-code.md +44 -0
- package/docs/study/sources/deepseek-harness.md +102 -0
- package/docs/study/sources/harness2.md +50 -0
- package/docs/study/sources/kimi-cli.md +42 -0
- package/docs/study/sources/omp.md +93 -0
- package/docs/study/sources/opencode.md +43 -0
- package/docs/study/sources/openhands.md +46 -0
- package/docs/study/sources/smolagents.md +40 -0
- package/docs/study/sources/swe-agent.md +34 -0
- package/docs/system-prompt-design.md +196 -0
- package/docs/terminal-tui.md +473 -56
- package/package.json +43 -13
- package/docs/evidence/terminal-2026-10-17/120x40-completed-transcript.ansi.gz +0 -0
- package/docs/evidence/terminal-2026-10-17/40x20-settings-interaction.ansi.gz +0 -0
- package/docs/evidence/terminal-2026-10-17/40x20-settings-keyboard.ansi.gz +0 -0
- package/docs/evidence/terminal-2026-10-17/40x20-welcome.ansi.gz +0 -0
- package/docs/evidence/terminal-2026-10-17/80x24-approval-0.ansi.gz +0 -0
- package/docs/evidence/terminal-2026-10-17/80x24-question.ansi.gz +0 -0
- package/docs/evidence/terminal-2026-10-17/verification.json +0 -130
- package/docs/evidence/terminal-2026-10-17-followup/120x40-completed-transcript.ansi.gz +0 -0
- package/docs/evidence/terminal-2026-10-17-followup/40x20-settings-interaction.ansi.gz +0 -0
- package/docs/evidence/terminal-2026-10-17-followup/40x20-settings-keyboard.ansi.gz +0 -0
- package/docs/evidence/terminal-2026-10-17-followup/40x20-welcome.ansi.gz +0 -0
- package/docs/evidence/terminal-2026-10-17-followup/80x24-approval-0.ansi.gz +0 -0
- package/docs/evidence/terminal-2026-10-17-followup/80x24-plugin-light.ansi.gz +0 -0
- package/docs/evidence/terminal-2026-10-17-followup/80x24-question-batch.ansi.gz +0 -0
- package/docs/evidence/terminal-2026-10-17-followup/80x24-question.ansi.gz +0 -0
- package/docs/evidence/terminal-2026-10-17-followup/app-bundle/80x24-approval-0.ansi.gz +0 -0
- package/docs/evidence/terminal-2026-10-17-followup/app-bundle/80x24-plugin-light.ansi.gz +0 -0
- package/docs/evidence/terminal-2026-10-17-followup/app-bundle/80x24-question-batch.ansi.gz +0 -0
- package/docs/evidence/terminal-2026-10-17-followup/app-bundle/80x24-question.ansi.gz +0 -0
- package/docs/evidence/terminal-2026-10-17-followup/app-bundle/verification.json +0 -95
- package/docs/evidence/terminal-2026-10-17-followup/global-install/80x24-approval-0.ansi.gz +0 -0
- package/docs/evidence/terminal-2026-10-17-followup/global-install/80x24-plugin-light.ansi.gz +0 -0
- package/docs/evidence/terminal-2026-10-17-followup/global-install/80x24-question-batch.ansi.gz +0 -0
- package/docs/evidence/terminal-2026-10-17-followup/global-install/80x24-question.ansi.gz +0 -0
- package/docs/evidence/terminal-2026-10-17-followup/global-install/README.md +0 -27
- package/docs/evidence/terminal-2026-10-17-followup/global-install/shell-command-80x24.ansi.gz +0 -0
- package/docs/evidence/terminal-2026-10-17-followup/global-install/shell-command.json +0 -18
- package/docs/evidence/terminal-2026-10-17-followup/global-install/verification.json +0 -95
- package/docs/evidence/terminal-2026-10-17-followup/harness-reference-80x24.json.gz +0 -0
- package/docs/evidence/terminal-2026-10-17-followup/harness-reference-final-80x24.json.gz +0 -0
- package/docs/evidence/terminal-2026-10-17-followup/harness-reference-scenario.json +0 -60
- package/docs/evidence/terminal-2026-10-17-followup/live-codex/README.md +0 -24
- package/docs/evidence/terminal-2026-10-17-followup/live-codex/complete-80x24.ansi.gz +0 -0
- package/docs/evidence/terminal-2026-10-17-followup/live-codex/verification.json +0 -57
- package/docs/evidence/terminal-2026-10-17-followup/omp-reference-80x24-early.json.gz +0 -0
- package/docs/evidence/terminal-2026-10-17-followup/omp-reference-80x24.json.gz +0 -0
- package/docs/evidence/terminal-2026-10-17-followup/omp-reference-scenario.json +0 -58
- package/docs/evidence/terminal-2026-10-17-followup/omp-supplemental-static.json.gz +0 -0
- package/docs/evidence/terminal-2026-10-17-followup/rea-artifacts.json +0 -320
- package/docs/evidence/terminal-2026-10-17-followup/reference-comparison.json +0 -30
- package/docs/evidence/terminal-2026-10-17-followup/reference-comparison.md +0 -133
- package/docs/evidence/terminal-2026-10-17-followup/reference-source-observations.json +0 -20
- package/docs/evidence/terminal-2026-10-17-followup/verification.json +0 -207
- package/src/accounts/accounts.test.ts +0 -333
- package/src/accounts/accounts.ts +0 -658
- package/src/accounts/env.test.ts +0 -95
- package/src/accounts/env.ts +0 -338
- package/src/accounts/secrets.ts +0 -50
- package/src/accounts/store.ts +0 -338
- package/src/capabilities/api.ts +0 -75
- package/src/capabilities/runSnapshot.ts +0 -59
- package/src/capabilities/types.ts +0 -34
- package/src/cli.ts +0 -118
- package/src/core/bus.ts +0 -34
- package/src/core/changes.ts +0 -33
- package/src/core/env.ts +0 -27
- package/src/core/errors.ts +0 -32
- package/src/core/frontmatter.ts +0 -47
- package/src/core/fs.test.ts +0 -38
- package/src/core/fs.ts +0 -92
- package/src/core/index.ts +0 -193
- package/src/core/path.test.ts +0 -14
- package/src/core/path.ts +0 -79
- package/src/core/projects.ts +0 -90
- package/src/core/text.ts +0 -39
- package/src/harness.ts +0 -312
- package/src/hub/catalog.json +0 -123
- package/src/hub/cli.ts +0 -59
- package/src/hub/hub.test.ts +0 -205
- package/src/hub/hub.ts +0 -256
- package/src/hub/schema.ts +0 -81
- package/src/index.ts +0 -75
- package/src/mcp/connections.ts +0 -614
- package/src/mcp/manager.ts +0 -130
- package/src/mcp/oauth.ts +0 -195
- package/src/mcp/scopeMigration.test.ts +0 -79
- package/src/mcp/scopeMigration.ts +0 -204
- package/src/mcp/service.test.ts +0 -376
- package/src/mcp/service.ts +0 -549
- package/src/mcp/types.ts +0 -108
- package/src/memory/api.test.ts +0 -82
- package/src/memory/api.ts +0 -303
- package/src/memory/blocks.test.ts +0 -78
- package/src/memory/blocks.ts +0 -408
- package/src/memory/caller.ts +0 -69
- package/src/memory/curation.test.ts +0 -163
- package/src/memory/curation.ts +0 -64
- package/src/memory/dispatch.ts +0 -59
- package/src/memory/facts.test.ts +0 -41
- package/src/memory/facts.ts +0 -248
- package/src/memory/graph.ts +0 -103
- package/src/memory/health.test.ts +0 -130
- package/src/memory/health.ts +0 -74
- package/src/memory/maintainer.ts +0 -272
- package/src/memory/maintenance.test.ts +0 -176
- package/src/memory/maintenance.ts +0 -518
- package/src/memory/migrate.ts +0 -79
- package/src/memory/operations.ts +0 -150
- package/src/memory/proposals.test.ts +0 -168
- package/src/memory/proposals.ts +0 -584
- package/src/memory/recall.test.ts +0 -115
- package/src/memory/recall.ts +0 -278
- package/src/memory/references.ts +0 -77
- package/src/memory/runContext.ts +0 -93
- package/src/memory/secrets.ts +0 -6
- package/src/memory/store.test.ts +0 -66
- package/src/memory/store.ts +0 -385
- package/src/memory/wiki.test.ts +0 -47
- package/src/memory/wiki.ts +0 -422
- package/src/memory/wikiIndex.test.ts +0 -88
- package/src/memory/wikiIndex.ts +0 -116
- package/src/plugins/api.ts +0 -181
- package/src/plugins/attachments.test.ts +0 -84
- package/src/plugins/attachments.ts +0 -141
- package/src/plugins/builtin.ts +0 -82
- package/src/plugins/catalogue.test.ts +0 -254
- package/src/plugins/catalogue.ts +0 -251
- package/src/plugins/cli.ts +0 -184
- package/src/plugins/discover.ts +0 -151
- package/src/plugins/firstParty.test.ts +0 -143
- package/src/plugins/firstParty.ts +0 -129
- package/src/plugins/hooks.test.ts +0 -250
- package/src/plugins/hooks.ts +0 -239
- package/src/plugins/identity.ts +0 -37
- package/src/plugins/install.test.ts +0 -107
- package/src/plugins/install.ts +0 -106
- package/src/plugins/inventory.ts +0 -123
- package/src/plugins/manifest.ts +0 -76
- package/src/plugins/plugins.test.ts +0 -205
- package/src/plugins/plugins.ts +0 -189
- package/src/plugins/proposal.ts +0 -121
- package/src/plugins/runtime.test.ts +0 -40
- package/src/plugins/runtime.ts +0 -82
- package/src/plugins/trust.ts +0 -142
- package/src/plugins/types.ts +0 -149
- package/src/prompt/compile.test.ts +0 -261
- package/src/prompt/compile.ts +0 -732
- package/src/server/methods.ts +0 -349
- package/src/server/remote.ts +0 -77
- package/src/server/rpc.ts +0 -116
- package/src/server/serve.ts +0 -28
- package/src/server/server.test.ts +0 -174
- package/src/sessions/approvals.ts +0 -118
- package/src/sessions/contracts.ts +0 -336
- package/src/sessions/conversation.test.ts +0 -177
- package/src/sessions/extensionSession.test.ts +0 -74
- package/src/sessions/extensionUi.test.ts +0 -65
- package/src/sessions/extensionUi.ts +0 -102
- package/src/sessions/history.ts +0 -51
- package/src/sessions/lineageJoin.ts +0 -75
- package/src/sessions/policy.ts +0 -36
- package/src/sessions/pricing.ts +0 -60
- package/src/sessions/questionBatches.test.ts +0 -110
- package/src/sessions/reasoningSummaries.ts +0 -59
- package/src/sessions/registry.ts +0 -381
- package/src/sessions/runIndex.ts +0 -99
- package/src/sessions/runStore.test.ts +0 -152
- package/src/sessions/runStore.ts +0 -332
- package/src/sessions/runner.ts +0 -604
- package/src/sessions/runtimeResources.test.ts +0 -61
- package/src/sessions/sessions.test.ts +0 -549
- package/src/sessions/sessions.ts +0 -339
- package/src/skills/registry.test.ts +0 -104
- package/src/skills/registry.ts +0 -413
- package/src/terminal/accountsMenu.test.ts +0 -225
- package/src/terminal/accountsMenu.ts +0 -382
- package/src/terminal/cli.ts +0 -149
- package/src/terminal/client.ts +0 -74
- package/src/terminal/control.test.ts +0 -23
- package/src/terminal/control.ts +0 -23
- package/src/terminal/controller.ts +0 -291
- package/src/terminal/hubMenu.ts +0 -24
- package/src/terminal/launch.test.ts +0 -25
- package/src/terminal/launch.ts +0 -48
- package/src/terminal/piExtension.lifecycle.test.ts +0 -55
- package/src/terminal/piExtension.ts +0 -259
- package/src/terminal/pluginControl.test.ts +0 -146
- package/src/terminal/pluginMenu.ts +0 -112
- package/src/terminal/socket.test.ts +0 -71
- package/src/terminal/socket.ts +0 -232
- package/src/terminal/standalone.test.ts +0 -167
- package/src/terminal/standalone.ts +0 -153
- package/src/terminal/terminal.test.ts +0 -399
- package/src/terminal/terminals.ts +0 -553
- package/src/terminal/tui/application.test.ts +0 -114
- package/src/terminal/tui/application.ts +0 -491
- package/src/terminal/tui/commands.test.ts +0 -218
- package/src/terminal/tui/commands.ts +0 -361
- package/src/terminal/tui/dialogs.ts +0 -301
- package/src/terminal/tui/editor.test.ts +0 -84
- package/src/terminal/tui/editor.ts +0 -79
- package/src/terminal/tui/keybindings.test.ts +0 -22
- package/src/terminal/tui/keybindings.ts +0 -50
- package/src/terminal/tui/piAdapter.ts +0 -62
- package/src/terminal/tui/presentation.test.ts +0 -79
- package/src/terminal/tui/questions.test.ts +0 -41
- package/src/terminal/tui/questions.ts +0 -47
- package/src/terminal/tui/runtime.socket.test.ts +0 -104
- package/src/terminal/tui/runtime.test.ts +0 -215
- package/src/terminal/tui/runtime.ts +0 -388
- package/src/terminal/tui/sessionUi.ts +0 -24
- package/src/terminal/tui/settings.test.ts +0 -150
- package/src/terminal/tui/settings.ts +0 -188
- package/src/terminal/tui/status.test.ts +0 -70
- package/src/terminal/tui/status.ts +0 -109
- package/src/terminal/tui/theme.ts +0 -174
- package/src/terminal/tui/tools.test.ts +0 -145
- package/src/terminal/tui/tools.ts +0 -142
- package/src/terminal/tui/transcript.test.ts +0 -25
- package/src/terminal/tui/transcript.ts +0 -124
- package/src/terminal/tui/ui.test.ts +0 -313
- package/src/terminal/tui/ui.ts +0 -166
- package/src/terminal/tui/welcome.ts +0 -102
- package/src/tools/askUser.test.ts +0 -69
- package/src/tools/askUser.ts +0 -59
- package/src/tools/definitions.ts +0 -187
- package/src/tools/maintenance.ts +0 -24
- package/src/tools/memoryTools.ts +0 -22
- package/src/tools/pluginPropose.ts +0 -41
- package/src/tools/registryWrite.test.ts +0 -101
- package/src/tools/registryWrite.ts +0 -182
- package/src/tools/spawnSubagent.ts +0 -92
- package/src/tools/types.ts +0 -39
- package/src/web/safeRequest.ts +0 -171
- package/src/web/text.ts +0 -53
- package/src/web/tools.ts +0 -134
- package/src/web/web.test.ts +0 -141
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
# Arm 06 — Memory
|
|
2
|
+
|
|
3
|
+
Status: **core four audited** (omp, dsh, opencode, harness²) + our Wiki;
|
|
4
|
+
claude-code/openhands pending.
|
|
5
|
+
|
|
6
|
+
## Design space
|
|
7
|
+
|
|
8
|
+
What counts as memory (instruction files, durable notes, episodic stores,
|
|
9
|
+
learned harnesses), who writes and when (model via tools, background
|
|
10
|
+
consolidation, per-write hooks), what shapes entries and their limits, and how
|
|
11
|
+
recall is gated (never ship rubrics or other answer-leaking data).
|
|
12
|
+
|
|
13
|
+
## Comparison
|
|
14
|
+
|
|
15
|
+
**this harness.** Wiki notes: `noteChange` fires once the file is in place, in
|
|
16
|
+
the background; a hook's failure never reaches the write; every new write point
|
|
17
|
+
calls it too (repo contract). Injection sections are bounded (`WIKI_BUDGET`,
|
|
18
|
+
`NOTES_LISTED` in `src/prompt/compile.ts:167` etc.), listing notes + revision,
|
|
19
|
+
with more available via `wiki-list`/`wiki-search` tools. The refine experience
|
|
20
|
+
library is a separate, answer-free lane (arm 10) — never ships rubrics
|
|
21
|
+
(`refine/evidence.ts` guard).
|
|
22
|
+
|
|
23
|
+
**omp — the memory machine.** Five `memory.backend` modes: off | local |
|
|
24
|
+
hindsight | mnemopi | sharpshooter (`docs/memory.md:3-11`). A startup
|
|
25
|
+
background job runs two phases (per-session extraction → global consolidation
|
|
26
|
+
with lease+heartbeat, skipped for subagents), producing per-project `MEMORY.md`
|
|
27
|
+
(+ summary) and lessons and **skills/** on disk
|
|
28
|
+
(`.../memories/index.ts:29-67`; `docs/memory.md:22-26,74-89`). Injection =
|
|
29
|
+
Memory Guidance block at session start sharing a 5000-token budget with
|
|
30
|
+
lessons (`docs/memory.md:132`); `learn` lessons capped 100 entries × 2000
|
|
31
|
+
chars, redacted (`docs/memory.md:70`). `mnemopi` = local SQLite
|
|
32
|
+
working/episodic engine with embeddings and a `memory://` read protocol plus
|
|
33
|
+
model-facing tools `recall|retain|reflect|memory_edit`
|
|
34
|
+
(`packages/mnemopi/README.md:5-8`; `docs/memory.md:34-46`). `hindsight` =
|
|
35
|
+
remote vector service; recall on first user turn, auto-retain every N turns
|
|
36
|
+
(`.../hindsight/state.ts:385-388`). Writes happen minutes/days later — nothing
|
|
37
|
+
is "auto right after task".
|
|
38
|
+
|
|
39
|
+
**dsh — durability without a memory package.** No memory package by design:
|
|
40
|
+
the durable session log (immutable JSONL + checkpoint policy,
|
|
41
|
+
`.../packages/session/README.md:38-39`), todos persisting across sessions
|
|
42
|
+
(owned by the session; whole-list replace, `.../packages/todo/README.md:12`),
|
|
43
|
+
`spill` storing oversized text out of context with locator+guidance
|
|
44
|
+
(`.../packages/spill/README.md:12,30-31`), `storage` for app data that is
|
|
45
|
+
**never model-visible** (`.../packages/storage/README.md:12,27-30`),
|
|
46
|
+
`deliverables` recording outputs as client-only events
|
|
47
|
+
(`.../packages/deliverables/README.md:12,27-28`). Cross-session memory:
|
|
48
|
+
deliberately absent.
|
|
49
|
+
|
|
50
|
+
**opencode.** No cross-session memory product: per-session todos (feature-gated
|
|
51
|
+
`experimental.todo`), skills/config as durable files, snapshot revert/restore
|
|
52
|
+
(`.../tool/plugin/todo.ts:50-75`; `.../session/revert.ts:37-42`). Memory is a
|
|
53
|
+
community-plugin story.
|
|
54
|
+
|
|
55
|
+
**harness².** Memory belongs to refinement: the per-domain experience library
|
|
56
|
+
carries full adopted trees + `EXPERIENCE.md` (why + lesson) per task, scoped
|
|
57
|
+
per run and domain, starting empty
|
|
58
|
+
(`external/harness2/harness2/core/library.py:15-23`). At proposal time the
|
|
59
|
+
library is *read* (`INDEX.md` browse, `prompts.py:320-328`), workspace facts
|
|
60
|
+
are re-verified before reuse — memory is a drift-checked `[cue→lesson]`, not a
|
|
61
|
+
freeform store. The editable tree also holds `LongTermMEMORY.md` as c3 durable
|
|
62
|
+
facts, "ALWAYS ON" with the output-budget price tag (`.../prompts.py:104,426`).
|
|
63
|
+
|
|
64
|
+
**claude-code (pending).** CLAUDE.local.md, `#` quick-notes, user memory file
|
|
65
|
+
(publishable specs; citations pending).
|
|
66
|
+
|
|
67
|
+
## Trade-offs
|
|
68
|
+
|
|
69
|
+
- **Where memory lives.** The file the model reads (`MEMORY.md`, our Wiki) is
|
|
70
|
+
the visible tier; the episodic store (mnemopi) is the cheap tier for
|
|
71
|
+
per-project recall. omp is the only source with both, and it pays for it with
|
|
72
|
+
background jobs and lease/heartbeat machinery.
|
|
73
|
+
- **Learning to write.** harness²'s lessons have a *scope contract*
|
|
74
|
+
(generic/procedural, but never task facts; "too generic changes nothing, task
|
|
75
|
+
facts are wrong anchors") — enforced by prompt discipline and by the `cue`
|
|
76
|
+
shape in ours (`src/refine/prompts.ts:425`). Any Wiki lesson should carry the
|
|
77
|
+
same contract (pattern vs fact).
|
|
78
|
+
- **Caps and redaction.** omp's budget regime (100×2000 lessons, injection caps)
|
|
79
|
+
caps) mirrors our WIKI_BUDGET approach; worth remembering that redaction is
|
|
80
|
+
part of the cap story, not just size.
|
|
81
|
+
- **Nothing is model-visible that shouldn't be** (dsh `storage`): keep the
|
|
82
|
+
separation of run records (ours).validate Never model-visible: run events
|
|
83
|
+
used for the Wiki must already be validated kinds (family rule).
|
|
84
|
+
|
|
85
|
+
## Adoption candidates
|
|
86
|
+
|
|
87
|
+
| # | Idea | From | Land as | Tier |
|
|
88
|
+
|---|---|---|---|---|
|
|
89
|
+
| M1 | Apply harness²'s lesson-shape contract to any Wiki note that summarizes behavior (cue = shape of situation, lesson = checkable operation, NO_ENTRY when unsupported) | harness² + omp caps | Wiki note template/validation (plugin) | landed: `src/history/lessons.ts` (PROP-0008) |
|
|
90
|
+
| M2 | Evaluate a `memory://`-style read protocol (note retrieval as URI) — compare cost against plain wiki tools before adopting | omp mnemopi | none (note only) | T3 |
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
# Arm 07 — Governance
|
|
2
|
+
|
|
3
|
+
Status: **core three audited** (opencode, omp, dsh) + swe-agent blocklists,
|
|
4
|
+
smolagents executor posture; claude-code/openhands pending.
|
|
5
|
+
|
|
6
|
+
## Design space
|
|
7
|
+
|
|
8
|
+
Who may call what, expressed how (per-call gate, tier×policy, event pipeline,
|
|
9
|
+
modes), approval UX (`ask` as outcome), fallback behavior (fail-closed or not),
|
|
10
|
+
trust for loaded code, secret/account isolation.
|
|
11
|
+
|
|
12
|
+
## Comparison
|
|
13
|
+
|
|
14
|
+
**this harness (contracts).** Per-call gate as the final extension; standing
|
|
15
|
+
approvals; single-use operation approvals in the app scope; account pinning
|
|
16
|
+
and redaction; tree plugins load only when their exact code is trusted
|
|
17
|
+
(`src/tree/trust.ts`).
|
|
18
|
+
|
|
19
|
+
**opencode — effect assertions with a wildcard ladder.** Rules: `allow|deny|ask`
|
|
20
|
+
literals, `findLast` wildcard resource match, default ask; agent rules and
|
|
21
|
+
session-level rules merge; a missing agent rule means deny-all
|
|
22
|
+
(`.../core/src/permission.ts:87-97,158-172`); user-saved "always allow"
|
|
23
|
+
(`:148-155`); catalog filtering only for wildcard-deny leaves
|
|
24
|
+
(`.../tool.ts:233,293-296`). Plugins may reject calls via `execute.before`
|
|
25
|
+
(`.../packages/plugin/src/effect/tool.ts:20-52`) — handy, but note the gate
|
|
26
|
+
stays the execution boundary's last authority only if core retains its own
|
|
27
|
+
assert.
|
|
28
|
+
|
|
29
|
+
**omp — declared tiers and modes.** `ToolTier = read|write|exec` per tool
|
|
30
|
+
(exec default when unclaimed), per-tool policy `allow|deny|prompt`, modes
|
|
31
|
+
`always-ask | write | yolo`; **missing context fails closed to always-ask**
|
|
32
|
+
(`.../tools/approval.ts:17-18,53-84,100,1226-1230`). Extension hooks wrap every
|
|
33
|
+
call (`extensibility/hooks/tool-wrapper.ts`).
|
|
34
|
+
|
|
35
|
+
**dsh — pipeline events, not a package.** Gate inside dsh-tools:
|
|
36
|
+
`tools/pre-execute` (allow/deny/ask) → monotonic guard() reasons → execute →
|
|
37
|
+
post-execute → result (observe-only)
|
|
38
|
+
(`.../packages/core/tools/README.md:89,109`; ask at `.../index.ts:608-612`).
|
|
39
|
+
Bundle base ships a default policy confining file writes and asking before
|
|
40
|
+
risky actions (`.../bundle/base/README.md:50`). OS sandbox separately:
|
|
41
|
+
file-effect policy classes with Landlock/Seatbelt/Windows backends and one-time
|
|
42
|
+
approved escalation (`.../packages/sandbox/README.md:12,30`).
|
|
43
|
+
|
|
44
|
+
**swe-agent.** Governance = curation: blocklist files in bundles
|
|
45
|
+
(`external/swe-agent/tools` listing); the environment's own command filter
|
|
46
|
+
(pending detail).
|
|
47
|
+
|
|
48
|
+
**smolagents.** Almost none in-source; the free executor (interception-based
|
|
49
|
+
local or paid remote) carries the risk — the anti-reference for our no-code-actions stance.
|
|
50
|
+
|
|
51
|
+
**claude-code (pending).** Permission modes + allow/deny rules + hooks.
|
|
52
|
+
|
|
53
|
+
## Trade-offs
|
|
54
|
+
|
|
55
|
+
- **Declarative vs hook-composed.** A user wanting "always allow reads, ask on
|
|
56
|
+
writes" gets legibility from omp's tables; a plugin author gets power from
|
|
57
|
+
opencode's before-hooks. Our per-call gate can host both: tiers inform, hooks
|
|
58
|
+
advise, gate decides.
|
|
59
|
+
- **Fail-closed culture.** omp fails closed on missing policy; opencode defaults
|
|
60
|
+
ask; dsh asks by bundle default. Convergent good posture — record as a
|
|
61
|
+
shared norm, and keep our own default equally closed.
|
|
62
|
+
- **Escalations are one-time, auditable.** dsh's one-time approved sandbox
|
|
63
|
+
escalation and our single-use approvals express the same idea; forcing a
|
|
64
|
+
person to re-re-approve persistent bypasses is the safer curve.
|
|
65
|
+
|
|
66
|
+
## Adoption candidates
|
|
67
|
+
|
|
68
|
+
| # | Idea | From | Land as | Tier |
|
|
69
|
+
|---|---|---|---|---|
|
|
70
|
+
| G1 | Tier-per-tool declarations inform standing-approval wording (reads bulk-allowed, writes asked) | omp | ToolPolicy documents + default policy | T1 |
|
|
71
|
+
| G2 | Codify "policy missing ⇒ ask" as an invariant test | omp fail-closed | src tests around the gate | T1 |
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
# Arm 08 — Execution
|
|
2
|
+
|
|
3
|
+
Status: **core three audited** (opencode, omp, dsh) + swe-agent environments,
|
|
4
|
+
smolagents executors; hands pending.
|
|
5
|
+
|
|
6
|
+
## Design space
|
|
7
|
+
|
|
8
|
+
Where a step's process runs (own process, PTY owner, container), sandbox
|
|
9
|
+
mechanics per OS, output shapes (streaming, truncation, side-files), and who
|
|
10
|
+
owns the terminal surface.
|
|
11
|
+
|
|
12
|
+
## Comparison
|
|
13
|
+
|
|
14
|
+
**this harness (contracts).** Host owns PTY and supervision; the harness owns
|
|
15
|
+
the terminal launch spec; a session runs in its account's own Pi agent folder,
|
|
16
|
+
never `~/.pi` (isolation by account).
|
|
17
|
+
|
|
18
|
+
**opencode.** The `shell` tool runs via the core Shell service returning
|
|
19
|
+
bounded tail output with full output saved to a file
|
|
20
|
+
(`.../tool/plugin/shell.ts:17-23,42-43`). `persistent-pty` is a separate
|
|
21
|
+
per-server daemon for owned PTYs rooted at `<state>/pty` — for interactive
|
|
22
|
+
frontends, distinct from the tool path
|
|
23
|
+
(`.../core/src/persistent-pty/index.ts:6-23,129` — tool-vs-PTY overlap
|
|
24
|
+
unverified).
|
|
25
|
+
|
|
26
|
+
**omp.** The strongest in-process Unix environment: bash runs inside a Rust
|
|
27
|
+
`pi-shell` host **with vendored uutils coretools (pi-builtins)** — real
|
|
28
|
+
utilities, one process (`crates/pi-shell/Cargo.toml:18`,
|
|
29
|
+
`crates/pi-builtins/src/`). Always non-interactive env (pagers off,
|
|
30
|
+
TERM=dumb, credential prompts fail via `false`)
|
|
31
|
+
(`.../exec/non-interactive-env.ts:6-25`). No OS-level sandbox located
|
|
32
|
+
(unverified absence).
|
|
33
|
+
|
|
34
|
+
**dsh.** Layered: OS sandbox classes (read-only / workspace-write /
|
|
35
|
+
danger-full-access on Landlock/Seatbelt/Windows tokens, one-time approved
|
|
36
|
+
escalation), exactly one shell executor per composition exposing `bash`/`pwsh`
|
|
37
|
+
tools, and a single `ctx.subprocess` service with bounded output and scrubbed
|
|
38
|
+
env (`.../sandbox/README.md:12,30`; `.../shell/README.md:12,38`;
|
|
39
|
+
`.../subprocess/README.md:12,27`).
|
|
40
|
+
|
|
41
|
+
**swe-agent.** Containerized bash environments per run with tool bundles
|
|
42
|
+
bound to the interface (`sweagent/environment/`); benchmark single-shot
|
|
43
|
+
workspaces.
|
|
44
|
+
|
|
45
|
+
**smolagents.** Local executor intercepts/denies dangerous calls in-process;
|
|
46
|
+
remote (E2B etc.) otherwise (`local_python_executor.py`, `remote_executors.py`).
|
|
47
|
+
|
|
48
|
+
## Trade-offs
|
|
49
|
+
|
|
50
|
+
- **In-process Unix vs OS sandbox.** omp buys speed/fidelity with a Rust-hosted
|
|
51
|
+
environment; dsh buys verifiable confinement with OS primitives. This harness
|
|
52
|
+
runs on a host's PTY, so the OS-sandbox direction (dsh) is the compatible
|
|
53
|
+
one; "in-process coretools" is an execution detail of pi, not adoptable
|
|
54
|
+
machinery here without duplicating rust-supported layers.
|
|
55
|
+
- **Two command paths is the norm.** opencode (tool shell vs owned PTY) and dsh
|
|
56
|
+
(shell executor vs subprocess service) both split "model calls" from
|
|
57
|
+
"platform plumbing" — our launch-spec/PTY split matches; the invariant to
|
|
58
|
+
keep: environments are per-account, launched by spec, never shared across
|
|
59
|
+
accounts.
|
|
60
|
+
- **Output hygiene** (bounded tails + side files, scrubbed env, non-interactive
|
|
61
|
+
defaults) is universal; treat as a checklist for any new tool rather than a
|
|
62
|
+
design to adopt.
|
|
63
|
+
|
|
64
|
+
## Adoption candidates
|
|
65
|
+
|
|
66
|
+
| # | Idea | From | Land as | Tier |
|
|
67
|
+
|---|---|---|---|---|
|
|
68
|
+
| E1 | Sandboxing classes as a ToolPolicy option (read-only/workspace-write) for *host* integrations — offered, never default | dsh | ToolPolicy scope option | T2 (needs app-level sandbox plumbing) |
|
|
69
|
+
| E2 | "One subprocess service" norm: all child spawns montage through one owned helper with bounded output + env scrub | dsh subprocess | App-sidecar ownership unchanged; only normative doc | T1 as ADR text |
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
# Arm 09 — Observability
|
|
2
|
+
|
|
3
|
+
Status: **core three audited** (opencode, omp, dsh) + swe-agent trajectories;
|
|
4
|
+
hands pending.
|
|
5
|
+
|
|
6
|
+
## Design space
|
|
7
|
+
|
|
8
|
+
What is recorded (events, trajectories, usage), validation of records, who may
|
|
9
|
+
write run records, live relay to interfaces, retention/redaction, and cost
|
|
10
|
+
accounting granularity.
|
|
11
|
+
|
|
12
|
+
## Comparison
|
|
13
|
+
|
|
14
|
+
**this harness (contracts).** Validated run events saved per run by the only
|
|
15
|
+
writer (`sessions/runStore.ts`); `usage.updated` cumulative per run with the
|
|
16
|
+
uncached-input / cache-read / cache-write split; app relays to UI.
|
|
17
|
+
|
|
18
|
+
**opencode.** "event-logger.ts listens on the event bus and logs only
|
|
19
|
+
allow-listed config-type events (agent/provider/model/command/config updated),
|
|
20
|
+
as a global node" (`.../core/src/event-logger.ts:10-19`). Usage published as
|
|
21
|
+
`SessionEvent.UsageRecorded` from the compaction anchor
|
|
22
|
+
(`.../session/compaction.ts:632-639`); trajectory surface lives in session-ui
|
|
23
|
+
and the TUI (packages listing).
|
|
24
|
+
|
|
25
|
+
**omp.** `omp stats` — local web dashboard with live ingest (port 3847)
|
|
26
|
+
covering AI usage, with per-session ledgers available
|
|
27
|
+
(`packages/stats/README.md:3,9,31-35`); `wire` package supplies transport;
|
|
28
|
+
judgment roles record usage too (`.../judgment/index.ts:6-10`).
|
|
29
|
+
|
|
30
|
+
**dsh.** Telemetry is an OTel transport only — "business consumers own events,
|
|
31
|
+
identities, redaction"; feedback-authorized upload, default `FEEDBACK_ONLY`
|
|
32
|
+
(`.../packages/telemetry/README.md:12,25`; `.../bundle/base/README.md:50`).
|
|
33
|
+
Business events flow through the session event stream.
|
|
34
|
+
|
|
35
|
+
**swe-agent.** trajectory JSON per run + a separate inspector to browse them
|
|
36
|
+
(`external/swe-agent/trajectories`, `sweagent/inspector/`).
|
|
37
|
+
|
|
38
|
+
**smolagents.** `monitoring.py` metrics + `AgentLogger` markdown logs; gradio UI.
|
|
39
|
+
|
|
40
|
+
## Trade-offs
|
|
41
|
+
|
|
42
|
+
- **Where transport ends.** The dsh rule — a transport package knows nothing
|
|
43
|
+
about business events — is the cleanest boundary. Our runStore already
|
|
44
|
+
*is* the business schema; be careful that nothing in run records assumes an
|
|
45
|
+
application consumer (they don't: read-only records).
|
|
46
|
+
- **Local dashboards vs relay.** omp's stats serves a self-hosted view; ours
|
|
47
|
+
hands validated events to a UI. Same functionality, different home; nothing
|
|
48
|
+
to adopt; the one check if we ever add an export path: no
|
|
49
|
+
duplicate charges on relaunch (event ids dedupe).
|
|
50
|
+
- **Cost accounting alignment.** Everyone anchors usage at the latest provider
|
|
51
|
+
response and estimates lagging items (opencode anchor pattern at
|
|
52
|
+
`compaction.ts:812-842`). Ours does the same via usage.updated — align
|
|
53
|
+
definitions (reasoning inside output) with any upstream comparisons to
|
|
54
|
+
prevent double-cost surface.
|
|
55
|
+
|
|
56
|
+
## Adoption candidates
|
|
57
|
+
|
|
58
|
+
| # | Idea | From | Land as | Tier |
|
|
59
|
+
|---|---|---|---|---|
|
|
60
|
+
| O1 | A "transport owns nothing about identities" doc commitment when any telemetry-like export exists (apps may add; harness stays identity-blind) | dsh telemetry | a para note in repo README | T1 doc |
|
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
# Arm 10 — Refinement / self-improvement
|
|
2
|
+
|
|
3
|
+
Status: **audited (self + upstream, in person)** — this arm's headline finding changes
|
|
4
|
+
the shape of the study, see §1.
|
|
5
|
+
|
|
6
|
+
## Design space
|
|
7
|
+
|
|
8
|
+
Who is improved (prompt files, tools, tree files), how candidates are made
|
|
9
|
+
(dimension-split editors?), how they are probed (isolated, unattended; approvals
|
|
10
|
+
refused), how selection stays answer-free, how experience accumulates across
|
|
11
|
+
tasks, and what no step may do (act in the world with a person's assets).
|
|
12
|
+
|
|
13
|
+
## 1. Headline finding: this harness already ports harness²
|
|
14
|
+
|
|
15
|
+
Every module of `src/refine/` is an explicit port of harness²'s core, by its own
|
|
16
|
+
header comments:
|
|
17
|
+
|
|
18
|
+
| this harness | upstream |
|
|
19
|
+
|---|---|
|
|
20
|
+
| `src/refine/recursion.ts:5` | `harness2/core/recursion.py` |
|
|
21
|
+
| `src/refine/selection.ts:5` | `harness2/core/selection.py` |
|
|
22
|
+
| `src/refine/prompts.ts:5` | `harness2/core/prompts.py` (the **adapt** pack only — `prompts.ts:1`) |
|
|
23
|
+
| `src/refine/ledger.ts:5` | `harness2/core/ledger.py` |
|
|
24
|
+
| `src/refine/library.ts:9` | `harness2/core/library.py` |
|
|
25
|
+
| `src/refine/evidence.ts:13` | `harness2/core/context.py` |
|
|
26
|
+
| `src/refine/runner.ts:6` | `harness2/core/schedule.py::run_task` (shaped after) |
|
|
27
|
+
|
|
28
|
+
Identities preserved: R = 4k rollouts / P = 3k sessions per mode
|
|
29
|
+
(`src/refine/ledger.ts:7-11`), matching upstream `recursion.py:15-19`; Stage
|
|
30
|
+
shape (`Stage {label, dim, tree, keptBase, fellBack…}` `src/refine/recursion.ts:26-37`)
|
|
31
|
+
with one-retry-then-inherit upstream `recursion.py` docstring; sequential-round
|
|
32
|
+
checkpoint anchoring incl. the "KEEP_BASE means the CURRENT checkpoint" rule
|
|
33
|
+
(`src/refine/prompts.ts:316` vs upstream `prompts.py:852-857`); the answer-free
|
|
34
|
+
selector (`src/refine/prompts.ts:399` mirrors `prompts.py:791-793`); KEEP_BASE
|
|
35
|
+
doctrine (`src/refine/prompts.ts:232` mirrors `prompts.py:333-335`).
|
|
36
|
+
|
|
37
|
+
The merge the study was asked to plan is therefore **already largely executed**.
|
|
38
|
+
What remains is a mature-upstream delta analysis, below.
|
|
39
|
+
|
|
40
|
+
## 2. Comparison with harness² as it now stands
|
|
41
|
+
|
|
42
|
+
Converged (ported): parallel/sequential recursion, INV/DOM candidate split with
|
|
43
|
+
independent same-evidence samplers, aggregator/composer with MERGE / ADOPT-ONE /
|
|
44
|
+
KEEP_BASE, anonymized answer-free selection, per-domain experience library
|
|
45
|
+
carrying the **full adopted tree plus an EXPERIENCE.ms-style why/lesson** (ours:
|
|
46
|
+
`src/refine/library.ts`; theirs: `external/harness2/harness2/core/library.py:15-23`,
|
|
47
|
+
"the whole tree is carried, never a summary"), reflection writing cue/lesson rows
|
|
48
|
+
(`src/refine/prompts.ts:418-425` mirrors their `_EXP`-driven reflector).
|
|
49
|
+
|
|
50
|
+
Deltas (upstream beyond our port):
|
|
51
|
+
|
|
52
|
+
1. **Second, hardened prompt pack ("tts").** Upstream ships two packs per stage
|
|
53
|
+
(`_tts_propose` / `_tts_aggregate` / `_tts_select` vs the base pack,
|
|
54
|
+
`external/harness2/harness2/core/prompts.py:838-839,896-897`); ours carries
|
|
55
|
+
only the adapt pack (`src/refine/prompts.ts:1`). The tts pack adds: an
|
|
56
|
+
explicit **`<notes>` decision audit format** (`kept|revised|dropped -> edit ->
|
|
57
|
+
evidence`, `.../prompts.py:765-769`), a `yardstick` slot ("WHAT GOOD PROCESS
|
|
58
|
+
LOOKS LIKE HERE", `.../prompts.py:705-706,757-761`), sharper always-on
|
|
59
|
+
economics and on-demand-first framing, and pool-anonymity emphases
|
|
60
|
+
(`PICKING AN UNMODIFIED HARNESS IS VALID`, `.../prompts.py:66-74`).
|
|
61
|
+
2. **Screenshot-era surface dialects.** Upstream maintains this c1–c8 tree for
|
|
62
|
+
two substrates (opencode and codex) with per-substrate hook/plugin mechanics
|
|
63
|
+
(`.../prompts.py:617-661`, `tree.py:41-60 SurfaceSpec`) — ours compiles one
|
|
64
|
+
Pi surface (`src/refine/recursion.ts` imports `PI_SURFACE`).
|
|
65
|
+
3. **A decoupled judge.** `harness2/core/judge.py:15-19`: measurement of the
|
|
66
|
+
chosen run happens *after selection*, **"Nothing in the method imports this
|
|
67
|
+
module"**; a judge failure is None, excluded from denominators
|
|
68
|
+
(`.../judge.py:37-40`). **Not ported** — `src/refine/` has no judge module.
|
|
69
|
+
This is the one structural piece of upstream we do not have.
|
|
70
|
+
4. **Substrate contract vs our RefineHost.** Their substrate wrap is a
|
|
71
|
+
file-level (`context/harness/` editable tree + workspace dirs); ours isolates
|
|
72
|
+
through `RefineHost` (workspace, probe session, deliverable) with probe runs
|
|
73
|
+
as unattended sessions whose approvals are refused (repo contract). Same
|
|
74
|
+
shape, different isolation vocabulary — ours is the stronger primitive, but
|
|
75
|
+
note upstream's `keep_base` inherits untouched files with no re-read
|
|
76
|
+
(`.../prompts.py:186-189`); ours should verify the same semantic survived the
|
|
77
|
+
port (pending test-level confirmation).
|
|
78
|
+
|
|
79
|
+
## 3. Trade-offs
|
|
80
|
+
|
|
81
|
+
- **Judge in or out.** Keeping measurement out of the harness (our family rule:
|
|
82
|
+
measurement belongs to Evaluation) preserves layering but forfeits private
|
|
83
|
+
experience labeling — the `<experience>` reflection then rests only on
|
|
84
|
+
trajectory contrast, which ours already guards ("A lesson resting only on
|
|
85
|
+
`confounded` rows is a guess", `src/refine/prompts.ts:425`). Upstream's
|
|
86
|
+
compromise: a judge that labels the *chosen* run only, never feeds forward, and
|
|
87
|
+
is excluded from denominators on failure — it cannot leak into selection
|
|
88
|
+
because selection already happened.
|
|
89
|
+
- **Prompt packs.** Two packs cost maintenance but let upstream evolve hardening
|
|
90
|
+
without destabilizing the published method. Ours froze one pack at port time;
|
|
91
|
+
upstream drift since then is invisible to our selectors.
|
|
92
|
+
- **One surface vs many.** Ours targets Pi only; upstream's SurfaceSpec proves
|
|
93
|
+
the same method bends to codex/opencode cheaply — a bridge test for whether
|
|
94
|
+
our `RefineHost` boundary is truly substrate-agnostic.
|
|
95
|
+
|
|
96
|
+
## 4. Adoption candidates
|
|
97
|
+
|
|
98
|
+
| # | Idea | From | Tier | Land as |
|
|
99
|
+
|---|---|---|---|---|
|
|
100
|
+
| R1 | Diff the ported prompts against upstream's `adapt` lines and pull changed sentences (e.g. pool-anonymity emphasis, deliverable-shape rule) into `src/refine/prompts.ts` | harness² drift since the port | T1 | in-place prompt text sync (tests measure wording-insensitive behavior) |
|
|
101
|
+
| R2 | Add the `<notes>` audit format to compose/selected stages so adoption decisions carry their evidence | tts pack | T1 | our prompts' notes sections |
|
|
102
|
+
| R3 | Consider the yardstick slot as an optional, app-supplied `BenchPrompts` field — *only if* an app needs a domain yardstick; it must remain prose, never a score | tts pack via `Spec` | T2 | `RefineHost` launch input, thinking hard before adding |
|
|
103
|
+
| R4 | A post-selection judge module, ported with upstream's exact decoupling (not imported by the method; None on failure excluded from denominators) **or** explicitly glued to Evaluation | judge.py | T2 with a layering decision first — see trade-off above | new `src/refine/judge.ts` behind `RefineHost`, or nothing |
|
|
104
|
+
| R5 | Re-run upstream-vs-ours substrate parity test: can our tree/validation accept an upstream-authored candidate tree without edits? (`isAllowed`, caps, autotrigger semantics) | both | T1 verification task, no code change | a test |
|
|
105
|
+
|
|
106
|
+
Anti-candidates, recorded so nobody re-proposes them: do **not** move measurement
|
|
107
|
+
or grading into `src/refine/` (family boundary: Evaluation owns measurement);
|
|
108
|
+
do **not** let any judge label reach improver or selector (answer-free is
|
|
109
|
+
invariant); do **not** carry per-task facts into the durable library without the
|
|
110
|
+
cue/lesson narrowing ours already enforces.
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
# `/btw` side-question comparison
|
|
2
|
+
|
|
3
|
+
Status: source-reviewed comparison of the checked-out workspace snapshots; no live model or UI runs were performed. This is a study note, not a change to the Harness contract.
|
|
4
|
+
|
|
5
|
+
## Scope and conclusion
|
|
6
|
+
|
|
7
|
+
This compares the terminal implementation in this repository, Xingular Agent's app-owned chat feature, and the external projects with an actual `/btw` implementation in the checked-out `external/` sources. The external set is Oh My Pi (`omp`), Kimi CLI, OpenCode, and OpenHands. OpenHands' SDK is its backend, not a separate UI implementation.
|
|
8
|
+
|
|
9
|
+
The similarly named features are not one shared implementation. **Xingular Harness terminal creates a separate, in-memory Pi session with a bounded transcript excerpt and hard tool suppression. Oh My Pi's native `/btw` uses the main session's ephemeral side-turn pipeline, with much more context and persistent BTW history.** Xingular Agent's `/btw` is instead owned by the App: it starts a tracked, tool-free side run using a deliberately bounded public snapshot.
|
|
10
|
+
|
|
11
|
+
## Comparison
|
|
12
|
+
|
|
13
|
+
| Implementation | Context supplied | Isolation and persistence | Interaction |
|
|
14
|
+
|---|---|---|---|
|
|
15
|
+
| **Xingular Harness terminal** | Up to six visible user/assistant turns; each is clipped to 1,200 characters and the excerpt to 6,000. Includes tool names and a running flag, not tool inputs/results. | Creates an in-memory Pi session using the active model, with tools, extensions, skills, prompt templates, themes, and context files disabled; thinking is off. The side exchange is not added to the main transcript or a Harness run record. | One dock at a time. A new question replaces the old one; an empty `/btw` or Escape dismisses it and aborts the side session. The displayed answer is limited to eight lines. (`src/terminal/tui/sideQuestion.ts:13-21,39-53,69-85,106-165`; wiring: `src/terminal/opentui/app.ts:376-399`.) |
|
|
16
|
+
| **Xingular Agent (App-owned)** | Up to eight visible conversation messages plus a bounded public-progress snapshot: current request, visible partial answer, status, and up to six public tool-activity summaries. Excludes hidden reasoning, tool arguments/results, and attachments. | Separate tool-free run using the conversation's account/model/effort and an opaque one-use session identity. It does not control or enter the main transcript; it has an ordinary run record/events for Trajectory and Usage. | One temporary dock per one-to-one Agent/Solo conversation. Stop and Dismiss affect only the side run; a new question replaces it. Groups and attachments are unsupported. (`../App/docs/features/FEAT-0014-side-questions.md:25-43`; snapshot and run launch: `../App/src-tauri/src/agents.rs:2748-2881`; dock lifecycle: `../App/src/modes/chat/useSideQuestion.ts:15-110`.) |
|
|
17
|
+
| **Oh My Pi (`external/omp`)** | Uses the main system prompt and session history, and includes the in-progress assistant text. The snapshot preserves thinking blocks too. Its main tool catalog is supplied for the request, but the side turn does not execute tool calls. | Ephemeral side turn does not mutate the main session history. BTW questions and answers are checkpointed in a separate on-disk history sidecar; topics support follow-ups. | TUI history panel, cancellation, copy, optional promotion of a single answer to a branch, and RPC commands/stream events. (`external/omp/packages/coding-agent/src/session/agent-session.ts:11363-11550,11555-11600`; turn/follow-up context: `external/omp/packages/coding-agent/src/session/btw-turn.ts:13-93`; sidecar: `external/omp/packages/coding-agent/src/session/btw-history.ts:80-146`; controller: `external/omp/packages/coding-agent/src/modes/controllers/btw-controller.ts:121-190,356-448`; RPC: `external/omp/packages/coding-agent/src/modes/rpc/rpc-btw.ts:1-18`.) |
|
|
18
|
+
| **Kimi CLI** | Uses the same system prompt, normalized conversation history, and tool definitions as the main agent, explicitly to align the prompt cache. It does not explicitly add the current partial stream to that history. | Tool definitions are visible, but a deny-all toolset rejects calls. If the model tries a tool, it gets one retry (two model steps maximum). The side exchange is not written into main conversation history. | Streams into a scrollable modal; Escape dismisses. Interactive shell and wire events are supported. (`external/kimi-cli/src/kimi_cli/soul/btw.py:33-93,102-190,233-247`; behavior: `external/kimi-cli/docs/en/reference/slash-commands.md:247-256`; modal handling: `external/kimi-cli/src/kimi_cli/ui/shell/visualize/_interactive.py:120-189,281-324`.) |
|
|
19
|
+
| **OpenCode** | Makes a one-shot generation from the selected session's previewed history, system transcript, and tool definitions, followed by the BTW instruction and question. | The generation explicitly does not mutate the session; it returns text rather than entering a tool-execution loop. The question/answer live in a separate per-session extension store until the tab closes. | One side tab per question; supports retry and copy. The command is enabled only with an open session in a desktop-width window. (`external/opencode/packages/core/src/session/generate.ts:25-65`; extension state: `external/opencode/packages/gui-extensions/src/btw/model.ts:7-110`; command/panel: `external/opencode/packages/gui-extensions/src/btw/renderer.tsx:32-101`.) |
|
|
20
|
+
| **OpenHands** | The default SDK path prepares a request from the enforced conversation snapshot plus the side question, using the agent's model and tool definitions. | `ask_agent` is documented as stateless: it does not alter conversation state, persist events, or change execution status. It makes a direct generation rather than running tool actions. The UI entries are held in a client-side store. | The UI shows a pending card and then the answer, which can be expanded or dismissed; it waits for the response rather than rendering token deltas. (`external/openhands-agent-sdk/openhands-sdk/openhands/sdk/conversation/impl/local_conversation.py:2903-2966`; interception: `external/openhands/src/hooks/chat/use-btw-interceptor.ts:13-43`; client state and card: `external/openhands/src/stores/btw-store.ts:1-68`, `external/openhands/src/components/features/chat/btw-messages.tsx:11-55`.) |
|
|
21
|
+
|
|
22
|
+
## Cross-cutting trade-offs
|
|
23
|
+
|
|
24
|
+
- **Context breadth:** Harness terminal and Agent App construct bounded excerpts. Oh My Pi, Kimi CLI, OpenCode, and OpenHands reuse broader session context. Oh My Pi is the most explicit about carrying live state—and its code includes current thinking blocks—so it is also the least restrictive about what private context the side request can see.
|
|
25
|
+
- **Tool boundary:** Harness terminal and Agent App suppress tools at launch. Kimi advertises the main tool definitions but denies execution and retries after a tool attempt. Oh My Pi, OpenCode, and OpenHands make direct side generations without dispatching the returned answer through the main agent's tool-execution loop; some still send tool definitions for context or cache alignment.
|
|
26
|
+
- **Retention:** Harness terminal is intentionally transient. Agent App retains an ordinary run record for observability. Oh My Pi has durable, followable BTW topics; OpenCode retains one tab's question and answer in its session store. OpenHands' displayed entries are client-side state, not main conversation events.
|
|
27
|
+
- **Cache versus least privilege:** Kimi CLI explicitly aligns system prompt and tool definitions for cache reuse; Oh My Pi reuses the main session's prompt/cache path. This means broader context and tool metadata may be sent than the bounded-snapshot designs require.
|
|
28
|
+
|
|
29
|
+
## Study implications
|
|
30
|
+
|
|
31
|
+
1. Keep the Harness terminal's bounded context and hard no-tools setup as the conservative generic default.
|
|
32
|
+
2. If a side question needs better awareness of an active run, prefer a bounded summary of public progress over forwarding hidden reasoning or raw tool inputs/results. Agent App already demonstrates that application-specific snapshot at the App layer; keep that ownership boundary intact.
|
|
33
|
+
3. Treat persistent follow-up topics, branching, and RPC support as optional product capabilities, not requirements of a basic side question.
|
|
34
|
+
|
|
35
|
+
## Coverage note
|
|
36
|
+
|
|
37
|
+
A source scan found no `/btw` implementation in the checked-out `external/deepseek-harness`, `external/harness2`, `external/smolagents`, or `external/swe-agent` trees. Matches in `external/orca` were fixture/test references, not an implementation. These are observations about the local snapshots, not claims about current upstream releases.
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
# Harness feature-gap review
|
|
2
|
+
|
|
3
|
+
**Scope:** What `@xingular/harness` provides compared with the agent systems in the local harness study. This is a feature-gap review, not a parity score. Comparisons refer to the studied snapshots; the deeper OpenHands and Claude Code audits are still marked pending in the [study index](00-index.md).
|
|
4
|
+
|
|
5
|
+
## Summary
|
|
6
|
+
|
|
7
|
+
The Harness is a generic single-run runtime, not a task manager or long-running workflow engine. Some apparent gaps are deliberate layer boundaries: the architecture assigns product tasks, schedules, teams, worktrees, and UI to the embedding application. The run record has an opaque `goal` string, but no goal lifecycle or progress model. See [00 Overview](../architecture/00-overview.md#layers) and [02 Sessions and runs](../architecture/02-sessions-and-runs.md).
|
|
8
|
+
|
|
9
|
+
| # | Capability missing from the Harness | Current state and comparison | Appropriate owner |
|
|
10
|
+
|---:|---|---|---|
|
|
11
|
+
| 1 | **First-class task lifecycle** — create, assign, track status, dependencies, review, and acceptance | Normal sessions track runs; `RefineTask` is for harness-tree refinement, not product work. OMP has a task-delegation tool. | **Application** |
|
|
12
|
+
| 2 | **Persistent goals and progress** — goal hierarchy, checklist, and durable progress | Plan mode produces a proposed plan, not tracked progress. `goal` on a run is opaque metadata. OpenCode has per-session todos; OMP exposes a goal helper. | **Application**, optionally through a tool provider |
|
|
13
|
+
| 3 | **Long-running job scheduler** — durable queue, cron/event triggers, deadlines, retries, and leases | Sessions can run asynchronously, but the Harness has no durable scheduler. The OpenHands study identifies scheduling in a separate automation project. | **Application** |
|
|
14
|
+
| 4 | **Crash-safe continuation** — resume from a checkpoint after a process or machine restart | Run events and Pi history persist, and terminal history can be resumed manually. However, startup marks active runs interrupted; the Harness does not restart model work. | **Harness + application**: recovery contract plus requeue policy |
|
|
15
|
+
| 5 | **Automatic cross-run memory consolidation** — extract useful task state and lessons from completed runs | The Harness has Wiki notes, history, and a refinement experience library, but no automatic task-state consolidation pipeline. OMP's study describes background memory extraction and consolidation. | **Harness** for generic memory; **application** for task state |
|
|
16
|
+
| 6 | **Team and work-queue orchestration** — persistent workers, assignments, dependencies, and shared coordination | Harness subagents are fresh parent-child runs with result delivery, not a persistent team or shared queue. OMP has task-worker machinery; product-level coordination belongs outside the Harness. | **Application** |
|
|
17
|
+
| 7 | **Managed per-task sandbox/workspace** — containers, worktrees, snapshots, and rollback | The host supplies the working folder and tools; the Harness tool gate is not an OS sandbox. The study contrasts this with OpenHands/SWE-agent containers and OMP worktrees. | **Application/host** |
|
|
18
|
+
| 8 | **Native browser and computer interaction** | Web search/fetch can be provided as tools, but browser or computer control is not built in. Plan-mode text mentioning managed controls is recorded as known drift (D-6). | **Application**, through tool providers and policy |
|
|
19
|
+
| 9 | **Goal-specific verification and acceptance** — tests, graders, and a “done” gate | The refinement matrix records execution and deliverability; it does not grade whether a user's goal was achieved. Frozen task grading belongs in Evaluation. | **Evaluation/application** |
|
|
20
|
+
| 10 | **Aggregate operations dashboard and budgets** — cross-run cost limits, alerts, and health views | The Harness records per-run events and usage. It has no built-in aggregate dashboard; an optional budget-guard plugin partially covers per-run limits. OMP's study describes a local stats dashboard. | **Application UI**, using Harness run data |
|
|
21
|
+
|
|
22
|
+
## Status (2026-10-22)
|
|
23
|
+
|
|
24
|
+
The Harness-owned parts of three gaps have landed. The application-owned parts and the other
|
|
25
|
+
seven gaps are unchanged.
|
|
26
|
+
|
|
27
|
+
| # | What landed in the Harness | Taken from | Still the application's |
|
|
28
|
+
|---:|---|---|---|
|
|
29
|
+
| 2 | `checklist_write`: the model's whole checklist as a `checklist.updated` run event, read with `runs.checklist` ([PROP-0006](../architecture/proposals/PROP-0006-run-checklist.md)) | dsh `todo_write` (whole-list replace, three statuses, replayed from the log); OpenCode `todowrite` (usage rules in the tool description) | Goal records, goal hierarchy, progress across runs, showing the checklist |
|
|
30
|
+
| 4 | `continueFrom` and `runs.continuation`: a stopped run is continued as a new run with the same account, tree version and capabilities, and the model is told where it stopped; `Recovery.interruptedRunIds` ([PROP-0007](../architecture/proposals/PROP-0007-run-continuation.md)) | Every peer's "never restart silently" rule; dsh's durable log as the checkpoint; OpenHands' requeue outside the agent | The requeue policy: which runs to continue, when, and whether to ask first |
|
|
31
|
+
| 5 | The opt-in `lessons` plugin: a read-only reflection after a completed run may keep one lesson in the Wiki under `library/lessons/` ([PROP-0008](../architecture/proposals/PROP-0008-lessons-from-runs.md), [ADR-0010](../decisions/ADR-0010-lessons-in-the-wiki.md)) | harness²'s reflector (cue → lesson, `NO_ENTRY`, never task facts, answer-free guards); OMP's background extraction and caps | Task state and its consolidation; a switch for the plugin in its UI |
|
|
32
|
+
|
|
33
|
+
## Recommendation
|
|
34
|
+
|
|
35
|
+
For products that need autonomous long-running work, start with an application-owned task/goal model and scheduler, then define how they request safe continuation of Harness runs. Keep task and schedule concepts out of the Harness itself; its architecture deliberately assigns them to the application. A useful first sequence is: (1) task and goal records with acceptance criteria, (2) durable scheduling and human handoff, (3) explicit restart/recovery policy, then (4) isolated workspaces and an evaluation gate.
|
|
36
|
+
|
|
37
|
+
## References
|
|
38
|
+
|
|
39
|
+
- Harness ownership and application boundary: [00 Overview](../architecture/00-overview.md#layers), [02 Sessions and runs](../architecture/02-sessions-and-runs.md#invariants).
|
|
40
|
+
- Harness memory and refinement: [08 Memory and history](../architecture/08-memory-and-history.md), [05 Refinement](../architecture/05-refinement.md).
|
|
41
|
+
- Peer comparisons: [Tools](arms/02-tools.md), [Subagents](arms/03-subagents.md), [Memory](arms/06-memory.md), [Execution](arms/08-execution.md), [Observability](arms/09-observability.md), [wide comparison matrix](arms/00-matrix.md).
|
|
42
|
+
- Source inventories: [OpenHands](sources/openhands.md), [OMP](sources/omp.md), [SWE-agent](sources/swe-agent.md), [OpenCode](sources/opencode.md).
|
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
# Cross-arm comparison insights
|
|
2
|
+
|
|
3
|
+
Standing conclusions from the arm audits (arms 01–10, `docs/study/arms/`).
|
|
4
|
+
Each insight cites the arm that backs it. These are the ideas with the highest
|
|
5
|
+
leverage for designing this harness; per-action items live in `roadmap.md`.
|
|
6
|
+
|
|
7
|
+
## 1. Everyone rebuilt the same five-layer architecture
|
|
8
|
+
|
|
9
|
+
Prompt assembly, tool registry + gate, subagent machinery, compaction/context,
|
|
10
|
+
and durable records appeared independently in opencode, omp, dsh, harness² and
|
|
11
|
+
ours — with the same *problems*, not the same *solutions* (arms 01–06, 08–09).
|
|
12
|
+
The design space is covered; the interesting work is picking positions per
|
|
13
|
+
layer, not inventing layers. Harness² even distributes the same c1–c8 component
|
|
14
|
+
taxonomy across substrates (`external/harness2/harness2/core/prompts.py:424-431`)
|
|
15
|
+
that this harness independently uses for its trees — and this harness's
|
|
16
|
+
`src/refine/` is a documented port of harness² (arm 10). Convergence is
|
|
17
|
+
evidence both directions were right.
|
|
18
|
+
|
|
19
|
+
## 2. The stable prefix is an invariant, dynamic content is a protocol
|
|
20
|
+
|
|
21
|
+
Four projects converge hard: keep system prompt byte-stable; put changing state
|
|
22
|
+
into *appended*, dated, superseding messages (omp user-turn reminder
|
|
23
|
+
`date-cwd-reminder.ts:44-48`; dsh "Current runtime context… supersedes earlier"
|
|
24
|
+
snapshot `system-prompt/src/index.ts:314-318`; opencode instruction deltas
|
|
25
|
+
between history and the prompt; ours: `xingular-context`). The subtle
|
|
26
|
+
engineering is where volatile values may NOT live (omp: a tail date line
|
|
27
|
+
invalidated the whole tool array). Never place date/cwd/workspace state in the
|
|
28
|
+
prefix; never rewrite sections in place (arm 01, A1).
|
|
29
|
+
|
|
30
|
+
## 3. There are only three sincere answers to "who contributed this prompt text"
|
|
31
|
+
|
|
32
|
+
(a) **Declaration with an ordering contract** (dsh: numeric order → name ties,
|
|
33
|
+
duplicate names throw, scoped shadowing, `complete` replacement) — most
|
|
34
|
+
legible for caching and reasoning;
|
|
35
|
+
(b) **Ability/extension slots** (omp capabilities; opencode internal tools +
|
|
36
|
+
tool hooks) — most permissive;
|
|
37
|
+
(c) **A validated tree** (ours c1–c8; harness² tree files with machine
|
|
38
|
+
validation) — most durable, at the cost of pipeline ceremony.
|
|
39
|
+
Any addition to our prompt surface should strengthen (a)'s contract or (c)'s
|
|
40
|
+
machines, never invent a fourth pattern. When a plugin contributes a section,
|
|
41
|
+
deterministic ordering and duplicate rejection belong to the compiler
|
|
42
|
+
(`src/prompt/compile.ts`), not to plugin scheduling (arm 01, A2).
|
|
43
|
+
|
|
44
|
+
## 4. Tool interfaces are where public instruction lives
|
|
45
|
+
|
|
46
|
+
All sources push "how to use this" into tool descriptions and keep the system
|
|
47
|
+
prompt shorter. Where that text lives differs: inline strings (opencode),
|
|
48
|
+
static md templates (omp: "Prompts never in code"), fully erased behind a
|
|
49
|
+
generated SDK (dsh's PTC), whole prose files (claude-code's TODOWRITE
|
|
50
|
+
descendant in opencode `todowrite.txt`). For this harness, md-template
|
|
51
|
+
descriptions are the highest leverage per line changed: reviewable diffs,
|
|
52
|
+
`{product}` interpolation stays (arm 02, A3).
|
|
53
|
+
|
|
54
|
+
## 5. Gate taxonomies converge on *tiers × per-call decisions*
|
|
55
|
+
|
|
56
|
+
read/write/exec tier declarations + per-call allow/deny/ask outcomes +
|
|
57
|
+
fail-closed defaults, expressed as tiers (omp), per-leaf asserts (opencode),
|
|
58
|
+
pipeline events (dsh) or a final gate (ours). Two universals worth canonizing
|
|
59
|
+
here: **policy missing ⇒ ask**, and **one-time escalations with audit trails**
|
|
60
|
+
(dsh sandbox escalation ≈ our single-use approvals). Hooks may *advise*;
|
|
61
|
+
neither hooks nor tools *decide* (arm 07, G2).
|
|
62
|
+
|
|
63
|
+
## 6. Subagent geometry: fresh children, explicit delivery, no forks
|
|
64
|
+
|
|
65
|
+
Inheritance of parent history into children is rare (only dsh's explicit
|
|
66
|
+
`fork`; omp/ours/claude-code/opencode default fresh). Delivery splits between
|
|
67
|
+
block-on-result (simpler, slower), background + never-poll instruction
|
|
68
|
+
(opencode), and receipts with automatic delivery (ours). Depth and capacity
|
|
69
|
+
defaults (8 active / depth 1 dsh) are good calibrations. dsh's `fork` is the
|
|
70
|
+
one mechanism worth studying further but the anti-pattern posture ("no more
|
|
71
|
+
capabilities than you") should stay (arm 03).
|
|
72
|
+
|
|
73
|
+
## 7. Compaction is a strategy ladder, not a single pass
|
|
74
|
+
|
|
75
|
+
Trigger at a formula of the window; prune oversized tool outputs first;
|
|
76
|
+
summarize to a fixed, named template; keep a verbatim tail checkpoint; retry
|
|
77
|
+
down-scaled on provider rejection; log usage at the anchor + estimates beyond.
|
|
78
|
+
The distinctive frontier is opencode's whole-transcript-to-summarizer-for-
|
|
79
|
+
cache-reuse against omp's deterministic, no-LLM archive rung (snapcompact) —
|
|
80
|
+
an SRE-quality safety net no other source has. For this harness: adopt the
|
|
81
|
+
shape and invariants; do not adopt the machinery (arm 05, C1–C3).
|
|
82
|
+
|
|
83
|
+
## 8. Memory products are files with contracts, not databases
|
|
84
|
+
|
|
85
|
+
Where memory is model-facing, it is a file (`MEMORY.md`, our Wiki, harness²'s
|
|
86
|
+
`LongTermMEMORY.md`) with caps, a lesson shape (cue/lesson, never task facts)
|
|
87
|
+
and redaction; where memory is engine-facing (mnemopi's `memory://`), it is an
|
|
88
|
+
optional accelerator, never the source of truth. dsh deliberately ships *no*
|
|
89
|
+
memory package — durability only (JSONL session log + todos + spill). The
|
|
90
|
+
difference between them is one offer: "does the next session need to behave
|
|
91
|
+
differently?" (arm 06, M1).
|
|
92
|
+
|
|
93
|
+
## 9. Measurement has exactly one defensible home inside the harness: after selection, decoupled
|
|
94
|
+
|
|
95
|
+
harness²'s judge reads only the chosen run, never feeds selection, fails to
|
|
96
|
+
None, and is excluded from denominators (`judge.py:15-19,37-40`). omp puts a
|
|
97
|
+
judgment role next to subagents; our family places measurement in Evaluation.
|
|
98
|
+
The adoptable principle is the *decoupling shape*, whatever module ends up
|
|
99
|
+
owning the measurement (arm 10, R4 — decide layering before porting).
|
|
100
|
+
|
|
101
|
+
## 10. Editorial discipline is a competitive feature
|
|
102
|
+
|
|
103
|
+
harness² turns prompt-writing conventions into machine validation: unnamed
|
|
104
|
+
skills discarded, template braces rejected, unshipped scripts rejected,
|
|
105
|
+
always-on prose priced by output budget ("ALWAYS-ON PROSE IS THE EXPENSIVE
|
|
106
|
+
OPTION", `prompts.py:129-146`). omp similarly: prompts never in code, model
|
|
107
|
+
policy never code (KDL tables), one JSON judge-questions file per feature.
|
|
108
|
+
This harness already validates trees; the opportunity is extending
|
|
109
|
+
validation to prompt-behavior contracts spotted above (trigger lines, delta
|
|
110
|
+
protocols, tier coverage) rather than more prose (arms 01, 02, 04, 10).
|
|
111
|
+
|
|
112
|
+
## 11. Anti-patterns known across sources
|
|
113
|
+
|
|
114
|
+
- Instruction discovery with no caps (opencode AGENTS.md walk) — unbounded cost
|
|
115
|
+
drift into sessions.
|
|
116
|
+
- Model-conditional code (`id.includes("claude")`-style) — omp bans it; policy
|
|
117
|
+
belongs in tables (omp KDL; opencode's per-model prompt plugins are the
|
|
118
|
+
hook-flavored equivalent).
|
|
119
|
+
- Any module that can rewrite its own pending tool call (claude-code
|
|
120
|
+
PreToolUse mutation, harness² plugin `tool` registration for *capability
|
|
121
|
+
edits* mid-run needs trust gating we already have for c8).
|
|
122
|
+
- Polling loops from the model (opencode had to say "DO NOT sleep, poll" in
|
|
123
|
+
the spawn tool description; ours prevents it structurally with receipts).
|