feat(graceful-handoff): remove hardcoded push window — push is now unconditional (v3.1.0)

The regime-wide push-window restriction (man–tor 08:00–17:00, fre 08:00–16:00)
was lifted permanently, so SKILL.md no longer gates the push on a weekday/time
window — it would otherwise park a push in the middle of working hours.

Two invariants are unchanged: push is Forgejo only (never GitHub), and push
stays user-triggered (the skill is disable-model-invocation: true). The pipeline
script had no window logic — only its header comment was corrected.

If a future repo needs a window again, reintroduce it as per-repo config, never
as a hardcoded default.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01BcNX2QdgmXyLd2Bt6Z25GU
This commit is contained in:
Kjell Tore Guttormsen 2026-06-24 11:00:10 +02:00
commit 192d4403eb
7 changed files with 26 additions and 20 deletions

View file

@ -6,7 +6,7 @@
*AI-generated: all code produced by Claude Code through dialog-driven development. [Full disclosure →](../../README.md#ai-generated-code-disclosure)*
![Version](https://img.shields.io/badge/version-3.0.0-blue)
![Version](https://img.shields.io/badge/version-3.1.0-blue)
![Platform](https://img.shields.io/badge/platform-Claude_Code_Plugin-purple)
![Skill](https://img.shields.io/badge/skill-1-green)
![Hooks](https://img.shields.io/badge/hooks-0-lightgrey)
@ -47,7 +47,7 @@ Invoke it whenever you want to hand off. The session:
1. **Reaches the first natural stopping point** — finishes the current logical unit, leaves the code working.
2. **Overwrites the nearest `STATE.md`** with a complete state-of-play in a fixed format, headed by a mandatory `👉 NESTE — START HER` block (where we are + the next concrete step + what to read).
3. **Commits per remote policy** — staging *only* `STATE.md` (when tracked), never `git add -A`.
4. **Leaves push to you**, gated by your push window.
4. **Leaves push to you** — push to Forgejo, you-triggered (no window gate).
The skill is `disable-model-invocation: true`: the model cannot trigger a handoff on its own. Handoff is a deliberate, user-initiated moment.
@ -154,7 +154,7 @@ flowchart TB
SK -->|2. fetch facts| PLAN
PLAN -->|JSON| SK
SK -->|4. safe commit| COMMIT
User -->|5. git push, in-window| Done((done))
User -->|5. git push (Forgejo)| Done((done))
```
Two pieces, one responsibility each: the **skill** synthesizes `STATE.md` (only it has the context); the **helper** does the deterministic mechanics (path resolution, remote classification, safe staging). The helper has no LLM dependencies and runs under `node:test` in seconds.
@ -169,7 +169,7 @@ Two pieces, one responsibility each: the **skill** synthesizes `STATE.md` (only
2. **`--plan`** — fetch deterministic facts (resolved `STATE.md` path, remote class, git status, recent commits).
3. **Write / overwrite `STATE.md`** in the mandatory format (title → `👉 NESTE` block → fixed sections → short history). Max ~60 lines. Overwrite, never append.
4. **`--commit`** — stage only `STATE.md` (when tracked) plus any explicit `--also` paths the model judges belong to the unit. Never `git add -A`.
5. **Push**check the window (`date '+%u %H:%M'`). In-window: push (Forgejo only, never GitHub). Out-of-window: park it and say so explicitly.
5. **Push**Forgejo only, never GitHub. Push is unconditional — no window gate.
6. **MEMORY.md check** — if it exceeds 200 lines, warn (don't auto-edit).
7. **Fixed closing line** — STATE.md status (path) · next session's first action (= the `👉 NESTE` block) · commit/push status.
@ -240,7 +240,7 @@ Enforced by tests, not convention:
- **Staging is explicit.** `--commit` stages *only* `STATE.md` (plus explicit `--also` paths). `git add -A` is never used — a regression test (`never stages unrelated dirty files`) enforces this.
- **STATE.md never leaks to a public mirror.** On a public/`open/` remote `STATE.md` is gitignored and the helper refuses to commit it (`local-only-skipped`), verified by test.
- **Push is never automatic.** The helper never pushes; push stays user-triggered and window-gated.
- **Push is never automatic.** The helper never pushes; push stays user-triggered (no window gate); never automatic.
- **Pre-commit hooks are respected.** The helper never uses `--no-verify`.
- **No network calls.** No WebSearch, no Agent delegation, no MCP — fully local.
- **Bash sub-scoped.** Skill `allowed-tools` enumerates `Bash(git:*) Bash(node:*) Bash(date:*)`.