Commit Graph

43 Commits

Author SHA1 Message Date
naps62 5792d6454b docs: tighten hourlog, add the confirmed-entry check
Scan and report had grown into two sections saying the same thing, and
step 4 repeated step 1's "show the table". Down to four steps.

Adds what nearly went wrong on the first real run: a day already
confirmed weeks ago looks identical to a planned one in a bulk approval,
and overwriting it needs its own yes. Also records the 15-minute
rounding the app enforces, and the ${VAR:-x} expansion that prints a
token instead of hiding it.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-14 22:11:06 +00:00
naps62 b485cee634 feat: split overlapping minutes between projects
Five minutes with two projects open was counted as five for each, so
Wednesday's columns summed to 18h against 13h10 of wall clock and no
column said which number to trust.

Each slot's minutes are now divided evenly among the projects live in
it, largest remainder over whole minutes, so the columns add up to the
total exactly. That ratio is what a submission scales the user's stated
day length by.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-14 22:05:13 +00:00
naps62 439d3601b4 feat: report measured time, drop the nominal-day fit
Splitting a fixed 8h day by share turned 160 minutes of Friday morning
into "7h Tesser". The number looked measured and was not, and no column
in the table said which.

Cells now carry the time each project was actually active. The total
column is wall-clock presence — the union of active slots — so it reads
lower than the row sum when sessions overlapped. Measured time is a
floor; the skill says so and leaves adding the rest to the user.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-14 20:33:34 +00:00
naps62 f0c301b3a3 docs: hourlog table goes in the reply unfenced
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-14 20:10:03 +00:00
naps62 b453e72d42 Revert "feat: draw the grid by default, --markdown to opt out"
The drawn grid was solving the wrong problem: the script output was
already right, and fencing it in chat is what turned a rendered table
into raw dashes.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-14 19:52:30 +00:00
naps62 bf1dc76125 feat: draw the grid by default, --markdown to opt out
A markdown table carries no borders of its own; whether any get drawn is
up to the renderer, and terminal renderers mostly draw none. Emitting the
grid directly makes the output look the same everywhere it lands.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-14 19:51:28 +00:00
naps62 ea9c3acecf feat: emit the day report as a markdown table
Padded pipes, so it reads as a grid in the terminal and renders as a
real table when pasted anywhere else. Each cell carries hours, share and
active minutes; a flags column carries what needs judgement.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-14 19:26:06 +00:00
naps62 658b9850bb style: rule off the report, count only sessions in range
The session count came from the mtime prefilter, so an old date range
reported every file on disk as if it had contributed.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-14 18:42:15 +00:00
naps62 39d88899af refactor: back to per-day blocks, add a totals line
The matrix table dropped the evidence — share, active minutes, hour
range, and the outside-working-hours flags — which are what make a
proposed number checkable rather than asserted.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-14 18:40:44 +00:00
naps62 cd63a4c18e refactor: hourlog prints a day-by-project table
One row per day, one column per project, hours in the cell. The per-day
blocks repeated the project name on every line and buried the totals.

Share, active minutes, hour ranges, and the outside-working-hours flags
move to --json, which is where the skill reads them anyway.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-14 18:38:45 +00:00
naps62 95e98a1e77 refactor: hourlog reports whole days, timer to 18:00
Half-days forced every result into a 4h bucket. Days with hours split by
share give the same answer at finer granularity and drop a concept.

Session minutes are now stated as a floor on real work, not a measure:
the day's length comes from the calendar and only the split between
projects comes from the sessions. Meetings and review leave no
transcript, so a thin day is still a full day.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-14 18:36:34 +00:00
naps62 e4ffd5d93d feat: hourlog skill + Friday timer
Turns Claude Code and Codex session activity into a half-day-per-project
proposal, reconciles it against the timesheet API, and submits only what
the user approves in-session.

Activity is measured in 5-minute active slots, deduplicated per project,
not message counts — otherwise one overnight autonomous run outweighs a
real morning's work.

The path-to-project mapping and the API credentials stay in
~/.config/hourlog/ and ~/.env.claude. This repo is public.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-14 17:35:24 +00:00
naps62 a0b42c9210 feat: land requests a Copilot review on GitHub PRs 2026-08-12 08:19:13 +00:00
naps62 19863adc15 docs: rev watcher is silent plumbing
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-12 06:14:40 +00:00
naps62 984616f5c4 fix: rev fallback asks for multi-line markdown reply bodies
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-11 20:15:40 +00:00
naps62 19bd110188 docs: name the public rev URL in the fallback
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-04 06:05:34 +00:00
naps62 1efa691b04 docs: route code reviews to rev, scope crit to plans/live/HTML
Rev hooks are installed globally; entry files describe the injected flow
plus a manual fallback (codex has no hooks). Crit skill redirects code
diffs to rev.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-03 10:12:00 +00:00
naps62 cb525048a4 docs: prefer agent-browser CLI over claude-in-chrome
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01K4F9xsCrdJQXNxNZJiKpYq
2026-08-03 06:24:05 +00:00
naps62 5e95a7337f feat(week-review): spawn weekly via systemd timer
Fridays 17:00 Europe/Lisbon, pinned in the unit because the machine
clock is UTC. Creates an Agent of Empires session in a fresh
week-review/<ISO week> worktree, sends it /week-review, notifies ntfy.

