Files
Gitea-Tools/skills/llm-project-workflow/templates/start-issue.md
T
sysadminandClaude Opus 4.8 fd2bc018ff fix: guard remote/repo mismatch vs local git remote (Closes #530)
Bare remote=prgs resolved to the hardcoded REMOTES default
Scaled-Tech-Consulting/Timesheet instead of the Gitea-Tools repository
the local git remote points at, causing false 404s and risking mutation
of a different repository.

Add remote_repo_guard.assess_remote_repo_match (pure) + formatter, wired
into gitea_mcp_server._resolve so every read/lookup/mutation tool fails
closed when the MCP-resolved org/repo disagrees with the local git remote
URL and the caller did not pass explicit org/repo. The guard is
best-effort: it skips when both org and repo are explicit, when the local
remote URL is unavailable, and is bypassed under pytest unless
GITEA_FORCE_REMOTE_REPO_CHECK is set.

Add tests/test_remote_repo_guard.py (pure-function cases + server wiring
proving a lookup tool cannot silently query a different repository), and
update author/reviewer/merger handoff templates to require explicit
remote/org/repo.

Closes #530

Co-Authored-By: Claude Opus 4.8 (1M context) <[email protected]>
2026-07-08 15:49:31 -04:00

4.9 KiB

Template: start a new issue

Copy, fill the <...> fields, and paste as the task prompt.

Task: implement <issue title / one-line goal>.

Load canonical workflow: skills/llm-project-workflow/workflows/work-issue.md
Final report schema: skills/llm-project-workflow/schemas/work-issue-final-report.md
Router: skills/llm-project-workflow/SKILL.md (task mode: work-issue)

Rules (llm-project-workflow):
- No repo changes without a tracking issue. If none exists, create one first;
  if it can't be created, stop.
- Work only in an isolated branch worktree under branches/. The main checkout
  is orchestration/status only.
- Do not self-review or self-merge.
- Repository targeting (#530): pass explicit `remote=`, `org=`, and `repo=` on
  every gitea-tools call (e.g. `remote=prgs org=Scaled-Tech-Consulting
  repo=Gitea-Tools`). A bare `remote=prgs` can resolve to the wrong default repo
  and is blocked when it disagrees with the local git remote URL.

Steps:
0. Work Selection Rule — before any claim, branch, or file edits, acquire or
   verify a work lease. Required checks: list open PRs; search PRs linked to
   the target issue; search local/remote branches for the issue number; search
   registered worktrees for the issue branch; check dirty worktrees; check
   active leases or recent handoffs; check whether a merged PR already
   completed the issue. If another session owns the lease, stop (continue only
   as lease owner, review the existing PR, hand off, request takeover after
   expiry, or report "work already claimed"). Never open a parallel branch/PR
   unless the old branch is proven abandoned and takeover is recorded.
0b. Global LLM Worktree Rule — before any mutation, prove and state: project
   root; cwd; current branch; stable branch for the main checkout (master/main/dev);
   session-owned worktree path under branches/. If cwd is not inside branches/,
   STOP (no exceptions — not for docs, tests, small fixes, review fixes, conflicts,
   or cleanup). Main checkout is control-only: read-only inspect, fetch, create
   worktrees, stable-branch update after merge, explicit repair.
1. Identity Checklist: Before claiming work, verify and state:
   - Required identity/profile for this task: author (allowed to push branches / create PRs)
   - Current authenticated identity (from whoami): <username>
   - Target task role: author/work identity
   *If the current identity does not match the required role (or lacks push/PR permissions), STOP before claiming the issue. Relaunch/switch to the correct profile first.*
2. Verify the orchestration checkout is the right repo and clean.
3. git fetch <remote> --prune; confirm local master == <remote>/master (0 0).
4. Create the issue "<title>" (problem, scope, acceptance) and claim it
   (status:in-progress + a "starting work" comment naming the branch).
5. scripts/worktree-start <type>/issue-<n>-<slug>   # type = fix|feat|docs
   cd branches/<type>-issue-<n>-<slug>
6. Implement the narrow scope only; add/update focused tests if behavior changes.
7. Checks: run the test suite, compile/lint changed files, git diff --check,
   and scan the diff for secrets. Record the branch name and HEAD SHA at
   validation time.
8. Branch proof before commit (#177) — prove and state:
   - git branch --show-current == the intended issue branch from step 5
   - the branch is NOT master/main/develop/development/dev
   - branch and HEAD unchanged since step 7 (another session can switch a
     shared checkout mid-session; if drift is detected, STOP and reconcile
     before committing)
   If a commit accidentally lands on a protected branch: do NOT push;
   report the accident and the exact repair steps — never silently continue.
9. Commit (issue-linked message). Branch proof before push (#177): local
   branch == push target branch == intended issue branch, none protected.
   Then push the branch and open a PR to master.
   *The PR body MUST use closing keywords like `Closes #N` or `Fixes #N` to close the issue; do NOT use `Implements #N` or `Refs #N` for closing, as Gitea will not auto-close it.*
   Include an "LLM Handoff Metadata" block in the PR body (attribution only;
   never an eligibility input — docs/llm-agent-sha.md):

   LLM Handoff Metadata:
   - LLM-Agent-SHA: llm-<12 lowercase hex, e.g. llm-8f3a9c2d6b41>
   - LLM-Role: implementer
   - Authenticated-Gitea-User: <whoami result>
   - MCP-Profile: <profile name>
   - Branch: <branch>
   - Worktree: <worktree path>
   - Self-review allowed: no
10. Stop before review/merge — you are the author.

Handoff: end with a section titled exactly `Controller Handoff` per SKILL.md
§K (compact; long form only on the high-risk triggers), including the author
role fields: Selected issue, Claim/comment status, PR number opened, and an
explicit "No review/merge:" confirmation — plus branch, worktree path, files
changed, checks + results. Next line: "Review needed — PR is open". Reports
missing the handoff are downgraded (review_proofs.assess_controller_handoff).