vision: scope the note, settle the contract, wait for the prune
Saving a description writes recall corpus. writeNote embeds it under media:image:<id>, a source no enrollment owns, and the method sits at AuthRead, so any enrolled module could put a small VLM's guess into what Maven knows and have it come back in a later turn as something she believes. The describing half stays a read; save_note is now held to the same source-scope rule WriteFact is, and the stored text carries a marker saying it came off a picture. Three doc comments said the method exists only when vision is enabled and the code says otherwise. The code is right, and storing without describing is the state this box is in, so the comments were corrected rather than the behaviour. A request carrying both data and id used to take the id branch and drop the bytes without a word; it is refused. A media dir that cannot be created and a vision endpoint that is a typo were logged at wiring time and the capability just stayed off, which is the hardest kind of misconfiguration to notice. Both fail at startup. runPrune was the one loop started with a bare go and not in the daemon's WaitGroup, so shutdown did not wait for a prune that was deleting files. Found in review of #72.
This commit is contained in:
+13
-7
@@ -190,14 +190,16 @@ type IngestMailResp struct {
|
||||
//
|
||||
// Source is provenance recorded on the stored blob: "telegram", "web:upload".
|
||||
//
|
||||
// Exactly one of Data or ID is set. ID re-describes an image core already has —
|
||||
// a different question, or the first attempt that succeeds after a vision model
|
||||
// finally lands on disk.
|
||||
// Exactly one of Data or ID is set, and core refuses a request carrying both:
|
||||
// it used to take the ID branch and drop the bytes without a word.
|
||||
//
|
||||
// The method exists only when core has both a media store and an enabled vision
|
||||
// block; otherwise it answers ErrUnknownMethod, which is what "off unless
|
||||
// configured" looks like at the wire. A surface cannot make Maven look at
|
||||
// pictures by merely sending one.
|
||||
// The method exists when core has a media store. Vision being off does NOT
|
||||
// remove it: the bytes are stored and the answer says she cannot read the
|
||||
// picture yet, which is re-runnable by ID once a vision model is on disk, and
|
||||
// it is the state this box is in today. So a surface that gets a reply with an
|
||||
// id and an empty description has not failed, it has stored something. With no
|
||||
// media block the method answers ErrUnknownMethod, which is what "off unless
|
||||
// configured" looks like at the wire.
|
||||
type DescribeImageReq struct {
|
||||
Data []byte `json:"data,omitempty"`
|
||||
ID string `json:"id,omitempty"`
|
||||
@@ -206,6 +208,10 @@ type DescribeImageReq struct {
|
||||
// SaveNote — also write the description as a note (source
|
||||
// "media:image:<id-prefix>") so it is recallable later. Default false: a
|
||||
// glance at a screenshot is not automatically a memory.
|
||||
//
|
||||
// Setting it raises what the call needs: an embedded note is recall corpus,
|
||||
// so the caller's source scope must cover auth.ImageNoteSource. Describing
|
||||
// without saving stays an ordinary read.
|
||||
SaveNote bool `json:"save_note,omitempty"`
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user