UNPKG

paqad-ai

Version:

Spec-driven development framework — AI agents that think before they type

45 lines (39 loc) • 3.56 kB
# History signals verified: 2026-11-03 `propose.mjs` reads these. A signal the account can't see goes into `unknown` and is never reported as "none". | Signal | Read from | When it can't be read | | ------------------------------------ | ------------------------------------------------------------- | -------------------------------------------- | | Remote and host | `git remote get-url origin` | no remote: `mode: new-project` | | Default branch | `git symbolic-ref --short refs/remotes/origin/HEAD` | falls back to `main` | | Branch names | `git branch -r` | none | | Main-line commit subjects and bodies | `git log --first-parent -n 200 origin/HEAD` | none | | PR history | `gh pr list --state all --limit 200` | `unknown` line, PR-based values skipped | | Allowed merge methods | `gh repo view` | `unknown` line | | Rules on the base branch | `gh api repos/{owner}/{repo}/rules/branches/{base}` | 403 or 404: `unknown` line, never "no rules" | | CI target branches | `pull_request:` `branches:` in `.github/workflows/*.yml` | none | | Code owners | `.github/CODEOWNERS`, `CODEOWNERS`, `docs/CODEOWNERS` | none | | PR template | `.github/pull_request_template.md` and the other usual places | `.paqad/templates/pr-body.md` | ## Thresholds - **Decide or ask.** One option with 70% or more of the evidence is decided without asking. Otherwise it becomes a `choice` with the top three options, the most common recommended. - **New project.** No remote, fewer than 20 main-line commits, or no branches except the base. - **Commit style** comes from main-line subjects and PR titles only. Branch-only commits are ignored, because with squash merges the message that lands is written at merge time. - **Base branch.** `release/*` when release branches get 50% or more of typed PRs; otherwise the most common PR base; without `gh`, the remote default branch. - **Extra PR targets.** A second base that got the same head branch in 30% or more of cases becomes an `also_open_against` choice, recommended "no". - **Branch types.** A first path segment used by 5% or more of the branches (leaving out bases, `HEAD`, `release`, `dependabot`, `renovate` and `revert-*`) becomes a type. `feature` maps to `feat`; `bugfix`, `bug`, `fix` and `hotfix` map to `fix`. - **Ticket sources.** A key prefix with 5 or more hits becomes a source (Jira or Linear is asked). 5 or more ServiceNow keys make a `servicenow` source; 5 or more subjects naming a GitHub issue make a `github-issues` source. - **Labels.** 60% or more of a type's PRs puts a label on that type; 80% or more of all PRs puts it on every PR. - **Draft.** 50% or more drafts sets `draft: true`. - **Sign-off.** 50% or more `Signed-off-by:` bodies sets `sign_off: true`. - **Enforcement** always starts at `agents: block` and `people: warn`.