feat(plane): memory store (file and MinIO) and the remember task (harnessx-removal task 2)

plane/memory.py: the MemoryStore interface with FileStore (index.jsonl, facts by
content hash, repos/<host>__<owner>__<name>/<pin>.jsonl, idempotent ingest,
deterministic row ids, refusal below 1 GiB free naming the path) and MinioStore
(object metadata and tags, S3 Select pushdown probed once per process with a
logged local fallback, object version ids on every row read, versioning and
runs/ lifecycle helper, presigned URLs). OUSAST_MEMORY selects the backend;
MINIO_* settings come from .env; the minio SDK is the optional extra `minio`.

plane/tasks/remember.py: model-free rows (facts, verdict, unit_cost, alert)
from a case's artifacts; remember_run computes them on the host for a recorded
run without writing into it. reconciler.mark_done (477 lines total), seed
before and ingest after `ousast plane run`, `ousast plane remember <run>`.
The generator annotates each repo-facts Task with openultrasast.io/memory-key
(repo, pin, candidates digest, image digest) and the Run with its population
and split; plane/ regenerated.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
Claude-Session: https://claude.ai/code/session_01EmM1j46qgKMh3zqD1QMwEo
This commit is contained in:
Marius Ciepluch
2026-09-30 11:10:28 +02:00
co-authored by Claude Opus 5.5
parent d64ab2817e
commit 52d28b5121
31 changed files with 2121 additions and 14 deletions
@@ -1,7 +1,7 @@
{
"modules": 132,
"modules": 134,
"counts": {
"load_bearing": 123,
"load_bearing": 125,
"standalone_capability": 9
},
"orphaned": [],
@@ -117,6 +117,7 @@
"hunter_tools",
"model.endpoint",
"pairs",
"plane.memory",
"push.assistance",
"push.policy",
"push.runner",
@@ -663,9 +664,11 @@
"cli",
"plane.egress",
"plane.generate",
"plane.memory",
"plane.reconciler",
"plane.router",
"plane.runner",
"plane.tasks.remember",
"plane.tasks.verify",
"plane.workspaces"
]
@@ -716,12 +719,22 @@
"plane.workspaces"
]
},
{
"module": "plane.memory",
"classification": "load_bearing",
"reason": "harnessx-removal Req 6.1/6.4: the memory store (file, MinIO), ingest and fact reuse; `ousast plane remember`",
"importers": [
"plane.generate",
"plane.tasks.remember"
]
},
{
"module": "plane.reconciler",
"classification": "load_bearing",
"reason": "ai-service-plane Req 3.1-3.5, 7.3: ax-backed Run execution, status attribution and doctor; `ousast plane`",
"importers": [
"plane.generate",
"plane.memory",
"plane.workspaces"
]
},
@@ -745,8 +758,10 @@
"classification": "load_bearing",
"reason": "ai-service-plane Req 4.1: the task entrypoint package the runner imports by name; runner integration pending (task 3)",
"importers": [
"cli",
"plane.generate",
"plane.tasks.agree"
"plane.tasks.agree",
"plane.tasks.remember"
]
},
{
@@ -755,11 +770,22 @@
"reason": "ai-service-plane Req 5.3/2.1: agreement across two verify passes with per-candidate cost, turns and site match",
"importers": []
},
{
"module": "plane.tasks.remember",
"classification": "load_bearing",
"reason": "harnessx-removal Req 6.1: a case's delivered artifacts as memory rows, model-free",
"importers": [
"cli"
]
},
{
"module": "plane.tasks.repo_facts",
"classification": "load_bearing",
"reason": "ai-service-plane Req 5.1/5.2: source-only functions and callers per file; runner integration pending",
"importers": []
"importers": [
"plane.generate",
"plane.tasks.remember"
]
},
{
"module": "plane.tasks.verify",