ipc: a seed_event method, step-up gated, refused by the store (V-518)
The pattern detector needs four events for one action+object spread by at least two hours before it proposes a routine. The only writer in the tree is a fact write at time.Now(), so V-43, V-46, V-247 and V-254 all stopped at the same missing step. This is the wire half of the seam that unblocks them. The request takes a fact — key, value, timestamp — not an event, so pattern.Extract runs for real on the daemon side and a key the extractor ignores seeds nothing. The response says which of those happened, because a caller that assumed a seed always yields an event would read four silent successes as a broken detector. AuthStepUp, the same rung as mutating the tool allowlist, and not because backdating is privileged in the usual sense: every other write records when something happened and this one asserts it. StoreAPI refuses outright — the method needs the daemon's detect-and-propose step, and a direct store caller would write a fact and quietly skip it. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_011x5DgnExQ5XZy8TZPs5bot
This commit is contained in:
@@ -184,6 +184,48 @@ type CaptureTaskResp struct {
|
||||
Promoted bool `json:"promoted,omitempty"`
|
||||
}
|
||||
|
||||
// SeedEventReq — write one fact at a caller-supplied timestamp and run the
|
||||
// pattern path over it, so a recurring routine can be produced on demand
|
||||
// instead of over real days (Vikunja #518).
|
||||
//
|
||||
// This is the ONLY backdating write path in the tree, and it exists for one
|
||||
// reason: the detector needs four events spread over hours before it proposes
|
||||
// anything, so V-43, V-46, V-247 and V-254 could not be verified against a
|
||||
// running daemon at all. A store fixture would have exercised the detector
|
||||
// without the wiring those tasks doubt.
|
||||
//
|
||||
// Two things hold it shut. It is AuthStepUp in the authority table, the same
|
||||
// rung as mutating the tool allowlist. And mavend refuses it outright unless
|
||||
// started with -allow-seed, so a box nobody is testing carries no live
|
||||
// backdating path even for a caller who cleared the gate.
|
||||
//
|
||||
// Key and Value are a fact, not an event: extraction runs for real, so a key
|
||||
// the extractor ignores seeds nothing and says so. That is deliberate — a
|
||||
// seam that accepted action and object directly would let QA prove a detector
|
||||
// against events no utterance could ever produce.
|
||||
type SeedEventReq struct {
|
||||
Key string `json:"key"`
|
||||
Value string `json:"value"`
|
||||
Ts time.Time `json:"ts"`
|
||||
}
|
||||
|
||||
// SeedEventResp — what the seed produced. Extracted is false when the fact was
|
||||
// written but yielded no event, which is the extractor declining rather than a
|
||||
// failure. Proposed is true only when this seed completed a pattern; the first
|
||||
// three seeds of a run return false with no routine.
|
||||
type SeedEventResp struct {
|
||||
FactID int64 `json:"fact_id"`
|
||||
EventID int64 `json:"event_id,omitempty"`
|
||||
Extracted bool `json:"extracted"`
|
||||
Action string `json:"action,omitempty"`
|
||||
Object string `json:"object,omitempty"`
|
||||
Proposed bool `json:"proposed"`
|
||||
RoutineID int64 `json:"routine_id,omitempty"`
|
||||
// IntervalDays — the median the detector settled on, echoed so QA can
|
||||
// check it against the spacing it asked for.
|
||||
IntervalDays float64 `json:"interval_days,omitempty"`
|
||||
}
|
||||
|
||||
// IngestMailReq — one message a mail reader has fetched, handed to core for
|
||||
// extraction (Vikunja #246).
|
||||
//
|
||||
|
||||
Reference in New Issue
Block a user