be62660be9
Step 5 of the board build. internal/tasks/stall.go counts three shapes — overdue, sitting longer than StallDays, waiting for confirmation — and states nothing about what any of them means. That is the line internal/memory/behavior.go already drew for habits, and the reason is the same: a 1.7B asked to judge will agree fluently and launder a guess into a decision. A test asserts the wording carries no assessment. Sitting is measured from created_ts, the only clock a live row carries: the store stamps resolved_ts and nothing else. So "no state change in eleven days" is exactly "captured eleven days ago and still live", which is narrower than the plan's wording and is the claim the data supports. A candidate is never counted as overdue, because its due date is Maven's reading of a mail rather than a deadline he set. Not a nag. No tick rule reads the counts; they go on /tasks and into the list reply when he asks, and tickLoop.dayPlan still does not read tasks at all. The empty case renders as nothing: "ничего не залежалось" appended to every list read is a nag with a friendly face. Three say entries, so the page and the spoken list cannot word it differently. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01SoL7EBdYC5Mhz3DJd49GJy
101 lines
4.0 KiB
HTML
101 lines
4.0 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)">
|
|
<!-- weight 1 is skipped on purpose: the two rungs here are the two words she
|
|
recognises out loud ("важно", "срочно"), so the form and the spoken markers
|
|
mean the same thing. -->
|
|
<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 .Stalls}}
|
|
<section class=card>
|
|
<h2 class=card-title>shapes</h2>
|
|
<!-- Counts, and nothing about what they mean (V-512). Whether a task should be
|
|
dropped is his call and Maven does not have an opinion to show here. -->
|
|
<div class=scroll><table>
|
|
<tr><th>count</th><th>shape</th></tr>
|
|
{{range .Stalls}}<tr><td>{{.N}}</td><td>{{.Line}}</td></tr>{{end}}
|
|
</table></div>
|
|
</section>
|
|
{{end}}
|
|
|
|
{{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 about a task is guessed; the only signal that is not yours is age, which lifts anything sitting here for weeks.</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><th>by</th></tr>
|
|
{{range .Resolved}}<tr>
|
|
<td class=text-max>{{.Text}}</td>
|
|
<td><span class="badge {{.Status}}">{{.Status}}</span></td>
|
|
<td class=muted>{{.Resolved}}</td>
|
|
<td class=hint>{{.ResolvedBy}}</td>
|
|
</tr>{{end}}</table></div>
|
|
{{if .ResolvedMore}}<div class=hint>only the {{len .Resolved}} most recent are shown.</div>{{end}}
|
|
</section>
|
|
{{end}}
|
|
{{template "shellBottom"}}
|