chore(process): issue and PR conventions for human and agent contributors - #14
Conversation
Five issue forms (PRD, Task, Enhancement, Bug, ADR) replacing upstream's block/buzz-oriented bug-report and feature-request templates. Each carries an AGENT INSTRUCTIONS comment block readable in raw YAML but invisible to humans in the rendered form. PR templates split by author, not issue type: the upstream markdown template gains an Issue type section for humans; agent-authored PRs use launchpad/AGENT_PR_TEMPLATE.md, which requires provider/model provenance, raw command output, and an explicit statement of what was not verified. Two CI checks enforce the contract on both paths, so structure holds whether an issue or PR came from the web UI or the CLI. Labels live in launchpad/labels.yml with a sync script that actually exists. Signed-off-by: tucktuck101 <jeffreytaylorrobertson@gmail.com>
launchpad/README.md is the human entry point — worked example, plain-English type table, label reference. AGENTS.md stays the normative spec and says so, so the two cannot silently drift. Root AGENTS.md gains a contiguous, clearly delimited block redirecting deployment, docs and process work to launchpad/. Without it, an agent starting at the repo root reads upstream's contributor guide and gets instructions that are wrong for this fork rather than merely irrelevant. CLAUDE.md is a symlink to AGENTS.md, so one edit covers both. Signed-off-by: tucktuck101 <jeffreytaylorrobertson@gmail.com>
Closes #40's template and label items by landing them in this PR rather than deferring them — the deferral existed only to avoid conflicting with this branch's rewrite of .github/ISSUE_TEMPLATE/, which does not apply if the form ships here. The form is an Enhancement with different prompts rather than a sixth type: it emits the four headings type:enhancement already requires, so the CI validator needs no change, and access/blast-radius are carried as extra sections. Those two fields are the point of the form — a sandbox can only be scoped to a purpose someone wrote down. Signed-off-by: tucktuck101 <jeffreytaylorrobertson@gmail.com>
Two conventions that were previously unstated, and were already drifting: - A PRD's open questions are raised as ADR issues with the PRD as parent, using --parent exactly as a Task does. Previously ADRs sat 'outside the hierarchy entirely', so an open question could stay in a PRD body indefinitely and get decided by accident inside whichever task hit it first. - Closing an ADR issue means writing launchpad/decisions/ADR-XXXX-slug.md in the same PR. This was already stated once under 'the one rule' but was not among the numbered type rules, where it is actually looked up. Observed drift this fixes: four of prd-02's (#4) seven open questions are already answered inside its sub-issues #6, #7 and #11 -- repo location, publication target, provenance schema and staleness detection -- with no ADR issue raised and no decision document written. The repo-location choice moves the corpus into a separate repository, which is discoverable today only by reading a task body. Signed-off-by: tucktuck101 <jeffreytaylorrobertson@gmail.com>
Review — issue and PR conventions for human and agent contributorsReviewed the full diff (18 files, +1289/−47) and verified several claims against the live repo. Verdict: approve after fixing the two bugs in §1 and §2. Everything else can follow up. Findings are in three piles, because only two are bugs I'd block on:
OverviewThis is a well-built process change. The design reasoning is unusually strong — the three rejected alternatives (moving the app into Independently verified as green:
1. BUG — the Bug form's validation cannot fail
- type: textarea
id: observed
value: |
```
# paste raw output here
```So a Bug submitted with nothing typed at all passes:
That last check exists specifically to force raw output, and the template hands it a free pass. Same pattern on Suggested fix: move placeholder text from Why this wasn't caught: the crafted bad bodies used for local testing were hand-written rather than generated from the templates' own defaults. Submitting an unmodified form is the missing test case, and it would have surfaced this immediately. 2. BUG — the CI strips a label the docs mandate
But gh issue edit "$NUMBER" --repo "$REPO" --remove-label needs-triage 2>/dev/null || trueunconditionally, on every pass. A Task filed through the form will pass — so the label is stripped seconds after it is applied, and the "a human should look at this" signal disappears. Two files in this PR contradict each other, and the CI wins. Suggested fix: only remove 3. GAP — the PR check enforces about half the agent templateThe summary says the two checks make "structure hold for humans and agents alike." The issue check validates every required heading per type. The PR check validates only: non-empty body, closing keyword, Not checked at all, despite being required by
4. GAP —
|
…issues Four of prd-02's (#4) seven open questions were answered inside its sub-issues months before any ADR issue existed for them, so the decisions were discoverable only by reading a task body. This writes them down. ADR-0001 handbook repo location + publication target (decided in #6) Closes #54 ADR-0002 source repository scope (decided in #10) Closes #55 ADR-0003 page provenance contract (decided in #7) Closes #56 ADR-0004 staleness detection mechanism (decided in #11) Closes #57 These ratify decisions humans already made; nothing here is a new choice. Each record names where the decision was actually taken. The remaining ADR issues stay open with their outcome blank. Also adds launchpad/decisions/README.md, since the folder had no stated format or numbering rule and the first four records would otherwise set it by accident. Does not touch .github/ISSUE_TEMPLATE/ or any file in PR #14, so the two do not conflict. Signed-off-by: tucktuck101 <jeffreytaylorrobertson@gmail.com>
Summary
Replaces the inherited
block/buzzissue templates with five forms matched to how thisfork actually works, and adds a PR path for agent-authored changes that records
provenance. Two CI checks validate issue and PR bodies identically whether they came from
the web UI or the CLI, so structure holds for humans and agents alike.
Related issue
Closes #13
Issue type
PRD
Agent provenance
Objective
A complete issue-and-PR convention for
launchpad-26/buzzthat both humans and AIagents can follow, with CI enforcing the contract on both paths.
Impacted components
Approach and rejected alternatives
Rejected — moving the app into
buzz-app/. Upstream is ~3,800 files. Git carriesupstream edits through a rename, but every upstream-added file lands back at the old
root, so every sync needs manual repair. It also breaks root-anchored tooling and strands
~630 existing fork branches. Chose an additive
launchpad/namespace instead.Rejected — a PR template per issue type. That needs a
.github/PULL_REQUEST_TEMPLATE/directory, which GitHub gives no chooser for; ordinary PRs would get no template at all.
Split by author instead — agent PRs need provenance, human PRs don't — with the agent
template living outside
.github/entirely so nothing is lost on the human path.Rejected — seven issue types (mirroring
tucktuck101/agent-trust-platform). Its datashows 2 of 7 templates unused across 105 issues, and 16 issues carrying multiple type
labels. Cut to five, with Epic mapped to a GitHub Milestone.
Full reasoning, with the evidence tables, is in #13.
Verification
Command run:
Raw output:
Both CI validators were then exercised against crafted good and bad bodies:
Full local pre-push gate also ran green on this exact tree:
Not verified
GitHub's issue-form schema is stricter than generic YAML. If a field type or attribute
is wrong, GitHub reports it only after merge to the default branch.
run locally; the surrounding Actions YAML, event triggers and permissions are untested.
launchpad-pr-checkshould run on this PR — that is its first real execution.mobile-testhook result unknown. Its output was truncated by my own command; notconfirmed green.
branch-skewguard was bypassed with--no-verify. See Escalations.instruction blocks are unproven against anything but this session.
Security implications
Net reduction. The issue chooser now routes vulnerabilities to a private security
advisory, and the Bug form requires an explicit non-vulnerability assertion — previously
blank issues were enabled with no routing at all. The agent PR template requires
confirming no secrets or hostnames were added to tracked files, which matters because this
repository is public.
Both workflows declare
contents: read; the issue check additionally needsissues: writeto apply
needs-triageand comment. Neither reads secrets, so fork PRs gain nothing bytriggering them.
Out of scope and still unresolved: the repository's Actions permissions, fork-PR approval
policy, and self-hosted runner inventory cannot be read without admin. That needs
verifying before prd-03 wires deployment credentials.
Escalations
scripts/check-branch-skew.shblocked this push and was bypassed with--no-verify. The script hardcodesorigin/mainas the PR base. In this forkoriginis a personal fork and the PR base islaunchpad— against its real base thebranch is 0 behind, 2 ahead. The flagged overlap was
AGENTS.md, where upstreamchanged 9 lines mid-file and this branch appends 22 at the end. A human decided the
bypass; it was not an agent's call. Follow-up filed separately.
Two upstream-owned files are modified, knowingly.
.github/ISSUE_TEMPLATE/and onesection of
.github/PULL_REQUEST_TEMPLATE.md. These will conflict on future upstreammerges. Documented in
launchpad/AGENTS.md§3.Labels were created before this PR was approved (
sync-labels.sh, 14 labels).Label creation is a direct write with no PR path, and prd-04 — issue and PR conventions ready for agentic automation #13 needed
type:prdto exist.If this PR is rejected the labels are orphaned and need removing by hand.