bf6ccf9aea
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.
84 lines
3.2 KiB
HTML
84 lines
3.2 KiB
HTML
{{template "shellTop" "tasks"}}
|
|
<h1>Tasks</h1>
|
|
{{if .Msg}}<div class="msg msg-ok">{{.Msg}}</div>{{end}}
|
|
{{if .Err}}<div class="msg msg-err">{{.Err}}</div>{{end}}
|
|
|
|
<section class=card>
|
|
<h2 class=card-title>add</h2>
|
|
<form method=post action=/tasks class=inline-form>
|
|
<input type=hidden name=action value=add>
|
|
<input type=text name=text placeholder="что нужно сделать" size=44 required>
|
|
<input type=date name=due title="due date (optional)">
|
|
<select name=weight title="importance (optional)">
|
|
<option value=0>normal</option>
|
|
<option value=2>важно</option>
|
|
<option value=3>срочно</option>
|
|
</select>
|
|
<button class=btn>add</button>
|
|
</form>
|
|
</section>
|
|
|
|
{{if .Candidates}}
|
|
<section class=card>
|
|
<h2 class=card-title>found, not confirmed <span class=badge>{{len .Candidates}}</span></h2>
|
|
<div class=hint>maven derived these from something she read. nothing counts as your work until you confirm it.</div>
|
|
<div class=scroll><table>
|
|
<tr><th>task</th><th>where from</th><th>due</th><th>captured</th><th></th><th></th></tr>
|
|
{{range .Candidates}}<tr>
|
|
<td class=text-max>{{.Text}}</td>
|
|
<td class=hint>{{.Source}}{{if .Evidence}} — {{.Evidence}}{{end}}</td>
|
|
<td>{{.Due}}</td>
|
|
<td class=muted>{{.Created}}</td>
|
|
<td><form method=post action=/tasks class=inline-form>
|
|
<input type=hidden name=id value="{{.ID}}">
|
|
<input type=hidden name=action value=confirm>
|
|
<button class=btn>confirm</button></form></td>
|
|
<td><form method=post action=/tasks class=inline-form>
|
|
<input type=hidden name=id value="{{.ID}}">
|
|
<input type=hidden name=action value=drop>
|
|
<button class="btn btn-muted">drop</button></form></td>
|
|
</tr>{{end}}</table></div>
|
|
</section>
|
|
{{end}}
|
|
|
|
<section class=card>
|
|
<h2 class=card-title>open <span class=badge>{{len .Open}}</span></h2>
|
|
<div class=hint>most pressing first — by the deadlines and the urgency you gave, nothing guessed.</div>
|
|
{{if .Open}}<div class=scroll><table>
|
|
<tr><th>task</th><th>why</th><th>from</th><th>due</th><th>captured</th><th></th><th></th></tr>
|
|
{{range .Open}}<tr>
|
|
<td class=text-max>{{.Text}}</td>
|
|
<td class=hint>{{.Why}}</td>
|
|
<td class=hint>{{.Source}}</td>
|
|
<td>{{.Due}}</td>
|
|
<td class=muted>{{.Created}}</td>
|
|
<td><form method=post action=/tasks class=inline-form>
|
|
<input type=hidden name=id value="{{.ID}}">
|
|
<input type=hidden name=action value=done>
|
|
<button class=btn>done</button></form></td>
|
|
<td><form method=post action=/tasks class=inline-form>
|
|
<input type=hidden name=id value="{{.ID}}">
|
|
<input type=hidden name=action value=drop>
|
|
<button class="btn btn-muted">drop</button></form></td>
|
|
</tr>{{end}}</table></div>
|
|
{{else}}<div class=empty>
|
|
<svg class=icon width="20" height="20"><use href="/ethos-icons.svg#i-grid"/></svg>
|
|
<div>no open tasks</div>
|
|
<div class=hint>add one above, or tell maven "добавь в задачи …"</div>
|
|
</div>{{end}}
|
|
</section>
|
|
|
|
{{if .Resolved}}
|
|
<section class=card>
|
|
<h2 class=card-title>resolved <span class=badge>{{len .Resolved}}</span></h2>
|
|
<div class=scroll><table>
|
|
<tr><th>task</th><th>status</th><th>when</th></tr>
|
|
{{range .Resolved}}<tr>
|
|
<td class=text-max>{{.Text}}</td>
|
|
<td><span class="badge {{.Status}}">{{.Status}}</span></td>
|
|
<td class=muted>{{.Resolved}}</td>
|
|
</tr>{{end}}</table></div>
|
|
</section>
|
|
{{end}}
|
|
{{template "shellBottom"}}
|