- Stack base commits:
0b02832d136ab9f847cc7a97ef16ba333c013e3a7be4b873252e1d4c715e04bdacd03ab5b9ce2916e9ff9d60565c9f9986c5371cd3710d4fc122ccaa
- This correction follows the architecture-artifact commit on top of PR 3.
- Existing PR #689 remains untouched. Pushes and PR editing belong to delivery, not this feedback step.
- Preserve
scratch/orc19-probe.ts; do not create, remove, prune or repair a worktree.
<Dir path> is not placement-only. It performs one provider-neutral semantic
directory operation before it installs cwd or expands content:
- recursively create the specified directory when it is missing;
- use an existing directory without replacing, clearing or otherwise changing it or its contents;
- refuse a target or intermediate entry that is a file or another non-directory, before content begins;
- resolve a relative path against the enclosing contextual cwd and preserve the component's existing absolute-path behavior;
- expand content with the resulting directory as cwd;
- restore the enclosing cwd on success, failure and cancellation;
- leave created directories in place, including after later content failure or cancellation; and
- change no Repository selection or identity member.
The contract applies to ordinary and workflow runs. Shared <Dir> calls only
the mandatory stable API.Files.ensureDirectory operation. It does not call
API.Fs, @effectionx/fs, a runtime API or RepositoryComposition. The absent
Files provider remains fail-closed, and independently loaded package copies
compose through the stable Api name. All four host entrypoints install the host
Files provider, so Node and Bun retain operational <Dir> behavior despite
having no ordinary repository provider.
The host Files provider resolves the target in the contextual filesystem, recursively creates it directly, accepts an existing directory and maps every documented refusal to the shared sanitized vocabulary. It is deliberately non-transactional: successful creation persists, and neither later content failure nor cancellation triggers rollback or teardown deletion.
The workflow Files provider publishes exactly one workspace_file effect for
the ensure. Recursive mutation runs inside its savepoint. On success, the
mutation, sanitized outcome and resulting Workspace root commit together. A
documented refusal rolls the savepoint back and records the refusal against the
unchanged root. Infrastructure failure or cancellation before commit publishes
neither an outcome nor a root. Completed replay restores the recorded success
and retained root without attempting creation again. No retained field contains
a host path, errno/platform code, raw platform message or cause.
The product decision is settled: selecting allow={["write"]} intentionally
authorizes <Dir>'s persistent recursive directory creation.
Make that authority change visible in retained identity. The paired write-table
entry is @executablemd/workflow/composition/dir-v2#Dir. The former
@executablemd/workflow/composition#Dir identity authorized placement that
created nothing and must never authorize creation. A continuation retaining the
former identity refuses before generated execution and mutation. Read-only
admissions remain unaffected because they never selected the write table.
-
Extend the shared
API.Filescontract with mandatoryensureDirectory(cwd, path)returning EffectionResult<Unit>. Keep the existing fail-closed terminal and stable namespaced Api. -
Implement the operation in the host Files provider through asynchronous Effection filesystem operations. Preserve the host provider's containment and sanitization rules, including the established absolute-Dir exception.
-
Implement it in the transaction-bound workflow Files provider as one named
workspace_fileeffect and savepoint, using the logical Workspace path and root-publication protocol already used by file mutations. -
Change shared
<Dir>ordering to ensure, then install cwd, then expand content. Scope teardown restores cwd only. -
Version the pinned paired Dir origin in the generated write table and cover continuation refusal from the former identity.
-
Keep Repository composition out of the operation. Do not select, replace or reconstruct a Repository from a directory path.
-
Update the component description to the already accepted text, without further product interpretation:
Create or use a directory.
<Dir path={worktree}>…</Dir>changes the working directory for its content.
Do not add a second directory API, a test-only provider fallback, host/runtime detection in shared code, rollback for ordinary host creation or deletion during Dir teardown.
Evidence must distinguish every row; one broad happy-path test does not replace the failure, replay or authority cases.
| ID | Criterion | Discriminating evidence |
|---|---|---|
| ORC6 | Missing directory and ordering | Missing relative parents are created recursively, an absolute target keeps its meaning, and no content begins before the ensure succeeds |
| ORC6a | Existing directory | Existing contents remain byte-identical; the directory is neither replaced nor cleared |
| ORC6b | Non-directory refusal | File and supported special targets, including an intermediate entry, refuse before content with sanitized structural data |
| ORC6c | Cwd restoration | The enclosing cwd is restored after success, printed failure and cancellation |
| ORC6d | Repository invariance | Every Repository identity member and provider selection remains unchanged inside and after Dir |
| ORC6e | Ordinary persistence | Host-created directories remain after success, failed content and cancellation; no teardown delete runs |
| ORC6f | Workflow atomicity | Recursive creation, one workspace_file success and its resulting authoritative root commit together before content |
| ORC6g | Workflow refusal rollback | A documented non-directory refusal rolls back its savepoint, creates no partial parent, begins no content and records the unchanged root |
| ORC6h | Workflow replay/cancellation | Completed replay performs no second ensure and restores the retained root; pre-commit cancellation publishes nothing; later content cancellation preserves the committed directory |
| ORC6i | Generated authority | write admits only paired dir-v2#Dir; the former retained identity refuses before generated execution and creates nothing |
| ORC20 | Retained regression | Repository/Worktree/Git/Issue/PullRequest replay contracts and provider call counts remain unchanged; directory ensure contributes only its own effect/root |
Also extend the shared host Files contract/compiled probe and the absent-provider suite. Exercise the ordinary component under Deno, Node and Bun because the host Files provider is their operational boundary. Exercise workflow creation, existing-directory adoption, refusal rollback, completed replay, current-root publication and cancellation at the retained provider boundary.
Create one production feedback commit on top of the architecture-artifact commit after the smallest focused tests that discriminate these rows pass. Hand back its exact base and SHA, every changed file, every focused command and exact result, the row-to-test mapping, and any deviation. Do not wait for CI or push before requesting the architecture verdict.