Skip to content

devhost 1.2.3 and git 1.1.0: guards that run, quieter backs, one commit identity - #12

Merged
nabil-becker merged 8 commits into
mainfrom
features/devhost-and-git-fixes
Oct 19, 2026
Merged

nabil-becker merged 8 commits into
mainfrom
features/devhost-and-git-fixes

Conversation

@nabil-becker

Copy link
Copy Markdown
Owner

What

Fixes and two new options in the devhost (1.1.1 → 1.2.3) and git (1.0.0 → 1.1.0) Features, plus the repository's sign-off hook.

  • devhost
    • devhost:* tasks run in the caller's directory, so devhost-verify checks the repository instead of the go-task includes folder; a skipped guard is now loud.
    • Backs keep the Friction section when the input is condensed, never drop a job silently while another back holds the lock (they wait up to 600 s), and turn a stake that asks to change an item into an amend-<id> item.
    • devhost-verify refuses a hook committed without its executable bit (hook-mode-guard).
    • The tester reports "skipped" once, instead of "red" every turn, when there is no Docker daemon (tester-skip-without-docker).
    • The redaction tests plant a placeholder name and are proven able to fail (redaction-fixture-placeholder).
    • Quieter backs: a higher librarian threshold for con jobs; tighter secretary and scribe briefs (back-briefs-tidy).
  • git: commitName / commitEmail options. The wrapper exports GIT_AUTHOR_* / GIT_COMMITTER_* from them, so agent commits carry one identity even when a repo-local user.email says otherwise (bot-git-identity).
  • .githooks/prepare-commit-msg signs off as the committer (git var GIT_COMMITTER_IDENT), like commit -s. It used to read user.name/user.email, so a rebase or cherry-pick added a second sign-off with the repo-local address.

Why

These were found running this repo's own devhost on 2026-10-16: a verify that checked nothing, backs that lost friction or jobs, and agent commits signed with the wrong identity. The way-of-working records that explain them come in the stacked PR.

Checklist

  • Every commit is signed off (Signed-off-by:, DCO)
  • version bumped in src/<id>/devcontainer-feature.json (semver)
  • Downloads remain checksum-verified; nothing unverified is piped into a shell
  • install.sh is idempotent and does not assume a remoteUser
  • Tests updated; task test runs in CI (no Docker daemon in the devhost)
  • taskfile.yml present and registered via installTaskfile (new Features): n/a
  • task lint passes (53 tests)
  • NOTES.md updated where options changed, and task docs run

🤖 Generated with Claude Code

devhost agent and others added 8 commits October 16, 2026 11:13
…t-identity)

It read user.name and user.email, so a rebase or cherry-pick under GIT_COMMITTER_* added a second sign-off pairing the global name with the repository-local address. git var GIT_COMMITTER_IDENT honours the environment and the config alike.

Co-Authored-By: Claude Opus 5.5 <claude-opus-5-5@noreply.invalid>
Signed-off-by: devhost agent <devhost-agent@noreply.invalid>
…guard is loud

Tasks of an included Taskfile run in the include's folder, so devhost:verify
ran against /usr/local/share/go-task/includes.d: no repository, no base ref,
append-only guard skipped. Set dir to USER_WORKING_DIR on every task that works
on the current repository. A skipped append-only guard now prints SKIP and a
WARNING on stderr, also under --quiet. Bump devhost to 1.1.2.

Co-Authored-By: Claude Sonnet 5.5 <claude-sonnet-5-5@noreply.invalid>
Signed-off-by: devhost agent <devhost-agent@noreply.invalid>
…nstead of reword

- condense: a con's hand-off keeps Friction, For the repository and Decisions needed whole
  and first; the rest is clipped at 8000 chars with a [clipped N chars] marker.
- run-job: SubagentStop runs wait for the job lock (DEVHOST_LOCK_WAIT, 180 s); every run
  skipped for the lock is logged.
- scribe brief: Friction: not reported when the hand-off has none or was clipped.
- secretary brief: a stake to change an item adds an amend-<id> item; a tick only ticks.
- backlog guard: the finding names the line and the rule, the job log carries the capped
  diff, and an undone run marks its stretch read so it is not retried every turn.
- templates: cons report worked-around friction. Feature version 1.2.0.

Co-Authored-By: Claude Sonnet 5.5 <claude-sonnet-5-5@noreply.invalid>
Signed-off-by: devhost agent <devhost-agent@noreply.invalid>
A hook committed as 100644 never runs on Linux, and core.fileMode=false on Windows hides it.

