Compare commits

...

5 Commits

Author SHA1 Message Date
N0zoM1z0 bbe6a7c31e test(mcp): assert workflow caveats at their declared locations
Main now retains upstream provider caveats in the workflow Evidence envelope
as well as the established graph result. Assert each exact list instead of
counting text occurrences across two distinct contract locations. Also assert
the actual complete graph edges so a caveat cannot silently truncate traversal.

Verified 22 focused workflow Evidence and MCP boundary tests. Product code and
advertised output are unchanged.

Co-authored-by: Kaoru0822 <208281322+kaoru0822-kitauji@users.noreply.github.com>
2026-10-14 03:50:45 +00:00
Kaoru0822 0f1c4611d2 Merge remote-tracking branch 'origin/main' into fix/main-red-ida-javascript-tests 2026-10-14 03:28:53 +00:00
Kaoru0822 d4df0a6f93 test(process): expose the demo helper fixture through the scanned proc root
599a8ee11 replaced the host-wide `ps` scan with a scan of the supplied proc
root, but the reparented demo-helper case only mirrored its process into the
synthetic root in alternate-launcher mode. The renamed `Xvfb` helper was
therefore invisible and the clean-runtime check resolved. Mirror the fixture
process in both modes.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-14 03:28:48 +00:00
Kaoru0822 8a28df4488 test(mcp): leave comparison group completeness to the runtime parser
80de3145e stopped advertising `dependentRequired` and states input groups in
the schema description instead. Passive captures with `normalization` and a
single scenario side with `normalization` therefore satisfy the advertised
projection, while the canonical parser still rejects them before any
provider call. Classify them with the other mixed groups and assert the
description carries the group guidance.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-14 03:27:51 +00:00
Ysopwnable 5830088520
docs(release): review compatibility for the current candidate (#3112)
Review breaking changes and migration notes for the release being prepared; retain the 6.1-to-6.2 guide as historical context.

Fixes #3058.

Co-authored-by: Geekwolf <3125615+geekwolf@users.noreply.github.com>
Co-authored-by: Kaoru0822 <208281322+kaoru0822-kitauji@users.noreply.github.com>
Co-authored-by: factory-droid[bot] <138933559+factory-droid[bot]@users.noreply.github.com>
2026-10-14 11:18:21 +08:00
4 changed files with 47 additions and 27 deletions

View File

@ -84,8 +84,10 @@ registry metadata or changelog disagrees with that version before creating a tag
### Compatibility and version selection
For the 6.2 candidate, review the [6.1 to 6.2 migration guide](migration-6.2.md)
alongside the changelog before publication.
Before publishing a candidate, review its changelog's breaking changes and the
migration notes for the release being prepared. The
[6.1 to 6.2 migration guide](migration-6.2.md) records that release's changes;
it is a historical reference, not the compatibility checklist for later releases.
REA uses Release Please's `always-bump-minor` strategy: every release increments
minor and resets patch, including releases with breaking changes. For example,

View File

@ -110,15 +110,6 @@ describe("browser comparison input boundary", () => {
},
{ before_scenario: {}, after_scenario: {} },
{ before_scenario: scenario.before_scenario },
{ ...passive, normalization: { rules: [] } },
{
before_scenario: scenario.before_scenario,
normalization: { rules: [] },
},
{
after_scenario: scenario.after_scenario,
normalization: { rules: [] },
},
{ ...passive, unexpected: true },
{
...scenario,
@ -133,8 +124,24 @@ describe("browser comparison input boundary", () => {
},
},
];
// The projection leaves group exclusion to the canonical runtime parser.
const mixedGroups = [{ ...passive, ...scenario }];
// Strict clients reject combinators and dependentRequired, so the
// projection states the groups in its description and leaves group
// completeness and exclusion to the canonical runtime parser.
expect(advertised.inputSchema.description).toContain(
"before + after; before_scenario + after_scenario + [normalization]",
);
const mixedGroups = [
{ ...passive, ...scenario },
{ ...passive, normalization: { rules: [] } },
{
before_scenario: scenario.before_scenario,
normalization: { rules: [] },
},
{
after_scenario: scenario.after_scenario,
normalization: { rules: [] },
},
];
for (const { input, advertisedValid, runtimeValid } of [
...[passive, scenario, withoutNormalization].map((input) => ({
input,

View File

@ -91,7 +91,9 @@ describe("enhanced MCP tools", () => {
},
});
});
});
describe("enhanced MCP graph caveats", () => {
it("keeps generic provider caveats visible without truncating complete relationships", async () => {
const caveat = "Decompiler output may omit indirect calls.";
const client = await connect({
@ -113,21 +115,33 @@ describe("enhanced MCP tools", () => {
arguments: { address: "0x1", direction: "forward" },
});
expect(graph.structuredContent).toMatchObject({
limitations: [
"Artifact identity is unavailable for this observation.",
"Derived by an REA composed workflow.",
caveat,
],
normalized_result: {
graph: {
"0": [
{ status: "ok", relationship_coverage: { status: "complete" } },
{
address: "0x1",
calls: ["0x2"],
status: "ok",
relationship_coverage: { status: "complete" },
},
],
"1": [
{ status: "ok", relationship_coverage: { status: "complete" } },
{
address: "0x2",
calls: [],
status: "ok",
relationship_coverage: { status: "complete" },
},
],
},
limitations: [caveat],
},
});
expect(JSON.stringify(graph.structuredContent)?.split(caveat)).toHaveLength(
2,
);
const trace = await client.callTool({
name: "trace_call_path",

View File

@ -74,15 +74,12 @@ it
const { stdout } = await parent;
const { pid } = JSON.parse(stdout) as { pid: number };
orphanPid = pid;
if (alternateMode) {
const processEntry = join(procRoot, String(pid));
await mkdir(processEntry);
for (const name of ["cmdline", "comm", "exe"])
await symlink(
`/proc/${String(pid)}/${name}`,
join(processEntry, name),
);
}
// The runtime check reads only the supplied proc root, so expose the
// fixture there in both modes.
const processEntry = join(procRoot, String(pid));
await mkdir(processEntry);
for (const name of ["cmdline", "comm", "exe"])
await symlink(`/proc/${String(pid)}/${name}`, join(processEntry, name));
const { stdout: coordinates } = await execFileAsync("ps", [
"-p",
String(pid),