Files
EverOS/tests/integration/search/_rerun_probes.py
Elliot Chen 518b8eca85 chore: initialize EverOS 1.0.0
md-first memory extraction framework for AI agents.

Markdown is the single source of truth; SQLite holds state and LanceDB
provides the rebuildable vector + BM25 + scalar index. The codebase follows
a single-direction DDD layering (entrypoints -> service -> memory -> infra,
with component / core / config cross-cutting) enforced by import-linter.

Engineering surface:
- Coding conventions in .claude/rules/ (path-scoped) and workflows in
  .claude/skills/ (/commit, /new-branch, /pr).
- GitHub Actions CI runs make lint + test + integration; pre-commit mirrors
  the gates locally (ruff, hygiene hooks, gitlint commit-msg).
- Commit messages follow Conventional Commits, enforced by gitlint.
- make lint also enforces datetime two-zone discipline and OpenAPI drift.
2026-06-06 07:33:17 +08:00

84 lines
2.4 KiB
Python

"""Re-run probes against an existing corpus + regenerate the report.
Reuses everything from :mod:`_run_full_report` except the ingest step —
points at the already-populated ``~/.everos-report-corpus`` and only
re-runs the search probes + report rendering. Useful when the corpus
is already there from a previous run and you just want to refresh the
retrieval section without paying for LLM ingestion again.
"""
from __future__ import annotations
import asyncio
import os
from pathlib import Path
import httpx
from dotenv import load_dotenv
_PROJECT_ROOT = Path(__file__).resolve().parents[3]
load_dotenv(_PROJECT_ROOT / ".env", override=False)
from _run_full_report import ( # noqa: E402
CONVERSATION,
CORPUS_ROOT,
REPORT_PATH,
inspect_artifacts,
render_report,
run_probes,
)
async def main() -> None:
if not (CORPUS_ROOT / "users").is_dir():
raise SystemExit(f"{CORPUS_ROOT} not populated — run _run_full_report.py first")
os.environ["EVEROS_MEMORY__ROOT"] = str(CORPUS_ROOT)
from everos.config import load_settings
load_settings.cache_clear()
print(f"[1/3] using corpus at {CORPUS_ROOT}")
from everos.entrypoints.api.app import create_app
app = create_app()
transport = httpx.ASGITransport(app=app)
async with (
app.router.lifespan_context(app),
httpx.AsyncClient(transport=transport, base_url="http://test") as client,
):
print("[2/3] inspecting artifacts + running probes ...")
artifacts = await inspect_artifacts(CORPUS_ROOT)
probes = await run_probes(client)
print("[3/3] re-rendering report ...")
md = render_report(
memory_root=CORPUS_ROOT,
ingest_summary={
"batches": [
{
"idx": i,
"msg_count": len(b),
"status": "extracted (cached)",
"returned_count": len(b),
}
for i, b in enumerate(CONVERSATION)
],
"flush_status": "extracted (cached)",
},
cascade_summary={
"note": "cascade was force-completed via _rerun_probes.py "
"after initial run; counts below are post-completion."
},
artifacts=artifacts,
probes=probes,
)
REPORT_PATH.write_text(md, encoding="utf-8")
print(f"{REPORT_PATH}")
if __name__ == "__main__":
asyncio.run(main())