Co-Authored-By: Claude Sonnet 5.5 <claude-sonnet-5-5@noreply.invalid>
Signed-off-by: devhost agent <devhost-agent@noreply.invalid>
…ster-skip-without-docker)

A suite the environment cannot run (Taskfile precondition, no Docker daemon) gave no verdict on the code, so it was reported red on every run.

Co-Authored-By: Claude Sonnet 5.5 <claude-sonnet-5-5@noreply.invalid>
Signed-off-by: devhost agent <devhost-agent@noreply.invalid>
…il (redaction-fixture-placeholder)

The old assertions checked a name no fixture contained, so they could never fail off the Operator's machine; they now seed a placeholder person as the git user.name and would fail if the identity leaked into the output.

Co-Authored-By: Claude Sonnet 5.5 <claude-sonnet-5-5@noreply.invalid>
Signed-off-by: devhost agent <devhost-agent@noreply.invalid>
The librarian ran for nothing in most con stretches, the secretary filed in-session work as items and the scribe misused Corrects.

Co-Authored-By: Claude Sonnet 5.5 <claude-sonnet-5-5@noreply.invalid>
Signed-off-by: devhost agent <devhost-agent@noreply.invalid>
…entity (bot-git-identity)

The wrapper exports GIT_AUTHOR_* and GIT_COMMITTER_* from a file written at
install time, unless the caller set them, so a repository-local user.email
in a shared git dir cannot leak into agent commits and commit -s signs off
with the bot. Default empty leaves identity alone. Feature 1.1.0.

Co-Authored-By: Claude Sonnet 5.5 <claude-sonnet-5-5@noreply.invalid>
Signed-off-by: devhost agent <devhost-agent@noreply.invalid>
@nabil-becker
nabil-becker merged commit a3604a7 into main Oct 19, 2026
69 checks passed
@nabil-becker
nabil-becker deleted the features/devhost-and-git-fixes branch October 19, 2026 15:20
nabil-becker pushed a commit that referenced this pull request Oct 19, 2026
Co-Authored-By: Claude Opus 5.5 <claude-opus-5-5@noreply.invalid>
Signed-off-by: devhost agent <devhost-agent@noreply.invalid>
nabil-becker added a commit that referenced this pull request Oct 20, 2026
…e (docs-site) (#21)

## What

devhost 1.5.0 adds `devhost-site` (`task devhost:site`): the
repository's tracked docs and records (backlog, ledger, Features, ADRs,
night-shift reports, every `*.md`) as one self-contained HTML page,
every string passed through the name guard. The `publish-site` skill
publishes it as a private Claude artifact. It's shipped to consumers by
`devhost-init`.

This is the work of `features/devhost-site` (2026-10-16 to 10-17),
rebuilt on `main`. Its other eight commits already reached `main`
through squash merges (#12 to #15), so only the site remains: `site.py`,
its template, the skill, the task, init's file list and `test_site.py`.
Conflicts were resolved by keeping `main`'s text and adding the site's
parts.

## Why

The Operator asked to merge the site work and close the branch. It lets
the records be read in a browser, on a phone too, instead of the
terminal.

## Checklist

- [x] Every commit is signed off (DCO)
- [x] `version` bumped in `src/devhost/devcontainer-feature.json` (1.4.0
→ 1.5.0). If #20 (1.4.1) merges first, this one rebases and stays 1.5.0
- [x] Downloads remain checksum-verified; nothing unverified is piped
into a shell (the page loads `marked`, `DOMPurify` and `mermaid` from
cdnjs at view time, pinned to exact versions; nothing is installed)
- [x] `install.sh` is idempotent and does not assume a `remoteUser` (not
touched)
- [x] Tests: `test_site.py`, `test_init.py` updated. `task test
FEATURE=devhost` not run here (no Docker daemon); CI runs it
- [x] `taskfile.yml`: `devhost:site` with a `desc`
- [x] `task lint` passes (92 unit tests); `devhost-verify` passes; the
built page carries no redacted name
- [x] `NOTES.md` has "The site"; `task docs` run

Still open after the merge: `publish-site-browser-check` (look at the
published page in a browser).

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Signed-off-by: devhost agent <devhost-agent@noreply.invalid>
Co-authored-by: devhost agent <devhost-agent@noreply.invalid>
Co-authored-by: Claude Opus 5.5 <claude-opus-5-5@noreply.invalid>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant