oh-my-opencode 4.15.1 → 4.16.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/dist/cli/doctor/checks/tui-plugin-config.d.ts +4 -4
- package/dist/cli/index.js +673 -678
- package/dist/cli/install-senpi/index.d.ts +1 -0
- package/dist/cli/run/poll-for-completion.d.ts +4 -0
- package/dist/cli/run/session-resolver.d.ts +1 -0
- package/dist/cli/senpi-platform-flag.d.ts +4 -0
- package/dist/cli/types.d.ts +2 -1
- package/dist/cli-node/index.js +673 -678
- package/dist/features/background-agent/manager.d.ts +16 -0
- package/dist/hooks/anthropic-context-window-limit-recovery/aggressive-truncation-strategy.d.ts +1 -0
- package/dist/index.js +1334 -1146
- package/dist/skills/debugging/references/methodology/06-fix.md +6 -0
- package/dist/skills/frontend/ATTRIBUTION.md +10 -1
- package/dist/skills/frontend/SKILL.md +8 -3
- package/dist/skills/frontend/references/design/README.md +1 -1
- package/dist/skills/frontend/references/design/_INDEX.md +1 -1
- package/dist/skills/frontend/references/design/lazyweb.md +77 -0
- package/dist/skills/frontend/references/design/stitch-design-example.md +121 -0
- package/dist/skills/programming/SKILL.md +10 -1
- package/dist/skills/programming/references/logging.md +91 -0
- package/dist/skills/ulw-plan/SKILL.md +5 -5
- package/dist/skills/ulw-plan/references/full-workflow.md +7 -7
- package/dist/skills/ulw-plan/references/intent-unclear.md +3 -3
- package/dist/skills/ulw-research/ATTRIBUTION.md +2 -2
- package/dist/skills/ulw-research/SKILL.md +28 -7
- package/dist/tools/skill/description-formatter.d.ts +1 -0
- package/dist/tools/skill/description-formatter.test-support.d.ts +9 -0
- package/dist/tools/skill/zauc-mocks-skill-tools/test-support.d.ts +25 -0
- package/dist/tui.js +121 -419
- package/package.json +32 -15
- package/packages/git-bash-mcp/dist/cli.js +2 -2
- package/packages/omo-codex/plugin/.codex-plugin/plugin.json +1 -1
- package/packages/omo-codex/plugin/components/bootstrap/AGENTS.md +55 -0
- package/packages/omo-codex/plugin/components/bootstrap/dist/cli.js +19 -16
- package/packages/omo-codex/plugin/components/bootstrap/package.json +1 -1
- package/packages/omo-codex/plugin/components/codegraph/AGENTS.md +51 -0
- package/packages/omo-codex/plugin/components/codegraph/dist/cli.js +936 -248
- package/packages/omo-codex/plugin/components/codegraph/dist/serve.js +233 -135
- package/packages/omo-codex/plugin/components/codegraph/package.json +1 -1
- package/packages/omo-codex/plugin/components/codegraph/src/cache-gc.ts +29 -0
- package/packages/omo-codex/plugin/components/codegraph/src/cli.ts +13 -0
- package/packages/omo-codex/plugin/components/codegraph/src/hook-sweep.ts +25 -0
- package/packages/omo-codex/plugin/components/codegraph/src/hook-types.ts +3 -1
- package/packages/omo-codex/plugin/components/codegraph/src/hook.ts +30 -1
- package/packages/omo-codex/plugin/components/codegraph/src/serve.ts +16 -2
- package/packages/omo-codex/plugin/components/codegraph/src/sweep-cli.ts +80 -0
- package/packages/omo-codex/plugin/components/codegraph/test/cache-gc.test.ts +34 -0
- package/packages/omo-codex/plugin/components/codegraph/test/hook-exclusion.test.ts +107 -0
- package/packages/omo-codex/plugin/components/codegraph/test/hook-registration.test.ts +26 -0
- package/packages/omo-codex/plugin/components/codegraph/test/hook-sweep.test.ts +29 -0
- package/packages/omo-codex/plugin/components/codegraph/test/hook.test.ts +8 -21
- package/packages/omo-codex/plugin/components/codegraph/test/mcp-bridge-fixtures.ts +108 -0
- package/packages/omo-codex/plugin/components/codegraph/test/serve-built-wrapper.test.ts +76 -0
- package/packages/omo-codex/plugin/components/codegraph/test/serve-mcp-bridge.test.ts +17 -111
- package/packages/omo-codex/plugin/components/codegraph/test/serve-provision.test.ts +1 -1
- package/packages/omo-codex/plugin/components/codegraph/test/serve.test.ts +45 -67
- package/packages/omo-codex/plugin/components/codegraph/test/sweep-cli.test.ts +56 -0
- package/packages/omo-codex/plugin/components/comment-checker/package.json +1 -1
- package/packages/omo-codex/plugin/components/git-bash/AGENTS.md +31 -0
- package/packages/omo-codex/plugin/components/git-bash/package.json +1 -1
- package/packages/omo-codex/plugin/components/lazycodex-executor-verify/AGENTS.md +45 -0
- package/packages/omo-codex/plugin/components/lazycodex-executor-verify/package.json +1 -1
- package/packages/omo-codex/plugin/components/lsp/package.json +1 -1
- package/packages/omo-codex/plugin/components/rules/bundled-rules/hephaestus.md +37 -102
- package/packages/omo-codex/plugin/components/rules/package.json +1 -1
- package/packages/omo-codex/plugin/components/start-work-continuation/package.json +1 -1
- package/packages/omo-codex/plugin/components/teammode/AGENTS.md +46 -0
- package/packages/omo-codex/plugin/components/teammode/package.json +1 -1
- package/packages/omo-codex/plugin/components/telemetry/dist/cli.js +6 -0
- package/packages/omo-codex/plugin/components/telemetry/dist/posthog.js +6 -0
- package/packages/omo-codex/plugin/components/telemetry/package.json +1 -1
- package/packages/omo-codex/plugin/components/ultrawork/AGENTS.md +5 -2
- package/packages/omo-codex/plugin/components/ultrawork/CHANGELOG.md +2 -0
- package/packages/omo-codex/plugin/components/ultrawork/README.md +3 -3
- package/packages/omo-codex/plugin/components/ultrawork/dist/cli.js +51 -2
- package/packages/omo-codex/plugin/components/ultrawork/package.json +2 -1
- package/packages/omo-codex/plugin/components/ultrawork/scripts/sync-directive.mjs +14 -1
- package/packages/omo-codex/plugin/components/ultrawork/skills/ultrawork/SKILL.md +380 -0
- package/packages/omo-codex/plugin/components/ultrawork/skills/ulw-plan/SKILL.md +5 -2
- package/packages/omo-codex/plugin/components/ultrawork/skills/ulw-plan/references/full-workflow.md +4 -4
- package/packages/omo-codex/plugin/components/ultrawork/skills/ulw-plan/references/intent-unclear.md +2 -2
- package/packages/omo-codex/plugin/components/ultrawork/src/codex-hook.ts +5 -3
- package/packages/omo-codex/plugin/components/ultrawork/src/skill-pointer.ts +56 -0
- package/packages/omo-codex/plugin/components/ultrawork/test/codex-hook.test.ts +4 -4
- package/packages/omo-codex/plugin/components/ultrawork/test/directive-source.test.ts +12 -0
- package/packages/omo-codex/plugin/components/ultrawork/test/package-smoke.test.ts +1 -0
- package/packages/omo-codex/plugin/components/ultrawork/test/skill-pointer.test.ts +82 -0
- package/packages/omo-codex/plugin/components/ulw-loop/CHANGELOG.md +1 -0
- package/packages/omo-codex/plugin/components/ulw-loop/dist/cli.js +56 -5
- package/packages/omo-codex/plugin/components/ulw-loop/dist/codex-hook.d.ts +1 -0
- package/packages/omo-codex/plugin/components/ulw-loop/dist/codex-hook.js +5 -1
- package/packages/omo-codex/plugin/components/ulw-loop/dist/ultrawork-directive.d.ts +2 -1
- package/packages/omo-codex/plugin/components/ulw-loop/dist/ultrawork-directive.js +5 -3
- package/packages/omo-codex/plugin/components/ulw-loop/dist/ultrawork-skill-pointer.d.ts +7 -0
- package/packages/omo-codex/plugin/components/ulw-loop/dist/ultrawork-skill-pointer.js +46 -0
- package/packages/omo-codex/plugin/components/ulw-loop/package.json +1 -1
- package/packages/omo-codex/plugin/components/ulw-loop/src/codex-hook.ts +5 -1
- package/packages/omo-codex/plugin/components/ulw-loop/src/ultrawork-directive.ts +9 -3
- package/packages/omo-codex/plugin/components/ulw-loop/src/ultrawork-skill-pointer.ts +55 -0
- package/packages/omo-codex/plugin/components/ulw-loop/test/ultrawork-directive.test.ts +49 -0
- 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/build-components.mjs +63 -17
- package/packages/omo-codex/plugin/scripts/materialize-shared-upstreams.mjs +10 -3
- package/packages/omo-codex/plugin/scripts/sync-skills.mjs +1 -0
- package/packages/omo-codex/plugin/shared/test/config-loader.test.ts +18 -0
- package/packages/omo-codex/plugin/skills/debugging/references/methodology/06-fix.md +6 -0
- package/packages/omo-codex/plugin/skills/frontend/ATTRIBUTION.md +10 -1
- package/packages/omo-codex/plugin/skills/frontend/SKILL.md +8 -3
- package/packages/omo-codex/plugin/skills/frontend/references/design/README.md +1 -1
- package/packages/omo-codex/plugin/skills/frontend/references/design/_INDEX.md +1 -1
- package/packages/omo-codex/plugin/skills/frontend/references/design/lazyweb.md +77 -0
- package/packages/omo-codex/plugin/skills/frontend/references/design/stitch-design-example.md +121 -0
- package/packages/omo-codex/plugin/skills/programming/SKILL.md +10 -1
- package/packages/omo-codex/plugin/skills/programming/references/logging.md +91 -0
- package/packages/omo-codex/plugin/skills/ultrawork/SKILL.md +380 -0
- package/packages/omo-codex/plugin/skills/ultrawork/agents/openai.yaml +2 -0
- package/packages/omo-codex/plugin/skills/ulw-plan/SKILL.md +5 -2
- package/packages/omo-codex/plugin/skills/ulw-plan/references/full-workflow.md +4 -4
- package/packages/omo-codex/plugin/skills/ulw-plan/references/intent-unclear.md +2 -2
- package/packages/omo-codex/plugin/skills/ulw-research/ATTRIBUTION.md +2 -2
- package/packages/omo-codex/plugin/skills/ulw-research/SKILL.md +28 -7
- package/packages/omo-codex/plugin/test/install-time-build-runtime.test.mjs +1 -1
- package/packages/omo-codex/plugin/test/sync-skills-test-support.mjs +2 -0
- package/packages/omo-codex/plugin/test/ultrawork-skill-pointer.test.mjs +56 -0
- package/packages/omo-codex/plugin/test/ulw-research-epistemic-contract.test.mjs +98 -0
- package/packages/omo-codex/plugin/test/ulw-research-skill-contract.test.mjs +6 -6
- package/packages/omo-codex/scripts/install-dist/install-local.mjs +259 -3954
- package/packages/shared-skills/skills/debugging/references/methodology/06-fix.md +6 -0
- package/packages/shared-skills/skills/frontend/ATTRIBUTION.md +10 -1
- package/packages/shared-skills/skills/frontend/SKILL.md +8 -3
- package/packages/shared-skills/skills/frontend/references/design/README.md +1 -1
- package/packages/shared-skills/skills/frontend/references/design/_INDEX.md +1 -1
- package/packages/shared-skills/skills/frontend/references/design/lazyweb.md +77 -0
- package/packages/shared-skills/skills/frontend/references/design/stitch-design-example.md +121 -0
- package/packages/shared-skills/skills/programming/SKILL.md +10 -1
- package/packages/shared-skills/skills/programming/references/logging.md +91 -0
- package/packages/shared-skills/skills/ulw-plan/SKILL.md +5 -5
- package/packages/shared-skills/skills/ulw-plan/references/full-workflow.md +7 -7
- package/packages/shared-skills/skills/ulw-plan/references/intent-unclear.md +3 -3
- package/packages/shared-skills/skills/ulw-research/ATTRIBUTION.md +2 -2
- package/packages/shared-skills/skills/ulw-research/SKILL.md +28 -7
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
import assert from "node:assert/strict";
|
|
2
|
+
import { spawnSync } from "node:child_process";
|
|
3
|
+
import { existsSync, readFileSync } from "node:fs";
|
|
4
|
+
import { join } from "node:path";
|
|
5
|
+
import test from "node:test";
|
|
6
|
+
|
|
7
|
+
import { root } from "./aggregate-plugin-fixture.mjs";
|
|
8
|
+
|
|
9
|
+
const POINTER_MAX_BYTES = 4096;
|
|
10
|
+
const skillPath = join(root, "skills", "ultrawork", "SKILL.md");
|
|
11
|
+
|
|
12
|
+
function runUserPromptSubmitCli(component, extraArgs = []) {
|
|
13
|
+
const payload = {
|
|
14
|
+
hook_event_name: "UserPromptSubmit",
|
|
15
|
+
session_id: "s-ultrawork-pointer",
|
|
16
|
+
turn_id: "t-ultrawork-pointer",
|
|
17
|
+
transcript_path: null,
|
|
18
|
+
cwd: root,
|
|
19
|
+
model: "gpt-5.5",
|
|
20
|
+
permission_mode: "default",
|
|
21
|
+
prompt: "ulw this change",
|
|
22
|
+
};
|
|
23
|
+
return spawnSync(
|
|
24
|
+
process.execPath,
|
|
25
|
+
[join(root, "components", component, "dist", "cli.js"), "hook", "user-prompt-submit", ...extraArgs],
|
|
26
|
+
{ cwd: root, encoding: "utf8", input: `${JSON.stringify(payload)}\n` },
|
|
27
|
+
);
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
test("#given synced skills #when the ultrawork skill is inspected #then it carries the full directive body", () => {
|
|
31
|
+
assert.equal(existsSync(skillPath), true);
|
|
32
|
+
const skill = readFileSync(skillPath, "utf8");
|
|
33
|
+
const directive = readFileSync(join(root, "components", "ultrawork", "directive.md"), "utf8");
|
|
34
|
+
assert.match(skill, /^---\nname: ultrawork\n/);
|
|
35
|
+
assert.equal(skill.endsWith(directive), true);
|
|
36
|
+
assert.match(skill, /## 1\. Create the goal with binding success criteria/);
|
|
37
|
+
});
|
|
38
|
+
|
|
39
|
+
test("#given the built ultrawork CLI #when a ulw prompt is submitted #then a compact skill pointer is emitted", () => {
|
|
40
|
+
const result = runUserPromptSubmitCli("ultrawork");
|
|
41
|
+
assert.equal(result.status, 0);
|
|
42
|
+
const output = JSON.parse(result.stdout);
|
|
43
|
+
const context = output.hookSpecificOutput.additionalContext;
|
|
44
|
+
assert.match(context, /^<ultrawork-mode>/);
|
|
45
|
+
assert.match(context, /First user-visible line this turn MUST be exactly:/);
|
|
46
|
+
assert.match(context, /create_goal/);
|
|
47
|
+
assert.equal(context.includes(skillPath), true);
|
|
48
|
+
assert.equal(context.includes("Tier triage"), false);
|
|
49
|
+
assert.equal(Buffer.byteLength(context, "utf8") < POINTER_MAX_BYTES, true);
|
|
50
|
+
});
|
|
51
|
+
|
|
52
|
+
test("#given the built ultrawork and ulw-loop CLIs #when both emit the pointer #then the payloads match byte for byte", () => {
|
|
53
|
+
const ultrawork = JSON.parse(runUserPromptSubmitCli("ultrawork").stdout);
|
|
54
|
+
const ulwLoop = JSON.parse(runUserPromptSubmitCli("ulw-loop", ["--with-ultrawork"]).stdout);
|
|
55
|
+
assert.equal(ulwLoop.hookSpecificOutput.additionalContext, ultrawork.hookSpecificOutput.additionalContext);
|
|
56
|
+
});
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
import assert from "node:assert/strict";
|
|
2
|
+
import { readFile } from "node:fs/promises";
|
|
3
|
+
import { dirname, join } from "node:path";
|
|
4
|
+
import test from "node:test";
|
|
5
|
+
import { fileURLToPath } from "node:url";
|
|
6
|
+
import { sharedSkillsRootPath } from "@oh-my-opencode/shared-skills";
|
|
7
|
+
|
|
8
|
+
const root = dirname(dirname(fileURLToPath(import.meta.url)));
|
|
9
|
+
|
|
10
|
+
async function readUlwResearchCopies() {
|
|
11
|
+
const sharedPath = join(sharedSkillsRootPath(), "ulw-research", "SKILL.md");
|
|
12
|
+
const packagedPath = join(root, "skills", "ulw-research", "SKILL.md");
|
|
13
|
+
return [
|
|
14
|
+
{ label: "shared", path: sharedPath, content: await readFile(sharedPath, "utf8") },
|
|
15
|
+
{ label: "packaged", path: packagedPath, content: await readFile(packagedPath, "utf8") },
|
|
16
|
+
];
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
function escapeRegExp(value) {
|
|
20
|
+
return value.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
function markdownSection(content, heading, nextHeading) {
|
|
24
|
+
const headingPattern = new RegExp(`^${escapeRegExp(heading)}\\r?$`, "m");
|
|
25
|
+
const headingMatch = content.match(headingPattern);
|
|
26
|
+
assert.notEqual(headingMatch, null, `SKILL.md section not found: ${heading}`);
|
|
27
|
+
assert.notEqual(headingMatch.index, undefined, `SKILL.md section index not found: ${heading}`);
|
|
28
|
+
const bodyStart = headingMatch.index + headingMatch[0].length;
|
|
29
|
+
if (nextHeading === undefined) return content.slice(bodyStart);
|
|
30
|
+
const nextHeadingIndex = content.indexOf(`\n${nextHeading}`, bodyStart);
|
|
31
|
+
assert.notEqual(nextHeadingIndex, -1, `SKILL.md next section not found: ${nextHeading}`);
|
|
32
|
+
return content.slice(bodyStart, nextHeadingIndex);
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
test("#given ulw-research epistemic instrumentation #when the research contract is inspected #then the meta-layer artifacts and fields are required", async () => {
|
|
36
|
+
for (const copy of await readUlwResearchCopies()) {
|
|
37
|
+
const section = markdownSection(copy.content, "## Epistemic instrumentation", "## Run the swarm as a cooperating team");
|
|
38
|
+
assert.match(section, /intent-diff\.md/i, `${copy.label}: body must require an intent-vs-reality diff artifact`);
|
|
39
|
+
assert.match(section, /expected truth/i, `${copy.label}: intent diff must record expected truth`);
|
|
40
|
+
assert.match(section, /observed reality/i, `${copy.label}: intent diff must record observed reality`);
|
|
41
|
+
assert.match(section, /diff, violated invariant/i, `${copy.label}: intent diff must record the diff gap field and violated invariant`);
|
|
42
|
+
assert.match(section, /claim-graph\.md/i, `${copy.label}: body must require a claim graph`);
|
|
43
|
+
assert.match(section, /independent observation groups/i, `${copy.label}: claim graph must track independent observation groups`);
|
|
44
|
+
assert.match(section, /convergence status/i, `${copy.label}: claim graph must track convergence status`);
|
|
45
|
+
const claimGraphBullet = section.split("\n").find((line) => line.includes("`claim-graph.md`"));
|
|
46
|
+
assert.notEqual(claimGraphBullet, undefined, `${copy.label}: claim graph bullet must exist`);
|
|
47
|
+
assert.match(claimGraphBullet, /single claim store/i, `${copy.label}: claim graph must be the single claim store`);
|
|
48
|
+
assert.match(claimGraphBullet, /risk tier/i, `${copy.label}: claim graph nodes must carry a risk tier`);
|
|
49
|
+
assert.match(claimGraphBullet, /counter-search/i, `${copy.label}: claim graph nodes must carry the counter-search result`);
|
|
50
|
+
assert.match(claimGraphBullet, /primary source/i, `${copy.label}: claim graph nodes must carry primary source backing`);
|
|
51
|
+
assert.match(claimGraphBullet, /verified-claims/i, `${copy.label}: cleared nodes must feed the verified-claims digest`);
|
|
52
|
+
assert.match(section, /observation-manifest\.md/i, `${copy.label}: body must require an observation manifest`);
|
|
53
|
+
assert.match(section, /observer group/i, `${copy.label}: observation manifest must record observer groups`);
|
|
54
|
+
assert.match(section, /independence basis/i, `${copy.label}: observation manifest must record independence basis`);
|
|
55
|
+
assert.match(section, /observed_at/i, `${copy.label}: temporal evidence must include observed_at`);
|
|
56
|
+
assert.match(section, /valid_at|claim_valid_at/i, `${copy.label}: temporal evidence must include a validity field`);
|
|
57
|
+
assert.match(section, /verification-economics\.md/i, `${copy.label}: body must require verification economics`);
|
|
58
|
+
assert.match(section, /cause-disappearance\.md/i, `${copy.label}: body must require cause-disappearance records`);
|
|
59
|
+
assert.match(section, /last_seen/i, `${copy.label}: cause-disappearance records must track last_seen`);
|
|
60
|
+
assert.match(section, /disconfirming observation/i, `${copy.label}: cause-disappearance records must track disconfirming observations`);
|
|
61
|
+
assert.match(section, /no longer observed/i, `${copy.label}: cause-disappearance records must support no-longer-observed verdicts`);
|
|
62
|
+
}
|
|
63
|
+
});
|
|
64
|
+
|
|
65
|
+
test("#given ulw-research readiness gates #when synthesis rules are inspected #then diff closure and independent convergence are required", async () => {
|
|
66
|
+
for (const copy of await readUlwResearchCopies()) {
|
|
67
|
+
const success = markdownSection(copy.content, "## Success criteria", "## Epistemic instrumentation");
|
|
68
|
+
const phase4 = markdownSection(copy.content, "## Phase 4 — Synthesize", "## Phase 5 — Final materials");
|
|
69
|
+
assert.match(success, /intent-vs-reality diff/i, `${copy.label}: success criteria must require intent diff closure`);
|
|
70
|
+
assert.match(success, /independent observation groups/i, `${copy.label}: success criteria must require independent observations`);
|
|
71
|
+
assert.match(success, /convergence/i, `${copy.label}: success criteria must require convergence`);
|
|
72
|
+
assert.match(phase4, /intent-diff\.md/i, `${copy.label}: synthesis must start from the intent diff`);
|
|
73
|
+
assert.match(phase4, /independent-observation convergence/i, `${copy.label}: synthesis must summarize independent convergence`);
|
|
74
|
+
}
|
|
75
|
+
});
|
|
76
|
+
|
|
77
|
+
test("#given ulw-research observation instrumentation #when worker ownership is inspected #then workers return candidates as message text and the orchestrator writes manifests", async () => {
|
|
78
|
+
for (const copy of await readUlwResearchCopies()) {
|
|
79
|
+
assert.match(copy.content, /observation candidates?|claim candidates?/i, `${copy.label}: workers must return claim and observation candidates`);
|
|
80
|
+
assert.match(copy.content, /message text/i, `${copy.label}: claim and observation candidates must travel as message text`);
|
|
81
|
+
assert.match(copy.content, /orchestrator-owned|orchestrator owns/i, `${copy.label}: instrumentation artifacts must be orchestrator-owned`);
|
|
82
|
+
assert.doesNotMatch(
|
|
83
|
+
copy.content,
|
|
84
|
+
/worker[^.]*\b(?:write|append|create)s?\b[^.]*(?:intent-diff|observation-manifest|claim-graph|verification-economics|cause-disappearance)/i,
|
|
85
|
+
`${copy.label}: workers must not write instrumentation artifacts directly`,
|
|
86
|
+
);
|
|
87
|
+
}
|
|
88
|
+
});
|
|
89
|
+
|
|
90
|
+
test("#given the claim graph as the single claim store #when the retired ledger is scanned #then claim-ledger is gone and the gate lives on graph nodes", async () => {
|
|
91
|
+
for (const copy of await readUlwResearchCopies()) {
|
|
92
|
+
assert.doesNotMatch(copy.content, /claim[- ]ledger/i, `${copy.label}: the retired claim-ledger artifact must not appear`);
|
|
93
|
+
const phase3b = markdownSection(copy.content, "## Phase 3b — Lock non-code claims through the claim graph", "## Phase 4 — Synthesize");
|
|
94
|
+
assert.match(phase3b, /claim-graph\.md/i, `${copy.label}: the gate must record outcomes on claim-graph nodes`);
|
|
95
|
+
assert.match(phase3b, /verified-claims/i, `${copy.label}: the verified-claims allowlist digest must survive the merge`);
|
|
96
|
+
assert.match(phase3b, /sole allowlist/i, `${copy.label}: the data-flow-lock must stay self-enforcing`);
|
|
97
|
+
}
|
|
98
|
+
});
|
|
@@ -245,22 +245,22 @@ test("#given ulw-research default swarm #when team guidance is inspected #then t
|
|
|
245
245
|
}
|
|
246
246
|
});
|
|
247
247
|
|
|
248
|
-
test("#given ulw-research non-code verification #when the gate is inspected #then a claim
|
|
248
|
+
test("#given ulw-research non-code verification #when the gate is inspected #then a claim graph / verified-claims data-flow-lock exists", async () => {
|
|
249
249
|
for (const copy of await readUlwResearchCopies()) {
|
|
250
250
|
assert.match(
|
|
251
251
|
copy.content,
|
|
252
|
-
/claim
|
|
253
|
-
`${copy.label}: body must define the non-code claim-
|
|
252
|
+
/claim graph|verified-claims/i,
|
|
253
|
+
`${copy.label}: body must define the non-code claim-graph verification gate`,
|
|
254
254
|
);
|
|
255
255
|
}
|
|
256
256
|
});
|
|
257
257
|
|
|
258
|
-
test("#given ulw-research claim
|
|
258
|
+
test("#given ulw-research claim graph #when ownership is inspected #then workers never write the graph / verified-claims artifact", async () => {
|
|
259
259
|
for (const copy of await readUlwResearchCopies()) {
|
|
260
260
|
assert.doesNotMatch(
|
|
261
261
|
copy.content,
|
|
262
|
-
/worker[^.]*\b(?:write|append|create)s?\b[^.]*(?:
|
|
263
|
-
`${copy.label}: workers must not be instructed to write/append/create the
|
|
262
|
+
/worker[^.]*\b(?:write|append|create)s?\b[^.]*(?:claim[- ]graph|verified-claims)/i,
|
|
263
|
+
`${copy.label}: workers must not be instructed to write/append/create the claim graph or verified-claims`,
|
|
264
264
|
);
|
|
265
265
|
}
|
|
266
266
|
});
|