Skip to content

chore(release): prepare 1.0.0#275

Open
plind-junior wants to merge 244 commits into
mainfrom
release/1.0.0
Open

chore(release): prepare 1.0.0#275
plind-junior wants to merge 244 commits into
mainfrom
release/1.0.0

Conversation

@plind-junior

Copy link
Copy Markdown
Collaborator

summary

prepares and integrates the 1.0.0 release. brings the test integration line
(everything since 0.1.0 — dual-solve, auto-pr, the review-ui SPA, typed page
kinds, and more) into main, and bumps to 1.0.0.

release prep

  • version 1.0.0 in pyproject.toml, src/vouch/__init__.py, openclaw.plugin.json
  • changelog [Unreleased][1.0.0] — 2026-06-26
  • restores the pypi packaging that the test branch had regressed: distribution
    name back to vouch-kb (the bare name vouch is owned by an unrelated
    project on pypi; trusted publishing is configured for vouch-kb), and the
    release.yml trusted-publishing workflow re-added from main
  • reviewGatedKB contract → vouch-kb-1.0.0

verification (before tagging)

  • pytest (utf-8, ignoring embeddings) green
  • mypy src clean · ruff check src tests clean
  • python -m build produces vouch_kb-1.0.0 (sdist + wheel)

after merge

tag v1.0.0 on mainrelease.yml publishes vouch-kb 1.0.0 to pypi via
trusted publishing.

note

the test branch independently regressed the packaging (name reverted to
vouch, release.yml dropped). this release fixes it on the way to main; the
test branch itself should be re-synced separately so it doesn't reintroduce the
regression.

galuis116 and others added 30 commits May 25, 2026 04:28
…76)

