The Coder workspace is the normal case: tea without op, signing via its own SSH signer

jklein committed 2026-09-18 11:19:36 +00:00
1 parent 7ab1168fa1
commit e7be294c21
3 files changed
+14 -8

No files matched your search

+11 -5
@@ -12,13 +12,16 @@ The workflow files under `.github/workflows/` are read by Gitea unchanged — th
## `tea`, not `gh`
Issues and pull requests are driven with `tea`, and only through 1Password:
Issues and pull requests are driven with `tea`:
```bash
op plugin run -- tea pr list
tea pr list
tea pr create --base main --head <branch> --title … --description …
```
A bare `tea` invocation falls back to the wrong identity. Every call costs a 1Password confirmation, so **bundle calls and never poll**.
**Work happens in a Coder workspace, and it has no `op`.** That is the normal case, not a broken environment — do not wait for the 1Password CLI and do not propose installing it as a precondition. `tea` carries the workspace's stored login, so anything it creates is authored by the **bot account**; that is accepted, and worth naming in the report when something is opened that way.
`op plugin run -- tea` is the older instruction and applies only where `op` actually exists. Where it does, every call costs a 1Password confirmation, so bundle calls and never poll.
## Remotes are named, and `origin` is not one of them
@@ -33,13 +36,16 @@ There is no `origin`, so `git push` without a remote is ambiguous here. Say whic
Branch protection on `main` requires a signature, and signatures verify on Gitea. A commit that is not signed does not reach `main`.
In the Coder workspace this works without any 1Password step: signing runs through the workspace's own SSH signer (`gpg.format = ssh`, `gpg.ssh.program = coder-git-ssh-sign`, `commit.gpgsign = true`).
Check before opening the PR, not at merge time:
```bash
git log --show-signature -1
git log --format='%G?' -1 # must print G
git log --show-signature -1 # the long form
```
If `op-ssh-sign` fails, stop and report. Pushing unsigned work only moves the failure to a place where it costs a review.
If signing fails, stop and report. Pushing unsigned work only moves the failure to a place where it costs a review.
## No merge queue — auto-merge takes its place
+2 -2
@@ -75,5 +75,5 @@ Doing it by hand is the same four steps:
| `k3d` + `docker` | throwaway clusters |
| `kubectl` | everything after the install |
| `python3` | the quantity render test reads `values.schema.json` |
| `op` + `tea` | issues and PRs — see [Forge and tooling](Forge-and-Tooling) |
| `op-ssh-sign` | signed commits, which branch protection requires |
| `tea` | issues and PRs — see [Forge and tooling](Forge-and-Tooling). The Coder workspace has **no `op`**, so `tea` is called directly and acts as the bot account |
| a working commit signer | branch protection requires signed commits; the Coder workspace signs through `coder-git-ssh-sign` without a 1Password step |
+1 -1
@@ -54,7 +54,7 @@ Page names are file names: `outline.md` is the page `outline`. Links between pag
## Rules for every commit, PR, issue and comment
- **No `Co-Authored-By` trailer and no "Generated with Claude Code" footer.**
- **Commits must be signed.** Verify the signature before opening the PR. If `op-ssh-sign` fails, stop and report rather than pushing unsigned work — branch protection rejects unsigned commits on `main`, and discovering that at merge time wastes the review.
- **Commits must be signed.** In the Coder workspace that needs no extra step — its own SSH signer does it — but verify before opening the PR: `git log --format='%G?' -1` must print `G`. If signing fails, stop and report rather than pushing unsigned work; branch protection rejects unsigned commits on `main`, and discovering that at merge time wastes the review.
- **Write new issue references with the Gitea number.** `#n` inside the repo's files means the old GitHub tracker, and Gitea silently resolves a bare `#n` against its own counter — so an old reference can render as a link to something unrelated. See [Forge and tooling](Forge-and-Tooling#issue-numbers-changed-with-the-move).
## Documentation that is not the wiki