Files
Panama/user
Gabriel Brown ffce48964e Make the Jira skills call unslop, grilling, and tdd where they pay
All three already delegated in places — ticket calls diagnosing-bugs and
run, review-ticket calls codebase-design — so this extends a habit rather
than starting one.

unslop is the load-bearing part, at four points: create-ticket before the
Jira write, review-ticket's check list where a bare punctuation sweep
stood, and ticket on both mr.md and the Jira fields. Every one is scoped
to pattern detection and skips the "Adding soul" section, which is blog
voice and would fight the rigid house formats. The mr.md hook exempts the
pasted pre-MR handoff, generated output the skill already forbids
editing, and the field hook exempts proof cells. Conrad and Henry read
all of this, and prose that reads as machine generated costs the work its
credibility before anyone weighs what it says.

grilling comes in as a classification gate rather than blanket ceremony.
ticket now names the work bounded or architectural before drafting
plan.md and escalates only on architectural, where a wrong assumption is
expensive to find in Phase 2; bounded stories go straight through as
before. create-ticket escalates only when the epic docs have not settled
scope, which is where invented scope gets in.

tdd is gated the same way: test-first for procedures, derivations,
permission checks, migrations and state machines, and explicitly not for
UI wiring or copy changes, where it would produce the smoke-test padding
House style rejects. That closes a loop already half built, since
review-ticket proposes automated-test subtasks — those subtasks now name
the behavior to demonstrate, and ticket writes them first.
codebase-design gets the same call in ticket's planning step that
review-ticket already makes.

No steps were renumbered, so ticket's Phase 2 cross-references still
resolve.

Claude-Session: https://claude.ai/code/session_01DFgQVLdzLwu56gU8m4gvCS
2026-08-24 11:58:01 -04:00
..

Personal content

Everything else in Panama is the desktop. This directory is the person using it.

The problem it solves is small and annoying: an agent skill, an SSH host alias or a set of expansion triggers is worth having on every machine you own, but none of it belongs in the shared configuration, and keeping it in a second repository means remembering to update two things. So it lives here, tracked, and one file says where each piece goes.

What is in here

Path Goes to Why
agents/AGENTS.md ~/.claude/CLAUDE.md, ~/.codex/AGENTS.md Two tools, two names, one file. These were byte-identical copies before this, waiting to disagree.
agents/skills/ ~/.agents/skills, ~/.claude/skills Linked as a directory, so a skill installed on any machine lands in the checkout.
agents/rules/ ~/.claude/rules
ssh/config ~/.ssh/config Host aliases only. Keys are per-machine and are never tracked.
espanso/identity.yml ~/.config/espanso/match/identity.yml Copied, not linked, because a machine may add its own triggers.

manifest is the authority; this table is a summary of it.

It is off unless you say yes

The installer asks, naming the destinations, and the default is no. Nothing here is linked on a machine that did not answer yes, and the answer is remembered in $XDG_STATE_HOME/panama/user-content so upgrades do not re-ask.

That gating is the whole reason this can be tracked in a repository other people clone. If you are that other person: delete what is in here, put your own in its place, and answer yes. The mechanism is yours, the contents are not.

Adding something

Put the file under user/, add a line to manifest, run:

./setup/scripts/link-user

Anything already at the destination is moved to config/old/ rather than deleted, under a name that says where it came from.

What does not go in here

Anything secret. This repository is readable by anyone who finds it, and the contract test refuses private keys, tokens and credentials outright. That means no ~/.ssh/id_*, no .credentials.json, no API keys, and no settings.json carrying the names of hosts or people you would rather not publish. Machine state that a tool rewrites on its own does not belong here either; it will churn the git history for no benefit.