remove task reports

This commit is contained in:
lda
2026-08-12 03:26:34 +07:00 Verified
parent b24ba6a92d
commit 447b8d9e89
6 changed files with 0 additions and 673 deletions
@@ -1,108 +0,0 @@
# Task 1 Report
## Outcome
Task 1 is implemented on `main`. The canonical `InputValueBinding.value` contract
now accepts recursive JSON values, including finite numbers, while preserving
boolean/integer distinction and rejecting non-JSON objects and non-finite
numbers. The two focused browser RPC operations are authored, dispatched,
registered, exported, tested, and included in the explicit browser policy.
The authored RPC fixture now uses the same recursive JSON-value schema as the
canonical/generated contract. Runtime and parity tests cover scalar, boolean,
null, array, and object literals.
## Changed Files
- `src/wf_core/models/steps.py`: Added the canonical recursive finite JSON-value alias and used it for `InputValueBinding.value`.
- `tests/core/test_canonical_node_bindings.py`: Added category, recursion, rejection, boolean-distinction, and finite-number tests.
- `tests/wf_contract_manifest/test_generate.py`: Added manifest operation and recursive `JsonValue` assertions; updated generated component count.
- `contracts/workflow-api.manifest.json`: Regenerated checked manifest.
- `web/packages/rpc/scripts/workflow-contract-generator.ts`: Added both focused methods to the runtime operation cohort.
- `web/packages/rpc/scripts/workflow-contract-generator.test.ts`: Added missing-operation and reachable-schema coverage for both methods and recursive `JsonValue` output.
- `web/packages/rpc/src/generated/workflow-contract.ts`: Regenerated checked TypeScript contract.
- `web/packages/rpc/src/json-schema/authored-rpc-fixtures.ts`: Replaced object-only input literal validation with recursive JSON-value validation and added focused authored fixtures.
- `web/packages/rpc/src/json-schema/runtime-schema.test.ts`: Added focused runtime schema inventory and JSON literal coverage.
- `web/packages/rpc/src/json-schema/rpc-parity.test.ts`: Added both payload/result parity cases and canonical binding-union coverage.
- `web/packages/rpc/src/rpcs.ts`: Added schema-backed `Rpc.make` definitions and `WorkflowRpcs` membership.
- `web/packages/rpc/src/service.ts`: Added decode-before-dispatch cases for both operations.
- `web/packages/rpc/src/method-registry.ts`: Added metadata, interpretation, and replacement CLI evidence renderers.
- `web/packages/rpc/src/index.ts`: Added public operation and payload/result schema exports.
- `web/packages/rpc/src/service.test.ts`: Added representative request/response dispatch cases.
- `web/packages/rpc/src/method-registry.test.ts`: Added set-input/set-output, clear, and non-equivalent evidence assertions.
- `web/apps/console/src/connection/contracts.ts`: Added both operation names to the explicit browser DTO contract.
- `web/apps/server/src/browser-operation-policy.ts`: Added both names to the explicit browser allowlist.
- `web/apps/server/src/browser-operation-policy.test.ts`: Pinned the allowlist and continued rejecting generic/admin operations.
- `web/apps/server/src/app.test.ts`: Added one accepted request case per operation.
## TDD Evidence
### RED
- Initial brief commands passed the pre-existing tests: Python `25 passed`; generator `8 passed`, demonstrating the missing behavior was not previously asserted.
- After adding canonical/generator tests, Python failed `3` targeted tests: unconstrained `object` had no recursive `$defs` and accepted `object()`; the manifest value had no `anyOf`. Generator failed `3` tests because both operations were absent from the runtime cohort.
- After adding RPC/server tests, the RPC focused run failed `8` tests: both service operations were unknown, both registry entries were missing, and the authored RPC catalog did not contain the new methods. The requested `@lda/server` pnpm selector did not exist in this workspace.
- The finite-number test then failed all `3` cases before switching the canonical alias to `FiniteFloat`.
### GREEN
- Canonical/manifest Python suite: `38 passed`.
- Contract generator suite: `11 passed`.
- Focused RPC suite: `66 passed`.
- Focused server suite: `32 passed`.
## Verification
- `pnpm --dir web --filter @lda/workflow-rpc typecheck`: passed.
- `pnpm --dir web --filter @lda/web-server typecheck`: passed.
- `pnpm --dir web --filter @lda/workflow-rpc contract:check`: passed.
- Touched-file `uv run ruff check`: passed.
- Touched-file `uv run ruff format --check`: passed.
- Touched-file `uv run basedpyright --level error`: `0 errors, 0 warnings, 0 notes`.
- `git diff --check`: passed; only Git line-ending warnings were reported.
## Deviations
- The brief names the server package `@lda/server`; the current workspace package is `@lda/web-server`, so the equivalent focused test and typecheck commands used `@lda/web-server`.
- Repository-wide `uv run ruff format --check` is not clean because unrelated pre-existing files under `src/wf_api/` would be reformatted. They were not changed.
- Repository-wide `uv run basedpyright --level error` reports `353` errors across the existing project. The touched Python files were checked separately and have zero diagnostics.
## Concerns
- Parity continues to report the translator's existing `oneOf` blockers for structural path unions. The new focused payloads add the corresponding `InputPathBinding.path` and `OutputBinding.source` blocker entries; authored and manifest acceptance remains aligned for tested values.
- No Serena configuration was modified, and no generated output was hand-edited.
## Round 1/5 Review Fix
### Changed Files
- `src/wf_core/models/steps.py`: Made `InputValueBinding` strict and added a recursive pre-validator that rejects tuples, sets, `Decimal`, non-string object keys, and non-finite numbers without coercion while retaining finite recursive JSON values and the existing generated schema.
- `tests/core/test_canonical_node_bindings.py`: Added rejection coverage for tuple, set, `Decimal`, and non-string-key values.
- `web/packages/rpc/src/json-schema/authored-rpc-fixtures.ts`: Added a shared `Schema.String.pipe(Schema.minLength(1))` path segment schema to every checked structural input/output binding path.
- `web/packages/rpc/src/json-schema/rpc-parity.test.ts`: Added authored decode tests for empty segments in input path, input value target, output source, and output target, plus checked-manifest component assertions for all five structural path fields.
### RED
- Before the production edits, the new Python test failed 3 cases: tuple, set, and `Decimal` were coerced; the non-string-key case already failed under the existing recursive validator.
- Before the Effect fixture edit, the new parity test accepted an empty `InputPathBinding.path` segment.
### GREEN
- `uv run pytest tests/core/test_canonical_node_bindings.py -q`: `36 passed`.
- `pnpm exec vitest run src/json-schema/rpc-parity.test.ts`: `5 passed`.
### Verification
- Focused RPC runtime/parity/generator tests: `28 passed`.
- RPC package typecheck: passed.
- Checked contract verification: passed with `All checks passed!`.
- Touched-file Ruff and basedpyright checks: passed; basedpyright reported `0 errors, 0 warnings, 0 notes`.
- `git diff --check`: passed; only Git line-ending warnings were reported.
### Deviations
- No generated output changed: strict Pydantic validation and authored fixture constraints preserve the existing checked contract, so the contract check was run without rewriting generated files.
### Concerns
- The pre-existing translator blockers for structural `oneOf` path unions remain unchanged; this round only tightens authored decode parity and confirms the checked component `minLength` constraints.
@@ -1,133 +0,0 @@
# Task 2 Report
## Outcome
Task 2 is implemented on `main`. The console now has a pure selected-step
projection for keyed and compiled drafts, parser-first canonical input/output
binding handling, unsupported-row preservation, ordered row serializers,
schema-informed suggestions and source previews, structural diagnostic mapping,
and presence-aware setup metadata projection.
## Changed Files
- `web/apps/console/src/workspace/domain/draft-workspace-models.ts`: Added `StatePath`, `OutputBinding`, and focused input/output binding mutation input types.
- `web/apps/console/src/workspace/authoring/selected-step-dataflow.ts`: Added canonical projection, structural path guards, row projections, single-row and list serializers, schema helpers, preview selection, and diagnostic ownership mapping.
- `web/apps/console/src/workspace/authoring/selected-step-dataflow.test.ts`: Added keyed/compiled equivalence, ordering, null/zero/absent metadata, structural paths, malformed rows, output target rejection, serializer save blocking, suggestions, previews, and positive/negative diagnostic tests.
- `web/apps/console/src/workspace/authoring/canonical-capability-form.ts`: Preserved absent setup metadata as omitted properties without synthesizing nulls in the binding projection.
- `web/apps/console/src/workspace/authoring/canonical-capability-form.test.ts`: Added absent, explicit-null, and numeric-zero metadata tests.
- `.superpowers/sdd/2026-08-09-workflow-console-selected-step-dataflow/task-2-report.md`: This report.
## TDD Evidence
### RED
After writing the pure projection and setup tests, the prescribed command failed
before collecting tests because `selected-step-dataflow.ts` did not exist:
```text
Test Files 1 failed (1)
Tests no tests
Error: Failed to resolve import "./selected-step-dataflow.js"
```
This was the expected missing-production-module failure from the Task 2 brief,
not a test assertion or environment failure.
### GREEN
The first implementation run exposed five behavior/type defects. They were
fixed test-first: structural state path segments were preserved, structural
input roots were included during serialization, missing previews returned
`null`, focused diagnostics honored the requested field, and array-item target
suggestions were asserted. The final focused run passed:
```text
Test Files 2 passed (2)
Tests 10 passed (10)
```
## Verification
- `pnpm --dir web --filter @lda/console test -- src/workspace/authoring/selected-step-dataflow.test.ts src/workspace/authoring/canonical-capability-form.test.ts`: passed, `10/10`.
- `pnpm --dir web --filter @lda/console test -- src/workspace/authoring/selected-step-dataflow.test.ts src/workspace/authoring/canonical-capability-form.test.ts src/workspace/authoring/ContextInspector.test.tsx src/workspace/authoring/CapabilityNodeForm.test.tsx`: passed, `17/17`.
- `pnpm --dir web --filter @lda/console typecheck`: passed.
- `git diff --check`: passed; Git reported only normal LF/CRLF conversion warnings for modified files.
- No Serena configuration was modified.
## Deviations
- No controller, transport, or React dataflow forms were added. Those are later
plan tasks; Task 2's exact file list is limited to the domain models, pure
projection module/tests, and canonical setup projection/tests.
- The compiled fixture uses the repository's actual `nodes[]` capability key,
`node`, while keyed drafts use `use`.
- The list serializers return `null` while unsupported rows remain, providing the
pure save-blocking behavior needed by later forms; removing unsupported rows
before serialization is the explicit repair path.
## Concerns
- `bindingDiagnosticsForStep` receives only diagnostics, `stepId`, and field, so
it conservatively anchors `nodes[N]` ownership to the first matching selected
step node diagnostic. If a backend sends a node-indexed diagnostic without a
matching `step_id` or without another selected-step node anchor, it remains
unmatched rather than risking assignment to the wrong row. The keyed JSON
Pointer and focused `bindings[M]` forms do not have this limitation.
- Literal input values remain typed as the existing domain `unknown`; the
generated RPC/runtime contract remains authoritative for recursive JSON-value
validation at transport time.
## Round 1/5 Review Fix
### Changed Files
- `web/apps/console/src/workspace/authoring/selected-step-dataflow.ts`: Added strict JSON Pointer segment decoding, non-negative decimal array-index traversal, explicit `compiledNodeIndex` projection context, and recursive finite JSON literal validation.
- `web/apps/console/src/workspace/authoring/selected-step-dataflow.test.ts`: Added regression coverage for invalid `~2` escapes, array `items.1` traversal and non-index rejection, compiled diagnostics with only the row diagnostic present, wrong node indexes, and invalid recursive literal values.
- `.superpowers/sdd/2026-08-09-workflow-console-selected-step-dataflow/task-2-report.md`: Appended this review round.
### RED
Before the production fixes, the focused pure-module run reported `5` failed
tests out of `10`: the projection lacked `compiledNodeIndex`, `isJsonValue` was
not exported, `items.1` preview returned `null`, invalid pointer escapes were
accepted as row locations, and a wrong compiled node index was not kept
unmatched. The failures were assertion failures against the intended behavior,
not test collection or type errors.
### GREEN
After the fixes:
```text
Test Files 1 passed (1)
Tests 10 passed (10)
```
`SelectedStepDataflow.compiledNodeIndex` is now `null` for keyed drafts and the
selected `nodes[]` index for compiled drafts. `bindingDiagnosticsForStep` takes
that explicit index and never derives ownership from another diagnostic.
### Verification
- `pnpm --dir web --filter @lda/console test -- src/workspace/authoring/selected-step-dataflow.test.ts`: passed, `10/10`.
- `pnpm --dir web --filter @lda/console typecheck`: passed.
- `git diff --check`: passed; only normal Git LF/CRLF conversion warnings were reported.
- No Serena configuration was modified.
### Deferred Cross-Task Acceptance
The existing `ContextInspector` branch still uses the older canonical
capability-binding projection and can drop malformed input rows. This is not
resolved in Task 2. Task 7 must replace that selected-capability branch with
`SelectedCapabilityInspector` and test that it consumes
`inputBindingRows(...)` and `outputBindingRows(...)`, preserving unsupported
rows and the explicit save gate.
### Concerns
- The pure diagnostic helper now conservatively leaves compiled node paths
unmatched when the caller supplies `null` or a wrong node index. This is
intentional: ownership is explicit rather than inferred from unrelated
diagnostics.
- Literal validation is client-side recursive finite JSON validation; the
generated transport contract remains authoritative at the RPC boundary.
@@ -1,68 +0,0 @@
# Task 6 Report
## Status
Implemented the standalone ordered output-to-state binding form with schema suggestions, strict `state.*` targets, custom local paths, inferred previews, ordering controls, fan-out preservation, explicit clear confirmation, unsupported-row repair gating, row diagnostics, accessible labels, and responsive inspector styling.
## Commit
`feat: edit capability output bindings`
## Verification
- Focused Vitest: 7 tests passed.
- Console typecheck: passed.
- Staged diff check: passed.
- React Doctor changed scope: 100/100, no issues.
## Concerns
None.
## Fix Round 3/5
### Status
Extended each parameterized add, edit, and remove case to verify stale confirmation removal, fresh confirmation creation, empty-list submission, and cleared mutated-row UI state.
### Tests
- Focused Vitest: 15 tests passed.
- Console typecheck: passed.
- `git diff --check`: passed with only the repository CRLF conversion warning.
### Concerns
None.
## Fix Round 2/5
### Status
Added concise parameterized regressions proving add, edit, and remove actions cancel pending clear confirmation and preserve the mutated rows on save. No production changes were required.
### Tests
- Focused Vitest: 15 tests passed.
- Console typecheck: passed.
- `git diff --check`: passed with only the repository CRLF conversion warning.
### Concerns
None.
## Fix Round 1/5
### Status
Fixed pending-clear confirmation invalidation across non-confirm-clear mutations, replaced the colliding `__custom__` source sentinel with collision-proof indexed source selections, and corrected structural `state.*` path round-tripping.
### Tests
- Focused Vitest: 12 tests passed.
- Console typecheck: passed.
- `git diff --check`: passed with only the repository CRLF conversion warning.
### Concerns
None.
@@ -1,178 +0,0 @@
# Task 7 Report
## Status
Implemented and committed as `7453d6b2` (`feat: edit selected-step dataflow`).
## Delivered
- Extracted the selected-node branch from `ContextInspector` into
`SelectedCapabilityInspector` with stable Setup, Inputs, and Outputs tabs.
- Passed `inputBindingRows` and `outputBindingRows` directly into the binding
forms. Unsupported persisted rows remain visible in repair UI and block Save
and Clear through the existing form guards.
- Preserved controller ownership of canonical mutations while keeping local
form state mounted across mobile inspector close/reopen. Selected step changes
remount the inspector by step id and rehydrate canonical rows.
- Added regression coverage for unsupported-row Save blocking, unique
diagnostics across mounted forms, mobile tab/unsaved-row persistence, and
selected-step rehydration.
- Added truthful authoring graph summaries for canonical input and output row
counts, preserving node detail text and generic graph handles.
- Updated the console README and roadmap, and archived the completed plan.
## Verification
- Focused Task 7 command: passed, 7 files and 55 tests.
- A prior `pnpm --dir web --filter @lda/console test` run recorded two
presentation test failures: one audience pairing test timed out and one
found two pairing buttons.
- `pnpm --dir web typecheck`: passed.
- `pnpm --dir web build`: passed with the existing large-chunk warning.
- `npx react-doctor@latest --verbose --scope changed`: passed, 100/100.
- `git diff --check`: passed.
- Browser smoke: not run. Local ports 8765 and 5173 were listening, but the
available browser runtime reported that no browser was available, so no
`.visual-smoke/` evidence was created.
- A prior `pnpm --dir web test` run recorded an RPC generated-contract count
mismatch: the test expected 22 operations while the generated contract
exposed 24. The current dirty controller-owned test edit prevents attributing
that result to the intended controller state.
## Fix Round 1
Committed as `14892e89` (`fix: close selected-step dataflow review gaps`).
Addressed the review findings:
- Dagre now assigns content-aware heights for node references, details, and
summaries, with a connected-node spacing regression.
- Array-shaped compiled authoring nodes receive the same canonical binding
summary as keyed steps.
- The real `DraftWorkbench` graph selection boundary now proves Setup, Inputs,
and Outputs rehydrate between two nodes without a test-supplied key.
- Composition coverage now proves unsupported output rows remain visible and
block both Save and Clear until removal, after which the ordered payload is
submitted.
Fix-round verification: the focused Task 7 command passed with 7 files and 58
tests; `pnpm --dir web typecheck` passed; `git diff --check` passed.
The current worktree contains a controller-owned edit to
`web/packages/rpc/src/generated/workflow-contract.test.ts`; it was not touched
or staged in this fix round. The final controller should rerun the full suite
and browser acceptance against the intended controller state. Browser smoke and
`.visual-smoke/` evidence remain pending until a browser-capable environment is
available.
## Fix Round 2
Committed as `ee703976` (`fix: sync draft route freshness`).
The real-browser stale-header finding is addressed by a minimal freshness seam:
`DraftWorkbench` reports its controller-owned canonical draft to
`DraftDetailRoute`; the route uses that snapshot for immediate header updates,
then lets later loader snapshots, workspace changes, and disconnected states
replace it. Workspace ids gate callbacks so an old workbench cannot leak state
into another route.
Regression coverage proves immediate revision/status synchronization, loader
refresh precedence, no cross-workspace leak, and the workbench callback seam.
Focused verification passed: 8 files and 60 tests, `pnpm --dir web typecheck`,
and `git diff --check`.
## Fix Round 3
Committed as `1e671ed7` (`test: cover draft route freshness integration`).
The route regression now mounts the real `DraftWorkbench` and its authoring
controller, using mocked capability/loader transport only at the route boundary.
The integration path performs a real setup mutation and verifies that the
header immediately reflects the committed revision and status, then verifies
that a newer loader draft replaces that optimistic snapshot. It also exercises
loading and disconnected replacement, navigates to a second workspace through
the router, invokes the retained old callback, and proves the new workspace
header cannot be overwritten. The test bounds workbench renders to catch
freshness update loops. The route freshness guard uses loader source generation
so callbacks from an earlier draft, phase, or workspace cannot cross the
boundary.
Fix-round verification passed:
- Focused console command: 3 files and 20 tests.
- `pnpm --dir web --filter @lda/console typecheck`.
- `git diff --check`.
The controller-owned dirty edit to
`web/packages/rpc/src/generated/workflow-contract.test.ts` remained untouched
and unstaged. The final controller will rerun the full suite and browser
acceptance against the intended controller state.
## Fix Round 4
The route integration test now invokes a retained callback after a newer loader
generation for the same `draft-report` workspace and again after a
disconnect/reconnect cycle. Both assertions prove the revision 3 loader snapshot
remains authoritative without relying on the workspace-id guard. The existing
cross-workspace callback check remains a separate identity-gate assertion.
The permissive render-count ceiling was replaced with exact stabilization
checks after mutation synchronization, loader refresh, reconnect, and
navigation. Each check records the settled workbench render count, advances an
event-loop tick, and requires the count to remain unchanged.
A mutation check temporarily removed the `loaderGenerationRef` predicate while
leaving the workspace-id predicate intact. The focused test failed because the
same-workspace stale callback regressed the header from revision 3 to revision
99; production was then restored unchanged.
Fix-round verification passed:
- Focused console command: 3 files and 20 tests.
- `pnpm --dir web --filter @lda/console typecheck`.
- `git diff --check`.
The controller-owned dirty edit to
`web/packages/rpc/src/generated/workflow-contract.test.ts` remained untouched
and unstaged.
## Final Browser Acceptance
The controller subsequently ran the real browser path against the live console,
Hono bridge, and workflow RPC service on ports 5173, 8787, and 8765. The
disposable workspace `codex_bind_smoke_0810` verified:
- setup updates omit blank retry/timeout fields and advance the revision;
- literal input replacement persists;
- ordered output fan-out persists after reload;
- clearing outputs preserves the projected state schema;
- the route header shows the committed revision without a reload; and
- Setup, Inputs, and Outputs remain available in the mobile inspector.
The gitignored evidence is recorded under
`web/apps/console/.visual-smoke/selected-step-dataflow-evidence.md` with desktop
and mobile screenshots in the same directory.
## Final React Ownership Cleanup
Commit `070cbe6d` moved the route identity header beside the workbench's
canonical controller state. It supersedes the route-level draft mirror,
render-time generation refs, and child-to-parent effect while retaining the
same immediate mutation and loader-replacement behavior. The focused route and
workbench tests pass, and React Doctor reports 100/100 for the changed files.
## Final Whole-Slice Fix Round
Commit `167f080d` closes the valid Important findings from the whole-slice
review. Persisted binding containers and rows are now strict and unsupported
data stays visible; Inputs expose workflow/capability schema suggestions while
retaining free text; duplicate local targets receive row-owned errors; timeout
values match the positive-integer transport contract; and removing the final
output row routes Save through the explicit clear confirmation.
The focused authoring suite passed with 65 tests, and console typecheck and the
commit diff check passed independently after the implementation worker finished.
The controller also reopened the live disposable draft after the fix: a `0.5`
timeout was rejected locally, capability targets offered `.` and `message`, and
workflow sources offered `input.message`, `state.content`, and
`state.content_copy` from the live workflow schemas.
@@ -1,116 +0,0 @@
# Task 4 Report: Bound and Redact Console Evidence
## Scope
Implemented against baseline `32c99cbe`.
Task 4 adds the pure retention and security boundary for console evidence. It
does not change transport response decoding, Python code, Serena configuration,
or UI styling.
## Implementation
- Added `sanitizeEvidenceValue`, `sanitizeEvidenceRecord`, and `retainEvidence`
in `web/apps/console/src/workspace/domain/evidence-policy.ts`.
- Redaction is case-insensitive and happens before reading sensitive property
values. Keys matching authorization, cookie, token, password, secret,
credential, API-key, or private-key patterns become `[redacted]`.
- The projector is immutable and JSON-safe. It handles cyclic references,
throwing getters, unsupported values, non-finite numbers, bounded depth,
bounded strings, and bounded collection entries.
- Sanitized request and response values each receive an independent 32 KiB
UTF-8 JSON byte budget. The independent budgets preserve request context when
only the response is oversized. The byte fitter is deterministic and uses
`[truncated: depth limit]` and `[truncated: evidence limit]` markers.
- Reducer evidence retention now sanitizes the incoming record and keeps only
the newest 100 records.
- `EvidenceRecord` now requires `target`. Shared read/write executor evidence
records use `options.target` on success, invocation failure, server failure,
protocol/decode failure, and operation mismatch. Health, live demo, replay,
and test fixtures provide target attribution as well.
## TDD Evidence
The initial policy test run failed because the policy module did not exist, and
the new reducer retention assertion observed the old unbounded 101-record
behavior. After the minimal implementation, the policy and reducer tests
passed. A depth test was corrected to use an acyclic deep chain rather than a
cycle, preserving separate coverage for depth and circular-reference markers.
## Verification
- `pnpm --dir web --filter @lda/console test -- src/workspace/domain/evidence-policy.test.ts src/workspace/domain/read-executor.test.ts src/workspace/domain/write-executor.test.ts src/app/state.test.ts`
- PASS: 4 files, 47 tests
- `pnpm --dir web --filter @lda/console test`
- PASS: 144 files, 1,223 tests
- `pnpm --dir web --filter @lda/console typecheck`
- PASS
- `pnpm --dir web --filter @lda/console build`
- PASS
- `git diff --check`
- PASS
## Concerns
- The production build reports the pre-existing Vite warning about a minified
chunk larger than 500 kB; this task did not alter bundling or UI structure.
- Presentation replay evidence uses the explicit target label `replay`, while
live demo evidence records its connected target.
## Fix Round 1
Review findings addressed:
- Routed presentation replay initialization and live evidence appends through
the existing `retainEvidence` policy boundary. Initial replay projection now
sanitizes each record and retains only the newest 100; live appends use the
same function rather than a second retention implementation.
- Replaced the unanchored redaction regex with exact case-insensitive matching
for only: `authorization`, `cookie`, `set-cookie`, `token`, `access_token`,
`refresh_token`, `secret`, `password`, `api_key`, and `api-key`.
- Added coverage for every approved key variant, plus unchanged
`tokenCount`, `authorizationStatus`, `cookieJar`, and `secretary` keys.
- Added presentation projection coverage for sanitized initial replay evidence
and newest-100 retention.
Test files changed in this fix round:
- `web/apps/console/src/workspace/domain/evidence-policy.test.ts`
- `web/apps/console/src/presentation/PresentationRoute.test.tsx`
TDD RED command and output:
```text
pnpm --dir web --filter @lda/console test -- src/workspace/domain/evidence-policy.test.ts src/presentation/PresentationRoute.test.tsx
FAIL: 2 failed, 93 passed (95 total)
- ordinary tokenCount was redacted
- projectRecordingToEvidence was not a function
```
Focused GREEN command and output:
```text
pnpm --dir web --filter @lda/console test -- src/workspace/domain/evidence-policy.test.ts src/presentation/PresentationRoute.test.tsx
PASS: 2 files, 95 tests
```
Broader test command and output:
```text
pnpm --dir web --filter @lda/console test
PASS: 144 files, 1,225 tests
```
Typecheck command and output:
```text
pnpm --dir web --filter @lda/console typecheck
PASS: @lda/presentation-sync build; tsc -b --pretty false
```
Diff hygiene:
```text
git diff --check
PASS: exit code 0
```
@@ -1,70 +0,0 @@
# Task 5 Report: Add the Capability Call Domain Boundary
## Scope
Implemented against baseline `45ba9057`. This task adds only the Valibot
capability-call result model, executor-backed client, and stale-safe React
controller. No UI, Python, or Serena configuration changes were made.
## TDD Evidence
- RED: the domain tests failed because `decodeCapabilityCallResult` and the
capability-call client module were absent.
- GREEN: the focused domain tests passed with 2 files and 7 tests.
- RED: the controller test failed because `useCapabilityPlayground` was absent.
- GREEN: the controller tests passed with 1 file and 9 tests.
## Implementation
- Added the camel-case `CapabilityCallResult` Valibot decoder, including
`runtime_error` outcomes and dependency diagnostics.
- Added `callCapability`, lowering to snake-case through
`ConsoleExecutor.run("workflow.capabilities.call", ...)` only. Blank
deployment IDs are omitted.
- Added `useCapabilityPlayground` with disconnected, idle, calling, result, and
error phases; double-submit suppression; acknowledgement/deployment reset;
and generation plus selection-identity stale completion guards.
## Verification
```text
pnpm --dir web --filter @lda/console test -- src/workspace/domain/capability-models.test.ts src/workspace/domain/capability-call-client.test.ts src/workspace/routes/useCapabilityPlayground.test.tsx
PASS: 3 files, 16 tests
pnpm --dir web --filter @lda/console typecheck
PASS
git diff --check
PASS
```
## Concerns
No functional concerns identified. The controller intentionally leaves
acknowledgement enforcement to the future playground UI while exposing and
resetting the acknowledgement state at this domain boundary.
## Fix Round 1
### Review Finding Addressed
Added direct coverage for changing from connected target A and executor A to
target B and executor B while a call is pending. The test asserts the idle
reset state, rejects the stale target-A promise without allowing an overwrite,
and verifies a subsequent target-B call completes successfully.
### TDD Evidence
The regression test was written before any production edit and passed
immediately, confirming the existing selection-identity and generation guards
already handled target/executor changes. No production change was warranted.
### Verification
```text
pnpm --dir web --filter @lda/console test -- src/workspace/routes/useCapabilityPlayground.test.tsx
PASS: 1 file, 10 tests
pnpm --dir web --filter @lda/console typecheck
PASS
```