feat: connect subjektiv extraction lifecycle

This commit is contained in:
2026-10-02 06:00:31 +09:00
parent 62b0f87477
commit 6091fafcac
13 changed files with 2082 additions and 103 deletions
+43 -4
View File
@@ -19,14 +19,17 @@ cutover of the existing Workspace Memory authority.
Async callers must run these synchronous repository calls on a blocking
executor.
- The store contains no `current_worker_id` or equivalent current link. Yoi's
keyed singleton remains the sole authority for the current Worker. Historical
Worker/Session attribution is provenance and will be connected separately.
keyed singleton remains the sole authority for the current Worker. T-668
connects Workers using the opaque `subjektiv:<subject-id>` key and records
immutable historical Worker/Session attribution as provenance; that history is
never consulted as a current Worker link.
Registration is deliberately separate from open. Trusted Server construction
registers `REGISTRATION` once per `FeatureStorage` manager, then reuses its
`RegisteredFeature` for each Workspace. Merely adding this module does not open
or create a subjektiv database; product enablement and old-Memory cutover are
later work.
or create a subjektiv database. T-668 opens it lazily for explicit subject
operations or an authenticated subject extraction write; leaving the Feature
disabled has no subject-store side effect.
## Versioned records
@@ -120,3 +123,39 @@ online backup/restore includes the entire subjektiv database, including immutabl
history and provenance. Workspace deletion and shutdown use the common lifecycle
fences and close retained repository handles. Disabling subjektiv does not erase
its database.
## Extraction connection (T-668)
`feature.subjektiv` is an explicit Worker profile boundary. It reuses the
committed-run threshold, restricted Internal extraction Worker,
`SessionEntryRef` evidence resolution, explicit finish, generation fence, and
success-only pointer progression from the established Memory lifecycle. Its
pointer domain is separate from legacy Workspace Memory, and a Worker is rejected
at installation when both automatic extraction destinations are enabled. Ordinary
SubWorkers and Reviewer SubWorkers have lifecycle Features disabled by their host;
only evidence actually committed into the parent Session can enter the parent's
capture.
The staging request contains the existing model contract (`kind`, `claim`,
`why_useful`, optional `staleness`, and entry references after host resolution)
plus the committed parent `session_id`. It contains no subject id. The Server
derives subject scope from authenticated Runtime/Worker source proof and the
current keyed-singleton lease, then attaches the session id to every source
reference and records immutable historical `{subject, runtime, worker, session}`
provenance atomically with staging. A Session already attributed to another
subject is rejected. Preference candidates still require exclusively HumanInput
evidence.
Subject retirement does not stop a Worker, and stopping/replacing a Worker does
not retire the subject. A replacement uses the same `subjektiv:<subject-id>` key;
retries therefore recover through Yoi's singleton authority without a second
current-worker mapping in this database.
Candidates are immutable writes that occur before `FinishMemoryExtraction`. If a
run stages one or more candidates and then fails, is cancelled, or loses its
generation fence, those candidates remain recorded and the extraction pointer
does not advance. A retry may therefore produce semantically duplicate candidates;
subsequent consolidation must compare them using the existing candidate
identity/content boundary. The system must not claim that the partial writes were
rolled back or silently delete them. Subject recall, consolidation, and legacy
Memory migration remain separate work.