chore: remove progress reports
This commit is contained in:
@@ -1,19 +0,0 @@
|
||||
# SDD ledger — plan: docs/historical/superpowers/plans/2026-08-12-composite-input-expressions.md
|
||||
|
||||
Task 1: complete (`b38cc325`, fix `e661691e`, approved)
|
||||
|
||||
Task 2: complete (`acda465d`, fix `b216521f`, approved)
|
||||
|
||||
Task 3: complete (`fa22a1a6`, fixes `4120174a`, `03150a5c`, `0eeb6079`, approved)
|
||||
|
||||
Task 4: complete (`144152a0`, fix `c259ba73`, approved)
|
||||
|
||||
Task 5: complete (`1bb684bf`, fixes `cca1be89`, `0a7996da`, approved)
|
||||
|
||||
Task 6: complete (`b8a16a0`, fixes `29d7a11d`, `18c9ef12`, approved)
|
||||
|
||||
Task 7: complete (`c062680c`, fixes `01b33c8c`, `5f09765f`, `7923254f`, approved; React Doctor 100/100)
|
||||
|
||||
Task 8: complete in the shared worktree; focused proofs pass. The scoped Python
|
||||
regression retains six pre-existing admin/schema failures, and repository-wide
|
||||
format/type gates retain their pre-existing failures; see task-8-report.md.
|
||||
@@ -1,57 +0,0 @@
|
||||
# Task 1 Review Fix Report
|
||||
|
||||
## Status
|
||||
|
||||
Fixed P1 findings #1 and #2 from `task-1-review.md`. P2 #3 was intentionally left for the planned Python API/runtime tasks.
|
||||
|
||||
## Fixes
|
||||
|
||||
### P1 #1: Prebuilt expression limits
|
||||
|
||||
`InputExpressionBinding.check_limits()` now converts an already-constructed Pydantic expression model with `model_dump(mode="python")` before invoking the raw-tree limit walker. This keeps the same bounded validation path for both JSON mappings and prebuilt `ArrayExpression`/`LiteralExpression` instances.
|
||||
|
||||
Added regressions for:
|
||||
|
||||
- a prebuilt array containing 1,024 literal expressions;
|
||||
- a prebuilt literal containing 64 nested JSON containers.
|
||||
|
||||
Both now fail with the configured node/depth validation errors instead of bypassing the limits.
|
||||
|
||||
### P1 #2: Strict JSON mapping boundary
|
||||
|
||||
`validate_strict_json_value()` now accepts native `dict` containers, matching the original strict contract, rather than every `collections.abc.Mapping`. A `UserDict` is rejected instead of being silently converted into a JSON-shaped dictionary.
|
||||
|
||||
Added a regression covering `UserDict` through the literal-expression boundary.
|
||||
|
||||
### P2 #3: Deferred builder/runtime carry-through
|
||||
|
||||
No change. Task 1 is persistence-only. The existing adapter cast remains documented as a temporary boundary because Task 4 widens builder signatures and Task 2 adds runtime resolution. No Task 1 persistence test is broken by leaving that work deferred.
|
||||
|
||||
## TDD And Verification
|
||||
|
||||
The new review regressions were run before the production fixes and failed as expected: `3 failed, 14 passed`. After the fixes, the focused expression suite passed with `17 passed`.
|
||||
|
||||
Final commands:
|
||||
|
||||
```powershell
|
||||
uv run pytest tests/core/test_input_expressions.py tests/core/test_canonical_node_bindings.py tests/artifacts/test_draft_models.py -q
|
||||
uv run basedpyright --level error src/wf_core/models src/wf_artifacts/drafts
|
||||
uv run ruff check src/wf_core/models src/wf_artifacts/drafts tests/core/test_input_expressions.py tests/core/test_canonical_node_bindings.py tests/artifacts/test_draft_models.py
|
||||
uv run ruff format --check src/wf_core/models src/wf_artifacts/drafts tests/core/test_input_expressions.py tests/core/test_canonical_node_bindings.py tests/artifacts/test_draft_models.py
|
||||
git diff --check
|
||||
```
|
||||
|
||||
Results before the fix commit:
|
||||
|
||||
- `70 passed`
|
||||
- `basedpyright`: `0 errors, 0 warnings, 0 notes`
|
||||
- Ruff check: all checks passed
|
||||
- Ruff format: all files already formatted
|
||||
- Git diff check: clean apart from normal Windows line-ending warnings
|
||||
|
||||
## Changed Files
|
||||
|
||||
- `src/wf_core/models/input_bindings.py`
|
||||
- `src/wf_core/models/json_values.py`
|
||||
- `tests/core/test_input_expressions.py`
|
||||
- This report file
|
||||
@@ -1,54 +0,0 @@
|
||||
# Task 1 Report: Canonical Input Expressions And Persistence
|
||||
|
||||
## Status
|
||||
|
||||
Implemented and verified. The task adds a recursive, discriminated input-expression model and widens only node-local persisted input/request fields. Workflow-level output remains on the existing simple path/value union.
|
||||
|
||||
## Changed Content
|
||||
|
||||
- Added `src/wf_core/models/json_values.py` with the shared recursive `JsonValue` type and strict JSON validator.
|
||||
- Added `src/wf_core/models/input_bindings.py` with path/value bindings, literal/path/array/object expressions, `InputExpressionBinding`, `StepInputBinding`, and bounded raw-tree validation.
|
||||
- Updated `src/wf_core/models/steps.py` to preserve legacy binding imports while using `StepInputBinding` for `NodeUse.input`, `SubgraphNode.input`, and `InterruptNode.request`.
|
||||
- Updated `src/wf_artifacts/drafts/models.py` to use `StepInputBinding` for draft use, subgraph, and interrupt input fields.
|
||||
- Exported the new public models and JSON helpers from `wf_core.models` and `wf_core`.
|
||||
- Added a narrow typed cast in `src/wf_artifacts/drafts/adapter.py` because the existing Python authoring builder remains simple-binding-only until the later API carry-through task. This preserves Task 1 persistence without pretending runtime authoring support is already complete.
|
||||
- Added model and persistence coverage in `tests/core/test_input_expressions.py`, `tests/core/test_canonical_node_bindings.py`, and `tests/artifacts/test_draft_models.py`.
|
||||
|
||||
## Behavior Covered
|
||||
|
||||
- The exact composite object/array/path/literal binding round-trips through `NodeUse`, `SubgraphNode`, `InterruptNode`, `DraftUseStep`, `DraftSubgraphPayload`, and `DraftInterruptPayload`.
|
||||
- Workflow final-output parsing rejects composite expressions and keeps the existing simple union.
|
||||
- Existing path/value bindings dump unchanged.
|
||||
- Extra fields are rejected at binding and expression nodes.
|
||||
- Literal expressions accept only strict finite JSON values; tuples, sets, NaN, and infinity are rejected.
|
||||
- Expression depth is bounded at 64 levels.
|
||||
- Total expression/container nodes are bounded at 1,024.
|
||||
- Malformed raw expression structures are left for normal Pydantic validation rather than recursively trusted by the limit walker.
|
||||
|
||||
## TDD And Verification
|
||||
|
||||
The new model suite was first run before production implementation and failed during collection because `InputExpressionBinding` did not exist. After implementation, the focused suite passed.
|
||||
|
||||
Commands run:
|
||||
|
||||
```powershell
|
||||
uv run pytest tests/core/test_input_expressions.py tests/core/test_canonical_node_bindings.py tests/artifacts/test_draft_models.py -q
|
||||
uv run basedpyright --level error src/wf_core/models src/wf_artifacts/drafts
|
||||
uv run ruff check src/wf_core/models src/wf_artifacts/drafts tests/core/test_input_expressions.py tests/core/test_canonical_node_bindings.py tests/artifacts/test_draft_models.py
|
||||
uv run ruff format --check src/wf_core/models src/wf_artifacts/drafts tests/core/test_input_expressions.py tests/core/test_canonical_node_bindings.py tests/artifacts/test_draft_models.py
|
||||
git diff --check
|
||||
```
|
||||
|
||||
Results:
|
||||
|
||||
- `67 passed`
|
||||
- `basedpyright`: `0 errors, 0 warnings, 0 notes`
|
||||
- Ruff check: all checks passed
|
||||
- Ruff format: all files already formatted
|
||||
- Git diff check: clean apart from normal Windows line-ending warnings
|
||||
|
||||
## Concerns And Follow-Up
|
||||
|
||||
- Composite expressions are persisted and decoded by the core/draft models, but the Python authoring builder and runtime resolution paths still require the later planned carry-through task.
|
||||
- The adapter cast is deliberately isolated at that boundary and documented so future API work can replace it with a widened authoring input type rather than spreading casts.
|
||||
- No transport, CLI, TypeScript, or console changes are included in this task.
|
||||
@@ -1,40 +0,0 @@
|
||||
# Task 2 Review Fix Report
|
||||
|
||||
## Status
|
||||
|
||||
Fixed the sole Task 2 review finding: direct `InputPathBinding` resolution now
|
||||
preserves the pre-Task 2 runtime behavior, while composite `PathExpression`
|
||||
leaves retain strict `JsonValue` validation.
|
||||
|
||||
## Change
|
||||
|
||||
`resolve_step_input_bindings()` now forwards values from direct path bindings
|
||||
unchanged into `set_local_value`. This preserves both identity and legacy
|
||||
acceptance of opaque runtime values. `resolve_input_expression()` continues to
|
||||
call `validate_strict_json_value()` for composite path leaves, as required by
|
||||
the composite expression contract.
|
||||
|
||||
No Task 4 authoring adapter files were modified.
|
||||
|
||||
## TDD Evidence
|
||||
|
||||
- RED: the new legacy identity test failed because the direct path branch
|
||||
rejected an opaque nested object through strict JSON validation.
|
||||
- GREEN: removing validation from only the direct path branch made the legacy
|
||||
test pass while the composite path strictness regression remained passing.
|
||||
|
||||
## Verification
|
||||
|
||||
- Shared resolver tests: `9 passed`.
|
||||
- Task 2 focused/core selection: `37 passed`.
|
||||
- Full core suite: `287 passed`.
|
||||
- Ruff check: clean for all changed files.
|
||||
- Ruff format check: clean.
|
||||
- Scoped basedpyright: `0 errors, 0 warnings, 0 notes` for
|
||||
`src/wf_core/runtime` and `src/wf_core/validation`.
|
||||
- `git diff --check`: clean apart from normal Windows line-ending warnings.
|
||||
|
||||
## Concerns
|
||||
|
||||
- The Task 4 Python authoring adapter widening remains intentionally separate
|
||||
and was not touched by this fix.
|
||||
@@ -1,54 +0,0 @@
|
||||
# Task 2 Report: Resolve And Validate Expressions In Core Execution
|
||||
|
||||
## Status
|
||||
|
||||
Implemented and verified. Core runtime input resolution now supports the
|
||||
canonical composite input expressions from Task 1 across node execution,
|
||||
prepared subgraph boundaries, and interrupt requests. Structural validation
|
||||
walks every nested path expression while keeping each top-level binding
|
||||
atomic for target-overlap checks.
|
||||
|
||||
## Changed Content
|
||||
|
||||
- Added `src/wf_core/runtime/input_bindings.py` with:
|
||||
- `resolve_input_expression()` for literal, path, array, and object nodes;
|
||||
- `resolve_step_input_bindings()` for simple and composite bindings;
|
||||
- strict JSON validation for values read from graph sources;
|
||||
- location-preserving `WorkflowExecutionError` messages for missing paths and
|
||||
local-target failures.
|
||||
- Replaced duplicated input-binding loops in:
|
||||
- `src/wf_core/runtime/ops/nodes.py`;
|
||||
- `src/wf_core/runtime/subgraphs.py`;
|
||||
- `src/wf_core/runtime/ops/interrupts.py`.
|
||||
- Extended `src/wf_core/validation/steps.py` to accept `StepInputBinding`,
|
||||
recursively validate every `PathExpression`, and report nested source paths
|
||||
such as `nodes[0].input[0].expression.fields.name.path`.
|
||||
- Added runtime and validation coverage in:
|
||||
- `tests/core/test_input_expression_runtime.py`;
|
||||
- `tests/core/test_mapping_validation.py`.
|
||||
|
||||
## TDD Evidence
|
||||
|
||||
- RED: the new focused suite initially failed during collection because the
|
||||
shared runtime resolver module did not exist.
|
||||
- GREEN: after implementation, the focused suite passed and was extended with
|
||||
explicit input/context path, nested location, and local-target failure cases.
|
||||
|
||||
## Verification
|
||||
|
||||
- Focused Task 2 suites: `35 passed`.
|
||||
- Full core suite: `285 passed`.
|
||||
- Ruff check: clean for all changed source and test files.
|
||||
- Ruff format check: all changed files already formatted.
|
||||
- Scoped basedpyright: `0 errors, 0 warnings, 0 notes` for
|
||||
`src/wf_core/runtime` and `src/wf_core/validation`.
|
||||
- `git diff --check`: clean apart from normal Windows line-ending warnings.
|
||||
|
||||
## Concerns
|
||||
|
||||
- The Python authoring builder and artifact adapter still carry the separate
|
||||
Task 1 follow-up for widening `InputBindingArg`; this task intentionally
|
||||
consumes the canonical models at the core runtime boundary and does not
|
||||
redesign that authoring API.
|
||||
- Workflow-level `project_output` remains on the simple path/value union as
|
||||
required by the brief.
|
||||
@@ -1,64 +0,0 @@
|
||||
# Task 4 Review-Fix Report
|
||||
|
||||
## Status
|
||||
|
||||
Review findings addressed as a follow-up to
|
||||
`144152a0 feat: expose composite step inputs`.
|
||||
|
||||
## Fixes
|
||||
|
||||
- Updated the stale `_draft_input_maps` node-local annotation from
|
||||
`InputBinding` to `StepInputBinding`; workflow-output helpers remain narrow.
|
||||
- Added command-level CLI parity assertions for composite expressions through:
|
||||
- `wf draft add capability --bindings-file`
|
||||
- `wf draft update capability --bindings-file`
|
||||
- `wf draft set-input --bindings-file`
|
||||
- Added explicit workflow-output command coverage proving an expression file is
|
||||
rejected before a remote context is loaded.
|
||||
- Added MCP handler persistence coverage asserting the exact nested expression
|
||||
survives into the stored draft.
|
||||
- Added artifact adapter coverage asserting a composite draft input survives
|
||||
the `WorkflowDraft` to `WorkflowBuilder` round-trip unchanged.
|
||||
- Corrected the original Task 4 report from the incorrect `589` count to the
|
||||
review-confirmed `368 passed, 3 baseline failures` result.
|
||||
|
||||
## Verification
|
||||
|
||||
Focused new parity tests:
|
||||
|
||||
```text
|
||||
6 passed
|
||||
```
|
||||
|
||||
Task 4 exact focused command, including the three known baseline failures:
|
||||
|
||||
```text
|
||||
373 passed, 3 failed, 180 warnings
|
||||
```
|
||||
|
||||
The failures are unchanged admin-event fixture failures:
|
||||
|
||||
- `test_rpc_workflow_client_reads_admin_state`
|
||||
- `test_wf_admin_commands_use_rpc_url_override`
|
||||
- `test_wf_status_uses_rpc_url_override`
|
||||
|
||||
The same command excluding only those tests:
|
||||
|
||||
```text
|
||||
373 passed, 164 warnings
|
||||
```
|
||||
|
||||
The expanded run including `tests/artifacts/test_draft_adapter.py` produced
|
||||
`388 passed, 3 failed, 180 warnings`.
|
||||
|
||||
- Ruff check passed for all changed source and tests.
|
||||
- Ruff format check passed.
|
||||
- `git diff --check` passed.
|
||||
- The required basedpyright scope still reports the same 33 pre-existing
|
||||
TypedDict/result-shape errors in CLI/MCP result surfaces; no new error is
|
||||
attributable to this review fix.
|
||||
|
||||
## Concerns
|
||||
|
||||
The admin-event fixture failures and existing basedpyright errors remain outside
|
||||
the composite-input review scope and should be handled separately.
|
||||
@@ -1,69 +0,0 @@
|
||||
# Task 4 Report: Expose Composite Step Inputs
|
||||
|
||||
## Status
|
||||
|
||||
Implemented on current `main`. Node-local step inputs now carry `StepInputBinding`
|
||||
through the Python authoring/API surfaces, live OpenRPC models and client, MCP
|
||||
workflow surface, CLI bindings-file paths, and draft adapters. Workflow-output
|
||||
binding surfaces remain simple-only.
|
||||
|
||||
## Changed Content
|
||||
|
||||
- Widened node-local API, service, capability, draft-update, subgraph, interrupt,
|
||||
JSON-RPC, remote-client, MCP, and builder input annotations to `StepInputBinding`.
|
||||
- Renamed the builder alias to `StepInputBindingArg` and the canonical normalizer
|
||||
to `normalize_step_input_bindings`; expression dictionaries are parsed through
|
||||
`InputExpressionBinding`.
|
||||
- Removed the temporary draft adapter cast/limitation. Persisted composite inputs
|
||||
now pass directly into `WorkflowBuilder.use_ref`.
|
||||
- Kept workflow-output APIs and parsers on `InputBinding`/`OutputBinding` as
|
||||
appropriate; their OpenRPC union does not include `InputExpressionBinding`.
|
||||
- Split CLI bindings-file adapters so node-local files accept expressions while
|
||||
inline `--map`/`--value` remain simple-only and workflow-output files reject
|
||||
expression records.
|
||||
- Updated CLI help and explain guidance to direct composite expressions to
|
||||
`--bindings-file` without inventing inline expression syntax.
|
||||
- Updated the simple binding schema description to document its node-local versus
|
||||
workflow-output boundary.
|
||||
|
||||
## Verification
|
||||
|
||||
Required focused command:
|
||||
|
||||
```text
|
||||
368 passed, 3 failed, 180 warnings
|
||||
```
|
||||
|
||||
This is the count from the original Task 4 verification command, corrected to
|
||||
match the command and collection reviewed after the task was committed.
|
||||
|
||||
The three failures are pre-existing admin-event fixture failures caused by
|
||||
`AdminEventPayload.timestamp_epoch_ms` being required while the fixture emitted
|
||||
no timestamp. They occur in admin-state/remote-status tests and are unrelated to
|
||||
composite input bindings.
|
||||
|
||||
The same focused command excluding only those three tests:
|
||||
|
||||
```text
|
||||
368 passed, 164 warnings
|
||||
```
|
||||
|
||||
Additional checks:
|
||||
|
||||
- `ruff check` passed for all changed source and test files.
|
||||
- `ruff format --check` passed for all changed source and test files.
|
||||
- `git diff --check` passed.
|
||||
- The required `basedpyright --level error` command reports the repository's
|
||||
existing 33 TypedDict/result-shape errors in unrelated CLI/MCP result surfaces.
|
||||
No new composite-binding error was reported. The changed `drafts.py` file has
|
||||
one of those pre-existing errors at its existing list-payload call site.
|
||||
- Live OpenRPC tests verify that step-input operations reach
|
||||
`InputExpressionBinding`, while workflow-output operations remain simple.
|
||||
|
||||
## Concerns
|
||||
|
||||
- The three admin-event failures and existing basedpyright errors should be
|
||||
remediated separately; changing them here would expand Task 4 beyond its
|
||||
binding-surface scope.
|
||||
- The checked OpenRPC manifest was intentionally not regenerated; Task 5 owns
|
||||
that deterministic artifact update.
|
||||
@@ -1,57 +0,0 @@
|
||||
# Task 5 Second Repair Report
|
||||
|
||||
## Status
|
||||
|
||||
Complete. Task 6 was not started.
|
||||
|
||||
## Fixed Findings
|
||||
|
||||
### P1: Context-aware runtime expression budget
|
||||
|
||||
Removed the global expression-shape scan from runtime validation. The new
|
||||
`hasBoundedInputExpressionsAtSchema` helper follows the generated operation
|
||||
payload or success schema and only invokes the canonical 1024-node expression
|
||||
counter at `StepInputBinding` and `InputExpressionBinding` positions.
|
||||
|
||||
Generic JSON components such as `JsonObject` are no longer interpreted by
|
||||
their keys. This preserves ordinary values shaped like
|
||||
`{ kind: "literal", value: ... }` in both simple `InputValueBinding.value` and
|
||||
`workflow.runs.start.workflow_input`, while genuine over-budget expressions
|
||||
remain rejected. Authored fixture validation continues to use the recursive
|
||||
expression schema and the same node budget.
|
||||
|
||||
Added adversarial runtime regressions for both accepted ordinary-value cases;
|
||||
the existing actual-expression and nested-literal rejection tests remain
|
||||
green.
|
||||
|
||||
### P2: Lossless legacy binding order
|
||||
|
||||
Replaced the legacy form's simple-row-plus-expression suffix construction with
|
||||
a stable merge. Existing expression rows stay at their original positions.
|
||||
Existing simple rows claim a matching original kind/target slot first, fall
|
||||
back to the next unused row of the same kind when an edit changes its target,
|
||||
and unmatched serialized rows are appended as genuinely new rows.
|
||||
|
||||
Added interaction regressions for no-op `[expression, path]` and mixed
|
||||
`[path, expression, value]` sequences. Both now submit in their original
|
||||
canonical order without duplicating expression rows.
|
||||
|
||||
## TDD Evidence
|
||||
|
||||
The new runtime and form interaction tests were added before the production
|
||||
changes. The initial focused runs reproduced both rereview failures; the final
|
||||
focused runs are green.
|
||||
|
||||
## Verification
|
||||
|
||||
- Python Task 5 focused suite — **168 passed**
|
||||
- `pnpm --dir web test` — **1,652 passed, 6 skipped** across RPC,
|
||||
presentation-sync, console, and server workspaces
|
||||
- RPC `contract:check` — clean
|
||||
- RPC typecheck — clean
|
||||
- Console typecheck/build — clean; existing Vite chunk-size warning only
|
||||
- Focused runtime-schema and CapabilityNodeForm tests — **25 passed**
|
||||
- `git diff --check` — clean; only expected Windows LF/CRLF warnings
|
||||
|
||||
No generated contract files were modified, Serena configuration was untouched,
|
||||
and Task 6 was not started.
|
||||
@@ -1,73 +0,0 @@
|
||||
# Task 5 Review Fix Report
|
||||
|
||||
## Status
|
||||
|
||||
Complete. Task 6 was not started.
|
||||
|
||||
## Fixed Findings
|
||||
|
||||
### P1: Legacy form expression preservation
|
||||
|
||||
`CapabilityNodeForm` now carries expression bindings found in rehydrated
|
||||
`initialValue.inputBindings` through legacy-form submission. The existing
|
||||
schema editor still owns simple path/value serialization; expression rows are
|
||||
appended only from the rehydrated expression subset, so they are preserved
|
||||
without duplicating rows or pretending that the legacy editor can edit them.
|
||||
|
||||
Added an interaction regression covering render, submit, and exact preservation
|
||||
of a rehydrated array expression.
|
||||
|
||||
### P1: Sound discriminated `oneOf` translation
|
||||
|
||||
The JSON Schema translator now accepts the special case only when all branches
|
||||
are distinct local component references, the discriminator mapping is an exact
|
||||
branch mapping, and every referenced branch is a closed object with the
|
||||
required discriminator property constrained to a distinct string `const`.
|
||||
|
||||
Decorative inline discriminators and overlapping branches without discriminator
|
||||
constants now fail translation instead of being weakened into an Effect union.
|
||||
|
||||
### P2: TypeScript expression node budget
|
||||
|
||||
Added shared recursive traversal helpers with the canonical `1024` node limit.
|
||||
The count includes expression nodes and nested array/object containers inside
|
||||
literal values. The check is applied to authored expression bindings and to
|
||||
runtime RPC payload/result boundaries, with cyclic values rejected safely.
|
||||
|
||||
Added runtime and authored validation-error regressions for both large
|
||||
expression arrays and nested literal containers.
|
||||
|
||||
### P2: Named generated `StepInputBinding`
|
||||
|
||||
Changed the canonical Python alias to `typing.TypeAliasType`, causing the
|
||||
OpenRPC manifest and generated TypeScript contract to expose a named
|
||||
`StepInputBinding` component/type. Repeated node-local operation fields now
|
||||
reference that name, while workflow-output bindings remain on the simple
|
||||
path/value union.
|
||||
|
||||
Updated the method registry and generated contract tests to consume the
|
||||
generated alias. The manifest and TypeScript contract were regenerated with
|
||||
the documented commands; no generated file was hand-edited.
|
||||
|
||||
## TDD Evidence
|
||||
|
||||
The new form, translator, runtime-budget, authored-budget, manifest, and
|
||||
generator tests were written before their corresponding fixes. The initial
|
||||
focused runs reproduced the four review failures; the final focused runs are
|
||||
green.
|
||||
|
||||
## Verification
|
||||
|
||||
- `uv run pytest tests/wf_contract_manifest/test_generate.py tests/wf_contract_manifest/test_committed_manifest.py tests/wf_transport_rpc_http/test_openrpc_contract.py tests/core/test_input_expressions.py tests/core/test_input_expression_runtime.py tests/core/test_canonical_node_bindings.py tests/wf_transport_rpc_http/test_rpc_models.py tests/wf_api/test_input_expression_validation.py -q` — **168 passed**
|
||||
- `pnpm --dir web --filter @lda/workflow-rpc test` — **147 passed, 6 skipped** across 13 files
|
||||
- Focused console tests — **59 passed** across 5 files
|
||||
- `pnpm --dir web --filter @lda/workflow-rpc typecheck` — clean
|
||||
- `pnpm --dir web --filter @lda/console typecheck` — clean
|
||||
- `pnpm --dir web --filter @lda/workflow-rpc contract:check` — clean
|
||||
- `uv run ruff check ...` — clean
|
||||
- `git diff --check` — clean; only expected Windows LF/CRLF warnings
|
||||
|
||||
An additional broader sweep exposed an unrelated existing admin-events fixture
|
||||
failure: `test_rpc_workflow_client_reads_admin_state` omits the required
|
||||
`timestamp_epoch_ms` field. It is outside this Task 5 remediation and no
|
||||
production code was changed for it.
|
||||
@@ -1,69 +0,0 @@
|
||||
# Task 5 Report: Decode Composite Step Inputs
|
||||
|
||||
## Status
|
||||
|
||||
Complete. Task 6 was not started.
|
||||
|
||||
## Changed Content
|
||||
|
||||
- Regenerated `contracts/workflow-api.manifest.json` and
|
||||
`web/packages/rpc/src/generated/workflow-contract.ts` using the documented
|
||||
generators. The checked contract now carries recursive literal/path/array/
|
||||
object expression branches for node-local inputs while workflow outputs stay
|
||||
on the simple binding union.
|
||||
- Added manifest, generated-type, authored-schema, and translator coverage for
|
||||
recursive expressions, strict over-specified-variant rejection, and the
|
||||
node-local/workflow-output boundary.
|
||||
- Extended the authored Effect Schema fixtures with a `Schema.suspend`
|
||||
recursive decoder. The existing translator now accepts discriminated
|
||||
recursive `oneOf` contracts but continues rejecting arbitrary `oneOf` schemas.
|
||||
- Made RPC CLI projection explicit and exhaustive. Path/value bindings retain
|
||||
their inline flags; expression bindings report
|
||||
`input_bindings (use --bindings-file)` and are never flattened into a fake
|
||||
`--value`.
|
||||
- Added browser `InputExpression`, `InputExpressionBinding`, and
|
||||
`StepInputBinding` types. Authoring clients and controllers now carry the
|
||||
complete node-local union, with handwritten recursive copies for paths,
|
||||
arrays, objects, and literal values.
|
||||
- Widened `CapabilityNodeForm` callback types without adding expression editing
|
||||
controls. The existing canonical rehydration seam preserves valid expression
|
||||
rows instead of classifying them as malformed; editing remains deferred to
|
||||
Task 6/7.
|
||||
|
||||
## Verification
|
||||
|
||||
- `uv run pytest tests/wf_contract_manifest/test_generate.py tests/wf_contract_manifest/test_committed_manifest.py -q`
|
||||
— **8 passed**
|
||||
- `pnpm --dir web --filter @lda/workflow-rpc test` — **142 passed, 6 skipped**
|
||||
across 13 files
|
||||
- `pnpm --dir web --filter @lda/workflow-rpc typecheck` — clean
|
||||
- `pnpm --dir web --filter @lda/workflow-rpc contract:check` — clean
|
||||
- Required focused console tests — **54 passed** across 4 files
|
||||
- `pnpm --dir web --filter @lda/console typecheck` — clean
|
||||
- `git diff --check` — clean; only expected Windows LF/CRLF warnings were
|
||||
reported by Git
|
||||
|
||||
## TDD Notes
|
||||
|
||||
- Manifest and parity tests were added before the recursive schema and contract
|
||||
regeneration; they failed until the new schemas were present.
|
||||
- The translator test initially failed on the generated discriminated `oneOf`;
|
||||
the targeted translator support made it pass while preserving the existing
|
||||
arbitrary-`oneOf` rejection tests.
|
||||
- Browser model, client, controller, form-seam, and canonical rehydration tests
|
||||
were added before their corresponding type/copy changes.
|
||||
|
||||
## Deviations And Risks
|
||||
|
||||
- `canonical-capability-form.ts` and its test were changed even though they were
|
||||
omitted from the Task 5 file list. This is the minimal enabling change needed
|
||||
for the widened form callback to preserve a valid returned expression and for
|
||||
the console typecheck to remain green; no recursive editor or Task 6
|
||||
projection was implemented.
|
||||
- The contract generator emits the node-local union inline in operation params
|
||||
rather than a standalone generated `StepInputBinding` alias. Generated type
|
||||
tests assert the complete path/value/expression union and the output boundary;
|
||||
neither generated artifact was edited manually.
|
||||
- The legacy form can carry an expression through rehydration and callback
|
||||
types, but it still renders/creates only simple path/value controls. The
|
||||
recursive editor is intentionally the next task.
|
||||
@@ -1,54 +0,0 @@
|
||||
# Task 8 Repair Report
|
||||
|
||||
## Scope
|
||||
|
||||
This repair addresses both findings in `task-8-review.md` without changing
|
||||
production behavior:
|
||||
|
||||
- The browser route regression no longer mocks `createDraftAuthoringClient` or
|
||||
its mutation methods.
|
||||
- The Python vertical proof uses the normal `state.result` state/output path
|
||||
instead of the unsupported `state.text` workaround explanation.
|
||||
|
||||
## Browser Proof
|
||||
|
||||
`DraftDetailRoute.authoring-sync.test.tsx` now constructs the production
|
||||
`createConsoleWriteExecutor`, keeps the production `createDraftAuthoringClient`
|
||||
and `callOperation` implementations, and stubs only `fetch` at the established
|
||||
connection contract boundary. The test:
|
||||
|
||||
1. Returns a canonical RPC success envelope through the real response parser and
|
||||
draft workspace decoder.
|
||||
2. Submits the composite editor form.
|
||||
3. Asserts the exact `/api/rpc` JSON body, including
|
||||
`workflow.draft_workspaces.set_step_input_bindings`, `workspace_id`,
|
||||
`revision`, `step_id`, and the recursive array expression payload.
|
||||
4. Asserts the returned revision and rehydrated path/literal editor values.
|
||||
|
||||
This fails on incorrect encoder field names or a malformed canonical response;
|
||||
the route has no mocked authoring client left to conceal either error.
|
||||
|
||||
## Python Proof
|
||||
|
||||
`tests/wf_api/test_composite_input_workflow.py` now declares `state.result`,
|
||||
projects the capability's `text` result into `state.result`, and exposes that
|
||||
state value as public output `result`. The composite root object still combines
|
||||
`state.foo` with the literal `wowcool`, and the vertical run still produces
|
||||
`hello wowcool`.
|
||||
|
||||
## Verification
|
||||
|
||||
- `pnpm --dir web/apps/console test -- src/workspace/routes/DraftDetailRoute.authoring-sync.test.tsx --reporter=dot`: **2 passed**
|
||||
- `uv run pytest tests/wf_api/test_composite_input_workflow.py -q`: **1 passed**
|
||||
- `pnpm --dir web/apps/console test -- src/workspace/routes/DraftDetailRoute.authoring-sync.test.tsx src/workspace/domain/draft-authoring-client.test.ts src/workspace/domain/write-executor.test.ts src/connection/api.test.ts --reporter=dot`: **27 passed**
|
||||
- `pnpm --dir web/packages/rpc test -- --reporter=dot`: **135 passed, 3 skipped**
|
||||
- `pnpm --dir web/apps/console typecheck`: **passed**
|
||||
- `pnpm --dir web/packages/rpc typecheck`: **passed**
|
||||
- `pnpm --dir web/apps/console build`: **passed** with the existing large-chunk warning
|
||||
- `uv run ruff check tests/wf_api/test_composite_input_workflow.py`: **passed**
|
||||
- `uv run ruff format --check tests/wf_api/test_composite_input_workflow.py`: **passed**
|
||||
- `git diff --check`: **passed**
|
||||
|
||||
No unclassified failure was encountered in the focused repair gates. The
|
||||
repository-wide baseline failures remain classified in `task-8-report.md` and
|
||||
were not re-labeled by this repair.
|
||||
@@ -1,79 +0,0 @@
|
||||
# Task 8 Report: Vertical Proof And Documentation Closure
|
||||
|
||||
## Delivered
|
||||
|
||||
- Added a real platform-registry proof for the exact root object expression
|
||||
from the plan. `wf.std.concat` receives a state-backed item and a literal
|
||||
item, and the final workflow output is `hello wowcool`.
|
||||
- Added remote CLI coverage using the existing RPC client/transport seam. The
|
||||
bindings file survives `wf draft set-input` as the exact composite payload.
|
||||
- Added a browser route regression through the real `createDraftAuthoringClient`,
|
||||
write executor, `callOperation`, and mocked `/api/rpc` fetch seam. It asserts
|
||||
the exact JSON-RPC method/target/params body, runs the canonical response
|
||||
through the runtime decoders, and verifies that the recursive editor state
|
||||
rehydrates.
|
||||
- Marked the data-shaping issue and Slice 5 complete, documented the Python
|
||||
canonical model and console editor, updated the live design-spec status, and
|
||||
archived the implementation plan.
|
||||
|
||||
## Verification
|
||||
|
||||
Focused proof:
|
||||
|
||||
- `uv run pytest tests/wf_api/test_composite_input_workflow.py -q`: **1 passed**
|
||||
- `uv run pytest tests/wf_cli/test_remote_target.py -q`: **45 passed, 2 failed**
|
||||
- `pnpm --dir web --filter @lda/console test -- src/workspace/routes/DraftDetailRoute.authoring-sync.test.tsx`: **2 passed**
|
||||
|
||||
Final gates:
|
||||
|
||||
- Scoped Python regression: **1667 passed, 6 failed, 358 warnings**
|
||||
- `uv run ruff check ...`: **passed**
|
||||
- `uv run ruff format --check ...`: **failed on pre-existing formatting in
|
||||
`src/wf_api/deployments.py` and `src/wf_api/runs.py`**
|
||||
- `uv run basedpyright --level error`: **338 pre-existing errors** across
|
||||
unrelated API, CLI, MCP, example, and test surfaces
|
||||
- `pnpm --dir web test`: **1677 passed, 3 skipped** across RPC,
|
||||
presentation-sync, server, and console workspaces
|
||||
- `pnpm --dir web typecheck`: **passed**
|
||||
- `pnpm --dir web build`: **passed** with the existing large-chunk warning
|
||||
- `git diff --check`: **passed**
|
||||
|
||||
## Classified Baseline Failures
|
||||
|
||||
The six scoped Python failures are outside the new composite-input proof:
|
||||
|
||||
- `tests/wf_transport_rpc_http/test_client.py::test_rpc_workflow_client_reads_admin_state`
|
||||
and `tests/wf_cli/test_remote_target.py::test_wf_admin_commands_use_rpc_url_override`
|
||||
fail because the existing recorded admin event fixture lacks
|
||||
`timestamp_epoch_ms`.
|
||||
- `tests/wf_cli/test_remote_target.py::test_wf_status_uses_rpc_url_override`
|
||||
fails because the existing local static admin surface reports unavailable.
|
||||
- `tests/wf_cli/test_schema.py::test_compact_outline_preserves_any_of_keyword`,
|
||||
`test_schema_compact_component_is_queryable`, and
|
||||
`test_compact_outline_replaces_local_refs_with_names` fail because the
|
||||
existing compact schema projection returns a string where those tests expect
|
||||
the older structured `any_of` shape.
|
||||
|
||||
These failures were reproduced before the final documentation/commit step and
|
||||
do not overlap the new vertical proof or changed production code. They are
|
||||
classified as **baseline regressions**, not suppressed failures.
|
||||
|
||||
## Review And Remaining Risk
|
||||
|
||||
Manual implementation review found no Critical or Important issue in the new
|
||||
tests or documentation changes. The repository's external review-dispatch
|
||||
tool was not available in this session, so no external reviewer result is
|
||||
claimed.
|
||||
|
||||
The root expression proof uses the ordinary `state.result` output slot. The
|
||||
capability's `text` result is projected into workflow state and then into the
|
||||
public `result` output, so this fixture exercises the normal state/output naming
|
||||
path without a validator workaround.
|
||||
|
||||
## Documentation
|
||||
|
||||
- Plan moved to
|
||||
`docs/historical/superpowers/plans/2026-08-12-composite-input-expressions.md`.
|
||||
- Live links now point to the historical plan.
|
||||
- The design spec remains live at
|
||||
`docs/superpowers/specs/2026-08-12-composite-input-expressions-design.md`.
|
||||
Reference in New Issue
Block a user