mavend: centralize action validation boundary (slice 4)

This commit is contained in:
2026-09-06 12:53:54 +04:00
parent 6a402bf556
commit 356766bce1
32 changed files with 2061 additions and 178 deletions
+20 -12
View File
@@ -11,14 +11,18 @@ started with an agent that inferred the goal instead of stating it back.
## 0. Get on the branch
```sh
task start <vikunja-id>
task start <vikunja-id> # with an id
git checkout -b task/<slug> # without one
```
`~/.local/bin/task` owns the branch, the identity and the PR. It cuts
`task/<id>-<slug>` off `origin/master` and sets the commit author to the `claude`
gitea user. It writes `TASK.md` from the Vikunja task, and pulls any waiting
An id is optional (owner's call, 2026-08-25). With one, `~/.local/bin/task` owns
the branch, the identity and the PR. It cuts `task/<id>-<slug>` off
`origin/master` and sets the commit author to the `claude` gitea user. It writes `TASK.md` from the Vikunja task, and pulls any waiting
review comments into `.task/review-comments.md`. Do not hand-roll any of that.
Without an id, branch by hand and skip `TASK.md`. The user's own brief is then
the goal, and step 4 restates it back to him instead.
`TASK.md` is the brief and it is immutable. If it says a PR already exists, this
is a review-fix session and not new work. Read the comments first.
@@ -34,9 +38,12 @@ If there is no handoff, that is normal. It means the last session closed clean.
In this order, and stop as soon as you have enough:
- The Vikunja task, by id. Project Maven is ID 2, MCP at `http://localhost:9100/mcp`.
The task description and its comments hold the goal, the constraints, and the
assumption ledger. This outranks the handoff on every conflict.
- The Vikunja task, if there is one. Project Maven is ID 2, MCP at
`http://localhost:9100/mcp`, reachable from workpc only through
`ssh -N -f -L 9100:127.0.0.1:9100 kami@192.168.1.104`. A refused connection is
the missing tunnel, not an outage. The task description and its comments hold
the goal, the constraints, and the assumption ledger. This outranks the handoff
on every conflict.
- `CLAUDE.md`, the section that covers the area you are about to touch.
- The one file under `docs/` that owns the area. Check its `Last verified` line.
If the sha is behind the code you are reading, say so in step 4 and trust the code.
@@ -44,8 +51,8 @@ In this order, and stop as soon as you have enough:
Do not read the dated files under `docs/evals/`. They are measurements from one day,
never updated. Read one only when you need the number it recorded.
If no task id is known, ask for one before doing anything else. Work without a task
is work nobody can resume.
With no task id, do not ask for one and do not stall. State it in step 4 as
`Task: unfiled` and carry on.
## 3. Look at the ground
@@ -58,7 +65,7 @@ Write at most five bullets and stop. Do not write code, do not open files to "ch
one thing first", do not start with a small safe change.
```
Task: V-359, one line.
Task: V-359, one line. `unfiled` when there is no id.
Done: what is already on the branch.
Next: the one thing this session does.
Constraints: what would make this wrong.
@@ -67,8 +74,9 @@ Assuming: the beliefs that, if false, waste the session.
Then ask: is this right? Wait for the answer.
A corrected assumption goes into the Vikunja task as a comment, not into the handoff.
The handoff dies tonight. The task does not.
A corrected assumption goes into the Vikunja task as a comment where there is a
task, because the handoff dies tonight and the task does not. Unfiled, it goes
into the handoff and nowhere else.
## 5. Then begin
+10 -4
View File
@@ -36,11 +36,13 @@ a commit message, not into a comment in the code.
Under 300 changed lines per commit in non-markdown files, enforced by `.githooks/pre-commit`.
Markdown is exempt and may land as one batch.
Each commit is one idea, subject in the repo's voice, lowercase area prefix, and it
ends with the Vikunja ref:
Each commit is one idea, subject in the repo's voice, lowercase area prefix. A
Vikunja ref is welcome where a task exists and is required nowhere: the
`commit-msg` hook that demanded it was deleted on 2026-08-25.
```
router: narrow the single-token rule (V-359)
router: narrow the single-token rule
```
If a change genuinely cannot split under 300 lines, say why in the commit body before
@@ -56,13 +58,17 @@ It refuses a dirty tree, pushes, opens or refreshes the PR against the repo defa
branch, labels the Vikunja task in-review, comments the PR url on it, and pushes an
ntfy. Do not push by hand and do not call `tea` yourself.
`task pr` needs an id. On a hand-cut branch with no task, push the branch and open
the PR by hand, and skip step 5.
## 5. Record what `task pr` cannot know
Comment on the Vikunja task: what you measured, what is still open. List every
assumption that turned out to be wrong. If the session found new work, create a task
for it now rather than describing it in prose.
This step is what makes the handoff disposable.
This step is what makes the handoff disposable. With no task, it cannot run, so the
handoff carries that content instead and stops being disposable. Say so in it.
## 6. Leave the handoff, or leave none
@@ -75,7 +81,7 @@ resume, and no history:
```markdown
# Handoff — <date>
Task: V-359 <one line>
Task: V-359 <one line>, or `unfiled`
Branch: task/359-<slug>, cut from master
## Where I stopped