refactor: remove placeholder join step

This commit is contained in:
lda
2026-09-05 17:47:57 +07:00 Verified
parent 043bda6a34
commit cccdbc0a47
42 changed files with 88 additions and 309 deletions
@@ -112,7 +112,6 @@ Exactly one step-kind key must be present. Allowed step-kind keys are:
- `use`
- `foreach`
- `interrupt`
- `join`
Zero kind keys or multiple kind keys are validation errors.
@@ -243,19 +242,6 @@ This lowers to the current core `ForeachNode`.
This lowers to the current core `InterruptNode`.
### `join`
```json
{
"join": {}
}
```
This lowers to the current core `JoinNode`.
`join` is not a reverse branch. It remains reserved for actual join/frame
semantics.
## Routes
Most ordinary edges should be authored through `routes`:
@@ -337,7 +323,8 @@ node_c.unreachable
-> runtime_error
```
This is not `join`. It is compressed declaration of several ordinary edges.
This is not synchronization. It is compressed declaration of several ordinary
edges.
Possible later surfaces:
@@ -366,7 +353,7 @@ That should be handled as its own pass, not smuggled into this MCP draft change.
Potential later core work:
- true graph-as-node / subgraph support
- meaningful join semantics
- explicit fork/gather semantics
- future START-edge support if `Workflow.start` changes
### Draft `route` Sugar
@@ -157,7 +157,6 @@ Example:
"SubgraphNode",
"ConditionNode",
"ForeachNode",
"JoinNode",
"EndNode",
"InterruptNode"
]
@@ -85,8 +85,8 @@ semantic operation produces one patch and consumes one revision.
clients do not need to know about the internal service split.
The service boundary is intentionally not capability-only. The current draft
model also represents `end`, `condition`, `interrupt`, `foreach`, `join`,
`when`, `choose`, and `match` steps, and core may gain more step kinds. This
model also represents `end`, `condition`, `interrupt`, `foreach`, `when`,
`choose`, `match`, and subgraph steps, and core may gain more step kinds. This
slice adds semantic operations only where required, but new step-kind helpers
belong in `WorkflowDraftAuthoringApi` rather than a parallel authoring system.
@@ -132,7 +132,6 @@ Node presentation distinguishes the existing core node kinds:
- condition;
- interrupt;
- foreach;
- join;
- end and other control nodes.
Each node shows its stable id and concise semantic label. Selecting a node opens
@@ -226,4 +225,3 @@ The slice is complete when:
7. stale requests and partial failures cannot corrupt newer selections;
8. the `lda_report_workflow` lifecycle is readable without scrolling raw JSON;
9. frontend tests, typecheck, production build, and optional live smoke pass.
@@ -56,7 +56,6 @@ deliberate authoring vocabulary that is later lowered by
- `DraftUseStep`
- `DraftForeachStep`
- `DraftInterruptStep`
- `DraftJoinStep`
- `DraftEndStep`
- `DraftWhenStep`
- `DraftChooseStep`
@@ -149,7 +148,6 @@ Declared top-level outcomes are:
- `foreach`: `loop`, `done`, plus `completed_with_errors` when the item-error
policy is `skip` or `collect`;
- `interrupt`: `interrupt.outcomes`;
- `join`: `done`;
- `subgraph`: `subgraph.outcomes`.
The capability helper remains distinct because it resolves a capability,
@@ -175,7 +173,7 @@ reject malformed or ambiguous step objects before dispatching to the API.
The Python RPC client implements the same method on `WorkflowApi`. Client and
server serialize steps with aliases so fields such as foreach `as` and when
`if` retain their canonical wire names. Round-trip tests cover all nine step
`if` retain their canonical wire names. Round-trip tests cover all eight step
variants, including interrupt schemas and subgraph workflow references.
## CLI Shape
@@ -186,7 +184,6 @@ Register a focused Typer application beneath `wf draft`:
wf draft add capability
wf draft add interrupt
wf draft add foreach
wf draft add join
wf draft add end
wf draft add when
wf draft add choose
@@ -210,7 +207,6 @@ Variant-specific options are:
`--resume LOCAL_SOURCE=STATE_TARGET`, and repeatable `--outcome`;
- `foreach`: `--over`, `--as`, `--mode`, `--item-error`, optional
`--collect-to`, `--max-active`, and `--max-outstanding`;
- `join`: no variant-specific options;
- `end`: `--outcome` and no `--route`;
- `when`: `--condition-file`, `--then`, and `--otherwise`;
- `choose`: `--clauses-file` containing the ordered clause array and
@@ -269,7 +265,7 @@ modules need them; avoid a broad CLI refactor.
### CLI
- `wf draft add --help` lists all nine commands.
- `wf draft add --help` lists all eight commands.
- Per-command help exposes only relevant options.
- Every command builds the expected `DraftStep`, incoming source, and routes.
- Invalid flag combinations fail before calling the API.
@@ -28,7 +28,7 @@ The remaining graph-authoring work is split into independently useful slices:
1. selected-step input and output dataflow;
2. workflow Input, State, and Outcomes contract projections;
3. explicit End authoring and a typed Add step palette;
4. typed interrupt, control, subgraph, foreach, and join forms; and
4. typed interrupt, control, subgraph, and foreach forms; and
5. direct graph gestures lowered through the same canonical mutations.
This document specifies only the first item.
@@ -56,7 +56,7 @@ Slice 6 includes:
Slice 6 excludes:
- explicit End-node creation;
- typed creation forms for interrupt, condition, subgraph, foreach, or join;
- typed creation forms for interrupt, condition, subgraph, or foreach;
- graph gesture binding by drawing edges;
- arbitrary schema inference from runtime values;
- renaming existing step ids;
@@ -140,7 +140,7 @@ independent source of truth once the operation is available.
Standard frame context currently includes values such as prior outcome, active
incoming edge, scope id, lineage id, and parent lineage id. Foreach iteration
frames additionally expose loop item, loop index, and the configured foreach
alias. Future fork/join features may add branch-scoped context through the same
alias. Future fork/gather features may add branch-scoped context through the same
inventory without changing high-level clients.
Context availability is computed by core/API code using workflow graph and
@@ -36,7 +36,7 @@ They are runtime policy, not workflow graph semantics.
**Step Attempt** is one admitted attempt to execute a selected workflow `Step`
in one frame. Node uses, conditions, foreach controllers, subgraph boundaries,
interrupt nodes, joins, and explicit end nodes all count.
interrupt nodes, and explicit end nodes all count.
**Step Number** is the one-based ordinal assigned to an admitted step attempt
within a run.
@@ -256,7 +256,7 @@ with the run.
### Core counting
- A budget of one admits exactly one step and denies the second.
- Node, condition, foreach, subgraph, interrupt, join, and explicit end steps
- Node, condition, foreach, subgraph, interrupt, and explicit end steps
count.
- A transition to legacy `END` does not create an extra attempt.
- Handler failure still consumes its admitted step.