Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
44 commits
Select commit Hold shift + click to select a range
9b8879f
fix(check): report unresolved authored helper credentials as warnings
Oct 6, 2026
c37b5ad
fix(check): report YAML helper requirements before credential warnings
Oct 6, 2026
435f170
test(check): pin the reported example against the credential refusal
Oct 6, 2026
5cd190d
Keep relayflow working files out of the change
Oct 6, 2026
c8eb1b0
fix(check): keep communication preflight and honest YAML remedies whe…
khaliqgant Oct 8, 2026
72043aa
fix(check): detect f.notion.appendBlock from the parse, not the body …
khaliqgant Oct 8, 2026
aea5c1a
fix(check): keep the appendBlock refusal for an aliased or destructur…
khaliqgant Oct 8, 2026
e8d22fd
fix(check): follow destructured helper methods; reads of f.notion are…
khaliqgant Oct 8, 2026
5205d7f
fix(check): judge helper escapes by an allowlist of read-only positions
khaliqgant Oct 8, 2026
7284ad1
fix(check): say why an alias-inferred appendBlock refusal fired, and …
khaliqgant Oct 8, 2026
e83d2e7
fix(cloud): read integration requirements for every authored flow ext…
khaliqgant Oct 8, 2026
692f5a4
fix(check): computed Notion members cannot rule out appendBlock
khaliqgant Oct 8, 2026
dad1e15
fix(check): computed member access cannot rule out an aliased appendB…
khaliqgant Oct 8, 2026
02e0371
fix(check): computed destructuring keys and rest elements are unknown…
khaliqgant Oct 8, 2026
47f674f
fix(cloud): never prompt to connect integrations for an authored flow…
khaliqgant Oct 8, 2026
e97af0b
fix(check): an escaped f.notion refuses whenever the body names appen…
khaliqgant Oct 8, 2026
4bce310
fix(check): f.notion handed into a call may have any member read from it
khaliqgant Oct 8, 2026
a86730b
fix(check): see a helper hand-off through optional chains and value w…
khaliqgant Oct 8, 2026
7f27b2c
fix(check): any escape but a plain binding hands f.notion to unseen code
khaliqgant Oct 8, 2026
1ea329f
fix(check): follow helper aliases; discarded guards are not hand-offs
khaliqgant Oct 8, 2026
cc58961
refactor(check): attribute appendBlock only for direct f.notion use, …
khaliqgant Oct 8, 2026
3d5b7bd
fix(check): inherited object members on f.notion are unprovable
khaliqgant Oct 8, 2026
970c370
fix(check): earlier comma operands are discarded reads; split the hel…
khaliqgant Oct 8, 2026
b0d467f
fix(check): primitive-returning inherited calls on f.notion stay prov…
khaliqgant Oct 8, 2026
5fc8bc7
fix(check): eval and Function make a Notion appendBlock call unprovable
khaliqgant Oct 8, 2026
3dc4b85
fix(check): template interpolation of f.notion is a read
khaliqgant Oct 8, 2026
caf375d
fix(check): arguments reaches the context; reading appendBlock is not…
khaliqgant Oct 8, 2026
da3a67a
fix(check): instanceof escapes; arguments only for the root; wrapped …
khaliqgant Oct 8, 2026
58664e7
fix(check): the root's arguments regardless of its parameter shape; n…
khaliqgant Oct 8, 2026
5b99a20
fix(check): keep helper diagnostics the trigger leg did not repeat
khaliqgant Oct 8, 2026
1c4dd1b
fix(check): every inherited member on f.notion is unprovable again
khaliqgant Oct 8, 2026
f9e709c
fix(check): prototype tampering makes Notion appendBlock unprovable
khaliqgant Oct 8, 2026
ba49659
fix(check): scan prototype machinery body-wide; local Proxy/Reflect b…
khaliqgant Oct 8, 2026
4965dde
fix(check): string-keyed prototype members; scope local machinery nam…
khaliqgant Oct 8, 2026
27ea02c
Merge remote-tracking branch 'origin/main' into relayflow/flows-softw…
khaliqgant Oct 8, 2026
a6d253d
fix(check): daemon validation also gates flows inspected past a missi…
khaliqgant Oct 8, 2026
d1bb462
fix(check): dynamic keys on prototype-bearing globals are unprovable
khaliqgant Oct 8, 2026
ac06f68
fix(check): destructuring a prototype-bearing global is unprovable
khaliqgant Oct 8, 2026
ec7b706
fix(check): a prototype-bearing global is safe only as a static non-m…
khaliqgant Oct 8, 2026
f568c07
fix(check): a locally defined class or function prototype is not mach…
khaliqgant Oct 8, 2026
14bb42e
fix(check): globals reached through globalThis follow the bare-global…
khaliqgant Oct 8, 2026
aaac448
fix(check): all global-object roots and their chains lead to the guar…
khaliqgant Oct 8, 2026
a96c88b
fix(check): constructor chains reach Function and are prototype machi…
khaliqgant Oct 8, 2026
2b03dd4
fix(check): any unshadowed use of eval is unprovable
khaliqgant Oct 8, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 5 additions & 3 deletions docs/SLACK-HELPER.md
Original file line number Diff line number Diff line change
Expand Up @@ -16,9 +16,11 @@ export default flow('notify', async f => {
```

Provide a relayfile mount with a `slack/` directory.
`flows check notify.flow.ts` refuses visible Slack calls when neither a mount
nor a bot token is available, with `REFUSED [helper_slack.credential_missing]`
and exit status 2.
`flows check notify.flow.ts` reports Slack under `REQUIRES` and warns
`helper_credential_unresolved` when no local mount is available.
Local `flows run` still refuses with `helper_slack.credential_missing` and
exit status 2 before executing the body. `flows schedule`, `flows deploy`,
and `flows run --cloud` check the workspace integration at submit.
Direct bot-token transport is deferred: a token without a mount is refused
as `helper_slack.mount_required`, before running the body. A header can declare
`tools: { slack: true }` for calls hidden behind another
Expand Down
7 changes: 7 additions & 0 deletions docs/SURFACE.md
Original file line number Diff line number Diff line change
Expand Up @@ -1414,6 +1414,13 @@ because it is a footnote to that line. It never refuses, and it is scoped to
`.flow.ts` is checked through its header without compiling step bodies, so it
has no agent steps to count.

Missing local helper mounts similarly produce `helper_credential_unresolved`
on `flows check`, after `REQUIRES` and before the result. Cloud submission
(`schedule`, `deploy`, `run --cloud`) checks the workspace integration and
refuses if Cloud cannot connect it. Local `run` still requires a mount or the
provider's mock mode. Unsupported helper operations remain refusals.
Non-`.flow.*` authored modules also warn, but have no `REQUIRES` line.

`flows check --watch` checks once, then watches the target, its reachable
relative `use:` imports, and the nearest `flows.json` walking up from the
flow directory. Saves are debounced for 150 ms; a change during a check
Expand Down
4 changes: 3 additions & 1 deletion docs/YAML-HELPERS.md
Original file line number Diff line number Diff line change
Expand Up @@ -43,7 +43,9 @@ takes `{issueId, body}`, and `updateIssue` takes `{issueId, args}`.
Configure a relayfile mount containing the provider directory using the same
mount environment variables as TS Slack helpers (`RELAYFILE_MOUNT_PATH`,
`WORKSPACE_ROOT`, `WORKFORCE_SANDBOX_ROOT`, `RELAYFILE_MOUNT_ROOT`, or
`RELAYFILE_ROOT`). `flows check` refuses missing mounts. To run locally:
`RELAYFILE_ROOT`). `flows check` lists the provider under `REQUIRES` and warns
`helper_credential_unresolved` for missing local mounts. Cloud submission checks
workspace integrations; local `flows run` still refuses missing mounts. To run locally:

```sh
flows run notify.yaml --local-agent
Expand Down
13 changes: 13 additions & 0 deletions evidence/helper-check/authored-subset.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
$ cd packages/sdk && npx vitest run tests/authored-flow-slack.test.ts tests/authored-helpers.test.ts -t 'refuses missing credentials|on `.flow.ts` paths too|rejects malformed arguments'

RUN v2.1.9 /home/daytona/.relayflow-v2-supervisor/durable/repository/packages/sdk

✓ tests/authored-helpers.test.ts (6 tests | 5 skipped) 28ms
✓ tests/authored-flow-slack.test.ts (7 tests | 5 skipped) 727ms
✓ authored Slack helper effects > refuses missing credentials before running the body while flows check warns 511ms

Test Files 2 passed (2)
Tests 3 passed | 10 skipped (13)
Start at 13:40:46
Duration 2.58s (transform 1.11s, setup 27ms, collect 2.85s, tests 755ms, environment 0ms, prepare 112ms)

5 changes: 5 additions & 0 deletions evidence/helper-check/build.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
$ npm --prefix packages/sdk run build

> @relayflows/sdk@2.0.42 build
> tsc && node scripts/make-cli-executable.mjs

3 changes: 3 additions & 0 deletions evidence/helper-check/example-check-module.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
$ env -u SLACK_BOT_TOKEN -u RELAYFLOWS_SLACK_MOCK -u RELAYFILE_MOUNT_PATH -u WORKSPACE_ROOT -u WORKFORCE_SANDBOX_ROOT -u RELAYFILE_MOUNT_ROOT -u RELAYFILE_ROOT node --experimental-default-type=module packages/sdk/dist/cli.js check examples/stale-issues/stale-issues.flow.ts
node: bad option: --experimental-default-type=module
exit=9
5 changes: 5 additions & 0 deletions evidence/helper-check/example-check.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
$ env -u SLACK_BOT_TOKEN -u RELAYFLOWS_SLACK_MOCK -u RELAYFILE_MOUNT_PATH -u WORKSPACE_ROOT -u WORKFORCE_SANDBOX_ROOT -u RELAYFILE_MOUNT_ROOT -u RELAYFILE_ROOT node packages/sdk/dist/cli.js check examples/stale-issues/stale-issues.flow.ts
(node:14983) Warning: Failed to load the ES module: /home/daytona/.relayflow-v2-supervisor/durable/repository/examples/stale-issues/stale-issues.flow.ts. Make sure to set "type": "module" in the nearest package.json file or use the .mjs extension.
(Use `node --trace-warnings ...` to show where the warning was created)
REFUSED [invalid_spec] Flow "/home/daytona/.relayflow-v2-supervisor/durable/repository/examples/stale-issues/stale-issues.flow.ts" could not be imported: Cannot use import statement outside a module
exit=2
9 changes: 9 additions & 0 deletions evidence/helper-check/example-module-boundary.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
$ python3 evidence/helper-check/example.py
$ env -u SLACK_BOT_TOKEN -u RELAYFLOWS_SLACK_MOCK -u RELAYFILE_MOUNT_PATH -u WORKSPACE_ROOT -u WORKFORCE_SANDBOX_ROOT -u RELAYFILE_MOUNT_ROOT -u RELAYFILE_ROOT node packages/sdk/dist/cli.js check examples/stale-issues/stale-issues.flow.ts
REQUIRES slack (tools.slack), claude (llm step)
WARNING [helper_credential_unresolved] f.slack needs a slack mount, which is not available locally. flows schedule / flows deploy / flows run --cloud check the integration against your workspace at submit and refuse if Cloud cannot connect it. A local flows run needs a relayfile slack mount (a slack/ directory under RELAYFILE_MOUNT_PATH) or RELAYFLOWS_SLACK_MOCK=1, and refuses with [helper_slack.credential_missing] without one.
CHECK PASSED examples/stale-issues/stale-issues.flow.ts
exit=0
$ env -u SLACK_BOT_TOKEN -u RELAYFLOWS_SLACK_MOCK -u RELAYFILE_MOUNT_PATH -u WORKSPACE_ROOT -u WORKFORCE_SANDBOX_ROOT -u RELAYFILE_MOUNT_ROOT -u RELAYFILE_ROOT node packages/sdk/dist/cli.js run examples/stale-issues/stale-issues.flow.ts --input '{"repo":"acme/api","channel":"#eng"}'
REFUSED [helper_slack.credential_missing] f.slack requires a relayfile slack mount; direct-token transport is not implemented.
exit=2
3 changes: 3 additions & 0 deletions evidence/helper-check/example-run-module.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
$ env -u SLACK_BOT_TOKEN -u RELAYFLOWS_SLACK_MOCK -u RELAYFILE_MOUNT_PATH -u WORKSPACE_ROOT -u WORKFORCE_SANDBOX_ROOT -u RELAYFILE_MOUNT_ROOT -u RELAYFILE_ROOT node --experimental-default-type=module packages/sdk/dist/cli.js run examples/stale-issues/stale-issues.flow.ts --input '{"repo":"acme/api","channel":"#eng"}'
node: bad option: --experimental-default-type=module
exit=9
5 changes: 5 additions & 0 deletions evidence/helper-check/example-run.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
$ env -u SLACK_BOT_TOKEN -u RELAYFLOWS_SLACK_MOCK -u RELAYFILE_MOUNT_PATH -u WORKSPACE_ROOT -u WORKFORCE_SANDBOX_ROOT -u RELAYFILE_MOUNT_ROOT -u RELAYFILE_ROOT node packages/sdk/dist/cli.js run examples/stale-issues/stale-issues.flow.ts --input '{"repo":"acme/api","channel":"#eng"}'
(node:15007) Warning: Failed to load the ES module: /home/daytona/.relayflow-v2-supervisor/durable/repository/examples/stale-issues/stale-issues.flow.ts. Make sure to set "type": "module" in the nearest package.json file or use the .mjs extension.
(Use `node --trace-warnings ...` to show where the warning was created)
REFUSED [invalid_spec] Flow "/home/daytona/.relayflow-v2-supervisor/durable/repository/examples/stale-issues/stale-issues.flow.ts" could not be imported: Cannot use import statement outside a module
exit=2
23 changes: 23 additions & 0 deletions evidence/helper-check/example.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
from pathlib import Path
import os, shlex, subprocess
boundary = Path('examples/stale-issues/package.json')
assert not boundary.exists()
env = os.environ.copy()
keys = ['SLACK_BOT_TOKEN', 'RELAYFLOWS_SLACK_MOCK', 'RELAYFILE_MOUNT_PATH',
'WORKSPACE_ROOT', 'WORKFORCE_SANDBOX_ROOT', 'RELAYFILE_MOUNT_ROOT', 'RELAYFILE_ROOT']
for key in keys:
env.pop(key, None)
# This checkout lacks a module boundary for examples; the installed CLI normally
# runs in an author's module project. Restore the checkout even on failure.
boundary.write_text('{"type":"module"}\n')
try:
for verb in ['check', 'run']:
cmd = ['node', 'packages/sdk/dist/cli.js', verb, 'examples/stale-issues/stale-issues.flow.ts']
if verb == 'run':
cmd += ['--input', '{"repo":"acme/api","channel":"#eng"}']
result = subprocess.run(cmd, env=env, text=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
print('$ env ' + ' '.join('-u ' + key for key in keys) + ' ' + shlex.join(cmd))
print(result.stdout, end='')
print(f'exit={result.returncode}')
finally:
boundary.unlink()
36 changes: 36 additions & 0 deletions evidence/helper-check/mutation-notion-fail.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
$ npx vitest run tests/check-helper-surface.test.ts -t still refuses unsupported notion

RUN v2.1.9 /home/daytona/.relayflow-v2-supervisor/durable/repository/packages/sdk

❯ tests/check-helper-surface.test.ts (11 tests | 1 failed | 10 skipped) 590ms
× still refuses unsupported notion appendBlock without a mount 588ms
→ expected +0 to be 2 // Object.is equality

⎯⎯⎯⎯⎯⎯⎯ Failed Tests 1 ⎯⎯⎯⎯⎯⎯⎯

FAIL tests/check-helper-surface.test.ts > still refuses unsupported notion appendBlock without a mount
AssertionError: expected +0 to be 2 // Object.is equality

- Expected
+ Received

- 2
+ 0

❯ tests/check-helper-surface.test.ts:80:23
78| ])('still refuses unsupported %s without a mount', async (_name, body)…
79| const result = await check(fixture(body));
80| expect(result.exit).toBe(2);
| ^
81| expect(result.stderr.join('\n')).toContain('[helper_provider.unsuppo…
82| });

⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[1/1]⎯

Test Files 1 failed (1)
Tests 1 failed | 10 skipped (11)
Start at 13:39:11
Duration 2.56s (transform 1.12s, setup 18ms, collect 1.72s, tests 590ms, environment 0ms, prepare 84ms)


exit=1
13 changes: 13 additions & 0 deletions evidence/helper-check/mutation-notion-pass.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
$ npx vitest run tests/check-helper-surface.test.ts -t still refuses unsupported notion

RUN v2.1.9 /home/daytona/.relayflow-v2-supervisor/durable/repository/packages/sdk

✓ tests/check-helper-surface.test.ts (11 tests | 10 skipped) 90ms

Test Files 1 passed (1)
Tests 1 passed | 10 skipped (11)
Start at 13:39:14
Duration 2.16s (transform 1.23s, setup 20ms, collect 1.87s, tests 90ms, environment 0ms, prepare 50ms)


exit=0
29 changes: 29 additions & 0 deletions evidence/helper-check/mutation-placement-fail.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
$ npx vitest run tests/check-helper-surface.test.ts -t reports the declared integration once

RUN v2.1.9 /home/daytona/.relayflow-v2-supervisor/durable/repository/packages/sdk

❯ tests/check-helper-surface.test.ts (11 tests | 1 failed | 10 skipped) 542ms
× reports the declared integration once after REQUIRES and before CHECK PASSED 541ms
→ expected 0 to be greater than 1

⎯⎯⎯⎯⎯⎯⎯ Failed Tests 1 ⎯⎯⎯⎯⎯⎯⎯

FAIL tests/check-helper-surface.test.ts > reports the declared integration once after REQUIRES and before CHECK PASSED
AssertionError: expected 0 to be greater than 1
❯ tests/check-helper-surface.test.ts:57:19
55| const passed = result.lines.findIndex(line => line.includes('CHECK P…
56| expect(requires).toBeGreaterThanOrEqual(0);
57| expect(warning).toBeGreaterThan(requires);
| ^
58| expect(passed).toBeGreaterThan(warning);
59| expect(result.stderr.filter(line => line.includes('[helper_credentia…

⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[1/1]⎯

Test Files 1 failed (1)
Tests 1 failed | 10 skipped (11)
Start at 13:39:05
Duration 2.45s (transform 1.09s, setup 16ms, collect 1.70s, tests 542ms, environment 0ms, prepare 42ms)


exit=1
14 changes: 14 additions & 0 deletions evidence/helper-check/mutation-placement-pass.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
$ npx vitest run tests/check-helper-surface.test.ts -t reports the declared integration once

RUN v2.1.9 /home/daytona/.relayflow-v2-supervisor/durable/repository/packages/sdk

✓ tests/check-helper-surface.test.ts (11 tests | 10 skipped) 577ms
✓ reports the declared integration once after REQUIRES and before CHECK PASSED 576ms

Test Files 1 passed (1)
Tests 1 passed | 10 skipped (11)
Start at 13:39:08
Duration 2.58s (transform 1.19s, setup 17ms, collect 1.80s, tests 577ms, environment 0ms, prepare 53ms)


exit=0
82 changes: 82 additions & 0 deletions evidence/helper-check/mutation-shipped-example.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,82 @@
# Mutation verification — the shipped-example regression test

## 1. Revert the fix (the authored `.flow.ts` opt-in in cli.ts)

```
$ sed -i 's/ const invocation = { warnUnresolvedHelperCredential: true };/ const invocation = {};/' packages/sdk/src/cli.ts
$ git diff packages/sdk/src/cli.ts
@@ -447,3 +447,3 @@ export async function runCli(
async function checkAuthoredFlowComposed(path: string): Promise<{ report: CheckReport }> {
- const invocation = { warnUnresolvedHelperCredential: true };
+ const invocation = {};
const helper = await checkHelperBody(path, invocation);
$ sha256sum packages/sdk/src/cli.ts
d5b85a21a85115a0561011ed4dbda1b5f86a28d915c33c3466a07dfd45926f5d packages/sdk/src/cli.ts
```

## 2. The test fails, with exactly the refusal from the report

```
$ cd packages/sdk && ./node_modules/.bin/vitest run tests/check-helper-surface.test.ts -t "answers the shipped Cloud-bound stale-issues example instead of refusing it"

RUN v2.1.9 /home/daytona/.relayflow-v2-supervisor/durable/repository/packages/sdk

❯ tests/check-helper-surface.test.ts (16 tests | 1 failed | 15 skipped) 99ms
× answers the shipped Cloud-bound stale-issues example instead of refusing it 98ms
→ expected [ Array(1) ] to deeply equal []

⎯⎯⎯⎯⎯⎯⎯ Failed Tests 1 ⎯⎯⎯⎯⎯⎯⎯

FAIL tests/check-helper-surface.test.ts > answers the shipped Cloud-bound stale-issues example instead of refusing it
AssertionError: expected [ Array(1) ] to deeply equal []

- Expected
+ Received

- Array []
+ Array [
+ "REFUSED [helper_slack.credential_missing] f.slack requires a relayfile slack mount; direct-token transport is not implemented.",
+ ]

❯ tests/check-helper-surface.test.ts:85:68
83| // workspace integration at submit, so inspection has to answer, not…
84| const result = await check(shippedExample('stale-issues'));
85| expect(result.stderr.filter(line => line.startsWith('REFUSED'))).toE…
| ^
86| expect(result.exit).toBe(0);
87| expect(result.stdout).toContain('REQUIRES slack (tools.slack), claud…

⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[1/1]⎯

Test Files 1 failed (1)
Tests 1 failed | 15 skipped (16)
Start at 14:15:50
Duration 2.00s (transform 1.10s, setup 17ms, collect 1.70s, tests 99ms, environment 0ms, prepare 41ms)

```

## 3. Restore byte-for-byte

```
$ cp /tmp/cli.ts.orig packages/sdk/src/cli.ts
$ git diff --stat packages/sdk/src/cli.ts # empty: identical to HEAD
$ sha256sum packages/sdk/src/cli.ts
83e60fd1e04acdc5ea679585c23923fd93fafd335c72077df776e0da9585d33c packages/sdk/src/cli.ts
```

## 4. The test passes again

```
$ cd packages/sdk && ./node_modules/.bin/vitest run tests/check-helper-surface.test.ts -t "answers the shipped Cloud-bound stale-issues example instead of refusing it"

RUN v2.1.9 /home/daytona/.relayflow-v2-supervisor/durable/repository/packages/sdk

✓ tests/check-helper-surface.test.ts (16 tests | 15 skipped) 573ms
✓ answers the shipped Cloud-bound stale-issues example instead of refusing it 572ms

Test Files 1 passed (1)
Tests 1 passed | 15 skipped (16)
Start at 14:15:52
Duration 3.11s (transform 1.55s, setup 13ms, collect 2.35s, tests 573ms, environment 0ms, prepare 39ms)

```
25 changes: 25 additions & 0 deletions evidence/helper-check/regression-final.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
$ cd packages/sdk && npx vitest run tests/check-helper-surface.test.ts tests/check-worker-surface.test.ts tests/preflight.test.ts tests/helpers-fanout.test.ts tests/helper-reference.test.ts tests/flow-requirements.test.ts tests/flow-extension-compose.test.ts

RUN v2.1.9 /home/daytona/.relayflow-v2-supervisor/durable/repository/packages/sdk

✓ tests/helper-reference.test.ts (30 tests) 22ms
✓ tests/preflight.test.ts (70 tests) 100ms
✓ tests/check-worker-surface.test.ts (11 tests) 88ms
✓ tests/flow-requirements.test.ts (14 tests) 1030ms
✓ flows check prints REQUIRES > names the helper, the harness and the mcp server of an authored flow 786ms
✓ tests/helpers-fanout.test.ts (96 tests) 156ms
✓ tests/check-helper-surface.test.ts (15 tests) 4150ms
✓ reports the declared integration once after REQUIRES and before CHECK PASSED 479ms
✓ keeps default and explicit opt-out checks strict, and local run refuses before attach 339ms
✓ preserves requirements when compilation refuses and for named agents 2248ms
✓ tests/flow-extension-compose.test.ts (33 tests) 5886ms
✓ composing flow extensions onto a base flow > composes two extensions in declaration order, and the order is the lockfile order 445ms
✓ composing flow extensions onto a base flow > flows check reports the composition and keeps the composed triggers deliverable 973ms
✓ composing flow extensions onto a base flow > flows check probes extension preflight before reporting the project healthy 305ms
✓ composing flow extensions onto a base flow > uses extension permissions for hosted deploy preflight and the deploy body 322ms

Test Files 7 passed (7)
Tests 269 passed (269)
Start at 13:40:37
Duration 7.93s (transform 1.99s, setup 57ms, collect 6.67s, tests 11.43s, environment 1ms, prepare 287ms)

26 changes: 26 additions & 0 deletions evidence/helper-check/regression-shipped-example.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
$ cd packages/sdk && ./node_modules/.bin/vitest run tests/check-helper-surface.test.ts tests/authored-flow-slack.test.ts tests/check-worker-surface.test.ts tests/flow-requirements.test.ts tests/preflight.test.ts tests/helpers-fanout.test.ts tests/helper-reference.test.ts tests/flow-extension-compose.test.ts

RUN v2.1.9 /home/daytona/.relayflow-v2-supervisor/durable/repository/packages/sdk

✓ tests/preflight.test.ts (70 tests) 104ms
✓ tests/helper-reference.test.ts (30 tests) 34ms
✓ tests/authored-flow-slack.test.ts (7 tests) 1947ms
✓ authored Slack helper effects > refuses missing credentials before running the body while flows check warns 441ms
✓ authored Slack helper effects > replays after SIGKILL before confirm with the same token and one successful completion 508ms
✓ authored Slack helper effects > replays after SIGKILL before complete with the same token and one successful completion 496ms
✓ tests/flow-requirements.test.ts (14 tests) 797ms
✓ flows check prints REQUIRES > names the helper, the harness and the mcp server of an authored flow 533ms
✓ tests/check-worker-surface.test.ts (11 tests) 91ms
✓ tests/helpers-fanout.test.ts (96 tests) 190ms
✓ tests/flow-extension-compose.test.ts (33 tests) 5949ms
✓ composing flow extensions onto a base flow > composes two extensions in declaration order, and the order is the lockfile order 476ms
✓ composing flow extensions onto a base flow > flows check reports the composition and keeps the composed triggers deliverable 962ms
✓ tests/check-helper-surface.test.ts (16 tests) 5008ms
✓ reports the declared integration once after REQUIRES and before CHECK PASSED 456ms
✓ preserves requirements when compilation refuses and for named agents 3058ms

Test Files 8 passed (8)
Tests 277 passed (277)
Start at 14:16:19
Duration 8.95s (transform 1.61s, setup 73ms, collect 5.86s, tests 14.12s, environment 1ms, prepare 366ms)

Loading
Loading