Rank captured tasks by what he actually said (#129)
Ordering is computed, not generated. Asking a 1.7B which of his tasks
matters most produces a fluent opinion with no basis in anything, and a
confidently wrong priority is worse than none — same posture as the
behaviour profile in internal/memory, which counts instead of summarising.
internal/tasks is a pure package (no ipc, no store, no cgo) holding the
score, the order and the Russian rendering, so the spoken list and the
/tasks page cannot drift. Four signals, all of them things he stated:
deadline (overdue > today > tomorrow > this week), stated urgency, age
with a cap so nothing rots at the bottom, and confirmed work always
ahead of mail-derived candidates. A task with no due date and no weight
scores nothing and carries no reason string — inventing a "потому что"
about a priority he never set is the failure mode this avoids.
Capture now picks up urgency he says out loud ("добавь в задачи срочно
оплатить интернет"), stripping the marker from the task text, and the web
add form offers the same three rungs. Ranking is a read: it sorts and
renders, never writes, schedules or announces.
This commit is contained in:
@@ -4,28 +4,36 @@ import "testing"
|
||||
|
||||
func TestParseTaskCapture(t *testing.T) {
|
||||
cases := []struct {
|
||||
in string
|
||||
text string
|
||||
ok bool
|
||||
in string
|
||||
text string
|
||||
weight int
|
||||
ok bool
|
||||
}{
|
||||
{"добавь в задачи купить молоко", "купить молоко", true},
|
||||
{"Добавь в список дел: позвонить в банк", "позвонить в банк", true},
|
||||
{"запиши задачу починить кран.", "починить кран", true},
|
||||
{"новая задача — оплатить интернет", "оплатить интернет", true},
|
||||
{"add a task buy milk", "buy milk", true},
|
||||
{"добавь в задачи купить молоко", "купить молоко", 0, true},
|
||||
{"Добавь в список дел: позвонить в банк", "позвонить в банк", 0, true},
|
||||
{"запиши задачу починить кран.", "починить кран", 0, true},
|
||||
{"новая задача — оплатить интернет", "оплатить интернет", 0, true},
|
||||
{"add a task buy milk", "buy milk", 0, true},
|
||||
// Urgency he stated out loud, leading or trailing, stripped from the text.
|
||||
{"добавь в задачи срочно оплатить интернет", "оплатить интернет", 3, true},
|
||||
{"добавь в задачи оплатить интернет срочно", "оплатить интернет", 3, true},
|
||||
{"новая задача важно позвонить маме", "позвонить маме", 2, true},
|
||||
// The stem inside the task text is part of the task, not a marker.
|
||||
{"добавь в задачи позвонить в срочную помощь", "позвонить в срочную помощь", 0, true},
|
||||
// A marker with nothing after it files nothing.
|
||||
{"добавь в задачи", "", false},
|
||||
{"новая задача", "", false},
|
||||
{"добавь в задачи", "", 0, false},
|
||||
{"новая задача", "", 0, false},
|
||||
{"добавь в задачи срочно", "", 0, false},
|
||||
// Not a capture: he is talking, not filing.
|
||||
{"надо бы поспать", "", false},
|
||||
{"я не добавил молоко в список", "", false},
|
||||
{"какие у меня задачи?", "", false},
|
||||
{"", "", false},
|
||||
{"надо бы поспать", "", 0, false},
|
||||
{"я не добавил молоко в список", "", 0, false},
|
||||
{"какие у меня задачи?", "", 0, false},
|
||||
{"", "", 0, false},
|
||||
}
|
||||
for _, c := range cases {
|
||||
text, ok := ParseTaskCapture(c.in)
|
||||
if ok != c.ok || text != c.text {
|
||||
t.Errorf("ParseTaskCapture(%q) = (%q, %v), want (%q, %v)", c.in, text, ok, c.text, c.ok)
|
||||
got, ok := ParseTaskCapture(c.in)
|
||||
if ok != c.ok || got.Text != c.text || got.Weight != c.weight {
|
||||
t.Errorf("ParseTaskCapture(%q) = (%+v, %v), want (%q, w=%d, %v)", c.in, got, ok, c.text, c.weight, c.ok)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user