Skip to content

Latest commit

 

History

History
21 lines (11 loc) · 5.35 KB

AGENTS.md

File metadata and controls

21 lines (11 loc) · 5.35 KB

open-pstack

Track all durable work in this repository's GitHub Issues. Do not create a parallel Linear queue. Build a ticket that comes from a waived review finding only after that failure has been seen in real use; until then the ticket records the finding and stays unscheduled. Read UPSTREAM.md before changing upstream-derived content.

Cursor's cursor/plugins/pstack tree is the content upstream. Keep one shared skill tree for Claude Code and Codex; adapt harness primitives at the existing mapping boundaries instead of forking skills or adding compatibility layers. The parent harness resolves provider routing once. Children do not detect or reroute themselves.

Code this repository owns explains itself. UPSTREAM.md, CHANGES.md and NOTICE.md say which files are local adaptations or additions. Upstream-derived files keep upstream's comments, so later syncs stay clean. In owned code, a comment stays only if it is a legal or license header, an explanation of behaviour forced by a vendor, platform or protocol we cannot change, a formatter directive, a doc comment that defines a public API contract, or an issue or RFC link for a constraint that code cannot express. When owned code would surprise a reader, reshape it (rename, extract, add a type) instead of explaining it. Encode a "must not change" constraint as a type, test or lint, then delete its comment. Suppress a lint or type error only when its rule is wrong, pedantic or style-only; otherwise fix the cause. pstack's no-comments skill applies this rule.

Before opening a pull request, run the Bun tests, strict typecheck, static invariants, and plugin validation.

Nothing merges, tags, releases, or rolls out until the exact candidate is installed and the changed behavior passes a live test from the real user surface in every affected harness. Unit tests, validators, source inspection, and self-reports do not satisfy this gate. The live test covers the changed behavior, not every changed file or branch. verify-open-pstack's rule picks the features and never defaults to a full sweep. A representative selection is the default, not a coverage gap to escalate. One stand-in covers a sentence repeated verbatim across many skills: the cheapest skill that carries it, never one that runs several models at high effort, such as interrogate, swarm or arena. The record is the live-gate commit status on that exact head, which links an evidence comment naming the installed version, surface, action, and observed result. Mergify does not queue a pull request without it. A pull request may be ready for review before its live test, but every new head, including a queue-created head, needs its own.

For Open Pstack PRs, use the shared repository-local .claude/skills/verify-open-pstack/ skill (Codex: .agents/skills/verify-open-pstack). Verifier-changing PRs run from a checkout of their reviewed candidate head, with the publisher revision equal to the candidate SHA; all other PRs run from trusted main. Record the publisher revision separately from the candidate SHA. Reuse the operator's existing logins without credential source flags, extra logins, or credential reading/copying. Claude uses normal operator config with session-only --plugin-dir <exact-head checkout>/plugins/pstack --settings '{"enabledPlugins":{"pstack@open-pstack":false}}'. Codex installs the exact-head candidate in a run-owned CODEX_HOME, with auth.json symlinked to the operator's ${CODEX_HOME:-$HOME/.codex}/auth.json; absent file-based auth fails closed. Removing the run home removes only the symlink, never its target. Setup alone snapshots real ${CLAUDE_CONFIG_DIR:-$HOME/.claude}/pstack-models.md and CLAUDE.md, restores their exact bytes or original absence afterwards, and verifies restoration before any publication; restoration failure publishes nothing. Preserve private mode-0700 raw evidence through merge. Publication is one structured evidence comment plus exact-SHA live-gate; no credential parsing, token registration, or exact-secret comment checks. No PR-body, ready/draft, reversal, or compensation writes, publisher-code attestation, or OS filesystem-denial claims are permitted. Builders do not publish the gate, queue, or merge.

Merge policy: land on green

Mergify merges a pull request once verify and live-gate pass on its head and no review thread is unresolved. Unfret reviews every head in parallel and usually publishes its verdict after the merge. .github/workflows/unfret-threads.yml resolves each thread Unfret starts, so only other reviewers' threads hold a merge. A pull request that touches .github/** or the Mergify config also waits for Unfret; the risky-path rule in .mergify.yml lists those paths, and the verifier is not one of them. A pull request that touches .github/** also needs an operator to queue it. A material Unfret finding on a merged head gets a fix-forward pull request: a new, small pull request under the same flow, whose issue carries Introduced by: <PR URL>. Mergify reads no hold label here: to keep a pull request from landing, keep it a draft.

Publish a release only when every pull request merged since the previous release has an Unfret verdict on its merged head and each material finding among them has a merged fix-forward pull request. Then run python3 scripts/release.py publish from a clean checkout of main.

Do not add an implicit runtime timeout or a weaker-model fallback.