Release 3.2.0: federation conformance oracles, ACTOR_MISMATCH removal, Codex fixes - #82
Conversation
…ter seam Filigree's consumer side of the wardline suppression-state filter vocabulary seam (wardline owns active/baselined/waived/judged; filigree consumes it + the local 'all' sentinel). Three layers, mirroring test_sei_conformance_oracle.py: - Layer-1: UPSTREAM_BLOB_SHA byte-pin of the vendored contract (default suite, reds on any 1-byte change) - Consumer oracle (non-circular): asserts filigree's REAL grammar (db_files.VALID_SUPPRESSION_FILTERS) == the contract's states + sentinel AND behaviorally probes the live list_findings_global validator (accepts every contract value, rejects off-vocab) — ties the runtime consumer to the contract - Layer-2: byte-drift recheck vs wardline's authority source (WARDLINE_REPO), skip-clean when absent, fail-closed on divergence Wired into the loomweave-contract CI job so it gates every PR. 6 tests pass, 40 federation tests no regressions, ruff+mypy clean. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…re seam Consumer side of the scan-results emission/intake seam. Vendors wardline's authored wire golden BYTE-IDENTICAL + Layer-1 byte-pin + a NON-CIRCULAR oracle that drives filigree's REAL intake: feeds the golden through the actual _parse_scan_results_body validator and db.process_scan_results ingest primitive (the exact path POST /api/weft/scan-results runs), then reads findings back via find_finding_by_fingerprint + list_findings_global and asserts every wire axis (fingerprint, rule_id, severity, metadata.wardline.* incl. confidence/properties/ related_entities/suppression, file records, suppression+kind filter partitions) survives. Layer-2 byte-drift recheck vs wardline authority (WARDLINE_REPO), skip-clean absent. Wired into the loomweave-contract CI job. 45 federation tests pass, ruff clean. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…y wire seam Consumer side of the fingerprint/qualname/spans identity seam. Vendors wardline's authority golden BYTE-IDENTICAL + Layer-1 byte-pin + a NON-CIRCULAR oracle that drives filigree's REAL fingerprint path: feeds each identity vector through process_scan_results and reads back via find_finding_by_fingerprint + list_findings_global (real metadata.wardline.qualname grammar). Proven non-circular: forcing collision_pair_b's fingerprint == _a's collapses the real dedup-join 5->4. Deliberately does NOT fabricate unstored columns (col_start/end aren't persisted) — column identity proven transitively via the join key. Layer-2 drift recheck vs wardline authority, skip-clean absent. Wired into CI. 51 federation tests pass. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
… (producer) Filigree producer side of the filigree<->loomweave entity-associations seam (ADR-029 opaque binding). Non-circular producer oracle: seeds associations it owns, drives the REAL GET /api/entity-associations ASGI route (api_list_associations_by_entity -> list_associations_by_entity), and asserts the produced row key-set + the real LEFT-JOIN lifecycle derivations (orphan_status/freshness_status/status_category) match the golden — never restates the golden against itself. Layer-1 UPSTREAM_BLOB_SHA byte-pin (reds on tamper) + a reverse byte-drift recheck. Wired into the loomweave-contract CI job. 54 federation tests pass. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
- capabilities CONSUMER: drives the real probe_loomweave_capabilities +
validate_loomweave_capabilities on loomweave's /api/v1/_capabilities golden;
RED targets proven (version-gate -> RegistryVersionMismatchError, bad
registry_backend/sei -> RegistryUnavailableError)
- loomweave-scan-results CONSUMER: drives the real _parse_scan_results_body +
process_scan_results, proving loomweave's fingerprint-LESS wire round-trips
through the legacy positional dedup with metadata.loomweave.* preserved
- issue-detail PRODUCER: freezes GET /api/weft/issues/{id} golden + a
non-circular recheck over the live ASGI handler (200 body + 404 envelope)
All byte-pinned + Layer-2 drift (fail-closed arming) + wired into CI. 73 passed.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…he bar Consumer half of the legis->filigree governed sign-off seam. POST the byte-identical shared golden (legis-signoff-binding-request.json, blob 8796aeb...) through the REAL ASGI entity-associations route and assert filigree persists the legis-specific signoff_seq+signature extension verbatim, flips the binding to governed (fail-closed vs the ungoverned twin), and makes it non-removable. Layer-1 byte-pin + skip-clean Layer-2 recheck against legis's authority copy. Producer (legis) and consumer (filigree) load the SAME bytes; negative-probed. No existing test altered. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…→Plainweave refs Adds/normalizes the 'not-for-X' Banner naming this member's specific misuse (deconfliction-first, not security/compliance); fixes hardcoded Charter→Plainweave prose. Re-vendored kit; build green. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Cites weft-6a1fdb0192 (C-20: federation skill/instruction injections are
overly verbose). Content-shrink only — no mechanism redesign. Nothing was
deleted: every removed chunk moved into an on-demand skill reference sheet.
Before → after (chars / bytes):
instructions.md template 5703 / 5739 → 792 / 792 (budget 800)
assembled injected block 5828 / 5864 → 917 / 917
SKILL.md 13742 / 13840 → 3685 / 3725 (budget 4000)
skill description 455 / 455 → 455 / 455 (budget 500, unchanged)
The injected block now carries: what filigree is, the session entry point
(`session-context` → `start-next-work`), where the full reference lives
(the filigree-workflow skill, `--help`, MCP tool schemas), and the two rules
`--help` cannot teach — claim atomically (never claim+update two-step) and
stop-don't-retry on `SCHEMA_MISMATCH`.
Relocation ledger (source → new home):
instructions.md observations discipline → references/observations.md
instructions.md priority scale → references/commands.md
instructions.md tool catalogue + --actor → references/commands.md
instructions.md entity bindings (ADR-029)→ references/commands.md
instructions.md error codes + recovery → references/error-codes.md
instructions.md ready≠startable → SKILL.md (already there)
SKILL.md observations section → references/observations.md
SKILL.md priority table, key commands,
claim-without-transition, file records,
health, quick decision guide → references/commands.md
SKILL.md response shapes + ErrorCode set → references/error-codes.md
SKILL.md starting-work / workflow-pattern
prose → already covered by the existing
team-coordination.md and
workflow-patterns.md sheets
Contract guards follow the content rather than going dark:
- test_bundled_instructions_enumerate_every_error_code (filigree-adbdda2ee5)
retargets to references/error-codes.md — one bundled sheet still carries
the COMPLETE enum, and a new pointer test keeps SKILL.md's link to it from
rotting. A partial teaser anywhere would re-create the original defect.
- TestInstructionsUpdate keeps every assertion, repointed at each piece's new
home (observations / priorities / INVALID_TRANSITION recovery), and gains
budget guards (800 / 4000 / 500), a non-vacuity sheet-exists check, and an
index check that every references/*.md is linked from SKILL.md.
- LIVE_AGENT_DOCS and the markdown old-name guard both gain the new sheets
(and the existing two, which were never covered by the latter).
- The bare-`observe` whole-word exemption moves from SKILL.md to
observations.md, where the English usage actually lives; SKILL.md is now
guarded again.
Verification: uv run pytest → exit 0 (full suite); 996 passed across
tests/install, tests/mcp/test_tools.py, the two doc-guard modules,
test_doc_command_examples, test_error_envelope_contract and
tests/cli/test_admin_commands.py. ruff check + ruff format --check clean;
mypy src/filigree/ clean (112 files).
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Follow-up to the previous commit (weft-6a1fdb0192 / C-20). A line-level
sweep of origin/main's instructions.md + SKILL.md against the new surface
found four claims that the section-level relocation ledger had assumed were
already covered by the existing sheets, but were not:
- `--advance` semantics ("missing required fields become warnings rather than
blocks; hard edges are never auto-walked") → references/workflow-patterns.md
- the "Before Starting Work" / "When Finishing Work" / "When Blocked" session
recipes, incl. "unblocking the critical path has highest leverage"
→ references/workflow-patterns.md (new Session Recipes section)
- the store-dir location, which the old instructions.md stated as a flat
`.filigree/` — restated correctly in references/commands.md with the real
precedence from resolve_store_dir (weft.toml [filigree].store_dir override,
then .weft/filigree/, then legacy .filigree/) rather than dropped or
carried forward stale
Also verified (not a code change): install_skills / install_codex_skills copy
the whole skill tree, so all five reference sheets land in both
.claude/skills/filigree-workflow/ and .agents/skills/filigree-workflow/ —
every pointer in the shrunk SKILL.md resolves in a consuming project.
863 passed across the doc-guard, install and MCP-tool suites; ruff clean.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
The hub registry already allocates C-18 (input-affordances-are-promises) and C-19; the agent-context conciseness convention is C-20. Ticket weft-6a1fdb0192 is unchanged and remains the anchor. Text-only — no behaviour, no budget, no test target changes. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…NTS.md)
C-20 / weft-6a1fdb0192, owner directive. A project whose CLAUDE.md is just a
pointer at AGENTS.md ("@AGENTS.md" on its own line) should carry ONE managed
block, in AGENTS.md — not two copies of the always-loaded payload, which is
the cost C-20 budgets against. Exemplar shape: ~/elspeth/CLAUDE.md.
Detection (install_support/redirect.py, new):
- `is_agents_md_redirect(claude_md)` — a line, OUTSIDE every managed block,
that is solely an @-import of AGENTS.md (`@AGENTS.md` / `@./AGENTS.md`,
case-insensitive). `see @AGENTS.md for details` is prose, not a redirect.
- `strip_managed_blocks()` excludes every tool's block first, so an
`@AGENTS.md` quoted inside a sibling's block (or our own) cannot trigger a
migration. An unclosed block is read conservatively as running to EOF: no
redirect is detected and the caller keeps existing dual-write behaviour
rather than migrating on the strength of a malformed file.
- Known limitation: an `@AGENTS.md` line inside a ``` fenced code block (not
a managed block) still reads as a redirect. Managed blocks are the case
that occurs in practice — every weft tool writes one.
Behaviour:
- `inject_instructions(CLAUDE.md)` on a redirect project writes and maintains
the block in AGENTS.md (creating it if absent) and migrates any legacy
CLAUDE.md block off. No redirect -> unchanged.
- Ordering is deliberate: the AGENTS.md path is symlink-validated and written
BEFORE the legacy block is stripped from CLAUDE.md, so a part-way failure
leaves the instructions in both files, never in neither.
- The redirect path calls the *locked* internals under the single existing
lock acquisition — the lock is per store dir, so re-entering
`inject_instructions` would self-deadlock on filigree's own flock.
- SessionStart freshness (hooks.py) honours the redirect. Critically it
migrates a legacy CLAUDE.md block even when that block's hash is CURRENT:
the staleness short-circuit would otherwise skip that project forever.
- `filigree install` (all flags) runs one step, not two, in a redirect
project — the CLAUDE.md step already maintains AGENTS.md. `--agents-md`
and `--claude-md` each remain correct standalone.
- doctor: a pointer-only CLAUDE.md now PASSES ("Redirects to AGENTS.md;
instructions live there") instead of failing "No filigree instructions"
forever; a redirect CLAUDE.md still carrying a legacy block FAILS with a
fix hint; and a missing AGENTS.md under a redirect is a real failure
rather than the usual "AGENTS.md is optional".
C-4 (multi-owner block contract) holds on both files: the removal path shares
the replace path's foreign-safe bounding via the extracted `_own_block_bounds`,
so only filigree's own block is ever excised, and a file that is nothing but
our block is left alone rather than emptied.
Tests: 32 new across tests/install/test_install.py (detection matrix incl.
accepted/rejected spellings, block-quoted imports, unclosed blocks;
block-lands-only-in-AGENTS.md; legacy migration; foreign-block preservation;
idempotency; symlink refusal leaves CLAUDE.md intact; no-redirect unchanged;
AGENTS.md created), tests/install/test_hooks.py (freshness migrates
current-hash and stale legacy blocks, pointer-only left alone, AGENTS.md
still refreshes, non-redirect dual-write intact) and
tests/cli/test_admin_commands.py (one reported action under `install`,
`--agents-md` / `--claude-md` standalone). Also verified by hand against a
copy of the real ~/elspeth/CLAUDE.md: redirect detected, AGENTS.md created
with the block, CLAUDE.md byte-identical to the original.
571 passed across tests/install + tests/cli/test_admin_commands.py; ruff and
mypy clean.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…mentation C-20 / weft-6a1fdb0192. Legis's redirect installer (legis c18/concise-injections, 4255cf4) is the normative reference the members implement against, so filigree must not diverge on the same file. Two real divergences, plus the user-facing promises that changed with the feature. Conformed: - **Removal is now more conservative than injection.** Injection can always fall back to an append — it deletes nothing — so it may bound a malformed block at a foreign fence and recover. A mis-bounded *delete* eats a sibling tool's block and has no safe fallback. The migration path now uses `_provable_own_block_span`, which refuses (no-op + warning, block left in place, reported in the return message) whenever ownership is not provable: our close marker missing; any open fence nested inside an unclosed block (which is what shields an own marker inside an unclosed sibling block); or split brain (>1 own block — doctor's "resolve it by hand" posture rather than guessing which copy to drop). Injection keeps its recovery semantics unchanged. - **The SessionStart hook never installs.** It now migrates a legacy CLAUDE.md block only once AGENTS.md already carries one. Migrating while AGENTS.md is empty would leave the session with NO filigree guidance; a duplicate block is the far cheaper failure, and `filigree install` does the real migration. - **Doubtful input keeps dual-write:** a symlinked CLAUDE.md now reads as no redirect, alongside absent/unreadable/non-UTF-8. Already matching, now pinned by test: the accepted/rejected @-import spellings (incl. `@/AGENTS.md` rejected as an absolute path), managed-block masking, `--claude-md` writing AGENTS.md under a redirect, doctor's inverted check, and the fenced-markdown detection gap — accepted as spec, uniform across members rather than locally clever. Promises updated with the behaviour (C-18 input-affordances doctrine — a flag must not advertise what it no longer does): - `--claude-md` help now says "into AGENTS.md when CLAUDE.md only redirects there". - docs/cli.md gains a redirect note covering install, the SessionStart refresh and doctor. - CHANGELOG.md gains an Unreleased section for both the shrink and the redirect routing. +11 tests (conservative-removal matrix: missing close marker, split brain, shielded-by-unclosed-sibling, file-is-nothing-but-our-block, CRLF, symlinked CLAUDE.md; hook never-installs in both AGENTS.md-absent and AGENTS.md-without-block shapes; doctor --fix convergence). Re-verified against a copy of the real ~/elspeth/CLAUDE.md with a legacy block planted: migrated, CLAUDE.md restored byte-identical to the original, AGENTS.md created and current, second run idempotent. 580 passed across tests/install + tests/cli/test_admin_commands.py; ruff and mypy clean. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…e installer (weft-6a1fdb0192)
# Conflicts: # CHANGELOG.md
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Av5hzKQjJrM2SAeTqTMMBa
|
You have reached your Codex usage limits for code reviews. You can see your limits in the Codex usage dashboard. |
There was a problem hiding this comment.
Pull request overview
This PR strengthens Filigree’s federation contract guarantees by adding byte-pinned conformance oracles and vendored fixtures, while also revising “actor identity” semantics so explicit agent aliases are treated as the operational actor (with OS identity kept as provenance, not a mismatch). It also introduces redirect-aware instruction injection for CLAUDE.md→AGENTS.md setups and restructures the bundled skill/instructions content to meet C-20 budgets by relocating detail into reference sheets.
Changes:
- Add multiple federation conformance “oracles” (byte-pins + live ASGI/intake checks) and new contract fixtures under
tests/fixtures/contracts/. - Retire
ACTOR_MISMATCHwarning injection and treatactoras a logical alias while recordingverified_*as transport provenance. - Add redirect-aware instruction injection (CLAUDE.md pointer projects write to AGENTS.md only) and relocate guidance into skill reference sheets with size-budget tests.
Reviewed changes
Copilot reviewed 59 out of 61 changed files in this pull request and generated 3 comments.
Show a summary per file
| File | Description |
|---|---|
| uv.lock | Bumps editable package version to 3.1.0 in lock metadata. |
| tests/util/test_docs_contracts.py | Updates doc contract allowlist/exemptions for relocated skill reference sheets. |
| tests/test_error_envelope_contract.py | Moves ErrorCode enumeration checks to the new reference sheet and adds pointer test. |
| tests/mcp/test_verified_actor_mcp.py | Updates MCP tests to assert no ACTOR_MISMATCH and to verify actor vs verified_actor persistence. |
| tests/mcp/test_tools.py | Adds skill-pack content/budget and relocation integrity tests. |
| tests/mcp/test_no_old_names_in_markdown_docs.py | Expands markdown guard coverage to new reference sheets. |
| tests/install/test_install.py | Adds extensive redirect-aware injection/migration test coverage. |
| tests/install/test_hooks.py | Adds redirect-aware SessionStart freshness/migration tests. |
| tests/fixtures/contracts/weft/issues-get.json | Extends weft issue-detail contract fixture with a live 200 example. |
| tests/fixtures/contracts/wardline-scan-results-wire.golden.json | Adds vendored Wardline scan-results request golden. |
| tests/fixtures/contracts/wardline-finding-identity-wire.golden.json | Adds vendored Wardline finding-identity golden vectors. |
| tests/fixtures/contracts/loomweave-scan-results-wire.golden.json | Adds vendored Loomweave scan-results golden. |
| tests/fixtures/contracts/legis-signoff-binding-request.json | Adds vendored legis governed sign-off binding request golden. |
| tests/fixtures/contracts/get-api-v1-capabilities.json | Adds vendored capabilities contract fixture. |
| tests/federation/test_weft_issue_detail_wire_conformance_oracle.py | Producer-side oracle tying live handler output shape to golden. |
| tests/federation/test_suppression_filter_conformance_oracle.py | Consumer-side oracle binding Filigree suppression vocab/validator to Wardline contract. |
| tests/federation/test_signoff_binding_wire_conformance_oracle.py | Consumer-side oracle verifying governed sign-off fields are parsed/persisted and have semantic effect. |
| tests/federation/test_scan_results_wire_conformance_oracle.py | Consumer-side oracle driving real validator + ingest and round-tripping Wardline golden. |
| tests/federation/test_entity_associations_wire_conformance_oracle.py | Producer-side oracle tying live reverse-lookup response row shape to golden + optional consumer drift recheck. |
| tests/core/test_actor_identity.py | Updates actor identity tests to reflect “no mismatch warning” policy. |
| tests/cli/test_verified_actor_cli.py | Updates CLI tests to assert no mismatch warning and verify stored actor/provenance columns. |
| tests/cli/test_issue_commands.py | Adjusts JSON parsing guidance in tests (prefer stdout due to Click merge behavior). |
| tests/cli/test_files_commands.py | Same stdout-isolation adjustments for JSON contract tests. |
| tests/cli/test_compose_commands.py | Same stdout-isolation adjustments for JSON contract tests. |
| tests/cli/test_admin_commands.py | Adds redirect-aware install reporting test and server-mode init registration repair tests. |
| src/filigree/skills/filigree-workflow/SKILL.md | Compresses SKILL.md and turns it into an index pointing to reference sheets. |
| src/filigree/skills/filigree-workflow/references/workflow-patterns.md | Adds “session recipes” content moved out of SKILL.md/instructions. |
| src/filigree/skills/filigree-workflow/references/observations.md | New relocated observations guidance sheet. |
| src/filigree/skills/filigree-workflow/references/error-codes.md | New relocated response envelope + full ErrorCode enum sheet. |
| src/filigree/skills/filigree-workflow/references/commands.md | New relocated commands/priorities/records sheet. |
| src/filigree/mcp_tools/common.py | Generalizes warning injection docstring (no longer actor-mismatch specific). |
| src/filigree/mcp_server.py | Removes ADR-012 mismatch-warning injection from MCP responses. |
| src/filigree/install.py | Implements redirect-aware instruction injection + safe block stripping utilities. |
| src/filigree/install_support/redirect.py | Adds redirect detection + managed-block stripping for safe redirect identification. |
| src/filigree/install_support/doctor.py | Makes doctor redirect-aware (CLAUDE.md pointer is OK without a block; missing AGENTS.md becomes an error). |
| src/filigree/hooks.py | Updates SessionStart freshness logic to honor redirects and migrate legacy CLAUDE.md blocks safely. |
| src/filigree/data/instructions.md | Shrinks injected instructions to the minimal entry point + two non-discoverable rules. |
| src/filigree/cli.py | Removes CLI actor-mismatch warning emission. |
| src/filigree/cli_commands/admin.py | Ensures server-mode init re-registers canonical store path; makes install redirect-aware to avoid duplicate writes/reporting. |
| src/filigree/actor_identity.py | Reframes actor identity: alias is operational; verified is provenance; mismatch warning retired (shim retained). |
| site/src/pages/index.astro | Expands “not a security boundary” disclaimer and updates a CSS var reference. |
| docs/UPGRADING.md | Updates upgrade docs for config-anchor move and server registration repair. |
| docs/superpowers/specs/2026-06-05-transport-bound-actor-identity-design.md | Updates design spec to remove mismatch-warning policy. |
| docs/product/vision.md | Adds product vision doc under docs/product. |
| docs/product/roadmap.md | Adds product roadmap doc under docs/product. |
| docs/product/prd-0001-agent-broadcast-board.md | Adds PRD for broadcast board bet. |
| docs/product/metrics.md | Adds metrics doc with bootstrap placeholders. |
| docs/product/decisions/0004-tabard-identity-seam.md | Adds decision record for Tabard identity seam posture. |
| docs/product/decisions/0003-agent-broadcast-board.md | Adds decision record for broadcast board bet. |
| docs/product/decisions/0002-agent-dx-is-the-now-bet.md | Adds decision record for Now bet prioritization. |
| docs/product/decisions/0001-bootstrap-from-observed-state.md | Adds bootstrap decision record for product workspace. |
| docs/product/current-state.md | Adds a “current state” checkpoint doc. |
| docs/product/2026-06-16-filigree-to-hub-tabard-seam.md | Adds hub/Tabard seam memo. |
| docs/cli.md | Documents CLAUDE.md→AGENTS.md redirect behavior for install/doctor/freshness. |
| docs/architecture/decisions/ADR-012-actor-identity-threat-model.md | Updates ADR-012 conflict policy to “record without warning”. |
| CHANGELOG.md | Adds Unreleased entries for redirect-aware injection, actor alias policy, budgeted guidance relocation, and init fix. |
| .gitignore | Stops ignoring docs/product and ignores .wardline/ output directories instead. |
| .github/workflows/ci.yml | Adds new federation oracle tests to the CI job’s explicit test list. |
Suppressed comments (1)
tests/mcp/test_tools.py:2899
- Test name says
c18but the docstring and comments refer to a C-20 budget for SKILL.md. Renaming avoids confusion when hunting for the C-20 budget guardrail tests.
💡 Add a code-review agent skill or configure MCP servers for context-aware, tailored reviews. Learn more in the docs.
| elif is_close and ns == open_ns: | ||
| open_ns = None | ||
| last = m.end() |
| The read-modify-write is serialised across processes by an exclusive | ||
| ``.filigree/instructions.lock`` (filigree-04bad2a2bf). | ||
| """ |
| assert "filigree-workflow" in FILIGREE_INSTRUCTIONS | ||
| assert "--help" in FILIGREE_INSTRUCTIONS | ||
|
|
||
| def test_instructions_stay_within_c18_budget(self) -> None: |
… v6 (ADR-056 auth discovery) Loomweave ef8dd82 bumped the producer golden to fixture_version 6, adding the additive non-secret `authentication` discovery block. Re-vendor byte-identical and refresh the blob/sha256 pins; the consumer oracle is unchanged and passes. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Av5hzKQjJrM2SAeTqTMMBa
…re replay The weft issue-detail oracle added a populated-success example (live_v_issue_detail_200) to issues-get.json, but the generation-parity harness replays every example against an unseeded dashboard, where that id cannot exist (404 != 200 on every CI lane). Flag the example requires_seeded_state and have the harness skip such examples; the oracle seeds its own row and pins the key shape, so coverage is unchanged. Refresh the oracle's blob pin for the fixture edit. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Minor: redirect-aware instruction injection (C-20) is new surface; agent-alias attribution, C-20 context budgets, init store reconciliation, symlink-safe store migration and instruction lock, unified MCP project-scope resolution, seven federation conformance oracles, dependency bumps. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
…review fixes) - scan-results oracle: process_scan_results normalises finding dicts in place and parsed["findings"] aliased the golden, so every post-ingest comparison ran against already-mangled objects; re-read a pristine golden after ingest. - finding-identity oracle: ingest the HTTP wire forms (scheme-stamped `wlfp2:` fingerprint, suffix-stripped qualname) instead of the JSONL file forms Filigree never receives; the property-setter vector now actually discriminates. - issues-get contract fixture: drop the harness control flag (Loomweave byte-mirrors this fixture; the copies had desynced) and exclude the seeded-only example by name in the parity harness instead; restore the blob pin and add the reverse skip-clean drift recheck against Loomweave's vendored copy. - capabilities oracle: prose digest updated to the v6 golden; two asserts that could never fail replaced by a comment naming the load-bearing check. - ci: the loomweave-contract job list was missing the sign-off oracle. - CHANGELOG: ACTOR_MISMATCH is a removal, not a narrowing; file it under Removed and say so. uv.lock carries the 3.2.0 self-version. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Summary
Release PR for 3.2.0.
tests/federation/with vendored golden/contract fixtures: wardline suppression-filter, scan-results wire, finding-identity wire; loomweave scan-results wire, entity-associations (producer), weft issue-detail wire; theGET /api/v1/capabilitiescontract; legis governed sign-off binding.ACTOR_MISMATCHwarnings removed — comparing a logical agent alias against a shared OS account only produced false positives. Claimedactorstill drives claim-aware writes;verified_actor/verified_authorstill record transport provenance.actor_mismatch_warning()stays as an always-Noneimport shim (follow-up to retire it: filigree-60a5103dee).docs/product/tracked in git (vision, roadmap, metrics, PDRs 0001–0004, PRD-0001). Note: this repo is public and the previous.gitignorefence said "kept local (not public)"; owner decision, see review below.maintwice: C-20 concise injections, RED-1 closure gate, init store reconciliation, six Dependabot bumps (chore(deps): bump pyjwt from 2.12.0 to 2.13.0 #61 build(deps): Bump python-multipart from 0.0.28 to 0.0.31 #64 build(deps): bump pydantic-settings from 2.12.0 to 2.14.2 #67 build(deps): bump the actions group across 1 directory with 5 updates #68 build(deps): bump mcp from 1.26.0 to 1.28.1 #73 build(deps): bump cryptography from 48.0.0 to 50.0.0 #75), and the three Codex fixes reviewed and merged in this session (fix(mcp): unify project query scope resolution #77 MCP scope unification, fix(store): reject symlinked migration destinations #79 symlink-safe store migration, fix(install): prevent instruction lock symlink truncation #81 symlink-safe instruction lock).Review (code-review, high effort) and what changed because of it
authenticationblock) — the v5 copy failed its own drift check locally.process_scan_resultshad already normalised in place; now re-reads a pristine golden after ingest.:setterqualname) instead of the HTTP wire forms (wlfp2:-stamped, suffix-stripped); switched to the wire forms so the property-setter vector actually discriminates.loomweave-contractCI list; CHANGELOG entry re-filed under Removed.authentication), filigree-6ba62e4e75, filigree-434aa4e145, filigree-9c16595d70.Test plan
uv run ruff check src/ tests/— cleanuv run ruff format --check src/ tests/— cleanuv run mypy src/filigree/— cleanuv run pytestfull suite locally on the final commit🤖 Generated with Claude Code