@gajae-code/coding-agent 0.14.2 → 0.15.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 +120 -1
- package/dist/types/async/job-manager.d.ts +4 -1
- package/dist/types/autoresearch/dashboard.d.ts +29 -4
- package/dist/types/autoresearch/data-context.d.ts +25 -0
- package/dist/types/autoresearch/git.d.ts +65 -7
- package/dist/types/autoresearch/harness.d.ts +58 -0
- package/dist/types/autoresearch/prompts.d.ts +51 -0
- package/dist/types/autoresearch/runs.d.ts +173 -0
- package/dist/types/autoresearch/types.d.ts +9 -139
- package/dist/types/capability/types.d.ts +20 -0
- package/dist/types/cli/accounts-cli.d.ts +1 -0
- package/dist/types/commands/{rlm.d.ts → autoresearch.d.ts} +2 -4
- package/dist/types/config/autorouting-contract.d.ts +146 -0
- package/dist/types/config/autorouting-generator.d.ts +40 -0
- package/dist/types/config/autorouting-tier-map.d.ts +16844 -0
- package/dist/types/config/autorouting.d.ts +35 -0
- package/dist/types/config/model-discovery-manager.d.ts +8 -1
- package/dist/types/config/model-registry.d.ts +30 -1
- package/dist/types/config/provider-selection-policy.d.ts +23 -0
- package/dist/types/config/settings-schema.d.ts +61 -3
- package/dist/types/config/settings.d.ts +3 -0
- package/dist/types/coordinator/contract.d.ts +1 -1
- package/dist/types/coordinator-mcp/durability.d.ts +29 -0
- package/dist/types/coordinator-mcp/event-webhook.d.ts +50 -0
- package/dist/types/coordinator-mcp/question-state.d.ts +1 -1
- package/dist/types/coordinator-mcp/server.d.ts +14 -0
- package/dist/types/crash/index-store.d.ts +3 -0
- package/dist/types/crash/record-loader.d.ts +2 -0
- package/dist/types/crash/upstream/relay.d.ts +5 -3
- package/dist/types/cursor.d.ts +12 -0
- package/dist/types/defaults/gjc-defaults.d.ts +35 -1
- package/dist/types/defaults/gjc-skills.generated.d.ts +1 -1
- package/dist/types/discovery/helpers.d.ts +1 -1
- package/dist/types/edit/index.d.ts +2 -1
- package/dist/types/eval/py/executor.d.ts +2 -0
- package/dist/types/extensibility/extensions/loader.d.ts +32 -0
- package/dist/types/extensibility/gjc-plugins/types.d.ts +1 -1
- package/dist/types/extensibility/skills.d.ts +2 -0
- package/dist/types/gjc-runtime/autoresearch-runtime.d.ts +194 -0
- package/dist/types/gjc-runtime/gc-runtime.d.ts +1 -1
- package/dist/types/gjc-runtime/psmux-detect.d.ts +1 -1
- package/dist/types/gjc-runtime/python-transcript.d.ts +19 -0
- package/dist/types/gjc-runtime/ralplan-runtime.d.ts +2 -8
- package/dist/types/gjc-runtime/session-layout.d.ts +6 -3
- package/dist/types/gjc-runtime/state-renderer.d.ts +0 -22
- package/dist/types/gjc-runtime/state-schema.d.ts +7 -7
- package/dist/types/gjc-runtime/tmux-common.d.ts +2 -2
- package/dist/types/gjc-runtime/ultragoal-change-set.d.ts +38 -1
- package/dist/types/gjc-runtime/ultragoal-runtime.d.ts +2 -24
- package/dist/types/gjc-runtime/ultragoal-validation-policy.d.ts +73 -0
- package/dist/types/gjc-runtime/workflow-recovery-projection.d.ts +100 -0
- package/dist/types/hooks/skill-keywords.d.ts +1 -1
- package/dist/types/main.d.ts +0 -10
- package/dist/types/modes/acp/acp-agent.d.ts +13 -6
- package/dist/types/modes/components/model-selector.d.ts +14 -0
- package/dist/types/modes/components/skill-hud/render.d.ts +6 -1
- package/dist/types/modes/components/smart-routing-panel.d.ts +82 -0
- package/dist/types/modes/controllers/selector-controller.d.ts +14 -0
- package/dist/types/modes/interactive-mode.d.ts +3 -0
- package/dist/types/modes/types.d.ts +9 -0
- package/dist/types/rlm/artifacts.d.ts +4 -4
- package/dist/types/runtime/optional-runtime-services.d.ts +2 -1
- package/dist/types/runtime/workspace-tree-service.d.ts +5 -1
- package/dist/types/runtime-mcp/config.d.ts +6 -0
- package/dist/types/runtime-mcp/manager.d.ts +10 -0
- package/dist/types/sdk/acp/adapter.d.ts +0 -4
- package/dist/types/sdk/broker/broker.d.ts +1 -1
- package/dist/types/sdk/broker/lifecycle.d.ts +57 -2
- package/dist/types/sdk/broker/session-index.d.ts +15 -0
- package/dist/types/sdk/bus/chat-daemon-control.d.ts +6 -0
- package/dist/types/sdk/bus/chat-daemon-runtime.d.ts +4 -0
- package/dist/types/sdk/bus/index.d.ts +8 -0
- package/dist/types/sdk/bus/kind-aware-reconciliation.d.ts +2 -0
- package/dist/types/sdk/bus/telegram-daemon-contract.d.ts +12 -2
- package/dist/types/sdk/client/client.d.ts +39 -4
- package/dist/types/sdk/host/host.d.ts +1 -0
- package/dist/types/sdk/host/internal-autorouting-state.d.ts +3 -0
- package/dist/types/sdk/host/model-pin.d.ts +29 -0
- package/dist/types/sdk/host/session-runtime.d.ts +2 -1
- package/dist/types/sdk/lifecycle-session.d.ts +13 -0
- package/dist/types/sdk/router/session-router.d.ts +27 -1
- package/dist/types/sdk/session.d.ts +11 -1
- package/dist/types/session/agent-session.d.ts +36 -6
- package/dist/types/session/artifacts.d.ts +16 -1
- package/dist/types/session/internal/managed-session-storage.d.ts +7 -0
- package/dist/types/session/session-manager.d.ts +84 -2
- package/dist/types/session/session-staging-paths.d.ts +3 -0
- package/dist/types/skill-state/canonical-skills.d.ts +1 -1
- package/dist/types/skill-state/workflow-hud.d.ts +12 -21
- package/dist/types/skill-state/workflow-mutation-guard.d.ts +1 -0
- package/dist/types/slash-commands/helpers/autorouting-status.d.ts +8 -0
- package/dist/types/system-prompt.d.ts +23 -0
- package/dist/types/task/executor.d.ts +35 -4
- package/dist/types/task/index.d.ts +17 -3
- package/dist/types/task/receipt.d.ts +3 -1
- package/dist/types/task/types.d.ts +144 -0
- package/dist/types/tools/atomic-file-write.d.ts +72 -0
- package/dist/types/tools/descriptors.d.ts +1 -0
- package/dist/types/tools/index.d.ts +36 -1
- package/dist/types/tools/move-session.d.ts +40 -0
- package/dist/types/tools/python.d.ts +12 -0
- package/dist/types/tools/resource-gc.d.ts +0 -3
- package/dist/types/tools/search.d.ts +8 -1
- package/dist/types/tools/skill.d.ts +9 -4
- package/dist/types/tools/subagent.d.ts +33 -3
- package/dist/types/utils/xml-escape.d.ts +2 -0
- package/dist/types/workflow/workflow-intent-diff.d.ts +2 -2
- package/dist/types/workflow/workflow-intent-report-consumer.d.ts +1 -1
- package/package.json +11 -12
- package/scripts/build-sdk-package-smoke.ts +7 -5
- package/scripts/check-autorouting-tier-map.ts +183 -0
- package/scripts/generate-sdk-operation-inventory.ts +12 -0
- package/scripts/generate-tool-catalog.ts +40 -5
- package/src/async/job-manager.ts +5 -2
- package/src/autoresearch/dashboard.ts +134 -314
- package/src/autoresearch/data-context.ts +35 -0
- package/src/autoresearch/git.ts +186 -26
- package/src/autoresearch/{helpers.ts → harness.ts} +65 -40
- package/src/autoresearch/{prompt-setup.md → prompts/prompt-setup.md} +7 -7
- package/src/autoresearch/prompts/prompt.md +103 -0
- package/src/autoresearch/prompts.ts +126 -0
- package/src/autoresearch/runs.ts +708 -0
- package/src/autoresearch/types.ts +9 -150
- package/src/capability/index.ts +4 -4
- package/src/capability/types.ts +20 -0
- package/src/cli/accounts-cli.ts +21 -5
- package/src/cli/config-cli.ts +25 -1
- package/src/cli/fast-help.ts +1 -2
- package/src/cli/list-models.ts +5 -8
- package/src/cli/setup-cli.ts +8 -0
- package/src/cli.ts +2 -21
- package/src/commands/autoresearch.ts +33 -0
- package/src/commands/coordinator.ts +15 -0
- package/src/commands/launch.ts +2 -4
- package/src/commands/quick-lane.ts +1 -1
- package/src/commands/sdk.ts +24 -0
- package/src/commands/state.ts +1 -1
- package/src/config/autorouting-contract.ts +474 -0
- package/src/config/autorouting-generator.ts +238 -0
- package/src/config/autorouting-tier-map.ts +6108 -0
- package/src/config/autorouting.ts +120 -0
- package/src/config/model-discovery-manager.ts +42 -11
- package/src/config/model-registry.ts +348 -68
- package/src/config/provider-selection-policy.ts +60 -9
- package/src/config/settings-schema.ts +195 -6
- package/src/config/settings.ts +62 -1
- package/src/config.ts +2 -3
- package/src/coordinator/contract.ts +0 -1
- package/src/coordinator-mcp/codex-handoff.ts +68 -42
- package/src/coordinator-mcp/durability.ts +200 -0
- package/src/coordinator-mcp/event-webhook.ts +278 -0
- package/src/coordinator-mcp/question-state.ts +109 -46
- package/src/coordinator-mcp/server.ts +932 -504
- package/src/crash/index-store.ts +126 -22
- package/src/crash/record-loader.ts +7 -0
- package/src/crash/upstream/relay.ts +82 -34
- package/src/cursor.ts +84 -1
- package/src/debug/index.ts +26 -0
- package/src/defaults/gjc/skills/autoresearch/SKILL.md +116 -0
- package/src/defaults/gjc/skills/autoresearch/auto-critic.md +46 -0
- package/src/defaults/gjc/skills/autoresearch/auto-iterate.md +42 -0
- package/src/defaults/gjc/skills/deep-interview/SKILL.md +17 -37
- package/src/defaults/gjc/skills/ralplan/SKILL.md +21 -18
- package/src/defaults/gjc/skills/ultragoal/SKILL.md +6 -17
- package/src/defaults/gjc/skills/ultragoal/ai-slop-cleaner.md +2 -2
- package/src/defaults/gjc-defaults.ts +89 -2
- package/src/defaults/gjc-skills.generated.ts +24 -17
- package/src/discovery/builtin.ts +18 -5
- package/src/discovery/helpers.ts +6 -6
- package/src/edit/index.ts +5 -2
- package/src/eval/py/executor.ts +8 -0
- package/src/extensibility/extensions/loader.ts +135 -13
- package/src/extensibility/extensions/wrapper.ts +1 -2
- package/src/extensibility/gjc-plugins/schema.ts +1 -1
- package/src/extensibility/runtime-skill-discovery.ts +2 -2
- package/src/extensibility/skill-management.ts +2 -3
- package/src/extensibility/skills.ts +16 -8
- package/src/gjc-runtime/autoresearch-runtime.ts +1509 -0
- package/src/gjc-runtime/gc-render.ts +0 -1
- package/src/gjc-runtime/gc-runtime.ts +1 -11
- package/src/gjc-runtime/launch-tmux.ts +3 -3
- package/src/gjc-runtime/psmux-detect.ts +2 -2
- package/src/gjc-runtime/python-transcript.ts +58 -0
- package/src/gjc-runtime/ralplan-runtime.ts +6 -18
- package/src/gjc-runtime/session-layout.ts +18 -7
- package/src/gjc-runtime/session-state-sidecar.ts +58 -9
- package/src/gjc-runtime/state-renderer.ts +0 -38
- package/src/gjc-runtime/state-runtime.ts +43 -22
- package/src/gjc-runtime/state-schema.ts +1 -1
- package/src/gjc-runtime/tmux-common.ts +7 -7
- package/src/gjc-runtime/ultragoal-change-set.ts +232 -11
- package/src/gjc-runtime/ultragoal-runtime.ts +309 -114
- package/src/gjc-runtime/ultragoal-validation-policy.ts +247 -0
- package/src/gjc-runtime/workflow-command-ref.ts +15 -11
- package/src/gjc-runtime/workflow-manifest.generated.json +413 -532
- package/src/gjc-runtime/workflow-manifest.ts +43 -83
- package/src/gjc-runtime/workflow-recovery-projection.ts +616 -0
- package/src/hooks/skill-keywords.ts +3 -3
- package/src/hooks/skill-state.ts +2 -2
- package/src/internal-urls/docs-index.generated.ts +26 -24
- package/src/lsp/index.ts +25 -5
- package/src/main.ts +2 -27
- package/src/modes/acp/acp-agent.ts +200 -75
- package/src/modes/components/model-selector.ts +216 -13
- package/src/modes/components/oauth-selector.ts +5 -5
- package/src/modes/components/skill-hud/render.ts +173 -35
- package/src/modes/components/smart-routing-panel.ts +531 -0
- package/src/modes/components/tool-status-header.ts +6 -3
- package/src/modes/controllers/command-controller.ts +17 -7
- package/src/modes/controllers/input-controller.ts +44 -9
- package/src/modes/controllers/runtime-mcp-command-controller.ts +4 -0
- package/src/modes/controllers/selector-controller.ts +298 -65
- package/src/modes/interactive-mode.ts +8 -1
- package/src/modes/shared/agent-wire/workflow-gate-types.ts +1 -1
- package/src/modes/types.ts +9 -1
- package/src/prompts/agents/planner.md +1 -1
- package/src/prompts/system/system-prompt.md +1 -1
- package/src/prompts/system/volatile-project-context.md +2 -1
- package/src/prompts/tools/move-session.md +15 -0
- package/src/prompts/tools/python.md +12 -0
- package/src/prompts/tools/skill-discovery.md +1 -1
- package/src/prompts/tools/skill.md +2 -2
- package/src/prompts/tools/task-summary.md +1 -0
- package/src/prompts/tools/task.md +6 -0
- package/src/rlm/artifacts.ts +12 -10
- package/src/runtime/optional-runtime-services.ts +3 -2
- package/src/runtime/workspace-tree-service.ts +11 -3
- package/src/runtime-mcp/config.ts +8 -1
- package/src/runtime-mcp/manager.ts +33 -0
- package/src/sdk/acp/adapter.ts +48 -1
- package/src/sdk/broker/broker.ts +30 -2
- package/src/sdk/broker/discovery.ts +217 -2
- package/src/sdk/broker/lifecycle.ts +385 -59
- package/src/sdk/broker/session-index.ts +243 -48
- package/src/sdk/broker/transport.ts +1 -0
- package/src/sdk/bus/chat-daemon-control.ts +8 -2
- package/src/sdk/bus/chat-daemon-runtime.ts +5 -0
- package/src/sdk/bus/index.ts +208 -11
- package/src/sdk/bus/kind-aware-reconciliation.ts +16 -0
- package/src/sdk/bus/reconciliation-store.ts +27 -5
- package/src/sdk/bus/telegram-daemon-contract.ts +12 -2
- package/src/sdk/client/client.ts +204 -22
- package/src/sdk/host/host.ts +16 -0
- package/src/sdk/host/internal-autorouting-state.ts +13 -0
- package/src/sdk/host/model-pin.ts +101 -0
- package/src/sdk/host/reverse-leases.ts +2 -1
- package/src/sdk/host/session-runtime.test.ts +224 -1
- package/src/sdk/host/session-runtime.ts +125 -37
- package/src/sdk/lifecycle/service.ts +3 -1
- package/src/sdk/lifecycle-session.ts +42 -1
- package/src/sdk/protocol/operation-inventory.generated.json +66 -0
- package/src/sdk/router/session-router.ts +375 -36
- package/src/sdk/session.ts +547 -47
- package/src/session/account-inventory.ts +1 -1
- package/src/session/agent-session.ts +765 -189
- package/src/session/artifacts.ts +234 -4
- package/src/session/internal/managed-session-storage.ts +91 -4
- package/src/session/provider-safety-stop-hint.ts +3 -2
- package/src/session/session-manager.ts +775 -16
- package/src/session/session-staging-paths.ts +8 -0
- package/src/setup/hermes/templates/operator-instructions.v1.md +0 -1
- package/src/setup/host-plugin-setup.ts +2 -2
- package/src/skill-state/active-state.ts +2 -2
- package/src/skill-state/canonical-skills.ts +1 -1
- package/src/skill-state/initial-phase.ts +1 -1
- package/src/skill-state/workflow-hud.ts +41 -41
- package/src/skill-state/workflow-mutation-guard.ts +26 -7
- package/src/slash-commands/builtin-registry.ts +77 -0
- package/src/slash-commands/helpers/autorouting-status.ts +55 -0
- package/src/system-prompt.ts +102 -5
- package/src/task/discovery.ts +2 -3
- package/src/task/executor.ts +617 -43
- package/src/task/index.ts +262 -15
- package/src/task/receipt.ts +30 -0
- package/src/task/render.ts +11 -1
- package/src/task/types.ts +316 -0
- package/src/tools/atomic-file-write.ts +594 -0
- package/src/tools/bisect.ts +3 -2
- package/src/tools/descriptors.test.ts +3 -0
- package/src/tools/descriptors.ts +24 -0
- package/src/tools/image-gen.ts +5 -1
- package/src/tools/index.ts +62 -5
- package/src/tools/move-session.ts +107 -0
- package/src/tools/python.ts +205 -0
- package/src/tools/read.ts +88 -15
- package/src/tools/renderers.ts +2 -0
- package/src/tools/resource-gc.ts +8 -177
- package/src/tools/search.ts +30 -6
- package/src/tools/skill-discovery.ts +1 -0
- package/src/tools/skill.ts +37 -7
- package/src/tools/subagent-render.ts +119 -13
- package/src/tools/subagent.ts +91 -74
- package/src/tools/tool-catalog.generated.ts +64 -2
- package/src/tools/write.ts +16 -12
- package/src/utils/xml-escape.ts +14 -0
- package/src/web/search/providers/codex.ts +2 -2
- package/src/workflow/workflow-intent-diff.ts +13 -12
- package/src/workflow/workflow-intent-report-consumer.ts +6 -6
- package/dist/types/autoresearch/helpers.d.ts +0 -24
- package/dist/types/autoresearch/index.d.ts +0 -2
- package/dist/types/autoresearch/state.d.ts +0 -17
- package/dist/types/autoresearch/storage.d.ts +0 -142
- package/dist/types/autoresearch/tools/init-experiment.d.ts +0 -31
- package/dist/types/autoresearch/tools/log-experiment.d.ts +0 -23
- package/dist/types/autoresearch/tools/run-experiment.d.ts +0 -8
- package/dist/types/autoresearch/tools/update-notes.d.ts +0 -12
- package/dist/types/commands/team.d.ts +0 -24
- package/dist/types/gjc-runtime/team-gc.d.ts +0 -7
- package/dist/types/gjc-runtime/team-launch.d.ts +0 -61
- package/dist/types/gjc-runtime/team-notify.d.ts +0 -45
- package/dist/types/gjc-runtime/team-runtime.d.ts +0 -336
- package/dist/types/gjc-runtime/team-store.d.ts +0 -168
- package/dist/types/gjc-runtime/team-worker-heartbeat.d.ts +0 -43
- package/dist/types/gjc-runtime/team-worker-memory-guard.d.ts +0 -92
- package/dist/types/gjc-runtime/team-workers.d.ts +0 -83
- package/dist/types/rlm/index.d.ts +0 -47
- package/dist/types/rlm/preset.d.ts +0 -23
- package/dist/types/rlm/python-tool.d.ts +0 -16
- package/src/autoresearch/command-resume.md +0 -14
- package/src/autoresearch/index.ts +0 -536
- package/src/autoresearch/prompt.md +0 -103
- package/src/autoresearch/resume-message.md +0 -10
- package/src/autoresearch/state.ts +0 -273
- package/src/autoresearch/storage.ts +0 -699
- package/src/autoresearch/tools/init-experiment.ts +0 -272
- package/src/autoresearch/tools/log-experiment.ts +0 -524
- package/src/autoresearch/tools/run-experiment.ts +0 -475
- package/src/autoresearch/tools/update-notes.ts +0 -109
- package/src/commands/rlm.ts +0 -19
- package/src/commands/team.ts +0 -238
- package/src/defaults/gjc/skills/deep-interview/auto-research-greenfield.md +0 -42
- package/src/defaults/gjc/skills/team/SKILL.md +0 -467
- package/src/gjc-runtime/team-gc.ts +0 -49
- package/src/gjc-runtime/team-launch.ts +0 -404
- package/src/gjc-runtime/team-notify.ts +0 -326
- package/src/gjc-runtime/team-runtime.ts +0 -5923
- package/src/gjc-runtime/team-store.ts +0 -878
- package/src/gjc-runtime/team-worker-heartbeat.ts +0 -149
- package/src/gjc-runtime/team-worker-memory-guard.ts +0 -363
- package/src/gjc-runtime/team-workers.ts +0 -1123
- package/src/prompts/system/rlm-report-command.md +0 -1
- package/src/prompts/system/rlm-research.md +0 -23
- package/src/rlm/index.ts +0 -365
- package/src/rlm/preset.ts +0 -76
- package/src/rlm/python-tool.ts +0 -68
|
@@ -0,0 +1,247 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Deterministic Ultragoal validation applicability policy (#4560).
|
|
3
|
+
*
|
|
4
|
+
* The boundary cohort (`cleaner || architect || QA`) and the terminal critic
|
|
5
|
+
* are expensive LLM lanes. They were introduced as unconditional per-boundary
|
|
6
|
+
* ceremony, which inflates token cost and failure surface on low-risk work and
|
|
7
|
+
* makes compaction more likely during long runs (#3473/#3474 moved review from
|
|
8
|
+
* per-subgoal to per-boundary; this policy makes the boundary lanes
|
|
9
|
+
* risk-proportional without removing them for risky work).
|
|
10
|
+
*
|
|
11
|
+
* Selection is runtime-authoritative and deterministic from durable facts
|
|
12
|
+
* (change set, plan shape, ledger receipts) — never free-form model prose.
|
|
13
|
+
* It fails closed: any condition that cannot be proven cheap is treated as
|
|
14
|
+
* high-risk and keeps the full heavyweight cohort. The precedent is
|
|
15
|
+
* `requiresComputerRedTeamSuite`, whose applicability the runtime derives from
|
|
16
|
+
* the computed change set and refuses to let the model self-exempt.
|
|
17
|
+
*/
|
|
18
|
+
import {
|
|
19
|
+
categorizeComputerChangePath,
|
|
20
|
+
normalizeRepoPath,
|
|
21
|
+
type UltragoalChangeSet,
|
|
22
|
+
type UltragoalChangeSetPath,
|
|
23
|
+
} from "./ultragoal-change-set";
|
|
24
|
+
|
|
25
|
+
export type UltragoalValidationLane = "cleaner" | "architect" | "qa" | "terminal-critic";
|
|
26
|
+
|
|
27
|
+
export interface UltragoalValidationApplicabilityInput {
|
|
28
|
+
/** Trusted computed change set for the boundary (checkpoint path). */
|
|
29
|
+
changeSet?: UltragoalChangeSet;
|
|
30
|
+
/**
|
|
31
|
+
* Durable aggregate shape: the number of goals the plan actually requires.
|
|
32
|
+
* This is a property of the plan, not of how far it has progressed, so the
|
|
33
|
+
* multi-goal risk signal cannot evaporate at the final goal of a multi-goal
|
|
34
|
+
* run — which is precisely the aggregate boundary where risk is highest.
|
|
35
|
+
*/
|
|
36
|
+
requiredGoals?: number;
|
|
37
|
+
/** Open review blockers exist (review_blocked goals). */
|
|
38
|
+
hasOpenReviewBlockers?: boolean;
|
|
39
|
+
/** Newest joined cohort sourceHash recorded in the ledger. */
|
|
40
|
+
latestCohortSourceHash?: string;
|
|
41
|
+
/** Current frozen source hash the boundary would review. */
|
|
42
|
+
currentSourceHash?: string;
|
|
43
|
+
/** Runtime-computed digest of the authoritative current source basis. */
|
|
44
|
+
authoritativeSourceHash?: string;
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
export interface UltragoalValidationApplicability {
|
|
48
|
+
/** Lane -> applicability decision with the durable facts that forced it. */
|
|
49
|
+
lanes: Record<UltragoalValidationLane, { applicable: boolean; reasons: string[] }>;
|
|
50
|
+
/** True only when every heavyweight lane is applicable (full cohort). */
|
|
51
|
+
heavyweight: boolean;
|
|
52
|
+
/** Risk classification driving the selection. */
|
|
53
|
+
riskClass: "low" | "high";
|
|
54
|
+
/** True when open review blockers make terminal evidence uncertain. */
|
|
55
|
+
hasOpenReviewBlockers: boolean;
|
|
56
|
+
/** True when an unchanged immutable source basis permits evidence reuse. */
|
|
57
|
+
basisUnchanged: boolean;
|
|
58
|
+
/** Human- and machine-inspectable selection basis, recorded in diagnostics. */
|
|
59
|
+
selection: string[];
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
export interface UltragoalValidationLaneSelection {
|
|
63
|
+
riskClass: "low" | "high";
|
|
64
|
+
reasons: string[];
|
|
65
|
+
omittedLanes: UltragoalValidationLane[];
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
/**
|
|
69
|
+
* Substring markers for security-sensitive surfaces. A hand-maintained prefix
|
|
70
|
+
* list cannot be fail-closed: any new credential/auth file added anywhere in
|
|
71
|
+
* the workspace would silently grade as low-risk until someone remembered to
|
|
72
|
+
* extend the list. These markers classify by what a path *is* rather than
|
|
73
|
+
* where it happens to live.
|
|
74
|
+
*/
|
|
75
|
+
const SECURITY_SENSITIVE_PATH_MARKERS = [
|
|
76
|
+
"auth-storage",
|
|
77
|
+
"auth-broker",
|
|
78
|
+
"auth-config",
|
|
79
|
+
"oauth",
|
|
80
|
+
"credential",
|
|
81
|
+
"secure-token",
|
|
82
|
+
"api-key",
|
|
83
|
+
"apikey",
|
|
84
|
+
"secret",
|
|
85
|
+
"token-store",
|
|
86
|
+
"keychain",
|
|
87
|
+
"permission",
|
|
88
|
+
] as const;
|
|
89
|
+
|
|
90
|
+
const GENERIC_SECURITY_PATH_PATTERN =
|
|
91
|
+
/(^|\/)(auth|authentication|authorization|security|permission|permissions)(?:[._-]|\/|$)/i;
|
|
92
|
+
|
|
93
|
+
const HIGH_RISK_PATH_PREFIXES = [
|
|
94
|
+
// Security/auth surfaces
|
|
95
|
+
"packages/coding-agent/src/session/auth-storage.ts",
|
|
96
|
+
"packages/coding-agent/src/session/secure-token-file.ts",
|
|
97
|
+
"packages/coding-agent/src/session/startup-auth-config.ts",
|
|
98
|
+
"packages/coding-agent/src/runtime-api-key.ts",
|
|
99
|
+
"packages/coding-agent/src/runtime-credential-selector.ts",
|
|
100
|
+
"packages/coding-agent/src/secrets",
|
|
101
|
+
"packages/ai/src/auth-storage.ts",
|
|
102
|
+
"packages/natives",
|
|
103
|
+
"packages/coding-agent/src/runtime-mcp/oauth-flow.ts",
|
|
104
|
+
"packages/coding-agent/src/commands/auth-broker.ts",
|
|
105
|
+
"crates/pi-natives/src",
|
|
106
|
+
"crates/git-daemon",
|
|
107
|
+
// Workflow enforcement surfaces must never grade their own weakening as low-risk.
|
|
108
|
+
"packages/coding-agent/src/gjc-runtime",
|
|
109
|
+
"packages/coding-agent/src/session/agent-session.ts",
|
|
110
|
+
// Public contract / SDK surfaces
|
|
111
|
+
"packages/coding-agent/src/sdk",
|
|
112
|
+
"packages/coding-agent/src/extensibility",
|
|
113
|
+
"packages/coding-agent/src/modes/shared/agent-wire",
|
|
114
|
+
// Shared behavior registries (mirrors the computer-suite conservative rule)
|
|
115
|
+
"packages/coding-agent/src/tools/index.ts",
|
|
116
|
+
"packages/coding-agent/src/tools/renderers.ts",
|
|
117
|
+
"packages/coding-agent/src/config/settings-schema.ts",
|
|
118
|
+
] as const;
|
|
119
|
+
|
|
120
|
+
const MIGRATION_PATH_PREFIXES = [
|
|
121
|
+
"packages/coding-agent/src/gjc-runtime/state-migrations.ts",
|
|
122
|
+
"packages/coding-agent/src/session/session-manager.ts",
|
|
123
|
+
"packages/coding-agent/src/session/session-manager-internal.ts",
|
|
124
|
+
"scripts",
|
|
125
|
+
] as const;
|
|
126
|
+
|
|
127
|
+
function changePaths(changeSet: UltragoalChangeSet | undefined): UltragoalChangeSetPath[] {
|
|
128
|
+
return changeSet?.trusted ? changeSet.paths : [];
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
export function isHighRiskChangePath(row: UltragoalChangeSetPath): boolean {
|
|
132
|
+
const candidates = [row.path, row.oldPath]
|
|
133
|
+
.filter((value): value is string => typeof value === "string")
|
|
134
|
+
.map(normalizeRepoPath);
|
|
135
|
+
for (const candidate of candidates) {
|
|
136
|
+
if (GENERIC_SECURITY_PATH_PATTERN.test(candidate)) return true;
|
|
137
|
+
if (/^packages\/natives(?:-|\/|$)/.test(candidate)) return true;
|
|
138
|
+
for (const prefix of HIGH_RISK_PATH_PREFIXES) {
|
|
139
|
+
if (candidate === prefix || candidate.startsWith(`${prefix}/`)) return true;
|
|
140
|
+
}
|
|
141
|
+
const fileName = candidate.slice(candidate.lastIndexOf("/") + 1).toLowerCase();
|
|
142
|
+
if (row.category === "generated-binding") return true;
|
|
143
|
+
if (/(auth|oauth|security|credential|token|secret|permission)/i.test(fileName)) return true;
|
|
144
|
+
for (const marker of SECURITY_SENSITIVE_PATH_MARKERS) {
|
|
145
|
+
if (fileName.includes(marker)) return true;
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
return false;
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
export function validationLaneSelectionFor(
|
|
152
|
+
applicability: UltragoalValidationApplicability,
|
|
153
|
+
): UltragoalValidationLaneSelection {
|
|
154
|
+
return {
|
|
155
|
+
riskClass: applicability.riskClass,
|
|
156
|
+
reasons: [...applicability.selection],
|
|
157
|
+
omittedLanes: (Object.keys(applicability.lanes) as UltragoalValidationLane[])
|
|
158
|
+
.filter(lane => !applicability.lanes[lane].applicable)
|
|
159
|
+
.sort(),
|
|
160
|
+
};
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
export function isMigrationChangePath(row: UltragoalChangeSetPath): boolean {
|
|
164
|
+
const candidates = [row.path, row.oldPath]
|
|
165
|
+
.filter((value): value is string => typeof value === "string")
|
|
166
|
+
.map(normalizeRepoPath);
|
|
167
|
+
for (const candidate of candidates) {
|
|
168
|
+
for (const prefix of MIGRATION_PATH_PREFIXES) {
|
|
169
|
+
if (candidate === prefix || candidate.startsWith(`${prefix}/`)) return true;
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
return false;
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
function isComputerControlSurfaceChangePath(row: UltragoalChangeSetPath): boolean {
|
|
176
|
+
const candidates = [row.path, row.oldPath].filter((value): value is string => typeof value === "string");
|
|
177
|
+
return candidates.some(candidate => {
|
|
178
|
+
const category = categorizeComputerChangePath(candidate);
|
|
179
|
+
return category === "code" || category === "tool" || category === "settings-registry";
|
|
180
|
+
});
|
|
181
|
+
}
|
|
182
|
+
|
|
183
|
+
/**
|
|
184
|
+
* Compute the deterministic validation applicability for a boundary.
|
|
185
|
+
*
|
|
186
|
+
* Low-risk eligibility (the only case where redundant lanes may be omitted):
|
|
187
|
+
* trusted change set, single outstanding goal, no open review blockers, no
|
|
188
|
+
* high-risk/migration/computer/public-contract path, complete capture.
|
|
189
|
+
* Everything else — including a missing/untrusted change set — keeps the full
|
|
190
|
+
* heavyweight cohort exactly as today.
|
|
191
|
+
*/
|
|
192
|
+
export function resolveUltragoalValidationApplicability(
|
|
193
|
+
input: UltragoalValidationApplicabilityInput,
|
|
194
|
+
): UltragoalValidationApplicability {
|
|
195
|
+
const selection: string[] = [];
|
|
196
|
+
const paths = changePaths(input.changeSet);
|
|
197
|
+
const highRiskPaths = paths.filter(isHighRiskChangePath);
|
|
198
|
+
const migrationPaths = paths.filter(isMigrationChangePath);
|
|
199
|
+
const computerPaths = paths.filter(isComputerControlSurfaceChangePath);
|
|
200
|
+
// Derived from the durable aggregate shape, never from remaining progress:
|
|
201
|
+
// a two-goal plan stays multi-goal on its final goal.
|
|
202
|
+
const multiGoal = (input.requiredGoals ?? 0) > 1;
|
|
203
|
+
const reasons: string[] = [];
|
|
204
|
+
if (!input.changeSet?.trusted) reasons.push("change-set-untrusted-or-missing");
|
|
205
|
+
if (input.changeSet?.captureIncomplete) reasons.push("capture-incomplete");
|
|
206
|
+
if (!input.authoritativeSourceHash) reasons.push("source-basis-unverified");
|
|
207
|
+
if (multiGoal) reasons.push("multiple-outstanding-goals");
|
|
208
|
+
if (input.hasOpenReviewBlockers) reasons.push("open-review-blockers");
|
|
209
|
+
if (highRiskPaths.length > 0) reasons.push("high-risk-paths");
|
|
210
|
+
if (migrationPaths.length > 0) reasons.push("migration-paths");
|
|
211
|
+
if (computerPaths.length > 0) reasons.push("computer-control-surface");
|
|
212
|
+
// Low-risk omission requires proof that the plan is genuinely single-goal.
|
|
213
|
+
if (input.requiredGoals === undefined) reasons.push("progress-unknown");
|
|
214
|
+
const highRisk = reasons.length > 0;
|
|
215
|
+
const heavyweight = highRisk;
|
|
216
|
+
const lane = (applicable: boolean, why: string[]): { applicable: boolean; reasons: string[] } => ({
|
|
217
|
+
applicable,
|
|
218
|
+
reasons: why,
|
|
219
|
+
});
|
|
220
|
+
// Unchanged-basis reuse: only when a prior joined cohort verified the exact
|
|
221
|
+
// frozen source hash this boundary would review, and no blockers reopened.
|
|
222
|
+
const basisUnchanged =
|
|
223
|
+
Boolean(input.latestCohortSourceHash) &&
|
|
224
|
+
Boolean(input.authoritativeSourceHash) &&
|
|
225
|
+
input.currentSourceHash === input.latestCohortSourceHash &&
|
|
226
|
+
input.currentSourceHash === input.authoritativeSourceHash &&
|
|
227
|
+
!input.hasOpenReviewBlockers;
|
|
228
|
+
const lanes: UltragoalValidationApplicability["lanes"] = {
|
|
229
|
+
cleaner: lane(heavyweight, heavyweight ? reasons : ["low-risk-single-goal"]),
|
|
230
|
+
architect: lane(heavyweight, heavyweight ? reasons : ["low-risk-single-goal"]),
|
|
231
|
+
// QA/targeted verification always applies at a boundary; risk selection
|
|
232
|
+
// never removes verification, only redundant review ceremony.
|
|
233
|
+
qa: lane(true, ["mandatory-verification"]),
|
|
234
|
+
"terminal-critic": lane(heavyweight, heavyweight ? reasons : ["low-risk-single-goal"]),
|
|
235
|
+
};
|
|
236
|
+
selection.push(`riskClass=${highRisk ? "high" : "low"}`);
|
|
237
|
+
selection.push(`basisUnchanged=${basisUnchanged}`);
|
|
238
|
+
if (reasons.length > 0) selection.push(`heavyweightReasons=${reasons.join(",")}`);
|
|
239
|
+
return {
|
|
240
|
+
lanes,
|
|
241
|
+
heavyweight,
|
|
242
|
+
riskClass: highRisk ? "high" : "low",
|
|
243
|
+
hasOpenReviewBlockers: Boolean(input.hasOpenReviewBlockers),
|
|
244
|
+
basisUnchanged,
|
|
245
|
+
selection,
|
|
246
|
+
};
|
|
247
|
+
}
|
|
@@ -118,7 +118,7 @@ export const WORKFLOW_COMMAND_REF_BLOCKS: readonly CommandRefBlock[] = [
|
|
|
118
118
|
},
|
|
119
119
|
],
|
|
120
120
|
notes: [
|
|
121
|
-
"Before invoking `/skill:ralplan`, `/skill:
|
|
121
|
+
"Before invoking `/skill:ralplan`, `/skill:autoresearch`, or `/skill:ultragoal`, persist the final spec and mark deep-interview ready for handoff.",
|
|
122
122
|
],
|
|
123
123
|
},
|
|
124
124
|
{
|
|
@@ -127,7 +127,7 @@ export const WORKFLOW_COMMAND_REF_BLOCKS: readonly CommandRefBlock[] = [
|
|
|
127
127
|
sourcePath: skillPath("ralplan"),
|
|
128
128
|
renderOrder: 10,
|
|
129
129
|
markers: { start: "<!-- gjc:cmdref:start state -->", end: "<!-- gjc:cmdref:end state -->" },
|
|
130
|
-
commands: [stateWrite("ralplan"), stateHandoff("ralplan", ["
|
|
130
|
+
commands: [stateWrite("ralplan"), stateHandoff("ralplan", ["autoresearch", "ultragoal"])],
|
|
131
131
|
examples: [
|
|
132
132
|
{
|
|
133
133
|
label: "handoff state write",
|
|
@@ -135,10 +135,14 @@ export const WORKFLOW_COMMAND_REF_BLOCKS: readonly CommandRefBlock[] = [
|
|
|
135
135
|
},
|
|
136
136
|
],
|
|
137
137
|
aliasesAndBridges: [
|
|
138
|
-
{
|
|
138
|
+
{
|
|
139
|
+
from: "ralplan",
|
|
140
|
+
to: "autoresearch|ultragoal",
|
|
141
|
+
rendered: "gjc state ralplan handoff --to <autoresearch|ultragoal> --json",
|
|
142
|
+
},
|
|
139
143
|
],
|
|
140
144
|
notes: [
|
|
141
|
-
"Before invoking `/skill:
|
|
145
|
+
"Before invoking `/skill:autoresearch` or `/skill:ultragoal`, mark ralplan ready for handoff so the skill tool's chain guard permits the transition.",
|
|
142
146
|
],
|
|
143
147
|
},
|
|
144
148
|
{
|
|
@@ -166,27 +170,27 @@ export const WORKFLOW_COMMAND_REF_BLOCKS: readonly CommandRefBlock[] = [
|
|
|
166
170
|
],
|
|
167
171
|
},
|
|
168
172
|
{
|
|
169
|
-
skill: "
|
|
173
|
+
skill: "autoresearch",
|
|
170
174
|
blockId: "state",
|
|
171
|
-
sourcePath: skillPath("
|
|
175
|
+
sourcePath: skillPath("autoresearch"),
|
|
172
176
|
renderOrder: 10,
|
|
173
177
|
markers: { start: "<!-- gjc:cmdref:start state -->", end: "<!-- gjc:cmdref:end state -->" },
|
|
174
|
-
commands: [stateWrite("
|
|
178
|
+
commands: [stateWrite("autoresearch"), stateHandoff("autoresearch", ["ralplan", "deep-interview", "ultragoal"])],
|
|
175
179
|
examples: [
|
|
176
180
|
{
|
|
177
181
|
label: "handoff state write",
|
|
178
|
-
bytes: '```\ngjc state
|
|
182
|
+
bytes: '```\ngjc state autoresearch write --input \'{"current_phase":"handoff"}\' --json\n```',
|
|
179
183
|
},
|
|
180
184
|
],
|
|
181
185
|
aliasesAndBridges: [
|
|
182
186
|
{
|
|
183
|
-
from: "
|
|
187
|
+
from: "autoresearch",
|
|
184
188
|
to: "ralplan|deep-interview|ultragoal",
|
|
185
|
-
rendered: "gjc state
|
|
189
|
+
rendered: "gjc state autoresearch handoff --to <ralplan|deep-interview|ultragoal> --json",
|
|
186
190
|
},
|
|
187
191
|
],
|
|
188
192
|
notes: [
|
|
189
|
-
"When the
|
|
193
|
+
"When the research mission concludes (verdict issued) OR the user requests return to planning/persistence, mark autoresearch ready for handoff.",
|
|
190
194
|
],
|
|
191
195
|
},
|
|
192
196
|
] as const;
|