@gajae-code/coding-agent 0.6.4 → 0.7.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 +51 -0
- package/dist/types/async/job-manager.d.ts +3 -1
- package/dist/types/cli/daemon-cli.d.ts +25 -0
- package/dist/types/cli/migrate-cli.d.ts +20 -0
- package/dist/types/cli/notify-cli.d.ts +23 -0
- package/dist/types/cli/setup-cli.d.ts +20 -1
- package/dist/types/commands/daemon.d.ts +41 -0
- package/dist/types/commands/migrate.d.ts +33 -0
- package/dist/types/commands/notify.d.ts +41 -0
- package/dist/types/config/keybindings.d.ts +4 -0
- package/dist/types/config/model-profile-activation.d.ts +12 -0
- package/dist/types/config/model-profiles.d.ts +2 -1
- package/dist/types/config/model-registry.d.ts +3 -3
- package/dist/types/config/models-config-schema.d.ts +5 -0
- package/dist/types/config/settings-schema.d.ts +38 -0
- package/dist/types/coordinator/contract.d.ts +1 -1
- package/dist/types/daemon/builtin.d.ts +20 -0
- package/dist/types/daemon/control-types.d.ts +57 -0
- package/dist/types/daemon/runtime.d.ts +25 -0
- package/dist/types/extensibility/extensions/types.d.ts +8 -0
- package/dist/types/gjc-runtime/deep-interview-recorder.d.ts +2 -0
- package/dist/types/gjc-runtime/deep-interview-runtime.d.ts +2 -2
- package/dist/types/gjc-runtime/goal-mode-request.d.ts +1 -1
- package/dist/types/gjc-runtime/session-layout.d.ts +59 -0
- package/dist/types/gjc-runtime/session-resolution.d.ts +47 -0
- package/dist/types/gjc-runtime/state-graph.d.ts +1 -1
- package/dist/types/gjc-runtime/state-runtime.d.ts +5 -4
- package/dist/types/gjc-runtime/state-schema.d.ts +2 -0
- package/dist/types/gjc-runtime/state-writer.d.ts +38 -7
- package/dist/types/gjc-runtime/ultragoal-guard.d.ts +15 -0
- package/dist/types/gjc-runtime/ultragoal-runtime.d.ts +21 -4
- package/dist/types/gjc-runtime/workflow-command-ref.d.ts +1 -1
- package/dist/types/gjc-runtime/workflow-manifest.d.ts +1 -1
- package/dist/types/harness-control-plane/storage.d.ts +2 -1
- package/dist/types/hooks/skill-state.d.ts +12 -4
- package/dist/types/migrate/action-planner.d.ts +11 -0
- package/dist/types/migrate/adapters/claude-code.d.ts +2 -0
- package/dist/types/migrate/adapters/codex.d.ts +5 -0
- package/dist/types/migrate/adapters/index.d.ts +45 -0
- package/dist/types/migrate/adapters/opencode.d.ts +2 -0
- package/dist/types/migrate/executor.d.ts +2 -0
- package/dist/types/migrate/mcp-mapper.d.ts +20 -0
- package/dist/types/migrate/report.d.ts +18 -0
- package/dist/types/migrate/skill-normalizer.d.ts +27 -0
- package/dist/types/migrate/types.d.ts +126 -0
- package/dist/types/modes/components/custom-editor.d.ts +1 -1
- package/dist/types/modes/components/oauth-selector.d.ts +2 -0
- package/dist/types/modes/controllers/selector-controller.d.ts +2 -2
- package/dist/types/modes/interactive-mode.d.ts +1 -1
- package/dist/types/modes/shared/agent-wire/unattended-audit.d.ts +1 -1
- package/dist/types/modes/shared/agent-wire/unattended-session.d.ts +10 -0
- package/dist/types/modes/types.d.ts +7 -1
- package/dist/types/notifications/config-commands.d.ts +26 -0
- package/dist/types/notifications/config.d.ts +61 -0
- package/dist/types/notifications/helpers.d.ts +55 -0
- package/dist/types/notifications/html-format.d.ts +62 -0
- package/dist/types/notifications/index.d.ts +28 -0
- package/dist/types/notifications/rate-limit-pool.d.ts +93 -0
- package/dist/types/notifications/telegram-cli.d.ts +19 -0
- package/dist/types/notifications/telegram-daemon-cli.d.ts +11 -0
- package/dist/types/notifications/telegram-daemon-control.d.ts +56 -0
- package/dist/types/notifications/telegram-daemon.d.ts +276 -0
- package/dist/types/notifications/telegram-reference.d.ts +111 -0
- package/dist/types/notifications/threaded-inbound.d.ts +58 -0
- package/dist/types/notifications/threaded-render.d.ts +66 -0
- package/dist/types/notifications/topic-registry.d.ts +67 -0
- package/dist/types/research-plan/index.d.ts +1 -0
- package/dist/types/research-plan/ledger.d.ts +33 -0
- package/dist/types/rlm/artifacts.d.ts +1 -1
- package/dist/types/rlm/index.d.ts +12 -0
- package/dist/types/runtime-mcp/config-writer.d.ts +26 -0
- package/dist/types/session/agent-session.d.ts +39 -2
- package/dist/types/session/auth-storage.d.ts +1 -1
- package/dist/types/setup/credential-auto-import.d.ts +63 -0
- package/dist/types/setup/credential-import.d.ts +3 -0
- package/dist/types/setup/host-plugin-setup.d.ts +39 -0
- package/dist/types/skill-state/active-state.d.ts +6 -11
- package/dist/types/skill-state/canonical-skills.d.ts +3 -0
- package/dist/types/skill-state/workflow-hud.d.ts +2 -0
- package/dist/types/task/spawn-gate.d.ts +1 -10
- package/dist/types/tools/ask-answer-registry.d.ts +13 -0
- package/dist/types/tools/index.d.ts +18 -0
- package/dist/types/tools/subagent.d.ts +3 -0
- package/package.json +7 -7
- package/scripts/build-binary.ts +3 -0
- package/src/async/job-manager.ts +5 -1
- package/src/cli/daemon-cli.ts +122 -0
- package/src/cli/migrate-cli.ts +106 -0
- package/src/cli/notify-cli.ts +274 -0
- package/src/cli/setup-cli.ts +173 -84
- package/src/cli.ts +3 -0
- package/src/commands/daemon.ts +47 -0
- package/src/commands/deep-interview.ts +2 -2
- package/src/commands/migrate.ts +46 -0
- package/src/commands/notify.ts +61 -0
- package/src/commands/setup.ts +11 -1
- package/src/commands/state.ts +2 -1
- package/src/commands/team.ts +7 -3
- package/src/config/model-profile-activation.ts +74 -5
- package/src/config/model-profiles.ts +7 -4
- package/src/config/model-registry.ts +6 -3
- package/src/config/models-config-schema.ts +1 -1
- package/src/config/settings-schema.ts +29 -0
- package/src/coordinator/contract.ts +3 -0
- package/src/coordinator-mcp/policy.ts +10 -2
- package/src/coordinator-mcp/server.ts +270 -1
- package/src/daemon/builtin.ts +46 -0
- package/src/daemon/control-types.ts +65 -0
- package/src/daemon/runtime.ts +51 -0
- package/src/defaults/gjc/extensions/grok-cli-vendor/biome.json +0 -1
- package/src/defaults/gjc/skills/deep-interview/SKILL.md +28 -24
- package/src/defaults/gjc/skills/ralplan/SKILL.md +8 -4
- package/src/defaults/gjc/skills/team/SKILL.md +51 -47
- package/src/defaults/gjc/skills/ultragoal/SKILL.md +33 -13
- package/src/extensibility/custom-commands/loader.ts +0 -7
- package/src/extensibility/extensions/runner.ts +4 -0
- package/src/extensibility/extensions/types.ts +8 -0
- package/src/extensibility/gjc-plugins/injection.ts +23 -4
- package/src/extensibility/gjc-plugins/state.ts +16 -1
- package/src/gjc-runtime/deep-interview-recorder.ts +51 -18
- package/src/gjc-runtime/deep-interview-runtime.ts +49 -23
- package/src/gjc-runtime/goal-mode-request.ts +26 -11
- package/src/gjc-runtime/launch-tmux.ts +6 -1
- package/src/gjc-runtime/ralplan-runtime.ts +79 -50
- package/src/gjc-runtime/session-layout.ts +180 -0
- package/src/gjc-runtime/session-resolution.ts +217 -0
- package/src/gjc-runtime/state-graph.ts +1 -2
- package/src/gjc-runtime/state-migrations.ts +1 -0
- package/src/gjc-runtime/state-runtime.ts +247 -124
- package/src/gjc-runtime/state-schema.ts +2 -0
- package/src/gjc-runtime/state-writer.ts +289 -41
- package/src/gjc-runtime/team-runtime.ts +43 -19
- package/src/gjc-runtime/tmux-sessions.ts +7 -1
- package/src/gjc-runtime/ultragoal-guard.ts +102 -4
- package/src/gjc-runtime/ultragoal-runtime.ts +226 -60
- package/src/gjc-runtime/workflow-command-ref.ts +1 -2
- package/src/gjc-runtime/workflow-manifest.generated.json +27 -2
- package/src/gjc-runtime/workflow-manifest.ts +12 -3
- package/src/goals/tools/goal-tool.ts +11 -2
- package/src/harness-control-plane/storage.ts +14 -4
- package/src/hooks/native-skill-hook.ts +38 -12
- package/src/hooks/skill-state.ts +178 -83
- package/src/internal-urls/docs-index.generated.ts +9 -6
- package/src/main.ts +30 -0
- package/src/migrate/action-planner.ts +318 -0
- package/src/migrate/adapters/claude-code.ts +39 -0
- package/src/migrate/adapters/codex.ts +70 -0
- package/src/migrate/adapters/index.ts +277 -0
- package/src/migrate/adapters/opencode.ts +52 -0
- package/src/migrate/executor.ts +81 -0
- package/src/migrate/mcp-mapper.ts +152 -0
- package/src/migrate/report.ts +104 -0
- package/src/migrate/skill-normalizer.ts +80 -0
- package/src/migrate/types.ts +163 -0
- package/src/modes/acp/acp-event-mapper.ts +1 -0
- package/src/modes/bridge/bridge-mode.ts +2 -2
- package/src/modes/components/custom-editor.ts +30 -20
- package/src/modes/components/hook-editor.ts +7 -2
- package/src/modes/components/oauth-selector.ts +19 -0
- package/src/modes/controllers/event-controller.ts +20 -0
- package/src/modes/controllers/selector-controller.ts +80 -17
- package/src/modes/interactive-mode.ts +6 -2
- package/src/modes/rpc/rpc-mode.ts +2 -2
- package/src/modes/runtime-init.ts +1 -0
- package/src/modes/shared/agent-wire/event-contract.ts +1 -0
- package/src/modes/shared/agent-wire/event-envelope.ts +1 -0
- package/src/modes/shared/agent-wire/event-observation.ts +16 -0
- package/src/modes/shared/agent-wire/unattended-audit.ts +3 -2
- package/src/modes/shared/agent-wire/unattended-session.ts +22 -0
- package/src/modes/types.ts +7 -1
- package/src/modes/utils/ui-helpers.ts +23 -0
- package/src/notifications/config-commands.ts +50 -0
- package/src/notifications/config.ts +107 -0
- package/src/notifications/helpers.ts +135 -0
- package/src/notifications/html-format.ts +389 -0
- package/src/notifications/index.ts +663 -0
- package/src/notifications/rate-limit-pool.ts +179 -0
- package/src/notifications/telegram-cli.ts +194 -0
- package/src/notifications/telegram-daemon-cli.ts +74 -0
- package/src/notifications/telegram-daemon-control.ts +370 -0
- package/src/notifications/telegram-daemon.ts +1370 -0
- package/src/notifications/telegram-reference.ts +335 -0
- package/src/notifications/threaded-inbound.ts +80 -0
- package/src/notifications/threaded-render.ts +155 -0
- package/src/notifications/topic-registry.ts +133 -0
- package/src/prompts/agents/init.md +1 -1
- package/src/prompts/system/plan-mode-active.md +1 -1
- package/src/prompts/tools/ast-grep.md +1 -1
- package/src/prompts/tools/search.md +1 -1
- package/src/prompts/tools/task.md +1 -2
- package/src/research-plan/index.ts +1 -0
- package/src/research-plan/ledger.ts +177 -0
- package/src/rlm/artifacts.ts +12 -3
- package/src/rlm/index.ts +26 -0
- package/src/runtime-mcp/config-writer.ts +46 -0
- package/src/sdk.ts +16 -0
- package/src/session/agent-session.ts +128 -24
- package/src/session/auth-storage.ts +3 -0
- package/src/session/session-dump-format.ts +43 -2
- package/src/session/session-manager.ts +39 -5
- package/src/setup/credential-auto-import.ts +258 -0
- package/src/setup/credential-import.ts +17 -0
- package/src/setup/hermes/templates/operator-instructions.v1.md +10 -0
- package/src/setup/hermes-setup.ts +1 -1
- package/src/setup/host-plugin-setup.ts +142 -0
- package/src/skill-state/active-state.ts +72 -108
- package/src/skill-state/canonical-skills.ts +4 -0
- package/src/skill-state/deep-interview-mutation-guard.ts +28 -109
- package/src/skill-state/workflow-hud.ts +4 -2
- package/src/skill-state/workflow-state-contract.ts +3 -3
- package/src/slash-commands/builtin-registry.ts +4 -1
- package/src/task/agents.ts +1 -22
- package/src/task/executor.ts +5 -1
- package/src/task/index.ts +1 -41
- package/src/task/spawn-gate.ts +1 -38
- package/src/task/types.ts +1 -1
- package/src/tools/ask-answer-registry.ts +25 -0
- package/src/tools/ask.ts +108 -16
- package/src/tools/computer.ts +58 -4
- package/src/tools/image-gen.ts +5 -8
- package/src/tools/index.ts +19 -0
- package/src/tools/inspect-image.ts +16 -11
- package/src/tools/subagent-render.ts +7 -0
- package/src/tools/subagent.ts +38 -7
- package/dist/types/extensibility/custom-commands/bundled/review/index.d.ts +0 -10
- package/src/extensibility/custom-commands/bundled/review/index.ts +0 -456
- package/src/prompts/agents/explore.md +0 -58
- package/src/prompts/agents/plan.md +0 -49
- package/src/prompts/agents/reviewer.md +0 -141
- package/src/prompts/agents/task.md +0 -16
- package/src/prompts/review-request.md +0 -70
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import * as fs from "node:fs/promises";
|
|
2
2
|
import { DEFAULT_ULTRAGOAL_OBJECTIVE } from "./goal-mode-request";
|
|
3
|
+
import { resolveGjcSessionForRead, SessionResolutionError } from "./session-resolution";
|
|
3
4
|
import {
|
|
4
5
|
computeUltragoalPlanGeneration,
|
|
5
6
|
getUltragoalPaths,
|
|
@@ -10,6 +11,7 @@ import {
|
|
|
10
11
|
type UltragoalCompletionVerification,
|
|
11
12
|
type UltragoalGoal,
|
|
12
13
|
type UltragoalLedgerEvent,
|
|
14
|
+
type UltragoalPaths,
|
|
13
15
|
type UltragoalPlan,
|
|
14
16
|
type UltragoalReceiptKind,
|
|
15
17
|
} from "./ultragoal-runtime";
|
|
@@ -63,9 +65,30 @@ function isKnownUltragoalObjective(currentObjective: string): boolean {
|
|
|
63
65
|
);
|
|
64
66
|
}
|
|
65
67
|
|
|
68
|
+
async function ultragoalReadPaths(cwd: string): Promise<UltragoalPaths> {
|
|
69
|
+
const envSessionId = process.env.GJC_SESSION_ID?.trim();
|
|
70
|
+
if (envSessionId) return getUltragoalPaths(cwd, envSessionId);
|
|
71
|
+
try {
|
|
72
|
+
const session = await resolveGjcSessionForRead(cwd, { envSessionId: process.env.GJC_SESSION_ID });
|
|
73
|
+
return getUltragoalPaths(cwd, session.gjcSessionId);
|
|
74
|
+
} catch (error) {
|
|
75
|
+
if (error instanceof SessionResolutionError && error.code === "no_session") {
|
|
76
|
+
return getUltragoalPaths(cwd, null);
|
|
77
|
+
}
|
|
78
|
+
throw error;
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
|
|
66
82
|
async function hasDurableUltragoalState(cwd: string): Promise<boolean> {
|
|
83
|
+
let paths: UltragoalPaths;
|
|
84
|
+
try {
|
|
85
|
+
paths = await ultragoalReadPaths(cwd);
|
|
86
|
+
} catch (error) {
|
|
87
|
+
if (error instanceof SessionResolutionError) return true;
|
|
88
|
+
throw error;
|
|
89
|
+
}
|
|
67
90
|
try {
|
|
68
|
-
await fs.stat(
|
|
91
|
+
await fs.stat(paths.dir);
|
|
69
92
|
return true;
|
|
70
93
|
} catch (error) {
|
|
71
94
|
if (
|
|
@@ -265,14 +288,15 @@ export function validateCompletionReceipt(input: {
|
|
|
265
288
|
export async function readUltragoalVerificationState(input: {
|
|
266
289
|
cwd: string;
|
|
267
290
|
currentGoal?: CurrentGoalLike | null;
|
|
291
|
+
sessionId?: string | null;
|
|
268
292
|
}): Promise<UltragoalGuardDiagnostic> {
|
|
269
293
|
const currentObjective = input.currentGoal?.objective?.trim() ?? "";
|
|
270
294
|
if (!currentObjective) return { state: "inactive", message: "No current goal objective is active." };
|
|
271
295
|
let plan: UltragoalPlan | null;
|
|
272
296
|
let ledger: UltragoalLedgerEvent[];
|
|
273
297
|
try {
|
|
274
|
-
plan = await readUltragoalPlan(input.cwd);
|
|
275
|
-
ledger = await readUltragoalLedger(input.cwd);
|
|
298
|
+
plan = await readUltragoalPlan(input.cwd, input.sessionId ?? undefined);
|
|
299
|
+
ledger = await readUltragoalLedger(input.cwd, input.sessionId ?? undefined);
|
|
276
300
|
} catch (error) {
|
|
277
301
|
if (currentObjective === DEFAULT_ULTRAGOAL_OBJECTIVE) {
|
|
278
302
|
return {
|
|
@@ -308,6 +332,18 @@ export async function readUltragoalVerificationState(input: {
|
|
|
308
332
|
}
|
|
309
333
|
const receiptTarget = findReceiptGoal(plan, currentObjective);
|
|
310
334
|
if (!receiptTarget) {
|
|
335
|
+
// When earlier required goals are already complete but later ones remain, name the
|
|
336
|
+
// specific blocking goals (a final-aggregate receipt cannot exist yet anyway). Only
|
|
337
|
+
// fall back to the generic missing-receipt message when no progress has been verified.
|
|
338
|
+
const completedRequired = requiredGoals(plan).filter(goal => goal.status === "complete");
|
|
339
|
+
if (completedRequired.length > 0 && runState.incompleteGoals.length > 0) {
|
|
340
|
+
return {
|
|
341
|
+
state: "active_missing_final_receipt",
|
|
342
|
+
message: `Ultragoal still has incomplete required goals: ${runState.incompleteGoals
|
|
343
|
+
.map(goal => goal.id)
|
|
344
|
+
.join(", ")}. Run \`gjc ultragoal complete-goals\` to continue.`,
|
|
345
|
+
};
|
|
346
|
+
}
|
|
311
347
|
return {
|
|
312
348
|
state: "active_missing_final_receipt",
|
|
313
349
|
message: "Ultragoal aggregate completion requires a fresh final aggregate receipt.",
|
|
@@ -331,7 +367,15 @@ export async function readUltragoalVerificationState(input: {
|
|
|
331
367
|
}
|
|
332
368
|
|
|
333
369
|
export async function isUltragoalAskBlocked(cwd: string): Promise<UltragoalAskBlockDiagnostic> {
|
|
334
|
-
|
|
370
|
+
let paths: UltragoalPaths;
|
|
371
|
+
try {
|
|
372
|
+
paths = await ultragoalReadPaths(cwd);
|
|
373
|
+
} catch (error) {
|
|
374
|
+
return activeAskDiagnostic({
|
|
375
|
+
reason: `Unable to resolve durable Ultragoal state: ${error instanceof Error ? error.message : String(error)}`,
|
|
376
|
+
source: "durable_state_unreadable",
|
|
377
|
+
});
|
|
378
|
+
}
|
|
335
379
|
try {
|
|
336
380
|
await fs.stat(paths.dir);
|
|
337
381
|
} catch (error) {
|
|
@@ -436,6 +480,7 @@ export async function isUltragoalAskBlocked(cwd: string): Promise<UltragoalAskBl
|
|
|
436
480
|
export async function assertCanCompleteCurrentGoal(input: {
|
|
437
481
|
cwd: string;
|
|
438
482
|
currentGoal?: CurrentGoalLike | null;
|
|
483
|
+
sessionId?: string | null;
|
|
439
484
|
}): Promise<void> {
|
|
440
485
|
if (!input.cwd) return;
|
|
441
486
|
const diagnostic = await readUltragoalVerificationState(input);
|
|
@@ -453,3 +498,56 @@ export function isUltragoalBypassPrompt(prompt: string): boolean {
|
|
|
453
498
|
) || /goal[\s\S]{0,80}complete/i.test(normalized)
|
|
454
499
|
);
|
|
455
500
|
}
|
|
501
|
+
export interface UltragoalPauseBlockDiagnostic {
|
|
502
|
+
blocked: boolean;
|
|
503
|
+
reason: string;
|
|
504
|
+
}
|
|
505
|
+
|
|
506
|
+
/**
|
|
507
|
+
* While an Ultragoal run is active, `goal({"op":"pause"})` is only allowed when the
|
|
508
|
+
* current durable Ultragoal state is readable and the latest durable ledger event
|
|
509
|
+
* classifies the current blocker as `human_blocked`. Resolvable blockers must be
|
|
510
|
+
* worked, not parked. Reads fail closed so unreadable durable state or ledger data
|
|
511
|
+
* blocks pause rather than silently allowing a give-up.
|
|
512
|
+
*/
|
|
513
|
+
export async function isUltragoalPauseBlocked(cwd: string): Promise<UltragoalPauseBlockDiagnostic> {
|
|
514
|
+
if (!cwd) return { blocked: false, reason: "No cwd to resolve durable Ultragoal state." };
|
|
515
|
+
const ask = await isUltragoalAskBlocked(cwd);
|
|
516
|
+
if (ask.source === "durable_state_unreadable") {
|
|
517
|
+
return {
|
|
518
|
+
blocked: true,
|
|
519
|
+
reason: `Unable to verify current durable Ultragoal state for pause: ${ask.reason}`,
|
|
520
|
+
};
|
|
521
|
+
}
|
|
522
|
+
if (!ask.active) return { blocked: false, reason: "No active Ultragoal run." };
|
|
523
|
+
let ledger: UltragoalLedgerEvent[];
|
|
524
|
+
try {
|
|
525
|
+
ledger = await readUltragoalLedger(cwd);
|
|
526
|
+
} catch (error) {
|
|
527
|
+
return {
|
|
528
|
+
blocked: true,
|
|
529
|
+
reason: `Unable to read durable Ultragoal ledger: ${error instanceof Error ? error.message : String(error)}`,
|
|
530
|
+
};
|
|
531
|
+
}
|
|
532
|
+
const latest = ledger.at(-1);
|
|
533
|
+
if (latest?.event === "blocker_classified" && latest.classification === "human_blocked") {
|
|
534
|
+
return { blocked: false, reason: "Latest Ultragoal ledger event classifies the blocker as human_blocked." };
|
|
535
|
+
}
|
|
536
|
+
return {
|
|
537
|
+
blocked: true,
|
|
538
|
+
reason:
|
|
539
|
+
"An Ultragoal run is active. Pausing requires the current blocker to be classified human_blocked as the latest ledger event.",
|
|
540
|
+
};
|
|
541
|
+
}
|
|
542
|
+
|
|
543
|
+
export async function assertUltragoalPauseAllowed(cwd: string): Promise<void> {
|
|
544
|
+
const diagnostic = await isUltragoalPauseBlocked(cwd);
|
|
545
|
+
if (!diagnostic.blocked) return;
|
|
546
|
+
throw new Error(
|
|
547
|
+
[
|
|
548
|
+
diagnostic.reason,
|
|
549
|
+
"Resolvable blockers must be worked, not paused: investigate, `gjc ultragoal steer --kind add_subgoal`, delegate an executor, or `gjc ultragoal record-review-blockers`.",
|
|
550
|
+
'If the blocker is genuinely human-only, record `gjc ultragoal classify-blocker --classification human_blocked --evidence "<human-only dependency>"` immediately before pausing.',
|
|
551
|
+
].join("\n"),
|
|
552
|
+
);
|
|
553
|
+
}
|