3.4 KiB
3.4 KiB
8.8 — X-Service: memory adapter, core resources (GREEN)
Phase: 8 — ServiceAdapter CRD rollout Stage: RED Depends on: 8.1, 8.2, 8.3
Design contract: API_ROUTING_HYBRID_DESIGN.md §6.
Covers only the poimen-memory endpoints confirmed already built and tested
(~/workplace/Poimen/memory/DESIGN.md's M3.5 phase): GET /memory/query,
GET /memory/projects, GET /memory/projects/{id}/status, GET /memory/skills,
GET /memory/skills/{name}, POST /memory/ingest. /memory/context,
/memory/projects/{id}/notes and the git-aware /memory/nodes/* endpoints are
not in scope here — see 8.9.
Hard prerequisite, not optional — do in this order:
NetworkPolicyin namespacepoimenrestricting ingress onpoimen-memoryto theapinamespace's gateway pod only. Must land before step 2.- Remove the
apikey:middleware frompoimen-memoryitself — separate change in the~/workplace/Poimen/memoryrepo, out of scope for this repo but a hard prerequisite for this adapter being safe to expose. Do not apply the CR below before this lands. - Provision
memory:read/memory:writeas real Authentik scopes (via 8.7'siamadapter orcore mwinit-issued tokens).
k8s/serviceadapter-memory.yamlCR per §6's example,auth.capability: memory:readdefault,ingestmethod overrides tomemory:writeresponseSchemaonqueryuses 8.3's array-of-object extension:type: array, items: { fields: { level: string, sha256: string, text: string, score: number } }responseSchemaonprojectsuses the array-of-scalar extension:type: array, items: stringresponseSchemaonskills/skills/{name}marksgenerated_fromas{type: string, nullable: true}— the real upstream response sendsnullfor un-derived skills, confirmed inDESIGN.md's examplerequestSchemaoningest:required: ["project", "source", "records"],ingest_idoptional (strict: false— server may compute it if absent)- A
memory:read-scoped token canGETquery/skill/projectand gets 403 oningest; amemory:write-scoped token canPOST ingest
Verify
curl -s -H 'Authorization: Bearer <jwt-with-memory:read>' \
https://api.riotpiao.com/ -H 'X-Service: memory' -H 'X-Resource: query' \
-G --data-urlencode 'query=why did requests over 10KB fail' \
--data-urlencode 'project=poimen' --data-urlencode 'level=L1,L2'
# expected: 200, JSON array of {level,sha256,text,score,parents}
curl -s -H 'Authorization: Bearer <jwt-with-memory:read>' \
https://api.riotpiao.com/ -H 'X-Service: memory' -H 'X-Resource: project'
# expected: 200, ["poimen", ...]
curl -s -o /dev/null -w '%{http_code}\n' -X POST \
-H 'Authorization: Bearer <jwt-with-memory:read>' \
https://api.riotpiao.com/ -H 'X-Service: memory' -H 'X-Resource: ingest' -d '{}'
# expected: 403 — memory:read token, ingest needs memory:write
curl -s -X POST -H 'Authorization: Bearer <jwt-with-memory:write>' \
https://api.riotpiao.com/ -H 'X-Service: memory' -H 'X-Resource: ingest' \
-d '{"project":"poimen","source":"agent:uuid","records":[]}'
# expected: 202, {"job_id":"ingest-...","status_url":"..."}
kubectl -n poimen get networkpolicy -o yaml | grep -A5 poimen-memory
# expected: ingress restricted to the api namespace's gateway pod selector only