release: v1.3.0 — honest partial-emit surfaces (wardline-7924d67d3b)#89
Conversation
…cally only" Review P2 pair: 89563f1 taught the producers to preserve partial-emit truth (EmitResult.chunks_landed + accumulated counts/warnings on mid-batch failures; WriteResult.written preserved on mid-batch outage/403), but the CLI human rendering still branched on binary `reachable` and only rendered counts in the reachable branch — so a mid-emit transport drop printed "could not reach Filigree ... findings written locally only" after Filigree had already ingested chunks and run mark_unseen, and a partial Loomweave write printed "taint store not written" over committed facts. The unreachable branches now discriminate partial evidence (chunks_landed for Filigree, written for Loomweave — deliberate skips always carry written=0) and render the counts, failed tally, and producer warnings in every soft-failure sub-branch (auth / server error / transport). The transport case names "connection dropped mid-emit" rather than the first-contact "could not reach". Machine surfaces (agent-summary/MCP/ scan-job blocks) already carried this truth; the operator line no longer contradicts them (PDR-0023 at the human surface). Glossary line anchors for the scan summary/gate lines shifted +38 with the edit; _ANCHORS and finding-lifecycle-vocabulary.md citations updated. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…d3b residuals) filigree_disabled_reason now takes chunks_landed and stops flattening a mid-batch failure to "filigree unreachable" — the string scan_jobs persists verbatim as the terminal job `error` field. The transport rung becomes "connection dropped mid-emit (K chunk(s) landed before the failure)"; the 401/403/5xx rungs keep their diagnosis and append the landed-chunk truth. The result-based status builder threads EmitResult.chunks_landed through, so the CLI agent-summary, scan-job status.json, and scan_file_findings surfaces inherit the honest string; the MCP from-block path is unchanged (its block already carries the partial story in failures/warnings, and its golden bytes stay frozen). Zero-chunk ladder bytes are byte-identical. Also closes the coverage gap the issue named: chunks_landed is now asserted on the mid-batch 401/403/5xx parameterization, not only the transport-drop path. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…t partial-emit surfaces Minor bump: adds concurrent-writer detection (WLN-ENGINE-TREE-CHANGED-DURING-SCAN) and hardens every credential-bearing transport against redirects (fail-closed WeftRedirectError; see [1.3.0] Security). Fixes ship the PDR-0023 partial-emit honesty through the human surfaces (CLI stderr + scan-job error field, wardline-7924d67d3b), MCP boolean-arg coercion, scan-job terminal-status monotonicity, and the zero-files vacuous-PASSED gate. Also repairs the Keep-a-Changelog compare links (stale since v1.0.6). Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Both can alter a previously-"green" run: an endpoint behind a 3xx now fails loudly instead of silently emitting credentials cross-origin as a GET, and a signing path with unreadable git state refuses instead of coercing to clean. Also retitles the v1.2 section now that 1.2.0 has shipped. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…y strict) 89563f1's arg-hardening test helper is annotated, so strict mypy checks its body — dispatch() returns dict | None (None only for id-less notifications) and the bare return failed [return-value]. The helper always sends id=1, so assert the invariant and return the narrowed dict. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: ba85f28390
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
| status=result.status, | ||
| token_sent=result.token_sent, | ||
| url=result.url, | ||
| chunks_landed=result.chunks_landed, |
There was a problem hiding this comment.
Thread landed chunk counts through MCP status
This only passes chunks_landed on the result-based status path; the MCP scan path still builds a raw block that drops er.chunks_landed (src/wardline/mcp/server.py:116-134), and filigree_emit_status_from_block() then calls filigree_disabled_reason() with the default zero. In an MCP scan where the Filigree connection drops after one or more chunks landed, the response can show nonzero created/updated counts and partial failures but still report disabled_reason: "filigree unreachable ...", recreating the misdiagnosis this change is meant to remove for the agent-facing surface.
Useful? React with 👍 / 👎.
Cuts v1.3.0 from the consolidation line. The consolidation content itself (redirect hardening, concurrent-writer detection, MCP strict args) is already on main; this PR carries the final review-driven fixes plus the version bump:
Fixes (wardline-7924d67d3b — both P2 review findings)
connection dropped mid-emitinstead of the first-contactcould not reach Filigree.taint store partially written … N taint fact(s) committed before the failureinstead of the flatnot written.filigree_disabled_reasonis partial-aware (chunks_landedkwarg): the string scan-jobs persists as the terminal joberrorno longer flattens a mid-batch failure tofiligree unreachable. Zero-chunk ladder bytes unchanged; MCP from-block goldens stay frozen.chunks_landedasserted on the mid-batch 401/403/5xx test parameterization; glossary line anchors re-pinned after the CLI edit.Release
_version.py→ 1.3.0; CHANGELOG[Unreleased]rolled into[1.3.0] - 2026-07-03; Keep-a-Changelog compare links repaired (stale since v1.0.6).[1.3.0]adds concurrent-writer detection and the never-follow-redirects federation hardening.Verification: full suite 4664 passed / 1 skipped; ruff + format + mypy clean;
wardline scan . --fail-on ERRORgate PASSED. Tagv1.3.0will be placed on the merge commit to trigger the PyPI publish workflow.🤖 Generated with Claude Code