Plainweave 1.2.0 — peer-facts CLI parity, web a11y, seam hardening, producer gated-live, workflow skill#7
Conversation
… degraded-state pins (PDR-018) Retires the last 3 named production blockers plainweave-side. Test-and-docs only — zero src/plainweave/*.py changes; the seam BEHAVIOR already exists, this freezes/pins it. - #5 Filigree: tests/contracts/test_filigree_contract.py pins open_linked_work as reserved-but-never-emitted (absence is the in-band linked_work_facts_unavailable warning, never empty-but-ok), filigree_issue trace opacity + canonical relations, and the dossier's verdict-free advisory boundary (key + whitelisted-value scan — the dossier legitimately carries lifecycle "approved"/"rejected" values, so the peer-facts scanner doesn't apply). - #4 Legis: behavioral coverage for orphaned_entity_link (previously zero); ADR-006 annotated with the 8-of-11 emission status (active/waived_finding_linked superseded by the dedicated wardline_peer_facts producer; open_linked_work handed off to Filigree); doc-staleness fix (the legis consumer now exists). - #3 Loomweave: tests/loomweave_contract.py validate_loomweave_catalog + degraded golden, pinning the cardinal no-silent-clean invariant — an unavailable adapter never returns a clean-empty page and never advertises positive coverage/pagination while down. Every new test mutation-proven red-first. make ci green (390 tests, 91.18% cov, mypy --strict + ruff); wardline scan 0 active; legis cross-repo preflight oracle stayed green (28 passed — additive, no plainweave obligation). Adversarially reviewed (3 lenses: decorative-test, no-silent-clean/boundary, claim-honesty); all findings applied. Owner-gated Filigree open_linked_work handoff authored (docs/handoffs/2026-06-29-filigree-linked-work-facts.md). 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: 1086187368
ℹ️ 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".
|
|
||
| from typing import Any | ||
|
|
||
| LOOMWEAVE_ADAPTER_STATUSES = {"available", "unavailable"} |
There was a problem hiding this comment.
Include the degraded adapter status in the catalog contract
When the Loomweave DB exists but lacks the catalog schema or SEI tables, the existing producer returns adapter_status["status"] == "degraded" (covered by tests/test_loomweave_adapter.py:128-160). This new validator rejects that already-supported partial state, so any contract check over live MCP output for a schema-missing or SEI-unsupported catalog fails even though the producer is correctly carrying degradation in-band. Please include degraded in the allowed vocabulary and apply the appropriate no-silent-clean expectations to it.
Useful? React with 👍 / 👎.
| """The real producer over a root with no Loomweave db: an unavailable adapter, an | ||
| empty page, and a degraded reason carried in-band (no silent-clean).""" | ||
| data = _data(_surface(tmp_path).plainweave_loomweave_catalog_list(limit=50, offset=0)) | ||
| validate_loomweave_catalog(data) |
There was a problem hiding this comment.
Compare the live degraded envelope to the golden
In the no-Loomweave-DB scenario this only runs the live payload through the structural validator, so the committed catalog-degraded.json can drift from the producer without failing the test; for example, changing the live degraded code/message away from loomweave_db_missing still passes because the validator only requires code/message keys. If this fixture is meant to be a golden pin, load it here and compare live output to it after normalizing path-sensitive fields.
Useful? React with 👍 / 👎.
| is reserved vocab the local-only producer never constructs today, so it must never appear | ||
| as an empty-but-ok fact list when a future live Filigree join lands (sibling-gated).""" | ||
| service = service_for(tmp_path) | ||
| requirement_id = approve_requirement(service) |
There was a problem hiding this comment.
Seed a Filigree trace before guarding open_linked_work
This test claims to pin that the local-only producer never emits open_linked_work, but its setup only creates a requirement and no filigree_issue trace. If a future change incorrectly translates existing local Filigree traces into open_linked_work facts while still leaving the unavailable warning, this contract stays green; add a scoped requirement with a Filigree trace before asserting that the reserved fact is absent.
Useful? React with 👍 / 👎.
…e (PDR-017) The [tool.hatch.build.targets.wheel.force-include] block re-mapped web/templates + web/static, which packages = ["src/plainweave"] already vendors under the src-layout, colliding on web/static/.gitkeep and breaking `uv build --wheel`. Removing it lets the wheel build once with every web asset shipped exactly once. Load-bearing: a clean `uv tool install` was producing a stale binary without the `requirements-enrichment` verb, darkening warpline's requirements federation member (it read `disabled` despite both sides' code being correct). Records PDR-017 (requirements-enrichment producer validated live end-to-end against the Warpline consumer, PDR-0008) and the producer implementation handoff. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…low skill Cut 1.2.0: bump _version.py 1.1.0 → 1.2.0, finalize the [1.2.0] CHANGELOG section (CLI peer-facts parity, web UX + a11y overhaul PDR-016, federation seam hardening PDR-018, wheel-build fix PDR-017), and refresh the README. Add the plainweave-workflow agent skill following the federation-standard infrastructure (the filigree pattern): authored in-package at src/plainweave/skills/plainweave-workflow/ (SKILL.md + two reference sheets), shipped as package data via packages=["src/plainweave"], and dogfooded into the repo's .claude/ + .agents/ skill trees. Verified locally with the exact release gate: make ci green (390 passed, 91.18% cov) and `uv build` produces plainweave-1.2.0 sdist+wheel with the skill files packaged. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Brings the full 1.2.0-line work to
mainand cuts the release.What's in 1.2.0
wardline-peer-facts+requirements-enrichmentover the CLI (previously MCP-only); the latter is now consumed live by Warpline as the 4thconsult_federationmember (Warpline PDR-0008, validated end-to-end in PDR-017).loomweave_catalog.v1, a Filigree-seam contract test, and ADR-006 fact-kind documentation + coverage.plainweave-workflowskill pack — federation-standard agent skill (the filigree infrastructure), authored in-package atsrc/plainweave/skills/, shipped as package data and dogfooded into the repo skill trees.force-includeblock that brokeuv build(collided onweb/static/.gitkeep); a cleanuv tool installagain advertises every CLI verb. This is also what failed the v1.1.0 release build.Release mechanics
_version.pybumped 1.1.0 → 1.2.0; CHANGELOG[1.2.0]finalized; README refreshed.make cigreen (390 passed, 91.18% cov);uv buildproducesplainweave-1.2.0sdist + wheel with the skill packaged.v1.2.0triggersrelease.yml→ build + PyPI publish (Trusted Publishing; v1.0.0 published green through this same workflow).🤖 Generated with Claude Code