lazycodex-ai 4.16.3 → 4.17.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/README.ja.md +4 -4
- package/README.ko.md +4 -4
- package/README.md +2 -2
- package/README.ru.md +4 -4
- package/README.zh-cn.md +4 -4
- package/dist/cli/index.js +179 -63
- package/dist/cli-node/index.js +179 -63
- package/package.json +1 -1
- package/packages/omo-codex/plugin/.codex-plugin/plugin.json +3 -1
- package/packages/omo-codex/plugin/components/bootstrap/dist/cli.js +84 -19
- package/packages/omo-codex/plugin/components/bootstrap/hooks/hooks.json +1 -1
- package/packages/omo-codex/plugin/components/bootstrap/package.json +1 -1
- package/packages/omo-codex/plugin/components/codegraph/package.json +1 -1
- package/packages/omo-codex/plugin/components/comment-checker/hooks/hooks.json +1 -1
- package/packages/omo-codex/plugin/components/comment-checker/package.json +1 -1
- package/packages/omo-codex/plugin/components/git-bash/hooks/hooks.json +2 -2
- package/packages/omo-codex/plugin/components/git-bash/package.json +1 -1
- package/packages/omo-codex/plugin/components/lazycodex-executor-verify/AGENTS.md +2 -2
- package/packages/omo-codex/plugin/components/lazycodex-executor-verify/dist/cli.js +6 -2
- package/packages/omo-codex/plugin/components/lazycodex-executor-verify/dist/codex-hook.js +6 -2
- package/packages/omo-codex/plugin/components/lazycodex-executor-verify/hooks/hooks.json +2 -2
- package/packages/omo-codex/plugin/components/lazycodex-executor-verify/package.json +1 -1
- package/packages/omo-codex/plugin/components/lazycodex-executor-verify/src/codex-hook.ts +6 -2
- package/packages/omo-codex/plugin/components/lazycodex-executor-verify/test/cli.test.ts +1 -1
- package/packages/omo-codex/plugin/components/lazycodex-executor-verify/test/codex-hook.test.ts +67 -2
- package/packages/omo-codex/plugin/components/lsp/hooks/hooks.json +2 -2
- package/packages/omo-codex/plugin/components/lsp/package.json +1 -1
- package/packages/omo-codex/plugin/components/lsp/test/package-smoke.test.ts +0 -13
- package/packages/omo-codex/plugin/components/rules/bundled-rules/hephaestus/gpt-5.6.md +1 -1
- package/packages/omo-codex/plugin/components/rules/hooks/hooks.json +4 -4
- package/packages/omo-codex/plugin/components/rules/package.json +1 -1
- package/packages/omo-codex/plugin/components/start-work-continuation/hooks/hooks.json +2 -2
- package/packages/omo-codex/plugin/components/start-work-continuation/package.json +1 -1
- package/packages/omo-codex/plugin/components/start-work-continuation/test/codex-hook.test.ts +1 -79
- package/packages/omo-codex/plugin/components/teammode/hooks/hooks.json +1 -1
- package/packages/omo-codex/plugin/components/teammode/package.json +1 -1
- package/packages/omo-codex/plugin/components/telemetry/hooks/hooks.json +1 -1
- package/packages/omo-codex/plugin/components/telemetry/package.json +1 -1
- package/packages/omo-codex/plugin/components/ultrawork/agents/explorer.toml +2 -2
- package/packages/omo-codex/plugin/components/ultrawork/agents/lazycodex-code-reviewer.toml +2 -2
- package/packages/omo-codex/plugin/components/ultrawork/agents/lazycodex-gate-reviewer.toml +6 -6
- package/packages/omo-codex/plugin/components/ultrawork/agents/lazycodex-qa-executor.toml +5 -5
- package/packages/omo-codex/plugin/components/ultrawork/agents/lazycodex-worker-high.toml +26 -0
- package/packages/omo-codex/plugin/components/ultrawork/agents/{lazycodex-executor.toml → lazycodex-worker-low.toml} +6 -4
- package/packages/omo-codex/plugin/components/ultrawork/agents/lazycodex-worker-medium.toml +26 -0
- package/packages/omo-codex/plugin/components/ultrawork/agents/librarian.toml +2 -2
- package/packages/omo-codex/plugin/components/ultrawork/agents/plan.toml +4 -4
- package/packages/omo-codex/plugin/components/ultrawork/directive.md +55 -28
- package/packages/omo-codex/plugin/components/ultrawork/hooks/hooks.json +1 -1
- package/packages/omo-codex/plugin/components/ultrawork/package.json +1 -1
- package/packages/omo-codex/plugin/components/ultrawork/skills/ultrawork/SKILL.md +55 -28
- package/packages/omo-codex/plugin/components/ultrawork/skills/ulw-plan/scripts/scaffold-plan.mjs +2 -2
- package/packages/omo-codex/plugin/components/ultrawork/test/codex-hook.test.ts +22 -0
- package/packages/omo-codex/plugin/components/ultrawork/test/package-smoke.test.ts +0 -68
- package/packages/omo-codex/plugin/components/ulw-loop/AGENTS.md +1 -1
- package/packages/omo-codex/plugin/components/ulw-loop/CHANGELOG.md +2 -0
- package/packages/omo-codex/plugin/components/ulw-loop/README.md +3 -1
- package/packages/omo-codex/plugin/components/ulw-loop/directive.md +55 -28
- package/packages/omo-codex/plugin/components/ulw-loop/dist/checkpoint.js +6 -1
- package/packages/omo-codex/plugin/components/ulw-loop/dist/cli-subcommands.d.ts +1 -1
- package/packages/omo-codex/plugin/components/ulw-loop/dist/cli-subcommands.js +13 -2
- package/packages/omo-codex/plugin/components/ulw-loop/dist/cli.js +405 -25
- package/packages/omo-codex/plugin/components/ulw-loop/dist/codex-goal-instruction.js +12 -1
- package/packages/omo-codex/plugin/components/ulw-loop/dist/domain-types.d.ts +4 -2
- package/packages/omo-codex/plugin/components/ulw-loop/dist/paths.d.ts +7 -0
- package/packages/omo-codex/plugin/components/ulw-loop/dist/paths.js +16 -1
- package/packages/omo-codex/plugin/components/ulw-loop/dist/plan-crud.js +1 -0
- package/packages/omo-codex/plugin/components/ulw-loop/dist/quality-gate-verdicts.d.ts +6 -0
- package/packages/omo-codex/plugin/components/ulw-loop/dist/quality-gate-verdicts.js +20 -0
- package/packages/omo-codex/plugin/components/ulw-loop/dist/quality-gate.d.ts +1 -0
- package/packages/omo-codex/plugin/components/ulw-loop/dist/quality-gate.js +12 -9
- package/packages/omo-codex/plugin/components/ulw-loop/dist/spawn-guard.d.ts +3 -0
- package/packages/omo-codex/plugin/components/ulw-loop/dist/spawn-guard.js +148 -0
- package/packages/omo-codex/plugin/components/ulw-loop/dist/stop-resume-hook.d.ts +2 -0
- package/packages/omo-codex/plugin/components/ulw-loop/dist/stop-resume-hook.js +209 -0
- package/packages/omo-codex/plugin/components/ulw-loop/hooks/hooks.json +25 -2
- package/packages/omo-codex/plugin/components/ulw-loop/package.json +1 -1
- package/packages/omo-codex/plugin/components/ulw-loop/skills/ulw-loop/SKILL.md +14 -15
- package/packages/omo-codex/plugin/components/ulw-loop/skills/ulw-loop/references/full-workflow.md +29 -27
- package/packages/omo-codex/plugin/components/ulw-loop/src/checkpoint.ts +6 -1
- package/packages/omo-codex/plugin/components/ulw-loop/src/cli-subcommands.ts +14 -3
- package/packages/omo-codex/plugin/components/ulw-loop/src/cli.ts +10 -0
- package/packages/omo-codex/plugin/components/ulw-loop/src/codex-goal-instruction.ts +12 -1
- package/packages/omo-codex/plugin/components/ulw-loop/src/domain-types.ts +4 -2
- package/packages/omo-codex/plugin/components/ulw-loop/src/paths.ts +27 -1
- package/packages/omo-codex/plugin/components/ulw-loop/src/plan-crud.ts +1 -0
- package/packages/omo-codex/plugin/components/ulw-loop/src/quality-gate-verdicts.ts +23 -0
- package/packages/omo-codex/plugin/components/ulw-loop/src/quality-gate.ts +16 -9
- package/packages/omo-codex/plugin/components/ulw-loop/src/spawn-guard.ts +138 -0
- package/packages/omo-codex/plugin/components/ulw-loop/src/stop-resume-hook.ts +208 -0
- package/packages/omo-codex/plugin/components/ulw-loop/test/cli-create-goals.test.ts +12 -0
- package/packages/omo-codex/plugin/components/ulw-loop/test/cli-entrypoint.test.ts +4 -1
- package/packages/omo-codex/plugin/components/ulw-loop/test/codex-goal-instruction.test.ts +8 -35
- package/packages/omo-codex/plugin/components/ulw-loop/test/fixtures/quality-gate-builder.ts +24 -13
- package/packages/omo-codex/plugin/components/ulw-loop/test/package-smoke.test.ts +5 -2
- package/packages/omo-codex/plugin/components/ulw-loop/test/paths.test.ts +43 -8
- package/packages/omo-codex/plugin/components/ulw-loop/test/quality-gate.test.ts +55 -2
- package/packages/omo-codex/plugin/components/ulw-loop/test/spawn-guard.test.ts +228 -0
- package/packages/omo-codex/plugin/components/ulw-loop/test/stop-resume-hook.test.ts +193 -0
- package/packages/omo-codex/plugin/hooks/post-compact-resetting-git-bash-mcp-reminder.json +1 -1
- package/packages/omo-codex/plugin/hooks/post-compact-resetting-lsp-diagnostics-cache.json +1 -1
- package/packages/omo-codex/plugin/hooks/post-compact-resetting-project-rule-cache.json +1 -1
- package/packages/omo-codex/plugin/hooks/post-tool-use-checking-codegraph-init-guidance.json +1 -1
- package/packages/omo-codex/plugin/hooks/post-tool-use-checking-comments.json +1 -1
- package/packages/omo-codex/plugin/hooks/post-tool-use-checking-lsp-diagnostics.json +1 -1
- package/packages/omo-codex/plugin/hooks/post-tool-use-checking-thread-title-hygiene.json +1 -1
- package/packages/omo-codex/plugin/hooks/post-tool-use-matching-project-rules.json +1 -1
- package/packages/omo-codex/plugin/hooks/pre-tool-use-enforcing-unlimited-goal-budget.json +1 -1
- package/packages/omo-codex/plugin/hooks/pre-tool-use-guarding-ulw-loop-spawns.json +18 -0
- package/packages/omo-codex/plugin/hooks/pre-tool-use-recommending-git-bash-mcp.json +1 -1
- package/packages/omo-codex/plugin/hooks/session-start-checking-auto-update.json +1 -1
- package/packages/omo-codex/plugin/hooks/session-start-checking-bootstrap-provisioning.json +1 -1
- package/packages/omo-codex/plugin/hooks/session-start-checking-codegraph-bootstrap.json +1 -1
- package/packages/omo-codex/plugin/hooks/session-start-loading-project-rules.json +1 -1
- package/packages/omo-codex/plugin/hooks/session-start-recording-session-telemetry.json +1 -1
- package/packages/omo-codex/plugin/hooks/stop-checking-start-work-continuation.json +1 -1
- package/packages/omo-codex/plugin/hooks/stop-checking-ulw-loop-resume.json +17 -0
- package/packages/omo-codex/plugin/hooks/subagent-stop-checking-start-work-continuation.json +1 -1
- package/packages/omo-codex/plugin/hooks/subagent-stop-verifying-lazycodex-executor-evidence.json +2 -2
- package/packages/omo-codex/plugin/hooks/user-prompt-submit-checking-ultrawork-trigger.json +1 -1
- package/packages/omo-codex/plugin/hooks/user-prompt-submit-checking-ulw-loop-steering.json +1 -1
- package/packages/omo-codex/plugin/hooks/user-prompt-submit-loading-project-rules.json +1 -1
- package/packages/omo-codex/plugin/model-catalog.json +16 -7
- package/packages/omo-codex/plugin/package-lock.json +13 -13
- package/packages/omo-codex/plugin/package.json +1 -1
- package/packages/omo-codex/plugin/scripts/migrate-codex-config/catalog.mjs +16 -7
- package/packages/omo-codex/plugin/scripts/sync-skills.mjs +8 -2
- package/packages/omo-codex/plugin/skills/init-deep/SKILL.md +2 -2
- package/packages/omo-codex/plugin/skills/refactor/SKILL.md +2 -2
- package/packages/omo-codex/plugin/skills/remove-ai-slops/SKILL.md +4 -4
- package/packages/omo-codex/plugin/skills/review-work/SKILL.md +8 -2
- package/packages/omo-codex/plugin/skills/start-work/SKILL.md +5 -2
- package/packages/omo-codex/plugin/skills/ultrawork/SKILL.md +55 -28
- package/packages/omo-codex/plugin/skills/ulw-loop/SKILL.md +14 -15
- package/packages/omo-codex/plugin/skills/ulw-loop/references/full-workflow.md +29 -27
- package/packages/omo-codex/plugin/skills/ulw-plan/scripts/scaffold-plan.mjs +2 -2
- package/packages/omo-codex/plugin/skills/ulw-research/SKILL.md +2 -2
- package/packages/omo-codex/plugin/skills/visual-qa/SKILL.md +2 -2
- package/packages/omo-codex/plugin/test/aggregate-agents.test.mjs +76 -16
- package/packages/omo-codex/plugin/test/aggregate-hooks.test.mjs +23 -2
- package/packages/omo-codex/plugin/test/aggregate-manifest.test.mjs +1 -1
- package/packages/omo-codex/plugin/test/aggregate-model-catalog.test.mjs +4 -4
- package/packages/omo-codex/plugin/test/auto-update.test.mjs +4 -4
- package/packages/omo-codex/plugin/test/component-hook-contract-cases.mjs +2 -2
- package/packages/omo-codex/plugin/test/lcx-bug-skills.test.mjs +4 -101
- package/packages/omo-codex/plugin/test/migrate-codex-config.test.mjs +14 -14
- package/packages/omo-codex/plugin/test/sync-skills-orchestration.test.mjs +11 -0
- package/packages/omo-codex/plugin/test/sync-skills-test-support.mjs +1 -1
- package/packages/omo-codex/plugin/test/sync-skills.test.mjs +4 -2
- package/packages/omo-codex/plugin/test/ulw-plan-skill-contract.test.mjs +9 -40
- package/packages/omo-codex/plugin/test/ulw-research-skill-contract.test.mjs +4 -277
- package/packages/omo-codex/scripts/install-dist/install-local.mjs +91 -21
- package/packages/shared-skills/skills/remove-ai-slops/SKILL.md +2 -2
- package/packages/shared-skills/skills/start-work/SKILL.md +5 -2
- package/packages/shared-skills/skills/ulw-plan/scripts/scaffold-plan.mjs +2 -2
- package/packages/omo-codex/plugin/components/ulw-loop/test/skill-contract.test.ts +0 -70
- package/packages/omo-codex/plugin/test/ulw-research-epistemic-contract.test.mjs +0 -98
- package/packages/shared-skills/skills/visual-qa/scripts/skill-prompt-contract.test.ts +0 -296
|
@@ -66,11 +66,15 @@ function isRecord(value) {
|
|
|
66
66
|
var SUBAGENT_STOP_EVENT = "SubagentStop";
|
|
67
67
|
|
|
68
68
|
// components/lazycodex-executor-verify/src/codex-hook.ts
|
|
69
|
-
var
|
|
69
|
+
var RECEIPT_ENFORCED_AGENTS = new Set([
|
|
70
|
+
"lazycodex-worker-low",
|
|
71
|
+
"lazycodex-worker-medium",
|
|
72
|
+
"lazycodex-worker-high"
|
|
73
|
+
]);
|
|
70
74
|
function runSubagentStopHook(input, fs) {
|
|
71
75
|
if (!isSubagentStopInput(input))
|
|
72
76
|
return "";
|
|
73
|
-
if (input.agent_type
|
|
77
|
+
if (!RECEIPT_ENFORCED_AGENTS.has(input.agent_type))
|
|
74
78
|
return "";
|
|
75
79
|
if (transcriptHasContextPressureMarker(input.transcript_path, fs))
|
|
76
80
|
return "";
|
|
@@ -3,11 +3,15 @@ import { isAbsolute, relative, resolve } from "node:path";
|
|
|
3
3
|
import { renderDirective } from "./directive.js";
|
|
4
4
|
import { clearAttemptState, MAX_ATTEMPTS, readAttemptState, writeAttemptState } from "./state.js";
|
|
5
5
|
import { SUBAGENT_STOP_EVENT } from "./types.js";
|
|
6
|
-
const
|
|
6
|
+
const RECEIPT_ENFORCED_AGENTS = new Set([
|
|
7
|
+
"lazycodex-worker-low",
|
|
8
|
+
"lazycodex-worker-medium",
|
|
9
|
+
"lazycodex-worker-high",
|
|
10
|
+
]);
|
|
7
11
|
export function runSubagentStopHook(input, fs) {
|
|
8
12
|
if (!isSubagentStopInput(input))
|
|
9
13
|
return "";
|
|
10
|
-
if (input.agent_type
|
|
14
|
+
if (!RECEIPT_ENFORCED_AGENTS.has(input.agent_type))
|
|
11
15
|
return "";
|
|
12
16
|
if (transcriptHasContextPressureMarker(input.transcript_path, fs))
|
|
13
17
|
return "";
|
|
@@ -2,13 +2,13 @@
|
|
|
2
2
|
"hooks": {
|
|
3
3
|
"SubagentStop": [
|
|
4
4
|
{
|
|
5
|
-
"matcher": "^lazycodex-
|
|
5
|
+
"matcher": "^lazycodex-worker-(low|medium|high)$",
|
|
6
6
|
"hooks": [
|
|
7
7
|
{
|
|
8
8
|
"type": "command",
|
|
9
9
|
"command": "node \"${PLUGIN_ROOT}/components/lazycodex-executor-verify/dist/cli.js\" hook subagent-stop",
|
|
10
10
|
"timeout": 10,
|
|
11
|
-
"statusMessage": "(OmO 4.
|
|
11
|
+
"statusMessage": "(OmO 4.17.0) Verifying LazyCodex Executor Evidence"
|
|
12
12
|
}
|
|
13
13
|
]
|
|
14
14
|
}
|
|
@@ -6,11 +6,15 @@ import { clearAttemptState, MAX_ATTEMPTS, readAttemptState, writeAttemptState }
|
|
|
6
6
|
import type { HookFileSystem, StopHookOutput, SubagentStopInput } from "./types.js";
|
|
7
7
|
import { SUBAGENT_STOP_EVENT } from "./types.js";
|
|
8
8
|
|
|
9
|
-
const
|
|
9
|
+
const RECEIPT_ENFORCED_AGENTS = new Set([
|
|
10
|
+
"lazycodex-worker-low",
|
|
11
|
+
"lazycodex-worker-medium",
|
|
12
|
+
"lazycodex-worker-high",
|
|
13
|
+
]);
|
|
10
14
|
|
|
11
15
|
export function runSubagentStopHook(input: unknown, fs: HookFileSystem): string {
|
|
12
16
|
if (!isSubagentStopInput(input)) return "";
|
|
13
|
-
if (input.agent_type
|
|
17
|
+
if (!RECEIPT_ENFORCED_AGENTS.has(input.agent_type)) return "";
|
|
14
18
|
if (transcriptHasContextPressureMarker(input.transcript_path, fs)) return "";
|
|
15
19
|
if (hasValidEvidenceReceipt(input, fs)) {
|
|
16
20
|
clearAttemptState(input.cwd, input.session_id, input.agent_id, fs);
|
|
@@ -110,7 +110,7 @@ function createPayload(
|
|
|
110
110
|
): Record<string, string | boolean> {
|
|
111
111
|
return {
|
|
112
112
|
hook_event_name: "SubagentStop",
|
|
113
|
-
agent_type: "lazycodex-
|
|
113
|
+
agent_type: "lazycodex-worker-medium",
|
|
114
114
|
agent_id: "agent_1",
|
|
115
115
|
session_id: "sess.1",
|
|
116
116
|
cwd,
|
package/packages/omo-codex/plugin/components/lazycodex-executor-verify/test/codex-hook.test.ts
CHANGED
|
@@ -299,7 +299,7 @@ function existingReceiptTargetOutsideEvidenceRoot(): string {
|
|
|
299
299
|
function createInput(cwd: string, overrides: Partial<SubagentStopInput> = {}): SubagentStopInput {
|
|
300
300
|
return {
|
|
301
301
|
hook_event_name: "SubagentStop",
|
|
302
|
-
agent_type: "lazycodex-
|
|
302
|
+
agent_type: "lazycodex-worker-medium",
|
|
303
303
|
agent_id: "agent_1",
|
|
304
304
|
session_id: "sess.1",
|
|
305
305
|
cwd,
|
|
@@ -315,7 +315,7 @@ function createInput(cwd: string, overrides: Partial<SubagentStopInput> = {}): S
|
|
|
315
315
|
function createUnknownEventInput(cwd: string): Record<string, string | boolean> {
|
|
316
316
|
return {
|
|
317
317
|
hook_event_name: "Stop",
|
|
318
|
-
agent_type: "lazycodex-
|
|
318
|
+
agent_type: "lazycodex-worker-medium",
|
|
319
319
|
agent_id: "agent_1",
|
|
320
320
|
session_id: "sess.1",
|
|
321
321
|
cwd,
|
|
@@ -344,3 +344,68 @@ function isBlockOutput(value: unknown): value is BlockOutput {
|
|
|
344
344
|
typeof value.reason === "string"
|
|
345
345
|
);
|
|
346
346
|
}
|
|
347
|
+
|
|
348
|
+
describe("tier worker receipt enforcement", () => {
|
|
349
|
+
// given the matcher set now covers the difficulty-tier workers
|
|
350
|
+
const workerTypes = ["lazycodex-worker-low", "lazycodex-worker-medium", "lazycodex-worker-high"] as const;
|
|
351
|
+
|
|
352
|
+
for (const agentType of workerTypes) {
|
|
353
|
+
it(`#given no evidence receipt #when a ${agentType} child stops #then blocks`, () => {
|
|
354
|
+
// given
|
|
355
|
+
const cwd = createWorkspace();
|
|
356
|
+
|
|
357
|
+
// when
|
|
358
|
+
const output = runSubagentStopHook(createInput(cwd, { agent_type: agentType }), nodeFileSystem);
|
|
359
|
+
|
|
360
|
+
// then
|
|
361
|
+
expect(parseBlockOutput(output).decision).toBe("block");
|
|
362
|
+
});
|
|
363
|
+
}
|
|
364
|
+
|
|
365
|
+
it("#given no evidence receipt #when an explorer child stops #then no-ops", () => {
|
|
366
|
+
// given
|
|
367
|
+
const cwd = createWorkspace();
|
|
368
|
+
|
|
369
|
+
// when
|
|
370
|
+
const output = runSubagentStopHook(createInput(cwd, { agent_type: "explorer" }), nodeFileSystem);
|
|
371
|
+
|
|
372
|
+
// then
|
|
373
|
+
expect(output).toBe("");
|
|
374
|
+
});
|
|
375
|
+
|
|
376
|
+
it("#given both hook manifests #when their matchers are applied #then enforced agents match and read-only roles do not", () => {
|
|
377
|
+
// given
|
|
378
|
+
const componentManifest = JSON.parse(
|
|
379
|
+
readFileSync(new URL("../hooks/hooks.json", import.meta.url), "utf8"),
|
|
380
|
+
);
|
|
381
|
+
const rootManifest = JSON.parse(
|
|
382
|
+
readFileSync(
|
|
383
|
+
new URL("../../../hooks/subagent-stop-verifying-lazycodex-executor-evidence.json", import.meta.url),
|
|
384
|
+
"utf8",
|
|
385
|
+
),
|
|
386
|
+
);
|
|
387
|
+
for (const manifest of [componentManifest, rootManifest]) {
|
|
388
|
+
const matcher = new RegExp(manifest.hooks.SubagentStop[0].matcher);
|
|
389
|
+
|
|
390
|
+
// then
|
|
391
|
+
for (const name of workerTypes) expect(matcher.test(name)).toBe(true);
|
|
392
|
+
expect(matcher.test("lazycodex-executor")).toBe(false);
|
|
393
|
+
expect(matcher.test("explorer")).toBe(false);
|
|
394
|
+
expect(matcher.test("lazycodex-gate-reviewer")).toBe(false);
|
|
395
|
+
}
|
|
396
|
+
});
|
|
397
|
+
|
|
398
|
+
it("#given the tier worker TOMLs #when inspected #then each instructs the EVIDENCE_RECORDED receipt line", () => {
|
|
399
|
+
for (const tier of ["low", "medium", "high"]) {
|
|
400
|
+
// when
|
|
401
|
+
const toml = readFileSync(
|
|
402
|
+
new URL(`../../ultrawork/agents/lazycodex-worker-${tier}.toml`, import.meta.url),
|
|
403
|
+
"utf8",
|
|
404
|
+
);
|
|
405
|
+
|
|
406
|
+
// then
|
|
407
|
+
expect(toml).toContain("EVIDENCE_RECORDED: <path>");
|
|
408
|
+
}
|
|
409
|
+
});
|
|
410
|
+
});
|
|
411
|
+
|
|
@@ -8,7 +8,7 @@
|
|
|
8
8
|
"type": "command",
|
|
9
9
|
"command": "node \"${PLUGIN_ROOT}/dist/cli.js\" hook post-tool-use",
|
|
10
10
|
"timeout": 60,
|
|
11
|
-
"statusMessage": "(OmO 4.
|
|
11
|
+
"statusMessage": "(OmO 4.17.0) Checking LSP Diagnostics"
|
|
12
12
|
}
|
|
13
13
|
]
|
|
14
14
|
}
|
|
@@ -21,7 +21,7 @@
|
|
|
21
21
|
"type": "command",
|
|
22
22
|
"command": "node \"${PLUGIN_ROOT}/dist/cli.js\" hook post-compact",
|
|
23
23
|
"timeout": 5,
|
|
24
|
-
"statusMessage": "(OmO 4.
|
|
24
|
+
"statusMessage": "(OmO 4.17.0) Resetting LSP Diagnostics Cache"
|
|
25
25
|
}
|
|
26
26
|
]
|
|
27
27
|
}
|
|
@@ -56,17 +56,4 @@ describe("plugin package metadata", () => {
|
|
|
56
56
|
expect(codexHookSource).not.toContain("../../../../../lsp-daemon");
|
|
57
57
|
expect(sourceFiles.filter((name) => name.startsWith("lazy-mcp") || name === "lazy-lsp-mcp.ts")).toEqual([]);
|
|
58
58
|
});
|
|
59
|
-
|
|
60
|
-
it("#given LSP skill guidance #when validating MCP tool instructions #then tool names are not framed as shell commands", () => {
|
|
61
|
-
// given
|
|
62
|
-
const skill = readTextFile("skills/lsp/SKILL.md");
|
|
63
|
-
|
|
64
|
-
// when
|
|
65
|
-
const mentionsToolInterface = skill.includes("through the tool interface");
|
|
66
|
-
const rejectsShellExecution = skill.includes("not shell commands");
|
|
67
|
-
|
|
68
|
-
// then
|
|
69
|
-
expect(mentionsToolInterface).toBe(true);
|
|
70
|
-
expect(rejectsShellExecution).toBe(true);
|
|
71
|
-
});
|
|
72
59
|
});
|
|
@@ -19,7 +19,7 @@ Status requests are not stop signals: give the update, keep working. Honor every
|
|
|
19
19
|
|
|
20
20
|
# Discovery
|
|
21
21
|
|
|
22
|
-
Never speculate about code you have not read: verify with tools and re-read on every hand-off. Start broad once: independent
|
|
22
|
+
Never speculate about code you have not read: verify with tools and re-read on every hand-off. Start broad once - and WIDE: tool calls run as JavaScript through `exec`, so write programs, not single calls. Batch EVERY independent read, search, and doc lookup into ONE `exec` script via `Promise.all` over the `tools` object before the first edit; filter and reduce results in-script so only what you need returns to context. NEVER await independent calls one at a time - sequence only when one result feeds the next. Retrieve again only when the core question is open, a needed fact is missing, or a second-order question (callers, error paths, ownership) changes the design. Stop when you can act. Prefer the root fix over the symptom fix.
|
|
23
23
|
|
|
24
24
|
# Operating Loop
|
|
25
25
|
|
|
@@ -7,7 +7,7 @@
|
|
|
7
7
|
"type": "command",
|
|
8
8
|
"command": "node \"${PLUGIN_ROOT}/dist/cli.js\" hook session-start",
|
|
9
9
|
"timeout": 10,
|
|
10
|
-
"statusMessage": "(OmO 4.
|
|
10
|
+
"statusMessage": "(OmO 4.17.0) Loading Project Rules"
|
|
11
11
|
}
|
|
12
12
|
]
|
|
13
13
|
}
|
|
@@ -19,7 +19,7 @@
|
|
|
19
19
|
"type": "command",
|
|
20
20
|
"command": "node \"${PLUGIN_ROOT}/dist/cli.js\" hook user-prompt-submit",
|
|
21
21
|
"timeout": 10,
|
|
22
|
-
"statusMessage": "(OmO 4.
|
|
22
|
+
"statusMessage": "(OmO 4.17.0) Loading Project Rules"
|
|
23
23
|
}
|
|
24
24
|
]
|
|
25
25
|
}
|
|
@@ -32,7 +32,7 @@
|
|
|
32
32
|
"type": "command",
|
|
33
33
|
"command": "node \"${PLUGIN_ROOT}/dist/cli.js\" hook post-tool-use",
|
|
34
34
|
"timeout": 10,
|
|
35
|
-
"statusMessage": "(OmO 4.
|
|
35
|
+
"statusMessage": "(OmO 4.17.0) Matching Project Rules"
|
|
36
36
|
}
|
|
37
37
|
]
|
|
38
38
|
}
|
|
@@ -45,7 +45,7 @@
|
|
|
45
45
|
"type": "command",
|
|
46
46
|
"command": "node \"${PLUGIN_ROOT}/dist/cli.js\" hook post-compact",
|
|
47
47
|
"timeout": 10,
|
|
48
|
-
"statusMessage": "(OmO 4.
|
|
48
|
+
"statusMessage": "(OmO 4.17.0) Resetting Project Rule Cache"
|
|
49
49
|
}
|
|
50
50
|
]
|
|
51
51
|
}
|
|
@@ -7,7 +7,7 @@
|
|
|
7
7
|
"type": "command",
|
|
8
8
|
"command": "node \"${PLUGIN_ROOT}/components/start-work-continuation/dist/cli.js\" hook stop",
|
|
9
9
|
"timeout": 10,
|
|
10
|
-
"statusMessage": "(OmO 4.
|
|
10
|
+
"statusMessage": "(OmO 4.17.0) Checking Start-Work Continuation"
|
|
11
11
|
}
|
|
12
12
|
]
|
|
13
13
|
}
|
|
@@ -19,7 +19,7 @@
|
|
|
19
19
|
"type": "command",
|
|
20
20
|
"command": "node \"${PLUGIN_ROOT}/components/start-work-continuation/dist/cli.js\" hook subagent-stop",
|
|
21
21
|
"timeout": 10,
|
|
22
|
-
"statusMessage": "(OmO 4.
|
|
22
|
+
"statusMessage": "(OmO 4.17.0) Checking Start-Work Continuation"
|
|
23
23
|
}
|
|
24
24
|
]
|
|
25
25
|
}
|
package/packages/omo-codex/plugin/components/start-work-continuation/test/codex-hook.test.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { mkdirSync, mkdtempSync,
|
|
1
|
+
import { mkdirSync, mkdtempSync, rmSync, writeFileSync } from "node:fs";
|
|
2
2
|
import { tmpdir } from "node:os";
|
|
3
3
|
import { join } from "node:path";
|
|
4
4
|
import { afterEach, describe, expect, it } from "vitest";
|
|
@@ -96,84 +96,6 @@ describe("start-work Stop hook", () => {
|
|
|
96
96
|
expect(output).toBe("");
|
|
97
97
|
});
|
|
98
98
|
|
|
99
|
-
it("#given active codex work #when continuation directive is emitted #then subagent guidance is reliable", () => {
|
|
100
|
-
// given
|
|
101
|
-
const workspace = createWorkspace({
|
|
102
|
-
boulderJson: createBoulderJson({ sessionIds: ["codex:sess_abc"], status: "active" }),
|
|
103
|
-
planMarkdown: ["# Plan", "", "## TODOs", "- [ ] First"].join("\n"),
|
|
104
|
-
});
|
|
105
|
-
const fs = createMemoryFs();
|
|
106
|
-
|
|
107
|
-
// when
|
|
108
|
-
const output = runStopHook(createStopInput(workspace), fs);
|
|
109
|
-
|
|
110
|
-
// then
|
|
111
|
-
const parsed = parseBlockOutput(output);
|
|
112
|
-
expect(parsed.reason).toMatch(/TASK:/);
|
|
113
|
-
expect(parsed.reason).toMatch(/fork_context:\s*false/);
|
|
114
|
-
expect(parsed.reason).toMatch(/wait_agent.*mailbox signals/);
|
|
115
|
-
expect(parsed.reason).toMatch(/TASK STILL ACTIVE/);
|
|
116
|
-
expect(parsed.reason).toMatch(/respawn.*smaller/);
|
|
117
|
-
expect(parsed.reason).toMatch(/WORKING:/);
|
|
118
|
-
});
|
|
119
|
-
|
|
120
|
-
it("#given active codex work #when continuation directive is emitted #then QA weight is tier-scoped without echo bloat", () => {
|
|
121
|
-
// given
|
|
122
|
-
const workspace = createWorkspace({
|
|
123
|
-
boulderJson: createBoulderJson({ sessionIds: ["codex:sess_abc"], status: "active" }),
|
|
124
|
-
planMarkdown: ["# Plan", "", "## TODOs", "- [ ] First"].join("\n"),
|
|
125
|
-
});
|
|
126
|
-
const fs = createMemoryFs();
|
|
127
|
-
|
|
128
|
-
// when
|
|
129
|
-
const output = runStopHook(createStopInput(workspace), fs);
|
|
130
|
-
|
|
131
|
-
// then
|
|
132
|
-
const parsed = parseBlockOutput(output);
|
|
133
|
-
expect(parsed.reason).toMatch(/LIGHT/);
|
|
134
|
-
expect(parsed.reason).toMatch(/HEAVY/);
|
|
135
|
-
expect(parsed.reason).toMatch(/When unsure[^.]{0,30}HEAVY/);
|
|
136
|
-
expect(parsed.reason).toMatch(/mirrors its implementation/);
|
|
137
|
-
expect((parsed.reason.match(/malformed input, prompt injection/g) ?? []).length).toBe(1);
|
|
138
|
-
expect(parsed.reason.split(/\s+/).filter(Boolean).length).toBeLessThanOrEqual(1135);
|
|
139
|
-
});
|
|
140
|
-
|
|
141
|
-
it("#given active codex work #when continuation directive is emitted #then PR lifecycle stays worktree-bound", () => {
|
|
142
|
-
// given
|
|
143
|
-
const workspace = createWorkspace({
|
|
144
|
-
boulderJson: createBoulderJson({
|
|
145
|
-
sessionIds: ["codex:sess_abc"],
|
|
146
|
-
status: "active",
|
|
147
|
-
worktreePath: "/tmp/worktree",
|
|
148
|
-
}),
|
|
149
|
-
planMarkdown: ["# Plan", "", "## TODOs", "- [ ] First"].join("\n"),
|
|
150
|
-
});
|
|
151
|
-
const fs = createMemoryFs();
|
|
152
|
-
|
|
153
|
-
// when
|
|
154
|
-
const output = runStopHook(createStopInput(workspace), fs);
|
|
155
|
-
|
|
156
|
-
// then
|
|
157
|
-
const parsed = parseBlockOutput(output);
|
|
158
|
-
expect(parsed.reason).toContain("PR or branch implementation/review/merge work requires a task-owned git worktree");
|
|
159
|
-
expect(parsed.reason).toContain("Treat the main worktree as read-only context");
|
|
160
|
-
expect(parsed.reason).toContain("create/update the PR, wait for CI/review/Cubic gates, merge by default");
|
|
161
|
-
expect(parsed.reason).toContain("Do not create a PR, PR handoff, branch handoff, merge");
|
|
162
|
-
});
|
|
163
|
-
|
|
164
|
-
it("#given stop hook source #when inspected #then it remains Boulder-only without planning bootstrap logic", () => {
|
|
165
|
-
// given
|
|
166
|
-
const hook = readFileSync(new URL("../src/codex-hook.ts", import.meta.url), "utf8");
|
|
167
|
-
|
|
168
|
-
// then
|
|
169
|
-
expect(hook).toMatch(/readContinuationState/);
|
|
170
|
-
expect(hook).toMatch(/START_WORK_CONTINUATION_DIRECTIVE/);
|
|
171
|
-
expect(hook).toMatch(/decision:\s*"block"/);
|
|
172
|
-
expect(hook).not.toMatch(
|
|
173
|
-
/\bulw-plan\b|\bspawn_agent\b|\brequest_user_input\b|bootstrap|selectable plan|Phase 1|Create or update Boulder state/i,
|
|
174
|
-
);
|
|
175
|
-
});
|
|
176
|
-
|
|
177
99
|
it("#given active work belongs to another harness #when hook runs #then returns empty output", () => {
|
|
178
100
|
// given
|
|
179
101
|
const workspace = createWorkspace({
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
name = "explorer"
|
|
2
2
|
description = "Codebase search specialist for Codex sessions. Finds files and code in the working tree, returns absolute paths with structured results. Read-only."
|
|
3
3
|
nickname_candidates = ["Explorer"]
|
|
4
|
-
model = "gpt-5.6-
|
|
5
|
-
model_reasoning_effort = "
|
|
4
|
+
model = "gpt-5.6-luna"
|
|
5
|
+
model_reasoning_effort = "low"
|
|
6
6
|
service_tier = "fast"
|
|
7
7
|
|
|
8
8
|
developer_instructions = """
|
|
@@ -15,9 +15,9 @@ Review for correctness, scope control, maintainability, test relevance, and regr
|
|
|
15
15
|
|
|
16
16
|
Before judging test relevance or maintainability, explicitly load or consult the `remove-ai-slops` and `programming` skills when they are available. If tool loading is unavailable, apply their documented criteria from the prompt/context instead. Your report must say whether this skill-perspective check ran or why it was unavailable, and whether the diff violates either skill perspective.
|
|
17
17
|
|
|
18
|
-
Run the `remove-ai-slops` overfit/slop review pass over tests and production code. Flag deletion-only tests, tests that merely verify a requested removal, tautological tests, tests that only mirror implementation constants, and unnecessary production data extraction, parsing, or normalization that the goal does not require. Apply the `programming` perspective to reject brittle prompt tests, implementation-mirroring tests, untyped escape hatches, needless abstraction, and validation/parsing inside production code when the boundary or goal does not require it.
|
|
18
|
+
Run the `remove-ai-slops` overfit/slop review pass over tests and production code. Flag deletion-only tests, tests that merely verify a requested removal, tautological tests, tests that only mirror implementation constants, and unnecessary production data extraction, parsing, or normalization that the goal does not require. Apply the `programming` perspective to reject brittle prompt tests, implementation-mirroring tests, untyped escape hatches, needless abstraction, and validation/parsing inside production code when the boundary or goal does not require it. Record useless tests or needless production complexity as MEDIUM by default; raise to HIGH only when they demonstrably cause a correctness, regression, or maintenance failure for this goal — maintenance burden, false confidence, or scope drift that will actually bite.
|
|
19
19
|
|
|
20
|
-
Write your report artifact to `.omo/evidence/<goal>-code-review.md`. The report must include findings by severity: CRITICAL, HIGH, MEDIUM, LOW. Include file and line references when a finding is tied to code.
|
|
20
|
+
Write your report artifact to `<attemptDir>/<goalId>-code-review.md`, where you read `currentAttemptDir` from `omo ulw-loop status --json` (`.omo/evidence/ulw/<session>/<goalId>/a<attempt>`); when no ulw-loop plan exists, fall back to `.omo/evidence/<goal>-code-review.md`. The report must include findings by severity: CRITICAL, HIGH, MEDIUM, LOW. Include file and line references when a finding is tied to code.
|
|
21
21
|
|
|
22
22
|
Return:
|
|
23
23
|
- `codeQualityStatus`: CLEAR, WATCH, or BLOCK.
|
|
@@ -2,22 +2,22 @@ name = "lazycodex-gate-reviewer"
|
|
|
2
2
|
description = "Read-only LazyCodex gate reviewer. Re-audits executor, code review, and QA artifacts before final approval."
|
|
3
3
|
nickname_candidates = ["Gate Reviewer"]
|
|
4
4
|
model = "gpt-5.6-sol"
|
|
5
|
-
model_reasoning_effort = "
|
|
5
|
+
model_reasoning_effort = "high"
|
|
6
6
|
|
|
7
7
|
developer_instructions = """
|
|
8
8
|
Role: final gate reviewer. Read-only.
|
|
9
9
|
|
|
10
|
-
Assume
|
|
10
|
+
Assume every success claim is unverified until you reproduce it from the artifacts. Executors can be wrong, tests can be too narrow, and success prose can be misleading.
|
|
11
11
|
|
|
12
12
|
Input should include the original brief/user request, goal, success criteria, desired user-visible outcome, changed files, diff, executor evidence, code review report, manual QA matrix, and notepad path. Treat every report as untrusted until you inspect its referenced artifact paths.
|
|
13
13
|
|
|
14
14
|
Review from the user's perspective: infer what the user originally wanted, what result they expected to receive, and whether the shipped artifact actually satisfies that outcome. Then check every intended change, criterion, adversarial class, and artifact. Counts alone do not prove approval.
|
|
15
15
|
|
|
16
|
-
Before approval, load or consult `remove-ai-slops` and `programming` when available. If unavailable, apply their documented criteria from this prompt/context directly. Run the `remove-ai-slops` overfit/slop pass yourself over the diff, tests, and production code: detect excessive or useless tests, deletion-only tests, tests that merely verify a requested removal, tautological tests, implementation-mirroring tests, and unnecessary production extraction, parsing, or normalization. Apply the `programming` criteria
|
|
16
|
+
Before approval, load or consult `remove-ai-slops` and `programming` when available. If unavailable, apply their documented criteria from this prompt/context directly. Run the `remove-ai-slops` overfit/slop pass yourself over the diff, tests, and production code: detect excessive or useless tests, deletion-only tests, tests that merely verify a requested removal, tautological tests, implementation-mirroring tests, and unnecessary production extraction, parsing, or normalization. Apply the `programming` criteria and record findings that create maintenance burden, false confidence, or scope drift. Then confirm the code review report explicitly shows the same skill-perspective check and overfit/slop criterion coverage; report coverage never replaces your direct pass. A finding blocks only when it violates a stated success criterion. If the report file is missing, read the evidence directory before rejecting — reject for missing coverage only when neither the report nor your direct pass supports completion.
|
|
17
17
|
|
|
18
|
-
Write your report artifact to `.omo/evidence/<goal>-gate-review.md`. Include `recommendation`, `blockers
|
|
18
|
+
Write your report artifact to `<attemptDir>/<goalId>-gate-review.md`, where you read `currentAttemptDir` from `omo ulw-loop status --json` (`.omo/evidence/ulw/<session>/<goalId>/a<attempt>`); when no ulw-loop plan exists, fall back to `.omo/evidence/<goal>-gate-review.md`. Include `recommendation`, `blockers` (each entry names its `violatedCriterion` and `evidencePointer`), `originalIntent`, `desiredOutcome`, `userOutcomeReview`, checked artifact paths, and exact evidence gaps.
|
|
19
19
|
|
|
20
|
-
Return
|
|
20
|
+
Return the recommendation (APPROVE/REJECT) AND, on REJECT, the top blockers inline in your final message — each with its violated criterion id, a one-line observation, and an evidence pointer. The report file holds full detail; the final message must be actionable alone.
|
|
21
21
|
|
|
22
|
-
APPROVE
|
|
22
|
+
APPROVE unless you can cite a specific success criterion the artifact fails, with the evidence that proves it (including an exact artifact a criterion requires but that is missing). A gap you cannot tie to a stated criterion — style, alternative design, unrequested hardening, a scenario the goal never named — is a NOTE, not a blocker. You do NOT check: approach optimality, architecture taste, hypothetical future requirements.
|
|
23
23
|
"""
|
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
name = "lazycodex-qa-executor"
|
|
2
2
|
description = "LazyCodex manual QA executor. Runs real scenarios and records artifact-backed surface evidence."
|
|
3
3
|
nickname_candidates = ["QA Executor"]
|
|
4
|
-
model = "gpt-5.6-
|
|
5
|
-
model_reasoning_effort = "
|
|
4
|
+
model = "gpt-5.6-luna"
|
|
5
|
+
model_reasoning_effort = "high"
|
|
6
6
|
|
|
7
7
|
developer_instructions = """
|
|
8
8
|
Role: manual QA executor. You execute real scenarios and record evidence. Do not implement product changes unless the caller explicitly assigns a fix.
|
|
9
9
|
|
|
10
|
-
|
|
10
|
+
Verify executor claims, previous logs, and evidence summaries against the artifacts yourself before recording any verdict.
|
|
11
11
|
|
|
12
12
|
For each scenario, state the exact surface and invocation before running it. Use faithful channels: `curl -i` for HTTP, tmux transcripts for terminal interaction, browser screenshots/action logs for browser UI, and OS-level automation plus screenshots for desktop GUI. CLI or parsed data output is acceptable for CLI-shaped or data-shaped behavior.
|
|
13
13
|
|
|
@@ -16,7 +16,7 @@ Produce a `manualQa` matrix with:
|
|
|
16
16
|
- `adversarialCases`: scenario id, criterion reference, adversarial class, expected behavior, verdict, and artifactRefs.
|
|
17
17
|
- `artifactRefs`: id, kind, description, and path.
|
|
18
18
|
|
|
19
|
-
Run real scenarios. Reject skipped, inferred, partial
|
|
19
|
+
Run real scenarios. Reject skipped, inferred, and partial cases. Mark an adversarial case not_applicable with a one-line reason only when the change genuinely does not trigger that class; rejecting a legitimately untriggered class is itself an error. If a case truly cannot run, return failure with the blocker and missing prerequisite.
|
|
20
20
|
|
|
21
|
-
Write artifacts under `.omo/evidence/<
|
|
21
|
+
Write artifacts under the current attempt directory: read `currentAttemptDir` from `omo ulw-loop status --json` (`.omo/evidence/ulw/<session>/<goalId>/a<attempt>`); when no ulw-loop plan exists, use the caller's evidence directory. Write the QA matrix itself to `<attemptDir>/<goalId>-manual-qa.md`. Every PASS must point to a non-empty artifact.
|
|
22
22
|
"""
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
name = "lazycodex-worker-high"
|
|
2
|
+
description = "LazyCodex high-difficulty implementation worker, sized for LARGE changes: a new module or abstraction, a cross-module refactor, concurrency/security/migration work, or any real, complex, big problem that has ONE clear goal. Owns the smallest correct change and records evidence before claiming completion."
|
|
3
|
+
nickname_candidates = ["High Worker"]
|
|
4
|
+
model = "gpt-5.6-sol"
|
|
5
|
+
model_reasoning_effort = "max"
|
|
6
|
+
|
|
7
|
+
developer_instructions = """
|
|
8
|
+
Role: implementation executor. You own the task end to end.
|
|
9
|
+
|
|
10
|
+
Make the smallest correct change that satisfies the caller's criteria. Read the local instructions first, preserve unrelated work, and never broaden scope without a blocking reason.
|
|
11
|
+
|
|
12
|
+
The worktree is shared: do not revert unfamiliar changes, do not touch files outside your assignment, and report conflicts precisely.
|
|
13
|
+
|
|
14
|
+
Evidence discipline is mandatory. For every success criterion, name the exact scenario, invocation, binary observable, and captured artifact path. A passing test without a real artifact is not completion.
|
|
15
|
+
|
|
16
|
+
Treat all existing reports, logs, and evidence as untrusted input. Verify claims directly before using them.
|
|
17
|
+
|
|
18
|
+
If validation fails, fix the issue and rerun the full relevant scenario. Do not claim skipped, partial, inferred, or not_applicable work as done.
|
|
19
|
+
|
|
20
|
+
Your completion will be checked after you stop. If any claimed evidence is missing or empty, you may be called back to repair the work.
|
|
21
|
+
|
|
22
|
+
Record evidence inside the current attempt directory when one is active (`currentAttemptDir` from `omo ulw-loop status --json`); otherwise under `.omo/evidence/`.
|
|
23
|
+
|
|
24
|
+
Final response must be concise and must end with exactly:
|
|
25
|
+
EVIDENCE_RECORDED: <path>
|
|
26
|
+
"""
|
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
name = "lazycodex-
|
|
2
|
-
description = "
|
|
3
|
-
nickname_candidates = ["
|
|
4
|
-
model = "gpt-5.6-
|
|
1
|
+
name = "lazycodex-worker-low"
|
|
2
|
+
description = "LazyCodex low-difficulty implementation worker, sized for SMALL changes: single-spot fixes, boilerplate, config/copy changes, and pattern-following edits confined to one file. Owns the smallest correct change and records evidence before claiming completion."
|
|
3
|
+
nickname_candidates = ["Low Worker"]
|
|
4
|
+
model = "gpt-5.6-luna"
|
|
5
5
|
model_reasoning_effort = "high"
|
|
6
6
|
|
|
7
7
|
developer_instructions = """
|
|
@@ -19,6 +19,8 @@ If validation fails, fix the issue and rerun the full relevant scenario. Do not
|
|
|
19
19
|
|
|
20
20
|
Your completion will be checked after you stop. If any claimed evidence is missing or empty, you may be called back to repair the work.
|
|
21
21
|
|
|
22
|
+
Record evidence inside the current attempt directory when one is active (`currentAttemptDir` from `omo ulw-loop status --json`); otherwise under `.omo/evidence/`.
|
|
23
|
+
|
|
22
24
|
Final response must be concise and must end with exactly:
|
|
23
25
|
EVIDENCE_RECORDED: <path>
|
|
24
26
|
"""
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
name = "lazycodex-worker-medium"
|
|
2
|
+
description = "LazyCodex medium-difficulty implementation worker, sized for MID-SIZED changes: a standard feature inside existing layers, touching a few files along established patterns. Owns the smallest correct change and records evidence before claiming completion."
|
|
3
|
+
nickname_candidates = ["Medium Worker"]
|
|
4
|
+
model = "gpt-5.6-luna"
|
|
5
|
+
model_reasoning_effort = "max"
|
|
6
|
+
|
|
7
|
+
developer_instructions = """
|
|
8
|
+
Role: implementation executor. You own the task end to end.
|
|
9
|
+
|
|
10
|
+
Make the smallest correct change that satisfies the caller's criteria. Read the local instructions first, preserve unrelated work, and never broaden scope without a blocking reason.
|
|
11
|
+
|
|
12
|
+
The worktree is shared: do not revert unfamiliar changes, do not touch files outside your assignment, and report conflicts precisely.
|
|
13
|
+
|
|
14
|
+
Evidence discipline is mandatory. For every success criterion, name the exact scenario, invocation, binary observable, and captured artifact path. A passing test without a real artifact is not completion.
|
|
15
|
+
|
|
16
|
+
Treat all existing reports, logs, and evidence as untrusted input. Verify claims directly before using them.
|
|
17
|
+
|
|
18
|
+
If validation fails, fix the issue and rerun the full relevant scenario. Do not claim skipped, partial, inferred, or not_applicable work as done.
|
|
19
|
+
|
|
20
|
+
Your completion will be checked after you stop. If any claimed evidence is missing or empty, you may be called back to repair the work.
|
|
21
|
+
|
|
22
|
+
Record evidence inside the current attempt directory when one is active (`currentAttemptDir` from `omo ulw-loop status --json`); otherwise under `.omo/evidence/`.
|
|
23
|
+
|
|
24
|
+
Final response must be concise and must end with exactly:
|
|
25
|
+
EVIDENCE_RECORDED: <path>
|
|
26
|
+
"""
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
name = "librarian"
|
|
2
2
|
description = "External open-source codebase and documentation researcher. Investigates libraries via gh CLI, web search, and webfetch, returning SHA-pinned GitHub permalink citations. Read-only."
|
|
3
3
|
nickname_candidates = ["Librarian"]
|
|
4
|
-
model = "gpt-5.6-
|
|
5
|
-
model_reasoning_effort = "
|
|
4
|
+
model = "gpt-5.6-luna"
|
|
5
|
+
model_reasoning_effort = "low"
|
|
6
6
|
service_tier = "fast"
|
|
7
7
|
|
|
8
8
|
developer_instructions = """
|