Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
115 changes: 0 additions & 115 deletions .agents/review/decisions.md

This file was deleted.

2 changes: 2 additions & 0 deletions .agents/skills/ci-pipelines/SKILL.md
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,8 @@ description: Use when changing continuous integration, GitHub Actions workflows,

# CI pipelines

Canonical workflows use maintained major-version tags for external actions.

## Billing shapes the job graph

- Jobs bill per minute, rounded up, minimum one. Fold sub-minute checks into an existing job on the same trust level instead of giving them their own.
Expand Down
6 changes: 3 additions & 3 deletions .agents/skills/review-fix/SKILL.md
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ An explicit user choice wins. Otherwise use Claude Opus 5 at high effort in Clau

## Scope

Read `.agents/review/decisions.md` when present. Post one scope comment with the intent, threat model, out-of-scope work, and selected lenses; its timestamp starts the cycle. Ask about splitting only when the PR contains independent product outcomes.
Post one scope comment with the intent, threat model, out-of-scope work, and selected lenses; its timestamp starts the cycle. Ask about splitting only when the PR contains independent product outcomes.

Choose distinct lenses:

Expand All @@ -37,14 +37,14 @@ Reuse a successful equivalent exact-head gate. Otherwise run the repository gate

For every required review or verification lens, spawn a separate read-only subagent using the [review skill](../review/SKILL.md). `review-pass` is an optional workflow helper. If delegation is unavailable, report incomplete coverage and stop.

Review the PR base → initial head with the scope, gate result, decisions registry, lenses, and any model override. Retry a skipped lens once, then stop if coverage is still incomplete. Merge duplicate findings while preserving every reporting lens, and assign one decision:
Review the PR base → initial head with the scope, gate result, lenses, and any model override. Retry a skipped lens once, then stop if coverage is still incomplete. Merge duplicate findings while preserving every reporting lens, and assign one decision:

- `block`: demonstrated, in scope, material under the threat model, and worth stopping the merge;
- `defer`: real but outside this PR or below the merge bar;
- `discard`: refuted, speculative, already accepted, or not worth scheduling;
- `ask`: a costly, durable product or architecture choice remains unresolved.

Do not ask about inferable implementation details, naming, local refactors, test shape, or other reversible choices. Choose the smallest sound option and record durable assumptions. Collect every unavoidable `ask` into one decision brief with the options, consequences, and a recommendation.
Do not ask about inferable implementation details, naming, local refactors, test shape, or other reversible choices. Choose the smallest sound option. Collect every unavoidable `ask` into one decision brief with the options, consequences, and a recommendation.

## Fix

Expand Down
3 changes: 1 addition & 2 deletions .agents/skills/review/SKILL.md
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,6 @@ Review the requested change without editing it. The goal is a trustworthy merge
- Ground findings in inspected code, repository contracts, tests, command output, or documented framework behavior.
- Show a reachable failure scenario. Suspicious patterns or theoretical possibilities alone are not findings.
- Judge materiality against the supplied intent and threat model. Repository-rule drift is evidence, not automatically a blocker.
- Read `.agents/review/decisions.md` when present and do not reopen a still-valid decision without new evidence.
- If an exact-head gate result was supplied, do not rerun the full gate. Use focused probes only. Instrumented probes belong in a disposable worktree; never modify the shared checkout.

Enumerate the surfaces owned by the lens rather than sampling them. Read other files when they prove an in-lens finding, but do not duplicate another lens’s charter.
Expand All @@ -24,7 +23,7 @@ Return exactly one decision per finding; do not add a separate severity:

- **block** — demonstrated, in intent, material under the threat model, and serious enough to stop this merge.
- **defer** — real and actionable, but outside the PR or below the merge bar.
- **discard** — refuted, speculative, already accepted, or too low-value to schedule. Report only durable discards worth recording.
- **discard** — refuted, speculative, already accepted, or too low-value to schedule.
- **ask** — the repository cannot choose between materially different durable product or architecture outcomes, and choosing wrongly would be expensive to reverse.