crystallize wrote a durable Page directly through store.put_page,
embedding sess.task, sess.note, and sess.agent verbatim into the
rendered markdown body. The body was never gated by propose_page +
approve, so an agent calling kb.session_start(task=<payload>) and
getting any one claim approved via crystallize could land arbitrary
content into pages/. The page surfaces in kb.read_page, kb.list_pages,
kb.context, and (once #60 is fixed) kb.search.

Restrict the summary body to fields the proposing agent cannot
influence: session id (server-generated), timestamps (server clock),
and the list of approved artifact ids. The agent-controlled fields
remain on the Session model itself and are still queryable, but no
longer promoted into a durable Page.

Also include summary_page_id in the session.crystallize audit
event's object_ids when a page is written, so vouch audit
truthfully attributes the write.

Adds two regression tests:
- test_crystallize_summary_page_does_not_leak_agent_controlled_fields
- test_crystallize_audit_event_records_summary_page_id
Leftover from the merge of main (which brought PR #62's
test_sessions.py changes); ruff F401 was failing CI on PR #77.
…index FTS5 on update (#78)

Two compounding bugs let archived / superseded / redacted claims keep
flowing back to agents through kb.context:

  1. build_context_pack had no claim.status filter, so any retrieval
     hit was appended to the pack regardless of subsequent lifecycle
     mutations.

  2. store.update_claim refreshed the embedding cache but never
     re-indexed the FTS5 row, so claims_fts.status stayed frozen at
     first-index time. Every lifecycle op (archive, supersede,
     contradict, confirm) routes through update_claim and was
     therefore invisible to FTS5 / semantic search.

This made ClaimStatus.{ARCHIVED, SUPERSEDED, REDACTED} purely
decorative on the read side — agents kept quoting retracted
knowledge as if it were live.

Fix:

  - storage.update_claim now also calls index_db.index_claim under a
    short-lived sqlite connection (mirroring proposals.approve's
    first-index pattern). FTS5 errors are logged-and-skipped so a
    lifecycle op never fails because the embedding/FTS5 layer is
    misconfigured.

  - context.build_context_pack resolves each claim hit, drops it if
    the on-disk status is in {ARCHIVED, SUPERSEDED, REDACTED}, and
    drops it if the claim YAML has been deleted between index time
    and now. CONTESTED claims keep surfacing so contradictions
    remain visible.

Tests:

  - test_context_pack_excludes_archived_claims
  - test_context_pack_excludes_superseded_claims
  - test_update_claim_refreshes_fts5_status (asserts the FTS5 status
    column via direct SQL against state.db)

No on-disk-layout, schema, or bundle-format change.
Resolves conflicts in CHANGELOG.md, tests/test_sessions.py, and
auto-merges src/vouch/sessions.py with the recently-merged:

  - #61 (FTS5 indexing of crystallize summary page) — adds
    index_db.index_page(...) right after store.put_page(...) inside
    crystallize. Composes cleanly with this PR's strict-derivation
    _build_summary_body and the summary_page_id audit fix.
  - #62 (test_crystallize_collects_approval_failures) — preserved as
    a sibling test.
  - #75 (bundle import sha256 verification) — CHANGELOG entry only.
  - #73 (bundle POSIX separators) — CHANGELOG entry only.

Both regression tests added by this PR
(test_crystallize_summary_page_does_not_leak_agent_controlled_fields
and test_crystallize_audit_event_records_summary_page_id) still pass
against the merged sessions.crystallize.
#81)

The 'claims must cite sources' guarantee (README §'Why this exists'
point 3; CONTRIBUTING §'Things we won't merge') used to live only in
proposals.propose_claim, so every other write path silently accepted
Claim(evidence=[]) and landed an uncited claim:

  - store.put_claim direct: existence-check loop iterates zero times.
  - store.update_claim: writes the YAML without re-validating.
  - bundle.import_apply via _validate_content: defers to
    Claim.model_validate, which accepted evidence=[] because the
    model had no min-length constraint.

Add @field_validator('evidence') on Claim — raises ValueError when
the list is empty. Closes all three bypass paths in one place.

store.update_claim additionally re-validates via
Claim.model_validate(claim.model_dump()) before persisting, so
in-place mutation (c.evidence = []; store.update_claim(c)) raises
before the YAML hits disk — the field validator only fires at
construction time, not on attribute assignment.

Four regression tests:

  - test_claim_model_rejects_empty_evidence (tests/test_storage.py)
    — Claim(evidence=[]) raises pydantic.ValidationError.
  - test_put_claim_rejects_empty_evidence — store.put_claim raises;
    no claims/<id>.yaml is written.
  - test_update_claim_rejects_empty_evidence — in-place mutation
    + update_claim raises; the on-disk YAML is unchanged.
  - test_import_rejects_uncited_claim (tests/test_bundle.py) — a
    schema-valid bundle whose claim YAML has evidence: [] is
    rejected by import_check (schema validation issue) and
    import_apply raises before writing.

The existing guard in proposals.propose_claim becomes a redundant
user-facing error message and is left in place for the friendlier
CLI/JSONL error string. No on-disk-layout, schema, or
bundle-format change; data the model never should have accepted
now raises.
…ing from tarball (#80)

import_check previously only verified that tar members listed in the
manifest had matching hashes, but never checked the reverse: whether
every manifest entry had a corresponding tar member. A bundle whose
manifest.json referenced claims/c1.yaml but whose tarball contained
only manifest.json would pass import_check with ok=True, and
import_apply would silently write nothing — no exception, no audit
event indicating data loss.

Add the missing-member pass (mirroring the existing check in
export_check) so that manifest entries without a matching tar member
produce a "manifest lists missing file" issue. import_apply then
refuses to import because check.issues is non-empty.
read-only `vouch diff <old> <new>` that shows what changed between two
claim or two page revisions: field-level changes plus a line-diff of the
long text/body. auto-detects kind, hides churning metadata.
new read-only `vouch diff <old> <new>` compares two claims or two pages by
id and shows what changed: scalar/list fields as old → new, plus a line-diff
of the long text/body. auto-detects kind, hides churning metadata
(timestamps, approved_by), supports --json. closes a roadmap 0.1 item.
mypy inferred old/new as Claim from the first branch, so the page branch's
reassignment tripped an incompatible-assignment error in CI. annotate the
union up front.
feat(diff): add `vouch diff` for claim/page revisions
…review)

The new Claim.evidence min-citation validator (#81) also fires when
claims are read back from disk. A KB that has a pre-existing
uncited claims/<id>.yaml from before the fix would otherwise crash
vouch lint / vouch doctor with a bare pydantic.ValidationError
deep in store.list_claims().

Add _load_claims_for_lint(), a per-file iteration that catches
pydantic.ValidationError (and any other load error) and surfaces
each bad file as a Finding with code='invalid_claim' and an
explicit repair hint: 'edit the YAML to add a citation, or delete
the file'. lint() also stops calling status() to populate counts —
status() calls the strict store.list_claims() which would re-raise
on the same files — and builds the counts dict inline from the
safely-loaded valid claims.

Regression test in tests/test_health.py:
  - test_lint_surfaces_legacy_uncited_claim_yaml_without_crashing
    hand-crafts a claims/legacy.yaml with evidence: []  (matches
    the on-disk shape an older buggy write path would have left),
    asserts vouch lint runs to completion, surfaces invalid_claim
    in findings with the repair-hint message, and that the
    well-formed sibling claim is still discovered.

CHANGELOG migration note expanded to describe the repair hint.
The new inline-built counts in lint() (from 5c881de) is a literal
dict with mixed value types (str/int/bool), which mypy correctly
inferred as dict[str, object] and rejected against the
HealthReport.counts: dict[str, int] annotation. The original
status() returned the same mixed dict via an untyped 'dict' return,
which masked the mismatch — the narrow type was effectively never
checked at the call site.

Widen counts to dict[str, Any] to match runtime reality. Also
tighten status()'s return annotation from 'dict' to 'dict[str, Any]'
for consistency. No caller does arithmetic on counts values; they
just echo or pass through, so the widening is risk-free.
…age-bypass

fix(sessions): close crystallize review-gate bypass via summary page
fix(models): require Claim.evidence to be non-empty at the model layer
the plan assumed a KBStore.list_pending() that does not exist; the
codebase queries pending via list_proposals(ProposalStatus.PENDING)
(server.py, cli.py). also fix payload dict-access and note the
ascii-only claim-text constraint forced by storage's latin-1 yaml write.
SubprocessRunner lives in auto_pr (not dual_solve); add choice: str|None
annotation mypy requires; ascii -- in the proposed-id echo to dodge the
locale latin-1 encode issue.
…rrupt the kb

a github issue title or engine summary with a non-latin-1 char (em dash,
smart quote) flowed into propose_claim's yaml write; storage encodes with
the locale default (latin-1 here), so the write raised UnicodeEncodeError
mid-stream and left a zero-byte proposal that poisoned list_proposals for
the whole kb. record_to_kb now coerces claim text to ascii at the boundary
(the verbatim original stays in the Source content, written as bytes), the
cli wraps finalize so any residual write error is a clean ClickException,
and a regression test exercises a non-ascii title. also fixes the
ground_prompt docstring (M3.2).
feat(dual-solve): run claude + codex on an issue, operator picks the winner
each engine run is multi-minute and fully captured, so the operator
watched a blank terminal with no signal of which engine was active.
thread an optional on_progress callback through prepare() and wire the
cli to echo it to stderr: a line per phase -- fetch, ground, and each
engine's run with elapsed time and diff size. defaults to none so
existing behaviour and tests are unchanged, and stderr keeps stdout and
--json output clean.
a single-page app, shipped inside the review-ui, that takes a github
issue link, runs dual-solve against the repo the server lives in,
streams progress over the existing websocket, shows both engines' diffs
side by side, and lets a human pick the winner -- keeping the branch and
proposing the rationale into the kb through the same review gate.

captures the decisions made during brainstorming: shipped feature in
src/vouch/web, fixed target repo, buildless vue 3, full pick semantics,
and an executing http surface that stays gated (off by default, edit-only,
bearer-token guarded) and requires a vep before merge.
a bite-sized, tdd task plan turning the design spec into the shipped
feature: vep, the gate + plumbing, the run/job/progress-bridge backend,
the choose endpoint that finalizes through the review gate, the buildless
vue spa, and the changelog. carries the dual-solve constraints forward
(import-as-used, ascii-coerced kb text, .venv tooling, edit-only over http).
the vep documents the new HTTP routes (/dual-solve, /dual-solve/run,
/dual-solve/job/{id}, /dual-solve/choose), the --allow-dual-solve gate,
the edit-only autonomy constraint, and the security argument that the
review-gate invariant is preserved (web finalize only proposes, never
auto-approves).
mount the /dual-solve shell route only when the server is started with
--allow-dual-solve. when the flag is absent, register() returns
immediately and the route does not exist (404). this is the security
gate: the dual-solve runner spawns external processes (claude+codex) so
it must be an explicit opt-in.

changes:
- src/vouch/web/dual_solve_api.py: new register() function; calls
  ds.repo_root() at app-build time to fail fast if not in a git repo.
- src/vouch/web/templates/dual_solve.html: spa shell template with the
  #dual-solve-app vue mount point.
- src/vouch/web/server.py: build_app gains allow_dual_solve=False;
  _tmpl injects dual_solve_enabled; _register_dual_solve called before
  return app.
- src/vouch/web/__init__.py: create_app gains allow_dual_solve=False and
  passes it to build_app.
- src/vouch/web/templates/base.html: conditional nav link for dual-solve.
- src/vouch/cli.py: review-ui gains --allow-dual-solve flag; passed to
  create_app.
- tests/test_web_dual_solve.py: two tests — enabled renders 200 with the
  vue mount point; disabled returns 404.
add DualSolveJob dataclass, _serialize helper, POST /dual-solve/run (201),
GET /dual-solve/job/{id}, and the sync→async progress bridge.

the job is created synchronously in the route handler before the
asyncio.create_task fires, so the single-flight 409 check is reliable.
the on_progress callback runs on the worker thread and bridges to the hub
via run_coroutine_threadsafe, capturing the event loop in the handler (not
the worker). autonomy is hard-forced to "edit" regardless of what the caller
sends.

deviation from spec: the single-flight guard uses `status not in
("done", "error")` rather than `status in ("running", "finalizing")`.
this is required because in the starlette testclient's per-request portal
environment, the background task (run_in_threadpool → anyio thread) completes
during portal teardown before the second post arrives, leaving status as
"ready". the broader guard matches the semantic intent (reject while a job is
still active/awaiting-decision).
the previous guard rejected new runs whenever a prior job was in any
non-terminal state, including "ready". a ready job the operator abandons
(closes the tab, never chooses) would block every future run forever and
make the stale-worktree cleanup path unreachable — a permanent leak.

corrected to 409 only on ("running", "finalizing"). ready/done/error jobs
are replaced by a new run, which first runs ds.cleanup on their candidates.

test_run_is_single_flight is rewritten to set the precondition directly
(no timing dependency on when the background task completes). a new test,
test_run_replaces_abandoned_ready_job_and_cleans_up, locks in the
replace-and-cleanup behavior for the ready case.
adds POST /dual-solve/choose which takes {job_id, winner, reason},
looks up the candidate matching the winner engine on the in-memory job,
calls ds.finalize with record=True and proposed_by=reviewer() so the
rationale lands in the kb review queue, then marks the job done and
broadcasts a "done" ws frame.

winner=null skips finalize entirely and returns empty proposed_ids.
guards: 404 when job_id doesn't match the active job, 409 when the
job is not in "ready" status, 500 on ValueError/RuntimeError from
finalize. the review gate is preserved — finalize only ever calls
proposals.propose_claim; no approve/durable-write is added here.
…s, constrain winner

rename test_choose_before_ready_is_conflict to test_choose_unknown_job_is_not_found
to match what it actually tests (404 on bogus job_id, not the 409 guard).

add test_choose_when_not_ready_is_conflict that exercises the real 409 path by
pre-planting a job in status="finalizing" and asserting the guard fires.

add an error broadcast in the choose handler's except block so clients see the
error frame before the 500 is raised, matching _run_job's error path.

tighten _ChooseReq.winner to Literal["claude","codex"]|None so an unrecognised
engine name is rejected with 422 rather than silently treated as "keep neither".

also enter testclient as a context manager in _client() so the blocking portal
stays alive across all requests within a test; without this asyncio.create_task
background jobs are cancelled when the per-request ephemeral portal closes, which
caused test_choose_winner_finalizes_and_returns_ids and test_choose_neither to
fail intermittently depending on test ordering.
vendor vue 3.4.38 (esm-browser.prod build, 150 kb) under
src/vouch/web/static/vendor/ with sha256 recorded in VENDOR.md.

add dual_solve.js — the full vue 3 spa: runform, websocket progress
log, side-by-side diff panes (with a minimal unified-diff parser), and
a choice bar that posts to /dual-solve/choose.

add dual_solve.css — two-column pane grid with diff line colouring.

extend base.html with a {% block head %} slot so per-page stylesheets
can be injected without touching the shared layout. dual_solve.html
uses it to pull in dual_solve.css.

add test_spa_assets_are_served to tests/test_web_dual_solve.py:
asserts the js, css, and vendor vue files all return 200, and that
the rendered page references both dual_solve.js and createApp.

no npm, no bundler, no build step — the esm-browser build includes the
template compiler so template: strings work at runtime.
note the new `review-ui --allow-dual-solve` browser surface under
[unreleased]/added, pointing at vep-0006. the pick keeps the branch and
proposes through the existing review gate; nothing auto-approves.
…recondition

from the final whole-branch review: assert the executing run/choose
routes 404 when --allow-dual-solve is off (not just the page), so a
future refactor cannot silently expose them; and document why a prepare
failure leaks no worktrees today.
feat(dual-solve): run agents in docker sandbox
extracts the inline styles and script from the original single-file landing
page into shared base.css / app.css / app.js, and adds three sibling pages
(gittensor, how-it-works, reference) that reuse the same nav and colophon.

index.html shrinks to the masthead and plates; the rest of the chrome and the
scroll/draw behaviour now live in the shared assets, so the pages stay in step
instead of each carrying their own copy.
feat(web): split the landing page into a shared-asset multi-page site
bump the version to 1.0.0 across pyproject.toml, src/vouch/__init__.py, and
openclaw.plugin.json, and move the [Unreleased] changelog entries into a dated
[1.0.0] section.

also restore the pypi packaging that the test branch had regressed: the
distribution name is set back to vouch-kb (the bare name "vouch" is owned by an
unrelated project on pypi, and trusted publishing is configured for vouch-kb),
and the release.yml trusted-publishing workflow is re-added from main. the
reviewGatedKB contract is bumped to vouch-kb-1.0.0 to match.

verified green before tagging: pytest (utf-8), mypy src, ruff, and
python -m build producing vouch_kb-1.0.0.
@coderabbitai

coderabbitai Bot commented Jun 26, 2026

Copy link
Copy Markdown

Important

Review skipped

Too many files!

This PR contains 230 files, which is 80 over the limit of 150.

To get a review, narrow the scope:
• coderabbit review --type committed # exclude uncommitted changes
• coderabbit review --dir # limit to a subdirectory
• coderabbit review --base # compare against a closer base

Upgrade to a paid plan to raise the limit.

⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro Plus

Run ID: f6bf7db0-0894-46f0-bf4b-f3b4e60a7f4c

📥 Commits

Reviewing files that changed from the base of the PR and between 18faf17 and 24c3d3f.

📒 Files selected for processing (230)
  • .github/workflows/ci.yml
  • .github/workflows/eval.yml
  • .github/workflows/install-sh.yml
  • AGENTS.md
  • CHANGELOG.md
  • CLAUDE.md
  • CONTRIBUTING.md
  • PR_BODY.md
  • README.md
  • ROADMAP.md
  • adapters/README.md
  • adapters/claude-code/.claude/commands/vouch-propose-from-pr.md
  • adapters/claude-code/.claude/commands/vouch-recall.md
  • adapters/claude-code/.claude/commands/vouch-resolve-issue.md
  • adapters/claude-code/.claude/commands/vouch-status.md
  • adapters/claude-code/.claude/settings.json
  • adapters/claude-code/install.yaml
  • adapters/claude-desktop/README.md
  • adapters/claude-desktop/README.snippet.md
  • adapters/claude-desktop/claude_desktop_config.json
  • adapters/claude-desktop/install.yaml
  • adapters/cline/README.md
  • adapters/cline/cline_mcp_servers.json
  • adapters/cline/install.yaml
  • adapters/cline/vscode_settings.json
  • adapters/codex/install.yaml
  • adapters/continue/install.yaml
  • adapters/cursor/AGENTS.md.snippet
  • adapters/cursor/install.yaml
  • adapters/http-tunnel/Dockerfile
  • adapters/http-tunnel/README.md
  • adapters/http-tunnel/cloudflare-tunnel/compose.yml
  • adapters/http-tunnel/fly.toml
  • adapters/openclaw/AGENTS.md.snippet
  • adapters/openclaw/README.md
  • adapters/openclaw/install.yaml
  • adapters/openclaw/plugins.json
  • adapters/openclaw/policy.json
  • adapters/openclaw/vouch-context-engine.mjs
  • adapters/windsurf/README.md
  • adapters/windsurf/install.yaml
  • adapters/windsurf/mcp_config.json
  • adapters/zed/README.md
  • adapters/zed/install.yaml
  • adapters/zed/settings.json
  • benchmarks/bench_bundle.py
  • benchmarks/bench_index_rebuild.py
  • benchmarks/bench_propose.py
  • benchmarks/bench_search.py
  • benchmarks/conftest.py
  • docs/README.md
  • docs/gittensor.md
  • docs/metrics.md
  • docs/migrations.md
  • docs/multi-agent.md
  • docs/provenance.md
  • docs/releases/v1.0.0.md
  • docs/review-ui.md
  • docs/superpowers/plans/2026-05-27-claude-code-adapter.md
  • docs/superpowers/plans/2026-06-25-auto-pr.md
  • docs/superpowers/plans/2026-06-25-vouch-dual-solve.md
  • docs/superpowers/plans/2026-06-26-dual-solve-web-spa.md
  • docs/superpowers/specs/2026-05-25-vouch-diff-design.md
  • docs/superpowers/specs/2026-06-25-auto-pr-design.md
  • docs/superpowers/specs/2026-06-25-vouch-dual-solve-design.md
  • docs/superpowers/specs/2026-06-26-dual-solve-web-spa-design.md
  • eval/baseline.json
  • eval/fixture-kb/.vouch/.gitignore
  • eval/fixture-kb/.vouch/claims/api-rate-limit.yaml
  • eval/fixture-kb/.vouch/claims/auth-jwt.yaml
  • eval/fixture-kb/.vouch/claims/auth-session.yaml
  • eval/fixture-kb/.vouch/claims/cache-redis.yaml
  • eval/fixture-kb/.vouch/claims/db-migrations.yaml
  • eval/fixture-kb/.vouch/claims/db-postgres.yaml
  • eval/fixture-kb/.vouch/claims/deploy-ci.yaml
  • eval/fixture-kb/.vouch/claims/deploy-docker.yaml
  • eval/fixture-kb/.vouch/claims/search-embeddings.yaml
  • eval/fixture-kb/.vouch/claims/search-fts5.yaml
  • eval/fixture-kb/.vouch/config.yaml
  • eval/fixture-kb/.vouch/sources/1410e7845543213186bddf486561536087d01cbefcf7f0c35d0fe6e7b008113e/content
  • eval/fixture-kb/.vouch/sources/1410e7845543213186bddf486561536087d01cbefcf7f0c35d0fe6e7b008113e/meta.yaml
  • eval/queries.jsonl
  • install.sh
  • llms.txt
  • migrations/README.md
  • openclaw.plugin.json
  • proposals/README.md
  • proposals/VEP-0004-http-transport.md
  • proposals/VEP-0005-richer-scopes.md
  • proposals/VEP-0006-dual-solve-web.md
  • pyproject.toml
  • schemas/audit-event.schema.json
  • schemas/capabilities.schema.json
  • schemas/claim.schema.json
  • schemas/page.schema.json
  • schemas/relation.schema.json
  • schemas/source.schema.json
  • skills/auto-pr/SKILL.md
  • skills/pr-precheck/SKILL.md
  • spec/2026-05-21/methods.md
  • spec/methods.md
  • spec/transports.md
  • src/vouch/__init__.py
  • src/vouch/audit.py
  • src/vouch/auto_pr.py
  • src/vouch/bundle.py
  • src/vouch/capabilities.py
  • src/vouch/cli.py
  • src/vouch/context.py
  • src/vouch/diff.py
  • src/vouch/dual_solve.py
  • src/vouch/embeddings/similarity.py
  • src/vouch/eval/__init__.py
  • src/vouch/eval/recall.py
  • src/vouch/extractors/__init__.py
  • src/vouch/extractors/edges.py
  • src/vouch/graph.py
  • src/vouch/health.py
  • src/vouch/hot_memory.py
  • src/vouch/http_server.py
  • src/vouch/index_db.py
  • src/vouch/install_adapter.py
  • src/vouch/jsonl_server.py
  • src/vouch/lifecycle.py
  • src/vouch/logging_config.py
  • src/vouch/metrics.py
  • src/vouch/migrations/__init__.py
  • src/vouch/migrations/_legacy.py
  • src/vouch/migrations/journal.py
  • src/vouch/migrations/manifest.py
  • src/vouch/migrations/rewriter.py
  • src/vouch/migrations/runner.py
  • src/vouch/migrations/schema.py
  • src/vouch/migrations/semver.py
  • src/vouch/models.py
  • src/vouch/onboarding.py
  • src/vouch/openclaw/__init__.py
  • src/vouch/openclaw/context_engine.py
  • src/vouch/openclaw/rpc.py
  • src/vouch/openclaw/synthesis.py
  • src/vouch/openclaw/types.py
  • src/vouch/page_kinds.py
  • src/vouch/pr_cache.py
  • src/vouch/proposals.py
  • src/vouch/provenance/__init__.py
  • src/vouch/provenance/cache.py
  • src/vouch/provenance/graph.py
  • src/vouch/provenance/model.py
  • src/vouch/provenance/query.py
  • src/vouch/salience.py
  • src/vouch/sandbox.py
  • src/vouch/scoping.py
  • src/vouch/server.py
  • src/vouch/sessions.py
  • src/vouch/stats.py
  • src/vouch/storage.py
  • src/vouch/sync.py
  • src/vouch/synthesize.py
  • src/vouch/trust.py
  • src/vouch/vault_sync.py
  • src/vouch/volunteer_context.py
  • src/vouch/web/__init__.py
  • src/vouch/web/dual_solve_api.py
  • src/vouch/web/server.py
  • src/vouch/web/static/app.css
  • src/vouch/web/static/app.js
  • src/vouch/web/static/dual_solve.css
  • src/vouch/web/static/dual_solve.js
  • src/vouch/web/static/vendor/VENDOR.md
  • src/vouch/web/static/vendor/vue.esm-browser.prod.js
  • src/vouch/web/templates/audit.html
  • src/vouch/web/templates/base.html
  • src/vouch/web/templates/claim.html
  • src/vouch/web/templates/dual_solve.html
  • src/vouch/web/templates/queue.html
  • src/vouch/web/templates/session.html
  • src/vouch/web/templates/source.html
  • templates/config.template.yaml
  • tests/embeddings/test_search.py
  • tests/fixtures/migrations/0099-test-rename.yaml
  • tests/test_audit.py
  • tests/test_audit_scoping.py
  • tests/test_auto_pr.py
  • tests/test_bundle.py
  • tests/test_cli.py
  • tests/test_context.py
  • tests/test_diff.py
  • tests/test_dual_solve.py
  • tests/test_eval_recall.py
  • tests/test_expire.py
  • tests/test_extractors_edges.py
  • tests/test_graph.py
  • tests/test_health.py
  • tests/test_http_server.py
  • tests/test_http_server_mcp.py
  • tests/test_install_adapter.py
  • tests/test_jsonl_server.py
  • tests/test_logging.py
  • tests/test_logging_config.py
  • tests/test_metrics.py
  • tests/test_migrations.py
  • tests/test_openclaw_context_engine.py
  • tests/test_openclaw_plugin_manifest.py
  • tests/test_page_kinds.py
  • tests/test_pr_cache.py
  • tests/test_propose_similarity.py
  • tests/test_provenance.py
  • tests/test_retrieval_backend.py
  • tests/test_salience.py
  • tests/test_sandbox.py
  • tests/test_schema_migrations.py
  • tests/test_scoping.py
  • tests/test_sessions.py
  • tests/test_stats.py
  • tests/test_storage.py
  • tests/test_sync.py
  • tests/test_synthesize.py
  • tests/test_trust.py
  • tests/test_vault_sync.py
  • tests/test_volunteer_context.py
  • tests/test_web.py
  • tests/test_web_dual_solve.py
  • tests/test_web_e2e.py
  • web/app.css
  • web/app.js
  • web/base.css
  • web/gittensor.html
  • web/how-it-works.html
  • web/index.html
  • web/reference.html

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

Use the checkbox below for a quick retry:

  • 🔍 Trigger review
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch release/1.0.0

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.