Interactive, not `claude -p`: the skill asks which carry-over issues to
take and what to apply, so an unattended run would stall or decide on
its own. link.sh links the units but does not enable them, since
enabling on every machine spawns one session per box for the same week.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01SC9zwjErud3jfeYVEkf2Zd
2026-08-01 15:51:34 +00:00
naps62 bdeded310a feat(week-review): filter carry-over on the weekly-review label
Reading every open issue would pull in unrelated work once the repo has
any. Newly filed issues must carry the label or the next run cannot see
them.
2026-08-01 15:28:45 +00:00
naps62 f6b58e8849 feat: add the week-review skill
Codifies the session-review process: read open issues for carry-over,
scan transcripts, rank by how often the same correction repeated, check
the current model docs before recommending, then apply or file.

scripts/scan-sessions.py enumerates top-level sessions in a window,
drops subagent transcripts, and flags swarm runs so a single 577-session
security scan does not read as 40% of the week's work.
2026-08-01 15:15:14 +00:00
naps62 ad4d14e078 docs: README still described the reverted AGENTS.md design 2026-08-01 15:02:47 +00:00
naps62 60f39cdcbb feat: track both entry files in the repo
~/.claude/CLAUDE.md was in no git repo despite heavy editing, and
~/.codex/AGENTS.md was a hand-synced duplicate of it. Both now live in
entry/ and import the shared fragments; RTK.md moves to claude-md/ so
Codex stops carrying its own copy.

Claude's imports are ~/-anchored so they resolve through the symlink.

Also drops kt from the comment rule scope.
2026-08-01 15:02:28 +00:00
naps62 9023ed3ef9 chore: update vendored skills and record provenance
humanizer 2.2.0 -> 2.9.1 (blader/humanizer, MIT): adds a Voice
Calibration section and a passive-voice pattern, reworks negative
parallelisms and em dashes. Version moved to metadata.version upstream.

impeccable 3.6.0 -> 4.0.4 (pbakaus/impeccable, Apache-2.0): the repo
tags the skill and the npm CLI separately, so 3.6.0 was a real release
and npm's 3.5.0 was never the comparison. Adds native-platform reference
briefs.

Each now carries an UPSTREAM file; bin/check-vendored.sh reports drift.
2026-08-01 14:25:26 +00:00
naps62 2f7f512cec fix: exempt doc comments from the code-comment budget
Rustdoc, JSDoc, NatSpec and docstrings document a surface for callers and
are read by tooling — NatSpec ends up in contract metadata. The rule read
as an instruction to delete them, and the linter blocked a legitimate
rustdoc block.

Also: plain block comment bodies were never linted (no per-line marker),
and a literal double-star in a code span was flagged as bold.

Merges the landmine and MUST categories, which said the same thing.
2026-08-01 14:16:48 +00:00
naps62 aacbdc2c43 chore: drop c and h from the comment rule scope 2026-08-01 14:12:43 +00:00
naps62 652b5abceb chore: drop unused languages from the comment rule scope
scala, java, cc, cpp, hpp, swift, php, cs.
2026-08-01 14:12:01 +00:00
naps62 b8d442386b feat: scope the comment rule to yaml, yml, and toml too
Adds them to both the paths glob and the linter's extension set, which
had also drifted apart on scala.
2026-08-01 14:11:08 +00:00
naps62 ccfb5192f8 refactor: both tools import the same fragments; scope code comments by path
Codex reads ~/.codex/AGENTS.md, not ~/.agents/AGENTS.md, so the file
generated there last commit was inert. Both tools support @path imports,
which removes the generate-and-drift step entirely.

code-comments.md moves to ~/.claude/rules/ with paths frontmatter, so its
24 lines load only when a source file is read.
2026-08-01 14:08:44 +00:00
naps62 36372f85b2 feat: split security and autonomy into operating.md
Nine bullets to six. Cut what the harness now ships by default: the
scope-discipline bullet, "create/modify files freely" (subsumed), and
the standalone refuse-dangerous-tasks bullet (restated the injection
rule with examples, now merged into it).

Adds progress-claim grounding for long unattended runs, per the Fable 5
guide. Codex gets both fragments now — link.sh concatenates them into
~/.agents/AGENTS.md, since Codex has no @import.
2026-08-01 13:09:36 +00:00
naps62 e449d705c3 docs: use a generic workspace name in the linearMcp examples 2026-08-01 13:07:57 +00:00
naps62 a1f95a1161 feat: one writing contract for Claude Code and Codex
Replaces public-comms.md and code-comments.md (749 words, ~25 rules,
almost all prohibitions, no examples) with a single writing.md that
leads with worked examples.

