tasks: key derived captures by external id and record who resolved
A task extracted from mail deduped on the live-norm index only, so once he finished it the row left the live set and the next poll of the same immutable message re-extracted it as a fresh candidate. mavmaild is a read-only reader and marks nothing read, so that repeats forever. Derived rows now carry an ext_id built from the message uid and the extracted span, unique across every status, while voice keeps live-only norm dedupe because saying an errand again is the recurrence signal. A derived source can no longer capture straight to open, and saying a task out loud that Maven had only proposed promotes the candidate instead of answering that it is already in the list. SetTaskStatus was classified AuthRead. Resolving a task is not additive, it erases work off his list, so it is a write, and the row now records the caller that moved it. ListTasks was unbounded. The list-query matcher claimed any utterance with "что мне делать", including "с чем мне помочь", and the urgency stripper matched inside words. Found in review of #60.
This commit is contained in:
+11
-2
@@ -93,6 +93,14 @@ func Requirement(m ipc.Method) Authority {
|
||||
return AuthWrite
|
||||
case ipc.MethodWriteFact:
|
||||
return AuthWrite
|
||||
case ipc.MethodSetTaskStatus:
|
||||
// Resolving a task is NOT additive, which is what separates it from
|
||||
// capture. Capture at AuthRead can only put a line on a list he reads
|
||||
// himself; SetTaskStatus at AuthRead would let any enrolled module —
|
||||
// mavpoll, mavsttd — mark every open task done and clear the list out
|
||||
// from under him. Same reasoning as WriteFact: a module gets to add to
|
||||
// its own corner, not to erase his.
|
||||
return AuthWrite
|
||||
case ipc.MethodAssertStepUp:
|
||||
return AuthRead
|
||||
case ipc.MethodLatestFact,
|
||||
@@ -109,10 +117,11 @@ func Requirement(m ipc.Method) Authority {
|
||||
// module write, not an allowlist mutation and not a new standing reason
|
||||
// for Maven to speak — nothing in the tick loop reads tasks. It stays
|
||||
// at AuthRead, the same rung as CreateReminder, which is the closest
|
||||
// existing analogue.
|
||||
// existing analogue. SetTaskStatus is NOT here: see the AuthWrite case
|
||||
// above, because resolving is the one task move that destroys
|
||||
// something.
|
||||
ipc.MethodCaptureTask,
|
||||
ipc.MethodListTasks,
|
||||
ipc.MethodSetTaskStatus,
|
||||
// Mail ingestion (Vikunja #246). AuthRead because of what the method can
|
||||
// produce: candidate tasks and nothing else. It cannot write a fact, set a
|
||||
// reminder, or touch the tool allowlist, so a compromised mail reader can
|
||||
|
||||
Reference in New Issue
Block a user