diff --git a/.agents/review/decisions.md b/.agents/review/decisions.md deleted file mode 100644 index 44cbe9a..0000000 --- a/.agents/review/decisions.md +++ /dev/null @@ -1,19 +0,0 @@ -# Review decisions registry - -Durable, already-litigated review decisions. How reviewers must treat entries and when orchestrators append them is defined in the `review` and `review-fix` skills. - -Entry format: heading `### D-NNN (date, status) — title`, where status is `decided` or `open`, followed by the decision and its rationale in prose. Entries are never edited silently; superseding an entry means a new entry that references the old id. - -## Entries - -### D-001 (2026-09-09, decided) — Authenticated production without preview sites - -The user chose to omit PR preview sites for now. PaperSync serves private homework and has GitHub account allowlisting in production. Browser checks and container smoke checks run in CI instead. Revisit isolated, authenticated previews when they provide enough value to justify their infrastructure and OAuth configuration. - -### D-002 (2026-09-09, decided) — Super Productivity plugin import - -The user approved an installable Super Productivity plugin that imports approved homework from PaperSync. Connect one Super Productivity installation; SuperSync distributes its tasks to the other devices. Matching repeated scans use sheet week, written day, subject, and normalized text. Due date and completion corrections update that identity; changed wording is a new entry and remains reviewable before approval. - -### D-003 (2026-09-09, decided) — Plugin destination scope - -This deployment and its bundled plugin target `papersync.vornholt.online`, the address requested by the user. A self-hosted installation at another address requires rebuilding the plugin with the matching request URL and manifest host permission. Configurable plugin destinations are deferred; documentation must state this limitation rather than imply that the distributed ZIP connects to arbitrary deployments. diff --git a/.agents/skills/ci-pipelines/SKILL.md b/.agents/skills/ci-pipelines/SKILL.md index 87fbc40..e04e038 100644 --- a/.agents/skills/ci-pipelines/SKILL.md +++ b/.agents/skills/ci-pipelines/SKILL.md @@ -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. diff --git a/.agents/skills/declarative-infra/references/image-promotion-contracts.md b/.agents/skills/declarative-infra/references/image-promotion-contracts.md index 824c026..a1a20e1 100644 --- a/.agents/skills/declarative-infra/references/image-promotion-contracts.md +++ b/.agents/skills/declarative-infra/references/image-promotion-contracts.md @@ -212,8 +212,13 @@ digest_hex=${DIGEST#sha256:} branch="image-bump/${APP}/${SOURCE_SHA:0:12}-${digest_hex:0:12}" prs=$(gh pr list --repo example/infra --state all --search "\"$marker\" in:body" --json number,body,state) pr=$(jq -er --arg marker "$marker" '[.[] | select(.state == "MERGED" and (.body | contains($marker)))] | if length == 1 then .[0].number else error("expected one merged promotion PR") end' <<<"$prs") -view=$(gh pr view "$pr" --repo example/infra --json state,mergeCommit,author,headRefName,headRepository,files,statusCheckRollup) -merge_sha=$(jq -er --arg branch "$branch" 'if .state == "MERGED" and .author.login == "promotion-bot[bot]" and .headRefName == $branch and .headRepository.nameWithOwner == "example/infra" and [.files[].path] == ["infra/images.json"] and ([.statusCheckRollup[] | select(.name == "trusted-promotion-provenance" and .conclusion == "SUCCESS")] | length) == 1 then .mergeCommit.oid else error("merged promotion PR is not trusted") end' <<<"$view") +view=$(gh pr view "$pr" --repo example/infra --json state,mergeCommit,author,headRefName,headRepository,headRefOid,files) +merge_sha=$(jq -er --arg branch "$branch" 'if .state == "MERGED" and .author.login == "promotion-bot[bot]" and .headRefName == $branch and .headRepository.nameWithOwner == "example/infra" and [.files[].path] == ["infra/images.json"] then .mergeCommit.oid else error("merged promotion PR is not trusted") end' <<<"$view") +head=$(jq -er '.headRefOid | select(test("^[0-9a-f]{40}$"))' <<<"$view") +checks=$(gh api "repos/example/infra/commits/$head/check-runs?check_name=trusted-promotion-provenance&filter=latest&per_page=100" --paginate --slurp) +jq -e --arg head "$head" '[.[].check_runs[]] | length == 1 and all(.[]; + .name == "trusted-promotion-provenance" and .head_sha == $head and + .app.slug == "github-actions" and .status == "completed" and .conclusion == "success")' <<<"$checks" >/dev/null encoded=$(gh api "repos/example/infra/contents/infra/images.json?ref=$merge_sha") images=$(jq -er '.content' <<<"$encoded" | base64 --decode) jq -er --arg app "$APP" --arg digest "$DIGEST" --arg sha "$SOURCE_SHA" 'select(.[$app].promotionEnabled == true and .[$app].digest == $digest and .[$app].promotedSourceSha == $sha) | true' <<<"$images" >/dev/null diff --git a/.agents/skills/declarative-infra/references/image-promotion.md b/.agents/skills/declarative-infra/references/image-promotion.md index a365820..936e85c 100644 --- a/.agents/skills/declarative-infra/references/image-promotion.md +++ b/.agents/skills/declarative-infra/references/image-promotion.md @@ -128,6 +128,8 @@ The deploy workflow serializes production without cancellation. Its deploy job d Completion filters merged PRs before uniqueness, then authenticates the App bot, canonical same-repository branch, `images.json`-only file set, successful trusted provenance check, and exact resulting pin at the merge SHA. Open and closed marker copies are ignored; forged or multiple merged candidates fail closed. The exact merge-SHA deploy and its one successful deploy job are required. +Read provenance through the Checks API for the exact PR head SHA, filter by `trusted-promotion-provenance` and `latest`, paginate, and require exactly one completed, successful GitHub Actions check. A missing, duplicate, failed, pending, wrong-head, or foreign-App check fails closed. The completion reader needs Actions read, Contents read, Pull requests read and Checks read; a reporter that publishes the completion check needs Checks write. Do not request `statusCheckRollup`: it also fetches commit statuses and can fail without `statuses: read`, even when the needed check is readable. Completion does not need access to those unrelated statuses. + Announcing or opening a promotion proposes a release; it does not authorize deployment. An open or deliberately deferred PR is informational and must not fail a freshness check because a newer image exists. Record the pending proposal and its evidence without treating it as completed deployment. Promotion is push-based. Verify the exact approved images and service health during deployment and report completion on the promotion PR. Do not add a scheduled image drift detector, periodic running-image comparisons, publication-age failures, or a promotion latency field. There is no periodic image recheck after successful completion. diff --git a/.agents/skills/review-fix/SKILL.md b/.agents/skills/review-fix/SKILL.md index 8ca3e79..308d19c 100644 --- a/.agents/skills/review-fix/SKILL.md +++ b/.agents/skills/review-fix/SKILL.md @@ -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: @@ -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 diff --git a/.agents/skills/review/SKILL.md b/.agents/skills/review/SKILL.md index 2d7db3f..9ff4709 100644 --- a/.agents/skills/review/SKILL.md +++ b/.agents/skills/review/SKILL.md @@ -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. @@ -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. diff --git a/.agents/skills/standards-sync/references/github.md b/.agents/skills/standards-sync/references/github.md index 770df50..829433a 100644 --- a/.agents/skills/standards-sync/references/github.md +++ b/.agents/skills/standards-sync/references/github.md @@ -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. diff --git a/.agents/skills/unslop/LICENSE.txt b/.agents/skills/unslop/LICENSE.txt deleted file mode 100644 index 6b54002..0000000 --- a/.agents/skills/unslop/LICENSE.txt +++ /dev/null @@ -1,21 +0,0 @@ -MIT License - -Copyright (c) 2026 Lauren Tan - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. diff --git a/.agents/skills/unslop/SKILL.md b/.agents/skills/unslop/SKILL.md deleted file mode 100644 index 2a93c06..0000000 --- a/.agents/skills/unslop/SKILL.md +++ /dev/null @@ -1,80 +0,0 @@ ---- -name: unslop -description: Cut AI tells from any writing. Must always apply. ---- - -# Unslop - -Edit text to remove AI patterns and add human voice. - -## Process - -1. Scan for the patterns below. -2. Rewrite. Preserve meaning, match intended tone. -3. Add soul (see next section). -4. Self-audit: "What makes this obviously AI generated?" Fix remaining tells. - -## Adding soul - -Removing patterns is half the job. Sterile, voiceless writing is just as obvious. - -- **Have opinions.** React to facts instead of neutrally listing pros and cons. -- **Vary rhythm.** Short sentences. Then longer ones that take their time. Mix it up. -- **Acknowledge complexity.** "Impressive but also kind of unsettling" beats "impressive." -- **Use "I" when it fits.** First person isn't unprofessional. -- **Let some mess in.** Perfect structure looks machine-made. -- **Be specific.** Not "this is concerning" but "there's something unsettling about agents churning away at 3am." - -## Patterns to detect and fix - -### Content - -1. **Puffery.** "pivotal moment", "testament to", "evolving landscape", "setting the stage for", "indelible mark", "deeply rooted". Cut puffery, state what happened. -2. **Name-dropping.** Listing media outlets without context. Pick one, say what was said. -3. **Superficial -ing phrases.** "highlighting...", "ensuring...", "reflecting...", "showcasing...", "fostering...". Delete or expand with real sources. -4. **Promotional language.** "nestled", "vibrant", "breathtaking", "groundbreaking", "renowned", "stunning", "must-visit". Use neutral descriptions. -5. **Vague attributions.** "Experts believe", "Industry reports suggest", "Some critics argue". Name the source or delete. -6. **Formulaic challenges.** "Despite challenges... continues to thrive." Replace with specific facts. - -### Language - -7. **AI vocabulary.** Additionally, crucial, delve, enduring, enhance, fostering, garner, interplay, intricate, landscape (abstract), pivotal, showcase, tapestry (abstract), testament, underscore, vibrant. Replace with plain words. -8. **Fancy ways to say "is".** "serves as", "stands as", "boasts", "features". Just say "is" or "has". -9. **"Not just X, but Y."** State the point directly instead. -10. **Rule of three.** Forcing ideas into groups of three. Use the natural number. -11. **Synonym cycling.** Protagonist, main character, central figure, hero all in one paragraph. Pick one, repeat it. -12. **False ranges.** "from X to Y" where X and Y aren't on a meaningful scale. List topics directly. - -### Style - -13. **Em dash overuse.** Avoid em dashes entirely. Use periods or commas only (no parentheses, no en dashes, no hyphen-as-dash substitutes). Em dashes are an AI tell, and reaching for parentheses instead just trades one tell for another. If a thought needs separation, end the sentence or use a comma. -14. **Colon overuse.** Colons are fine before a list or example. Not as mid-sentence connectors. "If you're coming from traditional automation: instead of registering event handlers, you describe conditions" adds nothing with the colon. Rewrite to let the point stand on its own without comparison framing. "Describing when the scheduler should fire works best as plain English." Same meaning, no crutch punctuation. -15. **Boldface overuse.** Don't bold every proper noun or acronym. -16. **Inline-header lists.** The tell is a bold label and colon that restates the line: "**Performance:** Performance improved...". Convert those to prose. A bold lead-in that ends in a period, names the item, and is followed by genuinely new detail ("**Schema in TypeScript.** Tables live in one file.") is fine, not a tell. -17. **Title case headings.** Use sentence case. -18. **Decorative emojis.** Remove from headings and bullets. -19. **Curly quotes.** Replace with straight quotes. - -### Communication artifacts - -20. **Chatbot phrases.** "I hope this helps!", "Let me know if...", "Of course!", "Certainly!", "Found the smoking gun!" Remove. -21. **Cutoff disclaimers.** "While specific details are limited..." Find sources or remove. -22. **Sycophantic tone.** "Great question! You're absolutely right!" Respond directly. - -### Filler - -23. **Filler phrases.** "In order to" becomes "To". "Due to the fact that" becomes "Because". "It is important to note that" gets deleted. -24. **Excessive hedging.** "could potentially possibly be argued that it might" becomes "may". -25. **Generic conclusions.** "The future looks bright." State specific plans or facts. - -### Jargon - -26. **Abstract metaphor nouns.** Substrate, wedge, vector, locus, vantage, nexus, primitive (as noun), harness (as metaphor), surface (as in "API surface"), bedrock, scaffolding (as metaphor), modality, paradigm, gold-plating, ratchet (as metaphor), evacuate (for moving code), endgame, north star, flywheel. These read as technical but usually have a plainer concrete word. "Substrate" becomes "base". "Wedge in" becomes "add". "Vector" becomes "way" or "method". "Gold-plating" becomes "more than the job needs". "Ratchet" becomes the mechanism's real name or "a limit that only tightens". "Evacuate" becomes "move out". "Endgame" becomes "the last phase". Pick the concrete word. - -### Plain speech - -27. **Say what it does, not how it feels.** "the database stays close at hand", "SQL you can read", "types that follow your schema" name a feeling. The fix names the mechanism or a number: "`.toSQL()` returns the exact string sent to the database", "a column rename fails the build". Ask what the sentence tells the reader to do or know, then write that. If you can't restate it as a concrete instruction, fact, or number, cut it. One more check: if the sentence could appear unchanged in another project's docs, it says nothing about this one. Cut it. -28. **Shorten or split dense sentences.** If the reader has to backtrack to parse a sentence, break it in two or drop clauses. One idea per sentence. -29. **Active voice.** Prefer it. Catch "is/are/was/were + past participle" and name the actor: "queries are validated" becomes "the compiler validates queries", "the file is parsed by the loader" becomes "the loader parses the file". Passive is fine only when the actor is unknown or genuinely doesn't matter. -30. **Cut adverbs, or use a stronger verb.** "runs quickly" becomes "is fast" or the number. "significantly improves" becomes the measured delta. An adverb propping up a weak verb means the verb is wrong. -31. **Prefer the plain word.** "utilize" becomes "use", "leverage" becomes "use", "facilitate" becomes "help", "numerous" becomes "many", "in the event that" becomes "if". The fancier synonym is rarely clearer. diff --git a/.agents/skills/unslop/agents/openai.yaml b/.agents/skills/unslop/agents/openai.yaml deleted file mode 100644 index 8dc1480..0000000 --- a/.agents/skills/unslop/agents/openai.yaml +++ /dev/null @@ -1,4 +0,0 @@ -interface: - display_name: "Unslop" - short_description: "Remove AI tells and add a natural human voice" - default_prompt: "Use $unslop to rewrite this text without AI tells while preserving its meaning and tone." diff --git a/.github/workflows/standards.yml b/.github/workflows/standards.yml index b88770f..3e7bd53 100644 --- a/.github/workflows/standards.yml +++ b/.github/workflows/standards.yml @@ -269,6 +269,9 @@ jobs: echo "::error::Found a browser a11y suite but no installed playwright binary. Declare @playwright/test in the workspace that owns the suite." exit 1 fi + # Playwright downloads its own Chromium. The runner's unused Chrome APT + # repository can break dependency installation with inconsistent metadata. + sudo rm -f /etc/apt/sources.list.d/google-chrome.list /etc/apt/sources.list.d/google-chrome.sources "$playwright" install --with-deps chromium - name: Check diff --git a/AGENTS.md b/AGENTS.md index 4c049b5..02bec9b 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -1,23 +1,18 @@ # AGENTS.md -This file is the root operating contract for agents in this repository. Keep root instructions for non-negotiable constraints; put specialized workflows in `.agents/skills/*/SKILL.md`. - ## Quality gates -- Never weaken a quality gate (lint, types, tests, a11y) to make a change pass. Fix findings in the code instead of downgrading or disabling rules. -- Every inline suppression needs a reason. Use a per-file override only when a rule genuinely cannot apply, narrowed to that path and rule. +Do not weaken quality gates to make a change pass. Explain inline suppressions. Use configuration exceptions only where a rule cannot apply, scoped to the affected path and rule. ## Change policy - Do not build backwards compatibility by default. Migrate every call site and delete the old shape in the same change. Do not add deprecated aliases, versioned copies, or compatibility-only optional parameters. - Ask before choosing product intent or another costly, durable direction. Assume no background knowledge or familiarity with the code; explain what is at stake, where each option leads, and recommend one before presenting technical evidence. -- Propose before changing CI workflows, quality gates, or canonical synced files, even to unblock a failure. The file class is the trigger. ## Package management - Use Bun only, at the exact version declared by the root `packageManager`. -- Add dependencies with `bun add`; do not manually edit dependency versions into `package.json`. -- Workspaces that rely on Bun runtime or `bun:test` types must declare `@types/bun`, not custom ambient declaration shims. +- Workspaces using Bun runtime or `bun:test` types must declare `@types/bun`. ## Architecture @@ -35,28 +30,22 @@ This file is the root operating contract for agents in this repository. Keep roo ## Effect standards -- Decode untrusted input with Schema before using it. -- Required for async work, concurrency, retries, timeouts, resource acquisition, cancellation, and injected dependencies; at service boundaries the error and requirement channels are the contract. -- Not required for total synchronous logic or UI components, which stay plain and consume Effect at the boundary. -- Never `throw` for expected failures; return typed Effect errors. Recoverable errors are `Data.TaggedError` classes with stable `_tag` values and actionable `message` fields. -- A workspace may opt out wholesale only for a stated architectural reason recorded in `AGENTS.local.md`; do not mix idioms inside one workspace. +- Use Effect extensively where it makes code more robust. Keep simple synchronous logic and UI components plain, integrating Effect at boundaries. +- Service contracts expose typed errors and requirements. Represent expected failures with `Data.TaggedError`, a stable `_tag`, and an actionable `message` instead of throwing. +- Workspace-wide exceptions require an architectural reason in `AGENTS.local.md`; keep each workspace consistent. ## 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. -- Comment only non-obvious intent. - Do not hard-wrap Markdown prose; keep each paragraph or list item on one logical line. -## Definition of done - -1. Test changed behavior and regression-prone states. Do not add tests that only pin trivial copy, static literals, or type-impossible states. -2. Search for stale references to changed concepts, names, paths, configuration, secrets, commands, public APIs, error types, or architectural patterns. Update docs and SOPS secret examples when needed. -3. Run `bun run check:fix` from the repo root for code changes. If it fails, read the full error, fix the root cause, and run it again. +## Documentation -For documentation-only changes, run a narrower verification when the full check would not add useful signal. +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 file is canonical and synced from the standards template — do not edit it locally. Project-specific rules that extend this contract live in `AGENTS.local.md`; add local guidance there instead. +This is a canonical file from the standards repository. Project-specific rules belong in `AGENTS.local.md`. @AGENTS.local.md diff --git a/sync-standards.json b/sync-standards.json index 1659a29..86a6df3 100644 --- a/sync-standards.json +++ b/sync-standards.json @@ -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", diff --git a/sync-standards.lock b/sync-standards.lock index 8736973..7e9a8f1 100644 --- a/sync-standards.lock +++ b/sync-standards.lock @@ -1,15 +1,15 @@ { "upstream": "github:davidvornholt/standards", - "sha": "091ad3ea5955a0e486100d271f2e41cd20f8f508", + "sha": "343a9d3b795c204bda384e16d6c731051f9851c2", "files": { - ".agents/skills/ci-pipelines/SKILL.md": "87728fdc98f9ac95df243ef4c1d44d616cc0440e2ae384da28dda83d627e00a0", + ".agents/skills/ci-pipelines/SKILL.md": "2b9acdddb838273af146f1aaaecaa0edbb9ca460da8bb32535fe06a74e7e2cba", ".agents/skills/database/agents/openai.yaml": "4c9f47df24219d5b195c88eef374431f64b453ed1ba057f50d4c11e4549343c1", ".agents/skills/database/SKILL.md": "cc89d5118e76537321ec3f7da1ef46fcbc7606ab6b44a630ef80373e6f28f988", ".agents/skills/declarative-infra/agents/openai.yaml": "d8631747495397fa341d956c20d7b3155b68f8f5a86b9d8015e654cb61e3d649", ".agents/skills/declarative-infra/references/bootstrap.md": "a7e6c96de118870f43059ab745b72fcd9c387bb5cc2e25c65393f95442303f01", - ".agents/skills/declarative-infra/references/image-promotion-contracts.md": "5efe46f9d282a5ad887b6cdd9394762e0c163e6e0a8a34d6f9a6d8ab70ccccf4", + ".agents/skills/declarative-infra/references/image-promotion-contracts.md": "2cb57660e0ee45ec9b2bb48add089b960d986e174a0763ee74a5223e9ca0b33c", ".agents/skills/declarative-infra/references/image-promotion-groups.md": "dc6e8f2ad41a47c11f5a2d438c45f4ff3def7a2dca6584a85c958873e91c97f5", - ".agents/skills/declarative-infra/references/image-promotion.md": "f59bfbc7fd3f5518c3da5ba1aabf13031ec2fab6800ce041a3e0ec882c0b0ba5", + ".agents/skills/declarative-infra/references/image-promotion.md": "d5796d16e668c8e335b8b824a99adde3131c138cb32236b33bb5f055ef59a16b", ".agents/skills/declarative-infra/references/pr-previews.md": "6553e36e29976f736570661b757b23c246f45ee01ccafba6ad8ef35c2bd47a89", ".agents/skills/declarative-infra/references/secrets.md": "0c7f0a6c2a4243fc58a4568d426071720a58ae07f29cada1e63ac49b5026ef3f", ".agents/skills/declarative-infra/references/vendor-image-promotion.md": "8ab7ab748cd428c30ab79c1d46489748c96768bb32ab7d88f3bd1ba8ff9ad683", @@ -19,17 +19,14 @@ ".agents/skills/issues/SKILL.md": "c0e3304564a7b5d532bc69995ae86f0e45d3fdaa1bdc1b383fcf4dded7ac62d9", ".agents/skills/nextjs/SKILL.md": "f9cd2a37e05246f3a371efed3a71380c3b83f9c0ee32371d57ac0f4f260cd005", ".agents/skills/prs/SKILL.md": "03eadfac76d5b1e92a576e41e18d0eb64c3c98da6003f79dcda6fe0d069acddc", - ".agents/skills/review-fix/SKILL.md": "0ed723a8d85ec0d8d320f1ccc58bee3afd25d7ceff0fc56fed482336034218c7", - ".agents/skills/review/SKILL.md": "4ca22b900fda25a9d303b017b0059bcd4a29743f5f50f1c7d5d02f24efc9508c", + ".agents/skills/review-fix/SKILL.md": "2cb0cd4a50b477f13d2a6cf431a8ec7c6c2b5203feb109a8751a9578b53234c6", + ".agents/skills/review/SKILL.md": "5e0f3b899ca68e1b124a0d60fc9b9db0e8262bce9f3c73963494bc556edf835e", ".agents/skills/screenshots-in-prs/agents/openai.yaml": "c412b92301b5d1ab50f62def7b845adf27b7a10bfd9491e270f544a7500661af", ".agents/skills/screenshots-in-prs/SKILL.md": "1b0992cf3d5a7c6a42ddfa66f0f3e7d233e1e94553e12f2e76d1915d7a358f21", ".agents/skills/secrets-and-config/SKILL.md": "5d8d0360ed533f507b441db5d703a091262cee9a3c40b22c6586a00f2e0b3081", ".agents/skills/standards-sync/agents/openai.yaml": "438b20601fde0e393a7d431f9795b6b9ac9bed256386d93ab414de917130c478", - ".agents/skills/standards-sync/references/github.md": "5c764f71d0d691d218f23b33fa5abf4425dd70c6f637837e5d15b05e9c1c04cd", + ".agents/skills/standards-sync/references/github.md": "6ffcffab7014f1b169ae570be1aeed7d588240e65fb85eeed6a658fb649325b3", ".agents/skills/standards-sync/SKILL.md": "b04b516cf2bc333a4636f3d734022b115983b300df2300e962b9f95326711e62", - ".agents/skills/unslop/agents/openai.yaml": "572b933f5f24d650386308d288ec3465a3e26ddcc95ec83e64b13fc46b8ab0ee", - ".agents/skills/unslop/LICENSE.txt": "bc957ca6bee02792566a1a028d105e02e247c6e77cf057061674273da77b200e", - ".agents/skills/unslop/SKILL.md": "181883e539caec8258ec9129e3ba5f133409144a2cbf2aa361158ab94cfc3441", ".agents/skills/ux-ui/SKILL.md": "b6edf5c2ccba99517542a147d38d5b8468fe2faf322ab04683a61fee5030be15", ".claude/agents/reviewer.md": "693e55cbae5f28954cefda6c475e97ddf62f4a58216c3cdf792852104b9e8d76", ".claude/skills": "46e7c0c6e8f3bd5ac2cb8978db058041d60b9034ba2a60c7268777a1438ff117", @@ -40,9 +37,9 @@ ".github/settings.json": "a06b6aa69b27bf1c3b8ebf25d90131a9653f54bc1ec08384a92581627527911c", ".github/workflows/notify-pause.yml": "ea228580fb33b34dd5c41a690f09158807d4486cf0647e557f830486a6d7a0f3", ".github/workflows/standards-sync.yml": "0565e5d9c1dc7f8ac08fe433c8866ea36853a502b7f96c2988361f0e9e6f3ae8", - ".github/workflows/standards.yml": "8c29bc1752697fa4e0f3142091ab85c93127123ce21fb87d49ee23528e20c727", + ".github/workflows/standards.yml": "6aa762b627462fe74999c9a2ef8e89f560c7523cd2a899b9ce6bdaa9eb4c52bc", ".mise/config.toml": "650a919aa3f06f5dfe20a047250c84f7afbfcc8886862c4421c61e815d2fd3f6", - "AGENTS.md": "3feb223fc28578673c7b8fd58a682250dba166a89487dfb389ac58c61387851a", + "AGENTS.md": "8109abf34f1ce0a6175bffb08bf6993a937a4bbdb368812a1d2ac89bf1d2ba3d", "biome.base.jsonc": "abf829f063a411a369d6ab8241b0c1b37149ee7d444cb962e5050abdc1d10c4a", "CLAUDE.md": "336cc4fbf19beaada7ccf9986414fa91851a8d7a07dfb3ccbe800a69eed0ab49", "justfile": "2b52e2a98fbdbe43aef6134e08f1937642f7fb3aa46f195e94fb01793465a45c", @@ -62,6 +59,6 @@ "packages/typescript-config/tanstack-start.json": "8a9102e47af6a72daab2b9f0baaa53dea98da19651fb01002dfe380ab9056cc5", "packages/typescript-config/tsconfig.json": "a7ad2417a335f31b5ce66273618ce64bf365a10a58cb06c598487a68ead7391c", "secrets.just": "c1d4d6557df5d96702179717839cee435b63df4f36fe38581a32a6359c6fd548", - "sync-standards.json": "81de04114ab939898798ee19916e075ce36a8821446dbdd55637de31b6289305" + "sync-standards.json": "8f59d1a02d09b4178882a21a0799c2fdc6d7c0bf2820ef5d09908492971cb1a7" } }