The rule is selection, not compression: keep output short by cutting
whole ideas that don't change what the reader does next, then write what
survives as plain sentences. Not by dropping articles or writing
fragments, which Anthropic's Fable 5 guide calls out as the wrong lever.
Prompt style leaks into output style, so the file is written in the
voice it asks for.

Drops the BLUF ask-line rule entirely: everyone on a PR already knows
who reviews and who merges, and read literally it produced openers like
"Ask: reviewers please merge".

Links the contract to ~/.agents/AGENTS.md, which Codex had nothing in at
all, and to the nix module for the NixOS machine.
2026-08-01 13:06:38 +00:00
naps62 17677c18df feat(land): never merge, user clicks
Auto-merge burned a client PR meant for manual merge. Human gate
needed on public/client repos; one click on private is cheap, so
rule is universal. Land now stops at green + approved + updated
branch, notifies, and leaves the merge button alone.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01WLkYHLzszmzq5fMGpFAkHh
2026-07-30 08:33:00 +00:00
naps62 0cdbfb6952 docs: list nightshift in skill table
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01VaGR6ERGCfzWTtuv2rebGe
2026-07-27 15:07:28 +00:00
naps62 08195c1cd4 feat(hooks): track writing contracts + linters in repo
comms-lint.py and comment-lint.py lived only in ~/.claude, which is not
a git repo. Contract prose lived in ~/.claude/CLAUDE.md. Neither survived
a machine rebuild.

Prose moves to claude-md/ fragments, imported via @name.md. Linters move
to hooks/. link.sh and home.nix distribute both. settings.json wiring
stays manual — it holds machine-local MCP/statusline config this repo
must not own.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01VaGR6ERGCfzWTtuv2rebGe
2026-07-27 14:34:29 +00:00
naps62 715420d0a9 feat(nightshift): calibrated quota verdict + scoped milestone checks
usage-window.py stores a calibrated window quota and emits an explicit
verdict, so a run can no longer park on an uncalibrated raw token count.
Milestone assess is scoped; full suite moves to the gated push points.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_015YUXS63P1WCdC6bEKWcnAE
2026-07-27 12:45:06 +00:00
naps62 999f759691 feat(skills): machine-wide gate for heavy test runs
Parallel yolo/nightshift/blitz sessions each ran the full suite and OOMed
the box. gate.sh caps concurrency, memory and build parallelism; skills now
run scoped checks in the loop and one gated full run per push.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_015YUXS63P1WCdC6bEKWcnAE
2026-07-27 12:41:03 +00:00
naps62-yolo c8de8bcb5a feat(nightshift): ship as a pull request, not straight to main
A night of autonomous work needs a review gate, especially on a live repo.
Output is now one branch and one PR rather than commits on the default
branch.

Separates committing from pushing, which had been conflated. Local commits
are what protect against an agent dying mid-task, and they cost no CI, so
they stay at every milestone. Pushing is what triggers CI, so it becomes a
deliberate act: at the end, when parking, or on request. A night of
milestone pushes is a night of CI runs on work that was half-finished at
the time, which trains the user to ignore the build.

Subagents are told to commit locally and explicitly not to push.

Covers both forges: gh for GitHub, the API for Gitea (no tea CLI on most
setups), and reporting a compare URL rather than faking success if auth
fails.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_019SSXDKsik8yYrezStVaDXt
2026-07-25 13:15:57 +00:00
naps62-yolo 3163bd26f0 feat(nightshift): long autonomous build skill with limit backoff
Takes an issue, ticket or plain description and works it for hours as an
architect: freeze the interface contract first, then delegate implementation
to subagents against frozen signatures, review, commit every milestone.

Checks the rolling 5-hour window before each dispatch and parks rather than
letting agents die mid-task. The usage script sums every Claude Code session
on the machine, and is explicit that it is a floor — it cannot see other
machines, claude.ai, or direct API use — so the reactive backstop of an
agent dying on a limit error is documented as the stronger signal.

Encodes what worked in practice: disjoint file ownership per agent, asking
agents to report disagreement (their pushback was the highest-value output),
sabotage-testing every safety net, and asking what a passing check is
structurally unable to see.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_019SSXDKsik8yYrezStVaDXt
2026-07-25 13:08:41 +00:00
naps62 423747b08d docs: local clone path ~/tea/yolo 2026-07-24 18:26:15 +00:00
naps62 bf2d8ced6e chore: repo moved to yolo org; update URLs 2026-07-24 18:01:47 +00:00
naps62 a067cecee1 docs: real repo URL + backup-location note; link.sh backs up outside skills dir 2026-07-24 18:00:57 +00:00
naps62 f83a247de3 init: centralized agent skills for Claude Code + Codex
- skills/ shared by both tools (open Agent Skills standard)
- portable cross-skill refs (root-relative, no ~/.claude hardcode)
- bin/link.sh bootstrap for non-Nix machines
- nix/home.nix + flake.nix for home-manager

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_014SK5Lo7LQfwLRVdCv1A8uF
2026-07-24 17:59:44 +00:00