Do not ask about inferable implementation details, reversible choices, local refactors, naming, or test shape. Prefer the smallest in-scope correction and defer optional machinery.
Expand Down
2 changes: 2 additions & 0 deletions .agents/skills/standards-sync/references/github.md
Original file line number Diff line number Diff line change
Expand Up @@ -20,3 +20,5 @@ bun standards creds add github --dest ci:ci.broker_app
```

The workflow mints two short-lived tokens for the current repository: a branch writer for contents and workflows, and a pull-request opener. Neither token enters the sync process, and there is no fallback credential. A repository with `autoSync: false` does not need these permissions until automatic sync is re-enabled.

Canonical sync branches contain trusted upstream code and may run consumer CI before the generated PR is reviewed.
21 changes: 0 additions & 21 deletions .agents/skills/unslop/LICENSE.txt

This file was deleted.

80 changes: 0 additions & 80 deletions .agents/skills/unslop/SKILL.md

This file was deleted.

4 changes: 0 additions & 4 deletions .agents/skills/unslop/agents/openai.yaml

This file was deleted.

5 changes: 5 additions & 0 deletions AGENTS.md
Original file line number Diff line number Diff line change
Expand Up @@ -36,9 +36,14 @@ Do not weaken quality gates to make a change pass. Explain inline suppressions.

## Writing style

- Write plainly and directly. Avoid mannered prose, decorative metaphors, and stock phrases. Prefer literal wording and sentences that are easy to follow.
- Use sentence case for reader-facing text — UI copy, labels, command-style actions, Markdown headings — preserving proper nouns, acronyms, filenames, package names, and domain terms.
- Do not hard-wrap Markdown prose; keep each paragraph or list item on one logical line.

## Documentation

Write documentation when it helps someone use, operate, or change the project. Keep it concise and current; do not narrate the implementation or repeat what the code makes clear. Put local rationale near the code and change history in PRs.

## Project-specific rules

This is a canonical file from the standards repository. Project-specific rules belong in `AGENTS.local.md`.
Expand Down
1 change: 0 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -72,7 +72,6 @@ Read [Sync and ownership](docs/sync-and-ownership.md) before changing a path who
| [Operations](docs/operations.md) | CodeBuild, local PostgreSQL, the poller, Nix packaging, and releases. |
| [CLI reference](packages/standards-cli/README.md) | Commands, configuration, and focused examples. |
| [Agent contract](AGENTS.md) | Rules enforced in every consumer. |
| [Review decisions](.agents/review/decisions.md) | Durable architecture and trust decisions. |
| [Infrastructure skill](.agents/skills/declarative-infra/SKILL.md) | NixOS hosts, OpenTofu, secrets, previews, and image promotion. |

## Packages
Expand Down
2 changes: 2 additions & 0 deletions packages/standards-cli/src/creds-cloudflare.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,8 @@
// itself, lists and mints scoped tokens, and revokes them. Token values
// returned by create flow only into SOPS writers,
// never stdout.
// User-owned tokens are intentionally outside this API and the bootstrap
// credential's authority; they must be managed separately in Cloudflare.

import {
type CfResult,
Expand Down
2 changes: 2 additions & 0 deletions packages/standards-cli/src/creds-github-apps.ts
Original file line number Diff line number Diff line change
Expand Up @@ -57,6 +57,8 @@ export const loadOwnedGithubStore = async (
return { ok: true, value: migrated };
};

// Private Apps belong to one owner. Selecting by repository owner keeps each
// owner's credentials separate; installation access is verified before export.
export const selectGithubAppForRepo = (
apps: ReadonlyArray<GithubBrokerApp>,
repo: string,
Expand Down
2 changes: 2 additions & 0 deletions packages/standards-cli/src/creds-plan.ts
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,8 @@
// tokens it minted for another repository, are reported
// (creds-plan-unmanaged.ts) but never mutated. Execution lives in
// creds-plan-run.ts.
// Live policy is preserved, not compared with a separate desired-policy manifest.
// Adding policy-drift enforcement would require a new source of truth.

import { cloudflareExpiresOn } from './creds-cloudflare-expiry';
import { groupByIntersectingFootprint } from './creds-plan-groups';
Expand Down
3 changes: 3 additions & 0 deletions packages/standards-cli/src/creds-store.ts
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,9 @@ export type BrokerStore = {
readonly cloudflare: ReadonlyArray<CloudflareBrokerAccount>;
};
export const EMPTY_BROKER_STORE: BrokerStore = { github: [], cloudflare: [] };
// This machine-global store trusts the local account, like its age private key.
// Encrypting it with a colocated key would not protect against that account.
// Repository secrets still belong in SOPS; this store stays outside repositories.
const OWNER_ONLY_FILE_MODE = 0o600;
const OWNER_ONLY_DIR_MODE = 0o700;
const FILE_MODE_MODULUS = 0o1000;
Expand Down
2 changes: 2 additions & 0 deletions packages/standards-cli/src/dev-env-brokered-resolve.ts
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,8 @@ export type ResolvedDevEnv = {
readonly problems: ReadonlyArray<string>;
};

// Each variable independently selects a complete pair and then one part.
// Variable names and neighboring references do not imply a shared credential.
const lookupReference = (
document: unknown,
reference: BrokeredS3Reference,
Expand Down
2 changes: 2 additions & 0 deletions packages/standards-cli/src/github-graphql.ts
Original file line number Diff line number Diff line change
Expand Up @@ -120,6 +120,8 @@ const BYPASS_ACTOR_PROBE = 1;
// `totalCount` means the connection is being filtered rather than merely
// redacted, so it supplies no count; a null *element* is the documented
// identity-withholding shape, so only the length is checked.
// Probes with restricted tokens confirmed that hidden actors still count:
// https://github.com/davidvornholt/standards/pull/176
const countedRuleset = (node: unknown): readonly [number, number] | null => {
if (!isRecord(node) || typeof node.databaseId !== 'number') {
return null;
Expand Down
3 changes: 3 additions & 0 deletions packages/standards-cli/src/poller-codex.ts
Original file line number Diff line number Diff line change
Expand Up @@ -163,6 +163,9 @@ export const runCodex = async (
{
detached: true,
stdio: ['ignore', 'ignore', 'pipe'],
// Approved runs share the host service identity and its GitHub token.
// Approval and write revalidation constrain the workflow; they do not
// isolate credentials. This assumes trusted, maintainer-approved work.
env: { ...process.env },
},
);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -72,6 +72,8 @@ const writerConsumerName = 'Commit and push mirror changes';
const prConsumerName = 'Open a pull request if the mirror changed';
export const syncPolicyRefName = ['SYNC', 'POLICY', 'REF'].join('_');

// Any new field can change execution or failure semantics. Even safe metadata
// additions require an explicit contract update so reviewers see the change.
const assertExactStep = (
workflow: ParsedWorkflow,
name: string,
Expand Down
1 change: 0 additions & 1 deletion sync-standards.json
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,6 @@
".agents/skills/secrets-and-config",
".agents/skills/screenshots-in-prs",
".agents/skills/standards-sync",
".agents/skills/unslop",
".agents/skills/ux-ui",
".claude/skills",
".claude/agents/reviewer.md",
Expand Down
7 changes: 0 additions & 7 deletions template/.agents/review/decisions.md

This file was deleted.

1 change: 0 additions & 1 deletion turbo.json
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,6 @@
"$TURBO_ROOT$/.agents/skills/secrets-and-config/**",
"$TURBO_ROOT$/.agents/skills/screenshots-in-prs/**",
"$TURBO_ROOT$/.agents/skills/standards-sync/**",
"$TURBO_ROOT$/.agents/skills/unslop/**",
"$TURBO_ROOT$/.agents/skills/ux-ui/**",
"$TURBO_ROOT$/.claude/skills/**",
"$TURBO_ROOT$/.claude/agents/reviewer.md",
Expand Down