Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
74 commits
Select commit Hold shift + click to select a range
806bbb8
chore: untrack generated agent instruction files (CLAUDE.md, AGENTS.md)
tachyon-beep Jun 6, 2026
a565c27
chore: gitignore CLAUDE.md and AGENTS.md
tachyon-beep Jun 6, 2026
54dabd5
test(filigree/client): cover transport/error branches (roadmap 13)
tachyon-beep Jun 6, 2026
4ca617f
ci: raise coverage floor to 88%, add ruff lint gate, clear F401s (Q-L…
tachyon-beep Jun 6, 2026
fa01db1
fix(identity): TTL-revalidate capability latch; type-check content_ha…
tachyon-beep Jun 6, 2026
881c80f
ci: make live Loomweave conformance non-optional for releases (roadma…
tachyon-beep Jun 6, 2026
c1f726d
fix(store): enforce AuditStore batch read-free invariant + regression…
tachyon-beep Jun 6, 2026
0b7d41c
fix(policy): reconcile gate/scanner fingerprint extraction; defer RFC…
tachyon-beep Jun 6, 2026
01dcc56
refactor(mcp): table-driven call_tool dispatch + stdin line bound (Q-…
tachyon-beep Jun 6, 2026
d7e7c81
chore: stop tracking AGENTS.md and CLAUDE.md
tachyon-beep Jun 6, 2026
fa5ca3b
feat(wardline): typed SKIPPED_DIRTY_TREE amber state + dirty-tree dev…
tachyon-beep Jun 6, 2026
dbc8303
style(tests): clear remaining ruff findings (release prep)
tachyon-beep Jun 6, 2026
01d26c6
chore(release): bump version to 1.0.0rc4
tachyon-beep Jun 6, 2026
772fd6b
Merge superseded branch chore/untrack-agent-instruction-files into rc4
tachyon-beep Jun 6, 2026
67946df
chore(gitignore): separate project-conduct artifacts from the capability
tachyon-beep Jun 6, 2026
0127b66
feat(install): inject legis instructions + skill pack with automatic …
tachyon-beep Jun 6, 2026
b245710
fix(install): harden skill swap, hook upgrade, gitignore, nested-corr…
tachyon-beep Jun 6, 2026
e87fbf3
fix(mcp): pull_request_get reports recorded checks unconditionally
tachyon-beep Jun 6, 2026
fe50792
docs(canonical): correct Q-L4 note clause + add non-ASCII regression …
tachyon-beep Jun 6, 2026
9cb0ff9
docs(changelog): backfill rc2/rc3 entries + complete rc4
tachyon-beep Jun 6, 2026
b4a59ac
fix(cli): log best-effort instruction-refresh failures on MCP boot
tachyon-beep Jun 6, 2026
5ac2499
chore(hooks): drop dead _build_instructions_block re-export
tachyon-beep Jun 6, 2026
a632541
fix(mcp): bound stdin reads by bytes, not characters
tachyon-beep Jun 6, 2026
129d0bb
test(wardline): pin allow-dirty fail-safe default + CI missing-proven…
tachyon-beep Jun 6, 2026
b100d45
fix(audit): surface SQLite PRAGMA failures instead of swallowing them
tachyon-beep Jun 6, 2026
e77d6e4
refactor(types): convert stringly-typed outcome/status axes to str Enums
tachyon-beep Jun 6, 2026
6361e03
docs(changelog): record str,Enum outcome/status axes conversion
tachyon-beep Jun 6, 2026
948e5dd
Merge branch 'refactor/str-enum-axes' into rc4
tachyon-beep Jun 6, 2026
9100e64
test(wardline): pin str,Enum axes to byte-identical bare-string wire
tachyon-beep Jun 6, 2026
6417b69
fix(observability): surface silent degrade paths + pin MCP registry sync
tachyon-beep Jun 6, 2026
7f5ad87
Rebrand Loom suite residue -> Weft in .gitignore comment
tachyon-beep Jun 6, 2026
9910c41
fix(observability): name failed seq in verify_integrity; warn on bad …
tachyon-beep Jun 6, 2026
a9a358a
fix(install): bound instruction injector at foreign fences (peer of f…
tachyon-beep Jun 6, 2026
1a221de
chore(release): sync uv.lock legis version to 1.0.0rc4
tachyon-beep Jun 6, 2026
645cc64
fix(install): span-aware injector anchor + surface drift-refresh fail…
tachyon-beep Jun 6, 2026
af32ed4
fix: fold in non-blocking rc4 review suggestions
tachyon-beep Jun 6, 2026
8ad8b3b
docs(readme): refresh rc1-era status to rc4
tachyon-beep Jun 6, 2026
38836ac
feat(config): consolidate legis stores under .weft/legis federation s…
tachyon-beep Jun 6, 2026
12d2494
fix(tests): isolate store locations; retire vestigial gitignore entries
tachyon-beep Jun 6, 2026
2b4588c
fix(docs): update error messages in SKILL.md for Loomweave and Filigr…
tachyon-beep Jun 6, 2026
c3637eb
fix(enforcement): drop vestigial v1/legacy signing path after clarion…
tachyon-beep Jun 7, 2026
015a2db
fix(governance): stop override-rate gate over-detecting protected rec…
tachyon-beep Jun 7, 2026
db9a38e
refactor(config): centralize LEGIS_*_DB env precedence into the store…
tachyon-beep Jun 7, 2026
020c0c6
refactor(identity): extract shared Weft-component transport-HMAC seam
tachyon-beep Jun 7, 2026
779023d
refactor(wardline): centralize scan-routing validation in the service…
tachyon-beep Jun 7, 2026
a217b00
style(tests): drop unused pytest import in test_weft_signing
tachyon-beep Jun 7, 2026
f32801f
refactor(install): colocate instruction-marker reader with its writer
tachyon-beep Jun 7, 2026
1805e37
docs(governance): record why full per-read trail verification is inte…
tachyon-beep Jun 7, 2026
f7eafa7
refactor(types): give recorded-fact provenance a shared str,Enum voca…
tachyon-beep Jun 7, 2026
cf1aded
refactor(config): centralize LEGIS_PROTECTED_POLICIES resolution
tachyon-beep Jun 7, 2026
cf07dda
docs(mcp): note the idempotency scan's verification cost is intentional
tachyon-beep Jun 7, 2026
f70feb4
chore(skills): regenerate loomweave-workflow for .weft/loomweave stor…
tachyon-beep Jun 7, 2026
e289bc6
docs(spec): legis doctor design — view/repair install+config health
tachyon-beep Jun 7, 2026
dcc38c8
docs(plan): legis doctor implementation plan (10 TDD tasks)
tachyon-beep Jun 7, 2026
430a759
feat(doctor): DoctorCheck record + text/json rendering
tachyon-beep Jun 7, 2026
077e668
feat(doctor): collect_checks + run_doctor orchestrator skeleton
tachyon-beep Jun 7, 2026
77b118f
feat(doctor): wire 'legis doctor' CLI subcommand
tachyon-beep Jun 7, 2026
8797502
style(doctor): consolidate test imports; drop redundant Path import
tachyon-beep Jun 7, 2026
c11360d
feat(install): register legis MCP server in .mcp.json (+ --mcp flag)
tachyon-beep Jun 7, 2026
0517cd0
feat(doctor): .mcp.json registration check + repair
tachyon-beep Jun 7, 2026
fc38a6d
fix(install): split command/args in .mcp.json entry for module fallback
tachyon-beep Jun 7, 2026
ae99cdf
fix(install): let explicit --agent-id win; guard non-dict .mcp.json
tachyon-beep Jun 7, 2026
71fbcd1
feat(doctor): install-wiring checks (blocks, skills, hook, gitignore)
tachyon-beep Jun 7, 2026
8f11e03
refactor(doctor): share gitignore predicate with install; test instal…
tachyon-beep Jun 7, 2026
e9e92a0
feat(doctor): config & store checks (weft.toml report-only, store dir…
tachyon-beep Jun 7, 2026
f002578
feat(doctor): governance-chain integrity + runtime/sibling checks
tachyon-beep Jun 7, 2026
6b77ff3
fix(doctor): root-anchor store_dir; source store specs from config; t…
tachyon-beep Jun 7, 2026
7c529cf
test(doctor): end-to-end repair pipeline + weft.toml/secret invariants
tachyon-beep Jun 7, 2026
7030be5
docs(doctor): changelog + readme for legis doctor; coverage floor
tachyon-beep Jun 7, 2026
872657e
test(doctor): harden secret guard + make fresh-project e2e test hermetic
tachyon-beep Jun 7, 2026
c078d69
fix(doctor): resolvability-based .mcp.json drift check; align text/js…
tachyon-beep Jun 7, 2026
dbb8e22
fix(gitignore): add .weft/ to ignore list for Filigree issue tracker
tachyon-beep Jun 7, 2026
ca513d7
fix(mcp): negotiate unsupported protocolVersion instead of hard-erroring
tachyon-beep Jun 7, 2026
5af3bfa
feat(cli): legis --version; name CELL_NOT_ENABLED enablement path; do…
tachyon-beep Jun 7, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .agents/skills/filigree-workflow/SKILL.md
Original file line number Diff line number Diff line change
Expand Up @@ -196,7 +196,7 @@ When parsing `--json` output or MCP responses, expect these unified envelopes:
one of: `VALIDATION`, `NOT_FOUND`, `CONFLICT`, `INVALID_TRANSITION`,
`PERMISSION`, `NOT_INITIALIZED`, `IO`, `INVALID_API_URL`,
`FILE_REGISTRY_DISPLACED`, `REGISTRY_UNAVAILABLE`,
`CLARION_REGISTRY_VERSION_MISMATCH`, `CLARION_OUT_OF_SYNC`,
`LOOMWEAVE_REGISTRY_VERSION_MISMATCH`, `LOOMWEAVE_OUT_OF_SYNC`,
`BRIEFING_BLOCKED`, `STOP_FAILED`, `SCHEMA_MISMATCH`, `INTERNAL`.
Branch on `code` for retry policy
(`CONFLICT` → exit 4, retryable; everything at exit 1 needs operator
Expand Down
2 changes: 1 addition & 1 deletion .agents/skills/loomweave-workflow/.fingerprint
Original file line number Diff line number Diff line change
@@ -1 +1 @@
fe04e6fd9d528b07738f527b41d817dff89344f051465af012fc42ed44377ea3
4c1af074f42ec147611923aafeb704eba54cd7dca4dcec2489907921b7f94233
22 changes: 16 additions & 6 deletions .agents/skills/loomweave-workflow/SKILL.md
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@ calls this?" without reading a single file.
- You need a function's neighborhood, execution paths, or which subsystem it belongs to.

**Not for:** editing code, reading exact implementation bodies (use `summary` or
read the file once you have its path), or codebases with no `.loomweave/` index.
read the file once you have its path), or codebases with no `.weft/loomweave/` index.

## Entity IDs — the model

Expand Down Expand Up @@ -65,18 +65,27 @@ tell which case you're in.
| `execution_paths_from` | bounded call paths out of an entity | `{"id": "<id>", "max_depth": 5}` |
| `subsystem_members` | modules in a subsystem | `{"id": "core:subsystem:<hash>"}` |
| `subsystem_of` | the subsystem an entity belongs to (reverse of `subsystem_members`) | `{"id": "<id>"}` |
| `summary` | on-demand prose summary of one entity | `{"id": "<id>"}` |
| `summary` | on-demand prose summary of one entity | `{"id": "<id>"}` |
| `summary_preview_cost` | preview a `summary` call's cache status / cost before spending | `{"id": "<id>"}` |
| `issues_for` | Filigree issues attached to an entity | `{"id": "<id>"}` |
| `source_for_entity` | an entity's exact indexed source span + bounded context | `{"id": "<id>", "context_lines": 10}` |
| `call_sites` | the source line(s) behind a calls/references edge | `{"id": "<id>", "role": "caller"}` |
| `orientation_pack` | one deterministic orientation packet for an entity or file:line (entity + context + neighbors + paths + issues + freshness) | `{"file": "rel/path.py", "line": 42}` |
| `index_diff` | index freshness / drift vs. the current working tree | `{}` |
| `analyze_start` | launch a background re-index, return its `run_id` | `{}` |
| `analyze_start` | launch a background re-index, return its `run_id` | `{}` |
| `analyze_status` | poll a started analyze (queued/running/terminal + progress) | `{"run_id": "<id>"}` |
| `analyze_cancel` | stop a running analyze (group-kills plugin + Pyright) | `{"run_id": "<id>"}` |
| `analyze_cancel` | stop a running analyze (group-kills plugin + Pyright) | `{"run_id": "<id>"}` |
| `project_status` | index freshness, counts, LLM + Filigree status | `{}` |

† **Write-gated.** `summary` (`entity_summary_get`), `analyze_start`,
`analyze_cancel`, `propose_guidance`, and `promote_guidance` are registered only
when `serve.mcp.enable_write_tools: true` is set in `loomweave.yaml` (default
`false`). When the gate is off they do not appear in `tools/list` and a call
returns a tool-disabled error — run `loomweave config check` to see the active
policy. `summary` additionally requires the live LLM provider to be enabled
(`llm_policy.enabled: true` + `allow_live_provider: true`), or it serves cache
only.

`callers_of` / `neighborhood` / `execution_paths_from` take a `confidence`
tier — one of `"resolved"` (default; only high-confidence edges),
`"ambiguous"`, or `"inferred"`. There is no `"all"` value. When you suspect an
Expand Down Expand Up @@ -152,7 +161,7 @@ honest-empty unless a plugin emits those tags. Likewise `high_churn` and

`search_semantic` is also in the catalogue. It is opt-in under
`semantic_search:`; when enabled, `loomweave analyze` populates the git-ignored
`.loomweave/embeddings.db` sidecar and the query path filters stale vectors by
`.weft/loomweave/embeddings.db` sidecar and the query path filters stale vectors by
content hash.

> Not in this catalogue: `emit_observation` as a general-purpose write surface.
Expand All @@ -163,6 +172,7 @@ for team sharing). Agents may call `propose_guidance` to create a Filigree
observation, but that proposal is inert until an operator promotes it through
`promote_guidance` or the CLI. Promoted sheets reach you through `guidance_for`
and are composed into `summary` prompts with a real guidance fingerprint.
(`propose_guidance` and `promote_guidance` are write-gated — see the † note above.)

## Workflow: orient, then navigate

Expand Down Expand Up @@ -192,7 +202,7 @@ and are composed into `summary` prompts with a real guidance fingerprint.

## Launch

`loomweave serve --path <dir>` where `<dir>` contains `.loomweave/loomweave.db`
`loomweave serve --path <dir>` where `<dir>` contains `.weft/loomweave/loomweave.db`
(built by `loomweave analyze <dir>`). In an MCP client the tools appear as
`mcp__loomweave__find_entity`, etc.

Expand Down
2 changes: 1 addition & 1 deletion .claude/skills/filigree-workflow/SKILL.md
Original file line number Diff line number Diff line change
Expand Up @@ -196,7 +196,7 @@ When parsing `--json` output or MCP responses, expect these unified envelopes:
one of: `VALIDATION`, `NOT_FOUND`, `CONFLICT`, `INVALID_TRANSITION`,
`PERMISSION`, `NOT_INITIALIZED`, `IO`, `INVALID_API_URL`,
`FILE_REGISTRY_DISPLACED`, `REGISTRY_UNAVAILABLE`,
`CLARION_REGISTRY_VERSION_MISMATCH`, `CLARION_OUT_OF_SYNC`,
`LOOMWEAVE_REGISTRY_VERSION_MISMATCH`, `LOOMWEAVE_OUT_OF_SYNC`,
`BRIEFING_BLOCKED`, `STOP_FAILED`, `SCHEMA_MISMATCH`, `INTERNAL`.
Branch on `code` for retry policy
(`CONFLICT` → exit 4, retryable; everything at exit 1 needs operator
Expand Down
2 changes: 1 addition & 1 deletion .claude/skills/loomweave-workflow/.fingerprint
Original file line number Diff line number Diff line change
@@ -1 +1 @@
fe04e6fd9d528b07738f527b41d817dff89344f051465af012fc42ed44377ea3
4c1af074f42ec147611923aafeb704eba54cd7dca4dcec2489907921b7f94233
22 changes: 16 additions & 6 deletions .claude/skills/loomweave-workflow/SKILL.md
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@ calls this?" without reading a single file.
- You need a function's neighborhood, execution paths, or which subsystem it belongs to.

**Not for:** editing code, reading exact implementation bodies (use `summary` or
read the file once you have its path), or codebases with no `.loomweave/` index.
read the file once you have its path), or codebases with no `.weft/loomweave/` index.

## Entity IDs — the model

Expand Down Expand Up @@ -65,18 +65,27 @@ tell which case you're in.
| `execution_paths_from` | bounded call paths out of an entity | `{"id": "<id>", "max_depth": 5}` |
| `subsystem_members` | modules in a subsystem | `{"id": "core:subsystem:<hash>"}` |
| `subsystem_of` | the subsystem an entity belongs to (reverse of `subsystem_members`) | `{"id": "<id>"}` |
| `summary` | on-demand prose summary of one entity | `{"id": "<id>"}` |
| `summary` | on-demand prose summary of one entity | `{"id": "<id>"}` |
| `summary_preview_cost` | preview a `summary` call's cache status / cost before spending | `{"id": "<id>"}` |
| `issues_for` | Filigree issues attached to an entity | `{"id": "<id>"}` |
| `source_for_entity` | an entity's exact indexed source span + bounded context | `{"id": "<id>", "context_lines": 10}` |
| `call_sites` | the source line(s) behind a calls/references edge | `{"id": "<id>", "role": "caller"}` |
| `orientation_pack` | one deterministic orientation packet for an entity or file:line (entity + context + neighbors + paths + issues + freshness) | `{"file": "rel/path.py", "line": 42}` |
| `index_diff` | index freshness / drift vs. the current working tree | `{}` |
| `analyze_start` | launch a background re-index, return its `run_id` | `{}` |
| `analyze_start` | launch a background re-index, return its `run_id` | `{}` |
| `analyze_status` | poll a started analyze (queued/running/terminal + progress) | `{"run_id": "<id>"}` |
| `analyze_cancel` | stop a running analyze (group-kills plugin + Pyright) | `{"run_id": "<id>"}` |
| `analyze_cancel` | stop a running analyze (group-kills plugin + Pyright) | `{"run_id": "<id>"}` |
| `project_status` | index freshness, counts, LLM + Filigree status | `{}` |

† **Write-gated.** `summary` (`entity_summary_get`), `analyze_start`,
`analyze_cancel`, `propose_guidance`, and `promote_guidance` are registered only
when `serve.mcp.enable_write_tools: true` is set in `loomweave.yaml` (default
`false`). When the gate is off they do not appear in `tools/list` and a call
returns a tool-disabled error — run `loomweave config check` to see the active
policy. `summary` additionally requires the live LLM provider to be enabled
(`llm_policy.enabled: true` + `allow_live_provider: true`), or it serves cache
only.

`callers_of` / `neighborhood` / `execution_paths_from` take a `confidence`
tier — one of `"resolved"` (default; only high-confidence edges),
`"ambiguous"`, or `"inferred"`. There is no `"all"` value. When you suspect an
Expand Down Expand Up @@ -152,7 +161,7 @@ honest-empty unless a plugin emits those tags. Likewise `high_churn` and

`search_semantic` is also in the catalogue. It is opt-in under
`semantic_search:`; when enabled, `loomweave analyze` populates the git-ignored
`.loomweave/embeddings.db` sidecar and the query path filters stale vectors by
`.weft/loomweave/embeddings.db` sidecar and the query path filters stale vectors by
content hash.

> Not in this catalogue: `emit_observation` as a general-purpose write surface.
Expand All @@ -163,6 +172,7 @@ for team sharing). Agents may call `propose_guidance` to create a Filigree
observation, but that proposal is inert until an operator promotes it through
`promote_guidance` or the CLI. Promoted sheets reach you through `guidance_for`
and are composed into `summary` prompts with a real guidance fingerprint.
(`propose_guidance` and `promote_guidance` are write-gated — see the † note above.)

## Workflow: orient, then navigate

Expand Down Expand Up @@ -192,7 +202,7 @@ and are composed into `summary` prompts with a real guidance fingerprint.

## Launch

`loomweave serve --path <dir>` where `<dir>` contains `.loomweave/loomweave.db`
`loomweave serve --path <dir>` where `<dir>` contains `.weft/loomweave/loomweave.db`
(built by `loomweave analyze <dir>`). In an MCP client the tools appear as
`mcp__loomweave__find_entity`, etc.

Expand Down
10 changes: 8 additions & 2 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -15,8 +15,12 @@ jobs:
enable-cache: true
- name: Install dependencies
run: uv sync --dev
- name: Run lint
run: uv run ruff check src
- name: Run test suite
run: uv run pytest --cov=legis --cov-report=term-missing --cov-fail-under=70
run: uv run pytest --cov=legis --cov-report=term-missing --cov-report=json --cov-fail-under=88
- name: Enforce per-package coverage floors
run: uv run python scripts/check_coverage_floors.py
- name: Run SEI conformance oracle
run: uv run pytest tests/conformance/test_sei_oracle.py
- name: Run live Loomweave oracle
Expand Down Expand Up @@ -46,4 +50,6 @@ jobs:
# Remove this once a real governance DB is wired into CI.
env:
LEGIS_ALLOW_MISSING_GOVERNANCE_DB: "1"
run: uv run legis governance-gate --db sqlite:///legis-governance.db
# No --db: use the resolved default store (.weft/legis/legis-governance.db),
# the same location the server/MCP write to.
run: uv run legis governance-gate
64 changes: 64 additions & 0 deletions .github/workflows/loomweave-conformance.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,64 @@
name: loomweave-conformance

# Live cross-repo Loomweave SEI conformance.
#
# Unlike the per-PR oracle step in ci.yml (opt-in, silently skipped when
# LOOMWEAVE_URL is unset), this gate is FAIL-CLOSED: a missing endpoint, locator
# fixture, or HMAC credential is an ERROR, not a pass. That closes the roadmap-12
# hole where an absent var let Loomweave endpoint/header drift sail through CI.
#
# It runs on a schedule (catch drift between releases) and is callable as a
# reusable workflow (`workflow_call`) so the release pipeline gates publish on it
# — making conformance non-optional for releases.

on:
schedule:
- cron: "0 7 * * *" # daily 07:00 UTC drift sweep
workflow_dispatch:
workflow_call:

permissions:
contents: read

jobs:
live-loomweave-oracle:
name: Live Loomweave oracle (fail-closed)
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: astral-sh/setup-uv@v5
with:
enable-cache: true
- name: Install dependencies
run: uv sync --dev
- name: Require live Loomweave configuration
env:
LOOMWEAVE_URL: ${{ vars.LOOMWEAVE_URL }}
LOOMWEAVE_LIVE_ORACLE_LOCATOR: ${{ vars.LOOMWEAVE_LIVE_ORACLE_LOCATOR }}
LEGIS_LOOMWEAVE_HMAC_KEY: ${{ secrets.LEGIS_LOOMWEAVE_HMAC_KEY }}
run: |
missing=0
if [ -z "${LOOMWEAVE_URL}" ]; then
echo "::error::LOOMWEAVE_URL variable is not set — live Loomweave conformance cannot run. Configure it under Settings → Secrets and variables → Actions → Variables."
missing=1
fi
if [ -z "${LOOMWEAVE_LIVE_ORACLE_LOCATOR}" ]; then
echo "::error::LOOMWEAVE_LIVE_ORACLE_LOCATOR variable is not set — the round-trip locator fixture is required for conformance."
missing=1
fi
if [ -z "${LEGIS_LOOMWEAVE_HMAC_KEY}" ]; then
echo "::error::LEGIS_LOOMWEAVE_HMAC_KEY secret is not set — the signed Loomweave channel credential is required."
missing=1
fi
if [ "${missing}" -ne 0 ]; then
exit 1
fi
- name: Run live Loomweave conformance oracle
env:
LOOMWEAVE_URL: ${{ vars.LOOMWEAVE_URL }}
LOOMWEAVE_LIVE_ORACLE_LOCATOR: ${{ vars.LOOMWEAVE_LIVE_ORACLE_LOCATOR }}
LEGIS_LOOMWEAVE_HMAC_KEY: ${{ secrets.LEGIS_LOOMWEAVE_HMAC_KEY }}
# -rs reports any skip in the log; the guard above makes the test file's
# own skipif conditions (unset URL / locator) unreachable, so a skip here
# would signal an unexpected gap rather than a benign opt-out.
run: uv run pytest tests/conformance/test_live_loomweave_oracle.py -q -rs
10 changes: 9 additions & 1 deletion .github/workflows/release.yml
Original file line number Diff line number Diff line change
Expand Up @@ -54,9 +54,17 @@ jobs:
name: dist
path: dist/

conformance:
# Live cross-repo Loomweave SEI conformance, required before publish. The
# reusable workflow is fail-closed: a missing LOOMWEAVE_URL / locator / HMAC
# credential fails the release rather than silently skipping (roadmap 12).
name: Live Loomweave conformance
uses: ./.github/workflows/loomweave-conformance.yml
secrets: inherit

publish:
name: Publish to PyPI
needs: build
needs: [build, conformance]
runs-on: ubuntu-latest
environment:
name: pypi
Expand Down
40 changes: 33 additions & 7 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
.worktrees/
# OS / editor cruft
.DS_Store
Thumbs.db
.idea/
Expand All @@ -8,14 +8,40 @@ Thumbs.db
.venv/
__pycache__/
*.py[cod]
.pytest_cache/
*.egg-info/
# Local audit/scratch databases (never commit audit data)
*.db
.filigree
.filigree.conf
.pytest_cache/
.mypy_cache/
.ruff_cache/
.coverage
coverage.json

# Worktrees
.worktrees/

# Local tooling config (machine-specific, never commit)
.mcp.json

# Agent instruction files — filigree-generated, regenerated each session
AGENTS.md
CLAUDE.md

# --- Weft suite working folders & local config (regenerated/local; never commit) ---
# Filigree — issue-tracker database + project config
.filigree/
.filigree.conf
# Loomweave — code-archaeology index/cache + config
.loomweave/
loomweave.yaml
# Wardline — scanner cache + config
.wardline/
wardline.yaml
.loomweave/loomweave.lock
# Legis — local audit/scratch databases + their SQLite WAL sidecars
# (audit data is never committed) and local working dir / config
*.db
*.db-shm
*.db-wal
# Federated runtime-state subtree (legis is the sole writer; never .weft/ wholesale)
.weft/legis/

# Filigree issue tracker
.weft/
26 changes: 0 additions & 26 deletions .loomweave/.gitignore

This file was deleted.

4 changes: 0 additions & 4 deletions .loomweave/config.json

This file was deleted.

1 change: 0 additions & 1 deletion .loomweave/instance_id

This file was deleted.

Loading
Loading