<?xml version="1.0" encoding="UTF-8"?><rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:fh="http://purl.org/syndication/history/1.0"><channel><title>Coding Standards | Blog</title><description>Unified coding standards for every AI coding assistant.</description><link>https://coding-standards.c65llc.com/</link><language>en</language><fh:complete/><atom:link rel="self" href="https://coding-standards.c65llc.com/blog/rss.xml"/><item><title>A Green Pipeline Is Not Proof</title><link>https://coding-standards.c65llc.com/blog/a-green-pipeline-is-not-proof/</link><guid isPermaLink="true">https://coding-standards.c65llc.com/blog/a-green-pipeline-is-not-proof/</guid><pubDate>Sun, 05 Jul 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Alongside the &lt;a href=&quot;https://coding-standards.c65llc.com/blog/standards-1-5-audit-sweep/&quot;&gt;audit sweep&lt;/a&gt;, 1.5 folds a batch of hard-won lessons into the architecture and process standards. They came out of real development on a TypeScript / Rust / Swift local-first monorepo — the kind of project these standards are meant for. Each one is a bug that a reasonable person would not have predicted, and that a green checkmark actively hid.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;a-green-release-that-never-reached-production&quot;&gt;A green release that never reached production&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;Twice, a release was cut, promoted, and reported green — while production never changed.&lt;/p&gt;
&lt;p&gt;The first time, the deploy platform’s build token had been silently rolled. Every in-repo check passed because the failure lived entirely outside the repo: the git host had no idea the token was dead. The second time, a force-push protection on the &lt;code dir=&quot;auto&quot;&gt;release&lt;/code&gt; branch blocked the fast-forward promote. Same symptom: pipeline exits zero, nothing ships.&lt;/p&gt;
&lt;p&gt;The lesson is uncomfortable because it undercuts the thing we most want to believe: that a passing pipeline means the work is done. It doesn’t. A pipeline proves the steps it ran exited zero. It cannot prove that a system it doesn’t control — the deploy platform, its credentials, its branch rules — did what you asked. So &lt;code dir=&quot;auto&quot;&gt;arch-08&lt;/code&gt; and &lt;code dir=&quot;auto&quot;&gt;proc-02&lt;/code&gt; now require the release to &lt;strong&gt;end by fetching the live deployment and asserting the new version is actually serving.&lt;/strong&gt; Necessary is not sufficient; the only proof that production updated is production.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;a-stale-tab-that-bricked-every-new-one&quot;&gt;A stale tab that bricked every new one&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;The local-first app used a shared-worker leader/follower model — one tab owns the database, the rest coordinate through it. After a deploy, a browser tab left open from the &lt;em&gt;previous&lt;/em&gt; version still held the leader lock. Every freshly loaded tab became a follower, probed the incompatible old leader, timed out, and retried the same doomed probe forever. The app was wedged, and nothing in the running code knew how to recover.&lt;/p&gt;
&lt;p&gt;Two fixes, now in &lt;code dir=&quot;auto&quot;&gt;arch-05&lt;/code&gt;. &lt;strong&gt;Version the coordination protocol&lt;/strong&gt;, so a new follower recognizes an incompatible leader and triggers takeover instead of trusting it. And &lt;strong&gt;distinguish transient failure from persistent failure&lt;/strong&gt; — retry is for hiccups; a persistent leader timeout means re-elect, not retry. A follower that retries a permanent condition forever isn’t resilient, it’s stuck.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;drift-a-warm-build-refused-to-show&quot;&gt;Drift a warm build refused to show&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;This one is subtle. The repo commits generated cross-platform artifacts — wasm blobs, UniFFI bindings. To catch drift, CI regenerates them and diffs against what’s committed. Straightforward, except it kept passing while the artifacts were genuinely stale.&lt;/p&gt;
&lt;p&gt;The culprit was the warm build cache. An incremental &lt;code dir=&quot;auto&quot;&gt;target/&lt;/code&gt; directory happily produced the already-committed output from stale intermediate state; the drift only reproduced after a &lt;code dir=&quot;auto&quot;&gt;cargo clean&lt;/code&gt;. So the “regenerate and diff” gate was diffing against a lie. &lt;code dir=&quot;auto&quot;&gt;arch-07&lt;/code&gt; now requires the drift gate to &lt;strong&gt;rebuild from a cold state&lt;/strong&gt; — clean first, or run in a fresh checkout — because a warm target masks exactly the drift the gate exists to catch.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;the-one-that-fails-in-seconds-vs-the-one-that-waits&quot;&gt;The one that fails in seconds vs. the one that waits&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;A smaller, sharper one for &lt;code dir=&quot;auto&quot;&gt;arch-08&lt;/code&gt;: two self-hosted runners sharing a machine produced collisions — duplicate listener stacks fighting over &lt;code dir=&quot;auto&quot;&gt;_diag&lt;/code&gt; paths, package-manager setup dirs racing on big fan-out PRs. The fix is isolation (each runner gets its own &lt;code dir=&quot;auto&quot;&gt;HOME&lt;/code&gt;, tool-cache, and work directory). But the lesson worth writing down was diagnostic: &lt;strong&gt;an offline runner leaves a job queued and waiting; a misconfigured one fails at “Set up job” in seconds.&lt;/strong&gt; Same red check, opposite cause. Knowing which you’re looking at saves an hour of debugging the wrong thing.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;why-these-belong-in-the-standards&quot;&gt;Why these belong in the standards&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;None of these are exotic. They’re the failure modes you only meet once you ship something real across more than one platform — and once you’ve met them, they’re obvious. The point of a standards repo is to let the next team meet them as a paragraph in a document instead of as a production incident.&lt;/p&gt;
&lt;p&gt;That’s the trade every entry in this batch makes: someone already paid for the lesson. The standard is just the receipt, filed where the next person will look.&lt;/p&gt;
</content:encoded></item><item><title>Standards 1.5: The Audit Sweep</title><link>https://coding-standards.c65llc.com/blog/standards-1-5-audit-sweep/</link><guid isPermaLink="true">https://coding-standards.c65llc.com/blog/standards-1-5-audit-sweep/</guid><pubDate>Sun, 05 Jul 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Every few releases we stop shipping features and turn the audit on ourselves. This is one of those releases. We ran a full-repo sweep — scripts, CI, docs, and the standards documents themselves — and it surfaced about thirty distinct issues. 1.5 lands the fixes.&lt;/p&gt;
&lt;p&gt;The interesting part isn’t the count. It’s what the count was made of: not one big broken thing, but thirty small ones, each individually easy to wave off, that together added up to a repo quietly drifting from the standards it publishes.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;the-shape-of-the-drift&quot;&gt;The shape of the drift&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;A few themes ran through almost everything we found.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Portability assumptions that only held on Linux.&lt;/strong&gt; The compliance linter (&lt;code dir=&quot;auto&quot;&gt;lint-standards.sh&lt;/code&gt;) crashed on &lt;code dir=&quot;auto&quot;&gt;--format json&lt;/code&gt; and &lt;code dir=&quot;auto&quot;&gt;--format sarif&lt;/code&gt; when there were zero findings — but only under bash 3.2, which is exactly what ships on macOS, and exactly the path the PR-review action runs. &lt;code dir=&quot;auto&quot;&gt;gh-task&lt;/code&gt; used &lt;code dir=&quot;auto&quot;&gt;grep -oP&lt;/code&gt;, a GNU-only flag that silently returns empty on a Mac. Both had lived in the tree for months because CI runs on Ubuntu and nobody hit them locally until they did.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Docs describing a repo that no longer existed.&lt;/strong&gt; The agent configs still told assistants to “strictly follow” &lt;code dir=&quot;auto&quot;&gt;arch-03&lt;/code&gt; — a standard we had deleted. Go and Elixir shipped as full language standards but were missing from every agent config’s detection map. The README said the standards-review workflow was “installed automatically by &lt;code dir=&quot;auto&quot;&gt;make setup&lt;/code&gt;” when in fact it required an explicit &lt;code dir=&quot;auto&quot;&gt;--workflow&lt;/code&gt; flag. None of these break a build. All of them mislead a reader — or an agent — at exactly the moment they’re trying to trust the document.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Gates that didn’t gate.&lt;/strong&gt; The Definition-of-Done workflow ran linting, coverage, and security scans and then swallowed every failure with &lt;code dir=&quot;auto&quot;&gt;|| true&lt;/code&gt;. It looked like a quality gate and enforced almost nothing. The lifecycle-sync automation queried the first 100 project items and quietly stopped working past that. A “green” pipeline that proves nothing is worse than no pipeline, because it manufactures false confidence.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;A &lt;code dir=&quot;auto&quot;&gt;source&lt;/code&gt; that would run anything.&lt;/strong&gt; &lt;code dir=&quot;auto&quot;&gt;gh-task&lt;/code&gt; read its state file with &lt;code dir=&quot;auto&quot;&gt;source .gh-task-state&lt;/code&gt; — executing whatever a tampered or mis-merged file put there, with your shell’s privileges. That one we treated as a security fix, not a cleanup.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;batching-the-fix&quot;&gt;Batching the fix&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;Thirty issues is too many for one pull request and too many to merge one-at-a-time without losing the plot. We grouped them by kind — script bugs, doc consistency, CI hardening, chores, dependency triage, standards enrichment — and shipped each as its own reviewable PR that closed a handful of issues at once. Each batch stated what it fixed, how it was verified, and what it deliberately left for later.&lt;/p&gt;
&lt;p&gt;That structure paid off when the batches started depending on each other. The new “dogfood” CI job — which runs our own linter against our own repo and asserts the JSON and SARIF output is valid — is a direct regression guard for the zero-findings crash. It literally cannot pass until the crash fix is present. So the batches had a merge order, and the order was part of the plan, not an afterthought.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;what-actually-shipped&quot;&gt;What actually shipped&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;The headline items:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;The linter now dogfoods.&lt;/strong&gt; CI runs &lt;code dir=&quot;auto&quot;&gt;lint-standards.sh&lt;/code&gt; against this repo on every push and fails if the tool crashes or emits malformed output. The bug that would have shipped a broken SARIF file to every consumer is now caught here first.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Secret scanning that teams won’t turn off.&lt;/strong&gt; We ship a TruffleHog config with a documented allowlist, verification off by default, and merge-blocking on real findings. Noisy scanners get disabled; a scanner with good false-positive hygiene stays on.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Release automation.&lt;/strong&gt; A release-drafter workflow keeps a categorized draft release current from merged PRs and auto-labels them from their commit type. The changelog stops being a manual chore.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Actions pinned to SHAs, Dependabot grouped.&lt;/strong&gt; Every workflow now pins actions to an exact commit, and Dependabot batches the updates so they stop piling up as one-PR-per-bump.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Standards enrichment&lt;/strong&gt; from real cross-platform work — the subject of &lt;a href=&quot;https://coding-standards.c65llc.com/blog/a-green-pipeline-is-not-proof/&quot;&gt;the companion post&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;There’s a satisfying symmetry to fixing your own linter’s crash by making your CI run your own linter. The repo is a little more like the thing it tells everyone else to build. That’s the whole point of doing this on a schedule.&lt;/p&gt;
</content:encoded></item><item><title>Standards 1.2: Safe Setup</title><link>https://coding-standards.c65llc.com/blog/standards-1-2-safe-setup/</link><guid isPermaLink="true">https://coding-standards.c65llc.com/blog/standards-1-2-safe-setup/</guid><pubDate>Thu, 16 Apr 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Last release was about governance and drift. This one is about a quieter promise we were breaking: &lt;strong&gt;installing the standards into your project should never destroy the work you’ve already done there.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;The feedback that kicked off 1.2 came from a real adoption. Someone ran &lt;code dir=&quot;auto&quot;&gt;setup.sh&lt;/code&gt; against a repo that already had an &lt;code dir=&quot;auto&quot;&gt;AGENTS.md&lt;/code&gt;, a &lt;code dir=&quot;auto&quot;&gt;CLAUDE.md&lt;/code&gt;, and a CI workflow. When the dust settled, their &lt;code dir=&quot;auto&quot;&gt;AGENTS.md&lt;/code&gt; had been overwritten, the new &lt;code dir=&quot;auto&quot;&gt;CLAUDE.md&lt;/code&gt; was full of literal &lt;code dir=&quot;auto&quot;&gt;{{PROJECT_NAME}}&lt;/code&gt; tokens, configs for five agents they don’t use had been dropped into the root, and a &lt;code dir=&quot;auto&quot;&gt;standards-review.yml&lt;/code&gt; workflow had appeared without anyone asking for it. They cherry-picked out what they wanted and sent back a note: &lt;em&gt;here’s what we rejected, and why.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Four problems. One underlying mistake — &lt;strong&gt;defaults that assumed more than they should&lt;/strong&gt;. This release fixes all four and ties them together around a single idea: &lt;strong&gt;stage, don’t clobber.&lt;/strong&gt;&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;one-rule-applied-four-ways&quot;&gt;One rule, applied four ways&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;&lt;code dir=&quot;auto&quot;&gt;setup.sh&lt;/code&gt; now routes every file it wants to write through the same gate that &lt;code dir=&quot;auto&quot;&gt;sync-standards&lt;/code&gt; has used for months: &lt;code dir=&quot;auto&quot;&gt;should_assemble()&lt;/code&gt;. If the target doesn’t exist, write it. If it exists and still matches the last assembled hash, overwrite it. If it exists and has been customized, write the new version to &lt;code dir=&quot;auto&quot;&gt;.standards-pending/&amp;#x3C;file&gt;&lt;/code&gt; instead and leave the original alone.&lt;/p&gt;
&lt;p&gt;The infrastructure for this wasn’t new — we’d built it for re-syncs. What was new was pointing &lt;code dir=&quot;auto&quot;&gt;setup.sh&lt;/code&gt; at it. The assembly loop is now a single function in &lt;code dir=&quot;auto&quot;&gt;scripts/lib/assembly.sh&lt;/code&gt;, shared by both scripts. First-run and re-sync are the same flow. That one change closes the “clobbered AGENTS.md” complaint completely.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;only-the-agents-you-actually-use&quot;&gt;Only the agents you actually use&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;&lt;code dir=&quot;auto&quot;&gt;--agents&lt;/code&gt; now defaults to &lt;code dir=&quot;auto&quot;&gt;detect&lt;/code&gt;. When you run &lt;code dir=&quot;auto&quot;&gt;setup.sh&lt;/code&gt;, it probes for &lt;code dir=&quot;auto&quot;&gt;CLAUDE.md&lt;/code&gt;, &lt;code dir=&quot;auto&quot;&gt;.cursorrules&lt;/code&gt;, &lt;code dir=&quot;auto&quot;&gt;.github/copilot-instructions.md&lt;/code&gt;, &lt;code dir=&quot;auto&quot;&gt;.gemini/GEMINI.md&lt;/code&gt;, &lt;code dir=&quot;auto&quot;&gt;AGENTS.md&lt;/code&gt;, &lt;code dir=&quot;auto&quot;&gt;.aiderrc&lt;/code&gt; — and only installs configs for the agents it finds. A greenfield project gets a short message listing what’s available, not six unused dotfiles.&lt;/p&gt;
&lt;p&gt;The old “install everything, let the user delete what they don’t need” default was well-intentioned but wrong. The escape hatch is still there — &lt;code dir=&quot;auto&quot;&gt;--agents all&lt;/code&gt; if you really do want everything, or &lt;code dir=&quot;auto&quot;&gt;--agents claude-code,cursor&lt;/code&gt; for an explicit list — but the default respects what’s already in your tree.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;template-variables-that-dont-ship&quot;&gt;Template variables that don’t ship&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;The base &lt;code dir=&quot;auto&quot;&gt;CLAUDE.md&lt;/code&gt; template has three placeholders: &lt;code dir=&quot;auto&quot;&gt;{{PROJECT_NAME}}&lt;/code&gt;, &lt;code dir=&quot;auto&quot;&gt;{{PROJECT_OVERVIEW}}&lt;/code&gt;, &lt;code dir=&quot;auto&quot;&gt;{{KEY_COMMANDS}}&lt;/code&gt;. Until this release, the assembler wrote them through as literal &lt;code dir=&quot;auto&quot;&gt;{{...}}&lt;/code&gt; tokens. If you weren’t paying attention, your repo ended up with a &lt;code dir=&quot;auto&quot;&gt;CLAUDE.md&lt;/code&gt; that greeted the next agent with &lt;code dir=&quot;auto&quot;&gt;# {{PROJECT_NAME}} — Claude Code Guide&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Now: &lt;code dir=&quot;auto&quot;&gt;{{PROJECT_NAME}}&lt;/code&gt; resolves from &lt;code dir=&quot;auto&quot;&gt;package.json&lt;/code&gt;, &lt;code dir=&quot;auto&quot;&gt;Cargo.toml&lt;/code&gt;, &lt;code dir=&quot;auto&quot;&gt;pyproject.toml&lt;/code&gt;, or the directory name — whichever comes first. The two content placeholders become &lt;code dir=&quot;auto&quot;&gt;&amp;#x3C;!-- TODO(standards): --&gt;&lt;/code&gt; markers that the merge skill fills in. The shipped file never contains &lt;code dir=&quot;auto&quot;&gt;{{&lt;/code&gt;.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;the-workflow-is-opt-in&quot;&gt;The workflow is opt-in&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;The &lt;code dir=&quot;auto&quot;&gt;standards-review.yml&lt;/code&gt; workflow is useful, but it’s also opinionated — it can conflict with a project’s existing CI. 1.2 gates its install behind &lt;code dir=&quot;auto&quot;&gt;--workflow&lt;/code&gt;. When you skip it, setup prints the one-liner to install it later. No more workflow showing up unannounced.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;the-handoff-merge_planmd&quot;&gt;The handoff: MERGE_PLAN.md&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;Here’s where it gets interesting. When &lt;code dir=&quot;auto&quot;&gt;setup.sh&lt;/code&gt; stages anything to &lt;code dir=&quot;auto&quot;&gt;.standards-pending/&lt;/code&gt;, it also writes a &lt;code dir=&quot;auto&quot;&gt;MERGE_PLAN.md&lt;/code&gt; alongside it — a short briefing that lists the files to reconcile, the agents detected in the project, any unresolved &lt;code dir=&quot;auto&quot;&gt;&amp;#x3C;!-- TODO --&gt;&lt;/code&gt; markers, and three ways to finish the job:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code dir=&quot;auto&quot;&gt;/merge-standards&lt;/code&gt; in Claude Code&lt;/li&gt;
&lt;li&gt;the &lt;code dir=&quot;auto&quot;&gt;merge-standards&lt;/code&gt; command in Cursor&lt;/li&gt;
&lt;li&gt;&lt;code dir=&quot;auto&quot;&gt;make merge-standards&lt;/code&gt; at the CLI&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;All three read the same MERGE_PLAN.md. The design goal is that &lt;code dir=&quot;auto&quot;&gt;setup.sh&lt;/code&gt; doesn’t &lt;em&gt;finish&lt;/em&gt; the install — it hands a complete, agent-agnostic briefing to whichever LLM the user prefers, and that agent finishes the install against the user’s actual preferences. You pick the tool; we give it the context.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;what-this-didnt-require&quot;&gt;What this didn’t require&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;This release isn’t a rewrite. The pending-mode infrastructure already existed — &lt;code dir=&quot;auto&quot;&gt;sync-standards.sh&lt;/code&gt; had been using it for months. The 1.2 change lifts that loop into &lt;code dir=&quot;auto&quot;&gt;scripts/lib/assembly.sh&lt;/code&gt; and points &lt;code dir=&quot;auto&quot;&gt;setup.sh&lt;/code&gt; at it. Most of the new code is in four small libs (one per concern: assembly, detection, template vars, merge plan), the 17 functional tests that enforce each fix, and the docs that explain it.&lt;/p&gt;
&lt;p&gt;Four rejections from one adoption. Four commits. Four test groups that will keep them from regressing. That’s the whole release.&lt;/p&gt;
</content:encoded></item><item><title>Standards 1.1: Reliability and Agent Coverage</title><link>https://coding-standards.c65llc.com/blog/standards-1-1-reliability-and-agent-coverage/</link><guid isPermaLink="true">https://coding-standards.c65llc.com/blog/standards-1-1-reliability-and-agent-coverage/</guid><pubDate>Wed, 15 Apr 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Standards 1.1 is a maintenance-and-maturity release. Most prior posts have been about &lt;em&gt;adding&lt;/em&gt; something — a new linter, a new skill, a new framework. This release is about the layer underneath: the governance, infrastructure, and drift-prevention that make the project trustworthy as a long-running dependency. It also closes a gap that was overdue: cross-agent coordination conventions for &lt;a href=&quot;https://antigravity.google.com&quot;&gt;Google Antigravity&lt;/a&gt;, so Missions and design-fidelity reviews work the same way whether the agent in front of you is Antigravity, Claude Code, Cursor, Aider, or Codex.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;project-governance-you-can-grep&quot;&gt;Project governance you can grep&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;Three files most projects don’t notice until they’re missing:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;code dir=&quot;auto&quot;&gt;.github/CODEOWNERS&lt;/code&gt;&lt;/strong&gt; — default code ownership for review routing. Aligns with &lt;a href=&quot;https://coding-standards.c65llc.com/standards/process/proc-03_code_review_expectations/&quot;&gt;proc-03 code review expectations&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code dir=&quot;auto&quot;&gt;.github/dependabot.yml&lt;/code&gt;&lt;/strong&gt; — automated dependency updates for npm and GitHub Actions. This is distinct from the &lt;a href=&quot;https://coding-standards.c65llc.com/blog/dependency-age-gate/&quot;&gt;72-hour age gate&lt;/a&gt;: dependabot &lt;em&gt;proposes&lt;/em&gt; upgrades, the age gate &lt;em&gt;decides&lt;/em&gt; whether they’re old enough to install.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;A P0/P1/P2 checklist in the PR template.&lt;/strong&gt; The &lt;a href=&quot;https://coding-standards.c65llc.com/blog/security-standards/&quot;&gt;security framework&lt;/a&gt; defined the severity model; the PR template is where reviewers and authors actually use it. One short checklist beats a 200-line standards doc no one re-reads per PR.&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;&lt;h2 id=&quot;why-decisions-are-written-down&quot;&gt;Why decisions are written down&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;&lt;code dir=&quot;auto&quot;&gt;docs/adr/0001-unified-standards-repository.md&lt;/code&gt; is the first Architecture Decision Record in the repo. It captures &lt;em&gt;why&lt;/em&gt; the standards live in one repo per organization (rather than per-language or per-team) and what the alternatives were. ADRs aren’t documentation in the usual sense; they’re the trail of receipts for choices that later look obvious.&lt;/p&gt;
&lt;p&gt;Two new READMEs join it: &lt;code dir=&quot;auto&quot;&gt;standards/README.md&lt;/code&gt; (a map of the directory layout and naming conventions) and &lt;code dir=&quot;auto&quot;&gt;bin/README.md&lt;/code&gt; (an overview of the &lt;code dir=&quot;auto&quot;&gt;gh-task&lt;/code&gt; CLI with links to its full guide). Neither adds anything functionally new; both compress the time-to-orient for someone landing in the repo cold.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;drift-detection-for-the-aiderrc-file&quot;&gt;Drift detection for the .aiderrc file&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;When the &lt;a href=&quot;https://coding-standards.c65llc.com/blog/token-efficient-agent-configs/&quot;&gt;block-based agent config assembly&lt;/a&gt; shipped, every agent config file &lt;em&gt;except one&lt;/em&gt; was migrated to it. The exception was &lt;code dir=&quot;auto&quot;&gt;.aiderrc&lt;/code&gt; — &lt;code dir=&quot;auto&quot;&gt;sync-standards.sh&lt;/code&gt; treats it as customized (its checksum diverged from the canonical template) and skipped it on every sync. The result: that file carried a 97-line inline P0/P1 security list that the rest of the project had stopped using six weeks earlier (&lt;a href=&quot;https://github.com/c65llc/coding-standards/issues/34&quot;&gt;#34&lt;/a&gt;).&lt;/p&gt;
&lt;p&gt;1.1 resyncs &lt;code dir=&quot;auto&quot;&gt;.aiderrc&lt;/code&gt; to its canonical template and adds a new &lt;code dir=&quot;auto&quot;&gt;make doctor&lt;/code&gt; check — &lt;code dir=&quot;auto&quot;&gt;check_aiderrc_template_sync&lt;/code&gt; — that &lt;code dir=&quot;auto&quot;&gt;cmp -s&lt;/code&gt; compares the two files and surfaces drift before another six weeks pass. Fix is small; the generalizable lesson is bigger: when you build an assembly system, audit the files that &lt;em&gt;aren’t&lt;/em&gt; in it.&lt;/p&gt;
&lt;p&gt;The default Aider model also moves from &lt;code dir=&quot;auto&quot;&gt;claude-sonnet-4-20250514&lt;/code&gt; (a dated Sonnet 4.0 preview) to the family alias &lt;code dir=&quot;auto&quot;&gt;claude-sonnet-4-6&lt;/code&gt;, which auto-tracks point releases without requiring further template churn.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;reliability-fix-the-standards-review-action&quot;&gt;Reliability fix: the standards-review action&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;The &lt;a href=&quot;https://coding-standards.c65llc.com/blog/pr-review-bot/&quot;&gt;standards-review composite action&lt;/a&gt; failed to load in consumer repos with:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;while scanning a simple key&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;could not find expected &apos;:&apos; (line 91, col 1)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;Root cause: a Python heredoc inside a &lt;code dir=&quot;auto&quot;&gt;run: |&lt;/code&gt; block was indented at column 0. YAML’s literal block scalar terminates the moment a content line has less indentation than the block, so the parser ended the scalar at the first heredoc line and tried to interpret Python as YAML. It choked on the colon in &lt;code dir=&quot;auto&quot;&gt;if len(sys.argv) &gt; 1 else &quot;{}&quot;&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;The fix moves the formatter to a sibling &lt;code dir=&quot;auto&quot;&gt;format-results.py&lt;/code&gt; invoked via &lt;code dir=&quot;auto&quot;&gt;${{ github.action_path }}&lt;/code&gt;. The YAML stays trivial, and the Python is independently testable. Two-file change (&lt;a href=&quot;https://github.com/c65llc/coding-standards/issues/64&quot;&gt;#64&lt;/a&gt;).&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;website-surface-area&quot;&gt;Website surface area&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;The website itself caught up in this release:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;A &lt;strong&gt;“How It Works”&lt;/strong&gt; page covering the architecture and the standards-sync pipeline end-to-end — useful for anyone evaluating the project before adopting it.&lt;/li&gt;
&lt;li&gt;A &lt;strong&gt;Security section in the sidebar&lt;/strong&gt;, surfacing &lt;code dir=&quot;auto&quot;&gt;sec-01&lt;/code&gt; rather than burying it under “Standards”.&lt;/li&gt;
&lt;li&gt;The build pipeline now &lt;strong&gt;syncs security standards into the rendered docs automatically&lt;/strong&gt;, so the website can’t drift from the canonical files.&lt;/li&gt;
&lt;li&gt;The blog backfilled posts covering release history back to 0.1.&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;&lt;h2 id=&quot;antigravity-mission-isolation&quot;&gt;Antigravity Mission isolation&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href=&quot;https://antigravity.google.com&quot;&gt;Google Antigravity&lt;/a&gt; groups work into Missions — long-running, agent-driven tasks scoped to a feature or fix. The problem when multiple agents touch the same project: Claude Code, Cursor, and Aider have no native concept of an active Mission, so they don’t know whether their work is in scope or scope creep.&lt;/p&gt;
&lt;p&gt;1.1 ships a cross-agent advisory mechanism — &lt;code dir=&quot;auto&quot;&gt;.gemini/active_mission.log&lt;/code&gt; — and two helper scripts:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;./scripts/mission-set.sh&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;https://antigravity.google.com/missions/&amp;#x3C;id&gt;&lt;/span&gt;&lt;span&gt;   &lt;/span&gt;&lt;span&gt;# at start&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;./scripts/mission-clear.sh&lt;/span&gt;&lt;span&gt;                                              &lt;/span&gt;&lt;span&gt;# on completion&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;Other agents check the log before starting work; if a Mission is active, they reference it in commits and avoid expanding scope. The full convention (feature bracketing, lifecycle, what “stale” looks like — i.e. a non-empty log more than ~7 days old) lives in &lt;code dir=&quot;auto&quot;&gt;proc-04 § 5&lt;/code&gt;, with the read protocol mirrored in &lt;code dir=&quot;auto&quot;&gt;GEMINI.md&lt;/code&gt; so every agent that consumes the standards picks it up automatically.&lt;/p&gt;
&lt;p&gt;Alongside it, &lt;code dir=&quot;auto&quot;&gt;.gemini/settings.json&lt;/code&gt; ships a Postgres MCP entry — opt-in via &lt;code dir=&quot;auto&quot;&gt;POSTGRES_MCP_DATABASE_URL&lt;/code&gt; env var. When set, Gemini gets live schema introspection for migration and query work; when unset, the server fails to start gracefully and Gemini continues without it. &lt;code dir=&quot;auto&quot;&gt;make doctor&lt;/code&gt; warns when the entry is present but the env var is missing.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;browser-agent-ui-validation&quot;&gt;Browser-agent UI validation&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;Antigravity, Claude Code (via Playwright MCP), and Cursor all have browser tools that can render and screenshot a UI. Until now there was no convention for &lt;em&gt;what to compare it against&lt;/em&gt; — agents would render, agree it looked “fine”, and merge. 1.1 introduces &lt;code dir=&quot;auto&quot;&gt;assets/designs/&lt;/code&gt; as a per-project reference directory, plus &lt;code dir=&quot;auto&quot;&gt;proc-04 § 7: UI Change Validation&lt;/code&gt; defining the protocol:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Render&lt;/strong&gt; via dev server or the project’s &lt;a href=&quot;https://coding-standards.c65llc.com/standards/process/proc-04_agent_workflow_standards/#4-devloop-pattern-ui-projects&quot;&gt;Devloop&lt;/a&gt; &lt;code dir=&quot;auto&quot;&gt;/rebuild&lt;/code&gt; endpoint.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Capture&lt;/strong&gt; the rendered output with the agent’s browser tool.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Compare&lt;/strong&gt; against &lt;code dir=&quot;auto&quot;&gt;assets/designs/&amp;#x3C;route-or-component&gt;/&amp;#x3C;state&gt;.png&lt;/code&gt;.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;The deliberate non-default: &lt;strong&gt;pixel-diff is not the gate.&lt;/strong&gt; Font rendering, anti-aliasing, and sub-pixel layout drift swamp real changes. The agent surfaces the diff (side-by-side, overlay, or per-region delta) and a written summary; a human approves whether the change matches design intent. Pixel-diff gating is opt-in for projects that want to enforce it, with thresholds documented in &lt;code dir=&quot;auto&quot;&gt;assets/designs/NOTES.md&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;The &lt;code dir=&quot;auto&quot;&gt;assets/designs/&lt;/code&gt; directory is &lt;strong&gt;opt-in per project&lt;/strong&gt; — &lt;code dir=&quot;auto&quot;&gt;setup.sh&lt;/code&gt; doesn’t auto-create it. Projects taking on UI work add it manually and copy in &lt;code dir=&quot;auto&quot;&gt;templates/assets-designs-README.md.example&lt;/code&gt;, which documents naming conventions, common state vocabulary (&lt;code dir=&quot;auto&quot;&gt;default&lt;/code&gt;, &lt;code dir=&quot;auto&quot;&gt;loading&lt;/code&gt;, &lt;code dir=&quot;auto&quot;&gt;error&lt;/code&gt;, &lt;code dir=&quot;auto&quot;&gt;mobile&lt;/code&gt;, &lt;code dir=&quot;auto&quot;&gt;dark&lt;/code&gt;, etc.), and the cross-agent invocation table.&lt;/p&gt;
&lt;p&gt;For agents without native browser tools (Aider, Codex), the protocol relies on the project’s &lt;a href=&quot;https://coding-standards.c65llc.com/standards/process/proc-04_agent_workflow_standards/#4-devloop-pattern-ui-projects&quot;&gt;Devloop&lt;/a&gt; &lt;code dir=&quot;auto&quot;&gt;GET /snapshot&lt;/code&gt; HTTP endpoint to normalize capture across all agents.&lt;/p&gt;
</content:encoded></item><item><title>72-Hour Age Gate: Our Response to the Axios Supply Chain Attack</title><link>https://coding-standards.c65llc.com/blog/dependency-age-gate/</link><guid isPermaLink="true">https://coding-standards.c65llc.com/blog/dependency-age-gate/</guid><pubDate>Tue, 31 Mar 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;At 00:21 UTC on March 31, 2026, a compromised npm maintainer account published &lt;code dir=&quot;auto&quot;&gt;axios@1.14.1&lt;/code&gt; – a trojaned version of the most popular JavaScript HTTP client, a package downloaded over &lt;a href=&quot;https://snyk.io/blog/axios-npm-package-compromised-supply-chain-attack-delivers-cross-platform/&quot;&gt;100 million times per week&lt;/a&gt;. Thirty-nine minutes later, &lt;code dir=&quot;auto&quot;&gt;axios@0.30.4&lt;/code&gt; followed. Both versions injected a hidden dependency, &lt;code dir=&quot;auto&quot;&gt;plain-crypto-js@4.2.1&lt;/code&gt;, whose sole purpose was to drop a cross-platform remote access trojan onto developer machines (&lt;a href=&quot;https://socket.dev/blog/axios-npm-package-compromised&quot;&gt;Socket&lt;/a&gt;, &lt;a href=&quot;https://thehackernews.com/2026/03/axios-supply-chain-attack-pushes-cross.html&quot;&gt;The Hacker News&lt;/a&gt;).&lt;/p&gt;
&lt;p&gt;Today we are adding a &lt;strong&gt;mandatory 72-hour (3-day) dependency age gate&lt;/strong&gt; to every language standard in this framework.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;what-happened&quot;&gt;What Happened&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;The attacker compromised the npm credentials of the primary Axios maintainer, bypassing the project’s GitHub Actions CI/CD pipeline entirely (&lt;a href=&quot;https://www.stepsecurity.io/blog/axios-compromised-on-npm-malicious-versions-drop-remote-access-trojan&quot;&gt;StepSecurity&lt;/a&gt;). According to Socket’s analysis, the malicious dependency was staged 18 hours in advance, three separate RAT payloads were pre-built for macOS, Windows, and Linux, and both release branches were hit within 39 minutes of each other (&lt;a href=&quot;https://socket.dev/blog/axios-npm-package-compromised&quot;&gt;Socket&lt;/a&gt;).&lt;/p&gt;
&lt;p&gt;The dropper used a dual-layer obfuscation scheme – reversed Base64 encoding plus XOR cipher – to evade static analysis (&lt;a href=&quot;https://snyk.io/blog/axios-npm-package-compromised-supply-chain-attack-delivers-cross-platform/&quot;&gt;Snyk&lt;/a&gt;). On install, npm’s &lt;code dir=&quot;auto&quot;&gt;postinstall&lt;/code&gt; hook executed automatically, detected the developer’s OS, and downloaded a platform-specific RAT from a command-and-control server. The payloads beaconed to C2 every 60 seconds, accepting commands for arbitrary code execution, credential harvesting, SSH key exfiltration, and filesystem enumeration (&lt;a href=&quot;https://socket.dev/blog/axios-npm-package-compromised&quot;&gt;Socket&lt;/a&gt;).&lt;/p&gt;
&lt;p&gt;The malicious versions were live for roughly &lt;strong&gt;two to three hours&lt;/strong&gt; before detection and removal. &lt;a href=&quot;https://socket.dev/blog/axios-npm-package-compromised&quot;&gt;Socket’s scanner flagged the compromise within about 6 minutes&lt;/a&gt;, but the npm registry take-down took longer. Any &lt;code dir=&quot;auto&quot;&gt;npm install&lt;/code&gt; or CI pipeline that ran during that window – without a lockfile, or with loose version ranges – pulled the trojan automatically.&lt;/p&gt;
&lt;p&gt;For the full breakdown, see the &lt;a href=&quot;https://www.malwarebytes.com/blog/news/2026/03/axios-supply-chain-attack-chops-away-at-npm-trust&quot;&gt;Malwarebytes write-up&lt;/a&gt;. Additional technical analysis is available from &lt;a href=&quot;https://www.huntress.com/blog/supply-chain-compromise-axios-npm-package&quot;&gt;Huntress&lt;/a&gt;, &lt;a href=&quot;https://www.wiz.io/blog/axios-npm-compromised-in-supply-chain-attack&quot;&gt;Wiz&lt;/a&gt;, and &lt;a href=&quot;https://www.sans.org/blog/axios-npm-supply-chain-compromise-malicious-packages-remote-access-trojan&quot;&gt;SANS&lt;/a&gt;.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;why-a-72-hour-age-gate&quot;&gt;Why a 72-Hour Age Gate&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;The axios attack was detected and reverted within hours. Most supply chain attacks follow this pattern: a malicious version is published, the community detects it, and the registry pulls it – usually within 1-3 days. A 72-hour waiting period before adopting any new dependency version means your team never installs a package during that critical window.&lt;/p&gt;
&lt;p&gt;This is not a novel idea. Google’s &lt;a href=&quot;https://slsa.dev/&quot;&gt;SLSA framework&lt;/a&gt; and the OpenSSF &lt;a href=&quot;https://securityscorecards.dev/&quot;&gt;Scorecard project&lt;/a&gt; both recommend evaluating package freshness as a risk signal. We are making it a hard rule.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;What the age gate catches:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Compromised maintainer accounts&lt;/strong&gt; (like axios) – malicious versions are typically reverted within hours to days&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Typosquatting packages&lt;/strong&gt; – most are flagged and removed quickly once published&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Accidental secret leaks&lt;/strong&gt; – maintainers who publish credentials in a release and yank it&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;What it does not catch:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Long-lived, subtle backdoors that evade detection for weeks (these require deeper supply chain controls like reproducible builds and code review of dependencies)&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;&lt;h2 id=&quot;what-changed-in-our-standards&quot;&gt;What Changed in Our Standards&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;We updated three layers of documentation:&lt;/p&gt;
&lt;div&gt;&lt;h3 id=&quot;core-standards-core-standardsmd&quot;&gt;Core Standards (&lt;code dir=&quot;auto&quot;&gt;core-standards.md&lt;/code&gt;)&lt;/h3&gt;&lt;/div&gt;
&lt;p&gt;A new &lt;strong&gt;Dependency Age Gate&lt;/strong&gt; subsection under Dependency Management:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;All 3rd-party dependency versions must be at least 3 days old before adoption. Do not upgrade to or add a dependency version published less than 72 hours ago. CI should enforce age verification against the registry publish date.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;div&gt;&lt;h3 id=&quot;security-standards-sec-01-section-5&quot;&gt;Security Standards (&lt;code dir=&quot;auto&quot;&gt;sec-01&lt;/code&gt;, Section 5)&lt;/h3&gt;&lt;/div&gt;
&lt;p&gt;A new &lt;strong&gt;P1-severity rule&lt;/strong&gt; under Dependency &amp;#x26; Supply Chain Security. P1 means this is merge-blocking – CI must fail if a dependency version is younger than 3 days. The rule includes:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;A registry API reference table covering PyPI, npm, crates.io, RubyGems, Maven Central, pub.dev, Swift packages, and Zig&lt;/li&gt;
&lt;li&gt;An exception process for emergency security patches (team lead approval + documented justification + 24-hour follow-up review)&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;&lt;h3 id=&quot;language-standards-lang-01-through-lang-10&quot;&gt;Language Standards (&lt;code dir=&quot;auto&quot;&gt;lang-01&lt;/code&gt; through &lt;code dir=&quot;auto&quot;&gt;lang-10&lt;/code&gt;)&lt;/h3&gt;&lt;/div&gt;
&lt;p&gt;The core language standards (&lt;code dir=&quot;auto&quot;&gt;lang-01&lt;/code&gt; through &lt;code dir=&quot;auto&quot;&gt;lang-10&lt;/code&gt;) now include an &lt;strong&gt;Age Gate&lt;/strong&gt; bullet in their Package Management sections, with the language-specific registry to check and a cross-reference to the full exception process in &lt;code dir=&quot;auto&quot;&gt;sec-01&lt;/code&gt;. Ruby on Rails (&lt;code dir=&quot;auto&quot;&gt;lang-11&lt;/code&gt;) inherits the rule from its Ruby base standard (&lt;code dir=&quot;auto&quot;&gt;lang-10&lt;/code&gt;). Remaining standards, including Go and Elixir, will adopt the same rule in their next revision.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;enforcing-it-in-ci&quot;&gt;Enforcing It in CI&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;The registry publish date is available via API for every major ecosystem:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;# npm - check publish date of a specific version&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;curl&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;-s&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;https://registry.npmjs.org/axios&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;|&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;jq&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;.time[&quot;1.14.1&quot;]&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;# PyPI&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;curl&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;-s&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;https://pypi.org/pypi/requests/json&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;|&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;jq&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;.releases[&quot;2.31.0&quot;][0].upload_time&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;# crates.io&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;curl&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;-s&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;https://crates.io/api/v1/crates/serde/versions&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;|&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;jq&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;.versions[0].created_at&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;# RubyGems&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;curl&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;-s&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;https://rubygems.org/api/v1/versions/rails.json&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;|&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;jq&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;.[0].created_at&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;A CI check that compares lockfile versions against registry timestamps is straightforward to build. We recommend running it as a required status check on every PR that modifies a lockfile.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;the-exception-process&quot;&gt;The Exception Process&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;Sometimes you genuinely need a fresh dependency version – typically a critical CVE fix. The exception requires:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Explicit approval&lt;/strong&gt; from a team lead or security owner&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Documented justification&lt;/strong&gt; in the PR description explaining why the bypass is necessary&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;A follow-up review&lt;/strong&gt; within 24 hours to confirm the version was not subsequently reverted or flagged&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;This keeps the gate meaningful without blocking legitimate emergency responses.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;what-you-should-do-now&quot;&gt;What You Should Do Now&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;If you use Coding Standards in your projects, run &lt;code dir=&quot;auto&quot;&gt;make sync-standards&lt;/code&gt; to pull the updated rules. If you maintain your own standards, consider adopting the 72-hour age gate – the axios attack demonstrated that even the most trusted packages in the ecosystem can be weaponized overnight.&lt;/p&gt;
&lt;p&gt;For the axios incident specifically: if you ran &lt;code dir=&quot;auto&quot;&gt;npm install&lt;/code&gt; between 00:21 and ~03:29 UTC on March 31, 2026 without a committed lockfile, check whether &lt;code dir=&quot;auto&quot;&gt;axios@1.14.1&lt;/code&gt; or &lt;code dir=&quot;auto&quot;&gt;axios@0.30.4&lt;/code&gt; was installed. If so, assume compromise and rotate all credentials on the affected machine.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&lt;em&gt;See the full rule in &lt;a href=&quot;https://coding-standards.c65llc.com/standards/security/sec-01_security_standards/&quot;&gt;sec-01: Security Standards&lt;/a&gt; and the updated &lt;a href=&quot;https://coding-standards.c65llc.com/standards/shared/core-standards/&quot;&gt;core standards&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
</content:encoded></item><item><title>Seven New Skills: Teaching AI Agents to Enforce Your Standards</title><link>https://coding-standards.c65llc.com/blog/ai-agent-skills/</link><guid isPermaLink="true">https://coding-standards.c65llc.com/blog/ai-agent-skills/</guid><pubDate>Tue, 31 Mar 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;We’ve added seven new skills to the Coding Standards framework. Each one teaches AI coding agents (Claude Code, Cursor, Copilot, and others) how to enforce a specific aspect of your standards — from security scanning to coverage thresholds to dependency age gates.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;what-are-skills&quot;&gt;What Are Skills?&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;Skills are markdown files that describe a workflow an AI agent should follow. They live in &lt;code dir=&quot;auto&quot;&gt;standards/agents/claude-code/skills/&lt;/code&gt; and contain structured instructions: when to trigger, what to check, how to report results. Think of them as runbooks that your AI assistant can execute on demand.&lt;/p&gt;
&lt;p&gt;Unlike static linter rules, skills can reason about context. They can ask clarifying questions, combine multiple checks, and explain &lt;em&gt;why&lt;/em&gt; something is a violation — not just that it is one.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;the-new-skills&quot;&gt;The New Skills&lt;/h2&gt;&lt;/div&gt;
&lt;div&gt;&lt;h3 id=&quot;1-standards-audit&quot;&gt;1. Standards Audit&lt;/h3&gt;&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;Skill:&lt;/strong&gt; &lt;code dir=&quot;auto&quot;&gt;standards-audit&lt;/code&gt; | &lt;strong&gt;Issue:&lt;/strong&gt; &lt;a href=&quot;https://github.com/c65llc/coding-standards/issues/49&quot;&gt;#49&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Wraps the existing &lt;code dir=&quot;auto&quot;&gt;lint-standards.sh&lt;/code&gt; compliance linter. Runs all applicable check modules for your detected languages, parses the structured JSON output, and reports violations grouped by severity (FAIL, WARN, PASS). This is the broadest skill — it covers everything from conventional commits to banned functions to test directory structure.&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;Standards audit: 14 passed, 2 warnings, 1 failure out of 17 checks.&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;div&gt;&lt;h3 id=&quot;2-security-gate&quot;&gt;2. Security Gate&lt;/h3&gt;&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;Skill:&lt;/strong&gt; &lt;code dir=&quot;auto&quot;&gt;security-gate&lt;/code&gt; | &lt;strong&gt;Issue:&lt;/strong&gt; &lt;a href=&quot;https://github.com/c65llc/coding-standards/issues/50&quot;&gt;#50&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Scans your codebase for P0 and P1 security violations from &lt;code dir=&quot;auto&quot;&gt;sec-01&lt;/code&gt;. Detects banned functions (&lt;code dir=&quot;auto&quot;&gt;eval()&lt;/code&gt;, &lt;code dir=&quot;auto&quot;&gt;exec()&lt;/code&gt;, &lt;code dir=&quot;auto&quot;&gt;pickle.loads()&lt;/code&gt;, etc.) per language, finds XSS patterns (&lt;code dir=&quot;auto&quot;&gt;innerHTML&lt;/code&gt;, &lt;code dir=&quot;auto&quot;&gt;dangerouslySetInnerHTML&lt;/code&gt;), flags hardcoded secrets, and checks for weak randomness. P0 and P1 findings are merge-blocking — the skill clearly states that the PR should not merge until they’re fixed.&lt;/p&gt;
&lt;div&gt;&lt;h3 id=&quot;3-dependency-age-gate&quot;&gt;3. Dependency Age Gate&lt;/h3&gt;&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;Skill:&lt;/strong&gt; &lt;code dir=&quot;auto&quot;&gt;dependency-age-gate&lt;/code&gt; | &lt;strong&gt;Issue:&lt;/strong&gt; &lt;a href=&quot;https://github.com/c65llc/coding-standards/issues/51&quot;&gt;#51&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Born from the &lt;a href=&quot;https://coding-standards.c65llc.com/blog/dependency-age-gate/&quot;&gt;axios supply chain attack&lt;/a&gt; — this skill verifies that every dependency version in your lockfile was published at least 72 hours ago. It queries registry APIs (npm, PyPI, crates.io, RubyGems, Maven Central, pub.dev) for publish timestamps and flags anything too fresh. Includes the exception process for emergency security patches.&lt;/p&gt;
&lt;div&gt;&lt;h3 id=&quot;4-config-assembly&quot;&gt;4. Config Assembly&lt;/h3&gt;&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;Skill:&lt;/strong&gt; &lt;code dir=&quot;auto&quot;&gt;config-assembly&lt;/code&gt; | &lt;strong&gt;Issue:&lt;/strong&gt; &lt;a href=&quot;https://github.com/c65llc/coding-standards/issues/52&quot;&gt;#52&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Drives the block composition system. Reads your &lt;code dir=&quot;auto&quot;&gt;.standards.yml&lt;/code&gt;, assembles agent configs from content blocks (architecture, testing, security, naming, language-specific, role-specific), and writes them to the correct output files. Respects the checksum system — customized files aren’t overwritten, they’re written to &lt;code dir=&quot;auto&quot;&gt;.standards-pending/&lt;/code&gt; for the merge-standards skill to resolve.&lt;/p&gt;
&lt;div&gt;&lt;h3 id=&quot;5-setup-wizard&quot;&gt;5. Setup Wizard&lt;/h3&gt;&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;Skill:&lt;/strong&gt; &lt;code dir=&quot;auto&quot;&gt;setup-wizard&lt;/code&gt; | &lt;strong&gt;Issue:&lt;/strong&gt; &lt;a href=&quot;https://github.com/c65llc/coding-standards/issues/53&quot;&gt;#53&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Guided onboarding for new projects. Detects languages from manifest files, asks about project role and desired agents, generates a &lt;code dir=&quot;auto&quot;&gt;.standards.yml&lt;/code&gt;, runs setup with dry-run preview, and finishes with a health check. Turns a multi-step manual process into a conversation.&lt;/p&gt;
&lt;div&gt;&lt;h3 id=&quot;6-coverage-enforcer&quot;&gt;6. Coverage Enforcer&lt;/h3&gt;&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;Skill:&lt;/strong&gt; &lt;code dir=&quot;auto&quot;&gt;coverage-enforcer&lt;/code&gt; | &lt;strong&gt;Issue:&lt;/strong&gt; &lt;a href=&quot;https://github.com/c65llc/coding-standards/issues/54&quot;&gt;#54&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Enforces the layer-specific test coverage thresholds from the standards: 100% for domain/core, 95%+ for application and infrastructure, 95% minimum overall. Knows which coverage tool to use per language (coverage.py, c8, simplecov, tarpaulin, JaCoCo) and can break down coverage by architecture layer. Also checks test naming conventions and file mirroring.&lt;/p&gt;
&lt;div&gt;&lt;h3 id=&quot;7-naming-convention&quot;&gt;7. Naming Convention&lt;/h3&gt;&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;Skill:&lt;/strong&gt; &lt;code dir=&quot;auto&quot;&gt;naming-convention&lt;/code&gt; | &lt;strong&gt;Issue:&lt;/strong&gt; &lt;a href=&quot;https://github.com/c65llc/coding-standards/issues/55&quot;&gt;#55&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Lints identifiers against the language-specific naming rules: &lt;code dir=&quot;auto&quot;&gt;snake_case&lt;/code&gt; for Python, &lt;code dir=&quot;auto&quot;&gt;camelCase&lt;/code&gt; for JavaScript, &lt;code dir=&quot;auto&quot;&gt;PascalCase&lt;/code&gt; for Go exports, &lt;code dir=&quot;auto&quot;&gt;?&lt;/code&gt; predicates for Ruby, and so on across all 13 supported languages. Uses grep patterns for quick scans and delegates to language-specific linters (ruff, eslint, rubocop, clippy) for deeper analysis.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;existing-skill-merge-standards&quot;&gt;Existing Skill: Merge Standards&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;The previously released &lt;code dir=&quot;auto&quot;&gt;merge-standards&lt;/code&gt; skill (&lt;a href=&quot;https://github.com/c65llc/coding-standards/issues/56&quot;&gt;#56&lt;/a&gt;) already handles the pending merge workflow — intelligently merging upstream standards updates into customized agent configs while preserving project-specific content.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;how-they-work-together&quot;&gt;How They Work Together&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;The skills form a pipeline that covers the full lifecycle:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;setup-wizard&lt;/strong&gt; onboards the project&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;config-assembly&lt;/strong&gt; generates agent configs&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;standards-audit&lt;/strong&gt; checks overall compliance&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;security-gate&lt;/strong&gt; enforces P0/P1 rules&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;dependency-age-gate&lt;/strong&gt; validates supply chain safety&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;coverage-enforcer&lt;/strong&gt; verifies test coverage by layer&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;naming-convention&lt;/strong&gt; catches identifier inconsistencies&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;merge-standards&lt;/strong&gt; keeps configs current as standards evolve&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Each skill is self-contained — use any one independently or chain them in CI.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;try-it&quot;&gt;Try It&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;Update your standards submodule:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;make&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;sync-standards&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;The new skills are available immediately to any agent with access to the &lt;code dir=&quot;auto&quot;&gt;.standards/&lt;/code&gt; directory. In Claude Code, reference them by name — for example, “run the standards-audit skill” or “check the dependency age gate.”&lt;/p&gt;
&lt;p&gt;See all skills in &lt;a href=&quot;https://coding-standards.c65llc.com/standards/agents/claude-code/&quot;&gt;&lt;code dir=&quot;auto&quot;&gt;standards/agents/claude-code/skills/&lt;/code&gt;&lt;/a&gt;.&lt;/p&gt;
</content:encoded></item><item><title>Automated Standards Review on Every Pull Request</title><link>https://coding-standards.c65llc.com/blog/pr-review-bot/</link><guid isPermaLink="true">https://coding-standards.c65llc.com/blog/pr-review-bot/</guid><pubDate>Wed, 25 Mar 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;The standards compliance linter shipped in Phase 2 can now run automatically on every pull request and post its findings as a structured comment — without any manual CI configuration from your team. Phase 3 ships the &lt;code dir=&quot;auto&quot;&gt;standards-review&lt;/code&gt; composite GitHub Action and installs the workflow into consumer projects during setup.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;what-gets-checked&quot;&gt;What gets checked&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;The PR review bot runs the full &lt;code dir=&quot;auto&quot;&gt;lint-standards.sh&lt;/code&gt; suite on every pull request. That includes:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Conventional Commits&lt;/strong&gt; — verifies recent commit messages match &lt;code dir=&quot;auto&quot;&gt;type(scope): subject&lt;/code&gt; format.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Test directory&lt;/strong&gt; — confirms a non-empty &lt;code dir=&quot;auto&quot;&gt;tests/&lt;/code&gt;, &lt;code dir=&quot;auto&quot;&gt;spec/&lt;/code&gt;, or &lt;code dir=&quot;auto&quot;&gt;__tests__/&lt;/code&gt; directory exists.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Secret detection&lt;/strong&gt; — scans source files for AWS keys, private key blocks, and hardcoded passwords.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Coverage configuration&lt;/strong&gt; — checks that a coverage threshold is declared in CI or &lt;code dir=&quot;auto&quot;&gt;.standards.yml&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Language-specific checks&lt;/strong&gt; — type annotations, banned functions, linter configs — activated by your &lt;code dir=&quot;auto&quot;&gt;.standards.yml&lt;/code&gt; language list.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;See the &lt;a href=&quot;https://coding-standards.c65llc.com/blog/standards-compliance-linter/&quot;&gt;linter blog post&lt;/a&gt; for the full check catalogue.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;what-it-looks-like-on-a-pr&quot;&gt;What it looks like on a PR&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;When the action runs it posts a comment with a summary line and a table of results:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;## Standards Review&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;:x: 1 failure(s) found&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;| Status | Check | Details |&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;|--------|-------|---------|&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;| :white_check_mark: PASS | conventional-commits | All recent commits follow Conventional Commits format |&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;| :white_check_mark: PASS | no-secrets | No hardcoded secrets detected |&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;| :warning: WARN | test-directory | Test directory found but appears empty |&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;| :x: FAIL | python/banned-functions | eval() usage detected in src/utils.py |&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;| :white_check_mark: PASS | python/ruff-config | [tool.ruff] section configured in pyproject.toml |&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;---&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;*Generated by Coding Standards linter*&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;If any check returns &lt;code dir=&quot;auto&quot;&gt;FAIL&lt;/code&gt;, the action exits with a non-zero code and the workflow step is marked as failed — blocking merge when branch protection is configured.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;how-to-install&quot;&gt;How to install&lt;/h2&gt;&lt;/div&gt;
&lt;div&gt;&lt;h3 id=&quot;automatic-via-setupsh&quot;&gt;Automatic (via setup.sh)&lt;/h3&gt;&lt;/div&gt;
&lt;p&gt;Running &lt;code dir=&quot;auto&quot;&gt;make setup&lt;/code&gt; (or the one-line curl installer) now copies the workflow template automatically:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;curl&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;-fsSL&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;https://raw.githubusercontent.com/c65llc/coding-standards/main/install.sh&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;|&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;bash&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;This places &lt;code dir=&quot;auto&quot;&gt;.github/workflows/standards-review.yml&lt;/code&gt; in your project on first setup. The workflow references the composite action from the &lt;code dir=&quot;auto&quot;&gt;.standards/&lt;/code&gt; submodule, so it stays in sync with the rest of your standards configuration.&lt;/p&gt;
&lt;div&gt;&lt;h3 id=&quot;manual&quot;&gt;Manual&lt;/h3&gt;&lt;/div&gt;
&lt;p&gt;Copy the template from the standards repository:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;cp&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;.standards/templates/standards-review.yml.example&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;.github/workflows/standards-review.yml&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;Then grant the workflow permission to comment on pull requests by ensuring your repository’s &lt;strong&gt;Settings &gt; Actions &gt; General &gt; Workflow permissions&lt;/strong&gt; allows pull requests write access, or rely on the &lt;code dir=&quot;auto&quot;&gt;permissions&lt;/code&gt; block already present in the template.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;sarif-integration-for-github-code-scanning&quot;&gt;SARIF integration for GitHub Code Scanning&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;The linter also supports &lt;code dir=&quot;auto&quot;&gt;--format sarif&lt;/code&gt; output (SARIF 2.1.0). You can extend the workflow to upload results to GitHub Code Scanning, which surfaces violations as inline annotations directly on the diff:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;- &lt;/span&gt;&lt;span&gt;name&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;Run standards linter (SARIF)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;run&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;|&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;.standards/scripts/lint-standards.sh --format sarif &gt; standards.sarif || true&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;- &lt;/span&gt;&lt;span&gt;name&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;Upload SARIF to Code Scanning&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;uses&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;github/codeql-action/upload-sarif@v3&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;with&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;sarif_file&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;standards.sarif&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;SARIF maps &lt;code dir=&quot;auto&quot;&gt;WARN&lt;/code&gt; checks to &lt;code dir=&quot;auto&quot;&gt;warning&lt;/code&gt; level and &lt;code dir=&quot;auto&quot;&gt;FAIL&lt;/code&gt; checks to &lt;code dir=&quot;auto&quot;&gt;error&lt;/code&gt; level in the Code Scanning UI. &lt;code dir=&quot;auto&quot;&gt;PASS&lt;/code&gt; results are omitted to keep the annotation list focused.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;whats-next&quot;&gt;What’s next&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;Phase 4 adds &lt;code dir=&quot;auto&quot;&gt;--dry-run&lt;/code&gt; support and a &lt;code dir=&quot;auto&quot;&gt;make diff-standards&lt;/code&gt; target so you can preview what a standards sync would change before applying it.&lt;/p&gt;
</content:encoded></item><item><title>Declarative Config and make doctor: Phase 1 of Standards Tooling</title><link>https://coding-standards.c65llc.com/blog/standards-yml-and-doctor/</link><guid isPermaLink="true">https://coding-standards.c65llc.com/blog/standards-yml-and-doctor/</guid><pubDate>Wed, 25 Mar 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Two new additions land in Phase 1 of our standards tooling roadmap: &lt;code dir=&quot;auto&quot;&gt;.standards.yml&lt;/code&gt; — a declarative configuration file that replaces the old shell-variable-based approach — and &lt;code dir=&quot;auto&quot;&gt;make doctor&lt;/code&gt;, a health check command that audits your project’s standards setup and tells you exactly what to fix.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;standardsyml-declarative-standards-configuration&quot;&gt;.standards.yml: Declarative Standards Configuration&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;Previously, consumer projects configured standards through a &lt;code dir=&quot;auto&quot;&gt;.standards-config&lt;/code&gt; file using &lt;code dir=&quot;auto&quot;&gt;KEY=value&lt;/code&gt; shell variables. It worked, but it was limited: no schema, no version field, no way to express nested settings like coverage thresholds.&lt;/p&gt;
&lt;p&gt;&lt;code dir=&quot;auto&quot;&gt;.standards.yml&lt;/code&gt; replaces that with a proper YAML config:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;# .standards.yml — Project standards configuration&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;version&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;1&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;languages&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;- &lt;/span&gt;&lt;span&gt;python&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;- &lt;/span&gt;&lt;span&gt;typescript&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;agents&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;- &lt;/span&gt;&lt;span&gt;claude-code&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;- &lt;/span&gt;&lt;span&gt;cursor&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;- &lt;/span&gt;&lt;span&gt;copilot&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;role&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;service&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;coverage&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;minimum&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;95&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;domain&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;100&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;architecture&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;clean&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;security&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;strict&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;div&gt;&lt;h3 id=&quot;what-each-field-controls&quot;&gt;What each field controls&lt;/h3&gt;&lt;/div&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Field&lt;/th&gt;
&lt;th&gt;Purpose&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code dir=&quot;auto&quot;&gt;version&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Config schema version — enables forward-compatible migrations&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code dir=&quot;auto&quot;&gt;languages&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Which language standards to load during assembly&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code dir=&quot;auto&quot;&gt;agents&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Which AI agents get config files during setup and sync&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code dir=&quot;auto&quot;&gt;role&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Project type — &lt;code dir=&quot;auto&quot;&gt;service&lt;/code&gt;, &lt;code dir=&quot;auto&quot;&gt;library&lt;/code&gt;, &lt;code dir=&quot;auto&quot;&gt;app&lt;/code&gt;, or &lt;code dir=&quot;auto&quot;&gt;data-pipeline&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code dir=&quot;auto&quot;&gt;coverage.minimum&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Overall test coverage floor (%)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code dir=&quot;auto&quot;&gt;coverage.domain&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Domain-layer coverage requirement (%)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code dir=&quot;auto&quot;&gt;architecture&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code dir=&quot;auto&quot;&gt;clean&lt;/code&gt; enforces Clean Architecture; &lt;code dir=&quot;auto&quot;&gt;none&lt;/code&gt; removes constraints&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code dir=&quot;auto&quot;&gt;security&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code dir=&quot;auto&quot;&gt;strict&lt;/code&gt; makes P0/P1 merge-blocking; &lt;code dir=&quot;auto&quot;&gt;moderate&lt;/code&gt; warns on P1&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;The &lt;code dir=&quot;auto&quot;&gt;setup.sh&lt;/code&gt; script generates &lt;code dir=&quot;auto&quot;&gt;.standards.yml&lt;/code&gt; automatically during installation using language detection. You can edit it afterward to adjust agents, coverage thresholds, or architecture mode. &lt;code dir=&quot;auto&quot;&gt;sync-standards.sh&lt;/code&gt; reads it on every run to assemble only the configs you need.&lt;/p&gt;
&lt;p&gt;The legacy &lt;code dir=&quot;auto&quot;&gt;.standards-config&lt;/code&gt; format remains supported for backward compatibility — &lt;code dir=&quot;auto&quot;&gt;make doctor&lt;/code&gt; will warn you if you’re on the old format.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;make-doctor-standards-health-check&quot;&gt;make doctor: Standards Health Check&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;&lt;code dir=&quot;auto&quot;&gt;make doctor&lt;/code&gt; runs a seven-point audit of your project’s standards setup and produces a scored report:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;Standards Health Check&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;=======================================&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;✅ PASS  Configuration          .standards.yml found (version 1)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;✅ PASS  Claude Code            CLAUDE.md present&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;✅ PASS  Cursor                 .cursorrules present&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;⚠️  WARN  Copilot               .github/copilot-instructions.md missing&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;✅ PASS  Checksums              All config checksums match&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;⚠️  WARN  Languages             Detected &apos;go&apos; not in .standards.yml&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;✅ PASS  Submodule              .standards/ is a valid git repo&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;❌ FAIL  Git Hooks              post-merge hook not installed&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;✅ PASS  Gitignore              All required entries present&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;=======================================&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;Score: 6/9 (67%)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;Fixes needed:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;-&gt; Run: make setup-agents  (to install missing Copilot config)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;-&gt; Add: &apos;go&apos; to .standards.yml languages list&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;-&gt; Run: make setup  (to install git hooks for automatic standards sync)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;div&gt;&lt;h3 id=&quot;what-it-checks&quot;&gt;What it checks&lt;/h3&gt;&lt;/div&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Configuration&lt;/strong&gt; — &lt;code dir=&quot;auto&quot;&gt;.standards.yml&lt;/code&gt; exists (or legacy &lt;code dir=&quot;auto&quot;&gt;.standards-config&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Agent files&lt;/strong&gt; — each agent declared in config has its expected file on disk&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Checksums&lt;/strong&gt; — &lt;code dir=&quot;auto&quot;&gt;.standards-checksums&lt;/code&gt; exists and config hashes match stored values, detecting unauthorized edits&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Languages&lt;/strong&gt; — runs &lt;code dir=&quot;auto&quot;&gt;detect-languages.sh&lt;/code&gt; and compares against declared languages, flagging gaps&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Submodule&lt;/strong&gt; — &lt;code dir=&quot;auto&quot;&gt;.standards/&lt;/code&gt; is a valid initialized git repo (skipped when running in the standards repo itself)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Git hooks&lt;/strong&gt; — &lt;code dir=&quot;auto&quot;&gt;.git/hooks/post-merge&lt;/code&gt; exists and references standards sync&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Gitignore&lt;/strong&gt; — &lt;code dir=&quot;auto&quot;&gt;.gitignore&lt;/code&gt; contains &lt;code dir=&quot;auto&quot;&gt;.standards-pending/&lt;/code&gt; and &lt;code dir=&quot;auto&quot;&gt;*.pre-standards-setup&lt;/code&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Every warning and failure includes a concrete fix command so you know exactly what to run.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;try-it&quot;&gt;Try It&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;Update your standards submodule and run the health check:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;cd&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;.standards&lt;/span&gt;&lt;span&gt; &amp;#x26;&amp;#x26; &lt;/span&gt;&lt;span&gt;git&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;pull&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;origin&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;main&lt;/span&gt;&lt;span&gt; &amp;#x26;&amp;#x26; &lt;/span&gt;&lt;span&gt;cd&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;..&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;make&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;doctor&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;If you haven’t installed standards yet:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;curl&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;-fsSL&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;https://raw.githubusercontent.com/c65llc/coding-standards/main/install.sh&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;|&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;bash&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;make&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;doctor&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;A perfect score means your project is fully configured, checksums are clean, and automatic sync is in place via git hooks.&lt;/p&gt;
</content:encoded></item><item><title>Preview Before You Commit: --dry-run and make diff-standards</title><link>https://coding-standards.c65llc.com/blog/dry-run-and-diff/</link><guid isPermaLink="true">https://coding-standards.c65llc.com/blog/dry-run-and-diff/</guid><pubDate>Wed, 25 Mar 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Phase 4 of the standards tooling roadmap adds two preview capabilities that let you see exactly what &lt;code dir=&quot;auto&quot;&gt;setup&lt;/code&gt; and &lt;code dir=&quot;auto&quot;&gt;sync-standards&lt;/code&gt; would change before a single file is modified.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;the-problem-trust-during-team-rollouts&quot;&gt;The problem: trust during team rollouts&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;When you run &lt;code dir=&quot;auto&quot;&gt;make setup&lt;/code&gt; or &lt;code dir=&quot;auto&quot;&gt;make sync-standards&lt;/code&gt; in an existing project, files get written. For a solo developer that is usually fine, but for a team rollout — or any project with carefully tuned AI agent configs — you want to review changes before committing to them. The new &lt;code dir=&quot;auto&quot;&gt;--dry-run&lt;/code&gt; flag and &lt;code dir=&quot;auto&quot;&gt;make diff-standards&lt;/code&gt; target solve this.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;dry-run-for-setup-and-sync&quot;&gt;–dry-run for setup and sync&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;Both &lt;code dir=&quot;auto&quot;&gt;scripts/setup.sh&lt;/code&gt; and &lt;code dir=&quot;auto&quot;&gt;scripts/sync-standards.sh&lt;/code&gt; now accept a &lt;code dir=&quot;auto&quot;&gt;--dry-run&lt;/code&gt; flag. When active, no files are created, modified, or deleted. Instead, each write operation prints a &lt;code dir=&quot;auto&quot;&gt;[dry-run]&lt;/code&gt; line describing what would have happened.&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;$ ./scripts/setup.sh --dry-run&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;🔍 DRY RUN — showing what would change (no files modified)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;📝 Assembling claude-code config...&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;[dry-run] Would write: /project/CLAUDE.md&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;✅ claude-code config (dry-run)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;📝 Assembling cursor config...&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;[dry-run] Would write: /project/.cursorrules&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;✅ cursor config (dry-run)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;[dry-run] Would write: /project/.standards.yml&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;[dry-run] Would write: /project/.git/hooks/post-merge&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;[dry-run] Would append to: /project/.gitignore&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;Nothing was written. You can now review the list and decide whether to proceed.&lt;/p&gt;
&lt;p&gt;The same flag works for sync:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;$ ./scripts/sync-standards.sh --dry-run&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;🔍 DRY RUN — showing what would change (no files modified)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;[dry-run] Would pull latest standards (submodule has updates)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;[dry-run] Would re-assemble: /project/CLAUDE.md&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;[dry-run] Would re-assemble: /project/.cursorrules&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;[dry-run] Would create: /project/.gemini/GEMINI.md&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;div&gt;&lt;h2 id=&quot;make-diff-standards-line-level-preview&quot;&gt;make diff-standards: line-level preview&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;&lt;code dir=&quot;auto&quot;&gt;--dry-run&lt;/code&gt; tells you which files would change. &lt;code dir=&quot;auto&quot;&gt;make diff-standards&lt;/code&gt; tells you exactly what would change inside each file. It assembles every declared agent config to a temp file, diffs it against the installed version, and prints color-coded output.&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;$ make diff-standards&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;Standards Diff&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;=======================================&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;→ claude-code  (CLAUDE.md)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;~ Changes: +12/-3 lines&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;--- CLAUDE.md&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;+++ (assembled)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;@@ -45,7 +45,7 @@&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;...&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;→ cursor  (.cursorrules)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;✅ Up to date&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;→ copilot  (copilot-instructions.md)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;+ Would create: .github/copilot-instructions.md&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;=======================================&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;Summary: 1 up to date  1 would change  1 new&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;Run make sync-standards to apply changes.&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;No temp files are left behind. If everything is up to date you see only checkmarks.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;recommended-workflow-for-team-rollouts&quot;&gt;Recommended workflow for team rollouts&lt;/h2&gt;&lt;/div&gt;
&lt;ol&gt;
&lt;li&gt;&lt;code dir=&quot;auto&quot;&gt;make diff-standards&lt;/code&gt; — review what would change across all agents&lt;/li&gt;
&lt;li&gt;&lt;code dir=&quot;auto&quot;&gt;./scripts/sync-standards.sh --dry-run&lt;/code&gt; — confirm the list of write operations&lt;/li&gt;
&lt;li&gt;&lt;code dir=&quot;auto&quot;&gt;make sync-standards&lt;/code&gt; — apply once you are satisfied&lt;/li&gt;
&lt;li&gt;Commit the updated agent configs in a single PR for team review&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;This workflow is especially useful when pulling a new version of the standards submodule: diff first, sync second, never surprise your teammates.&lt;/p&gt;
</content:encoded></item><item><title>Standards Compliance Linter: Enforce Your Standards in CI</title><link>https://coding-standards.c65llc.com/blog/standards-compliance-linter/</link><guid isPermaLink="true">https://coding-standards.c65llc.com/blog/standards-compliance-linter/</guid><pubDate>Wed, 25 Mar 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Phase 2 of the standards tooling roadmap ships &lt;code dir=&quot;auto&quot;&gt;make lint-standards&lt;/code&gt; — a multi-language compliance linter that checks your project against coding standards and reports results in text, JSON, or SARIF format for GitHub Code Scanning integration.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;what-it-checks&quot;&gt;What it checks&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;The linter is organized into two tiers: common checks that run on every project, and language-specific checks that activate based on your &lt;code dir=&quot;auto&quot;&gt;.standards.yml&lt;/code&gt; configuration.&lt;/p&gt;
&lt;div&gt;&lt;h3 id=&quot;common-checks-all-projects&quot;&gt;Common checks (all projects)&lt;/h3&gt;&lt;/div&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Check&lt;/th&gt;
&lt;th&gt;What it verifies&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code dir=&quot;auto&quot;&gt;conventional-commits&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Last 10 git commits match &lt;code dir=&quot;auto&quot;&gt;type(scope): subject&lt;/code&gt; pattern&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code dir=&quot;auto&quot;&gt;test-directory&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;A &lt;code dir=&quot;auto&quot;&gt;tests/&lt;/code&gt;, &lt;code dir=&quot;auto&quot;&gt;test/&lt;/code&gt;, &lt;code dir=&quot;auto&quot;&gt;spec/&lt;/code&gt;, or &lt;code dir=&quot;auto&quot;&gt;__tests__/&lt;/code&gt; directory exists and is non-empty&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code dir=&quot;auto&quot;&gt;no-secrets&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;No AWS keys, private key blocks, or hardcoded passwords/API keys in source files&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code dir=&quot;auto&quot;&gt;coverage-config&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;CI workflows, jest config, pytest config, or &lt;code dir=&quot;auto&quot;&gt;.standards.yml&lt;/code&gt; declare a coverage threshold&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;div&gt;&lt;h3 id=&quot;python-checks&quot;&gt;Python checks&lt;/h3&gt;&lt;/div&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Check&lt;/th&gt;
&lt;th&gt;What it verifies&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code dir=&quot;auto&quot;&gt;python/type-annotations&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;mypy is configured; WARN if not in strict mode, FAIL if not configured at all&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code dir=&quot;auto&quot;&gt;python/banned-functions&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;No &lt;code dir=&quot;auto&quot;&gt;eval()&lt;/code&gt;, &lt;code dir=&quot;auto&quot;&gt;exec()&lt;/code&gt;, &lt;code dir=&quot;auto&quot;&gt;pickle.loads()&lt;/code&gt;, &lt;code dir=&quot;auto&quot;&gt;os.system()&lt;/code&gt;, or &lt;code dir=&quot;auto&quot;&gt;subprocess&lt;/code&gt; with &lt;code dir=&quot;auto&quot;&gt;shell=True&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code dir=&quot;auto&quot;&gt;python/ruff-config&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code dir=&quot;auto&quot;&gt;ruff.toml&lt;/code&gt;, &lt;code dir=&quot;auto&quot;&gt;.ruff.toml&lt;/code&gt;, or &lt;code dir=&quot;auto&quot;&gt;[tool.ruff]&lt;/code&gt; in &lt;code dir=&quot;auto&quot;&gt;pyproject.toml&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;div&gt;&lt;h3 id=&quot;typescript--javascript-checks&quot;&gt;TypeScript / JavaScript checks&lt;/h3&gt;&lt;/div&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Check&lt;/th&gt;
&lt;th&gt;What it verifies&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code dir=&quot;auto&quot;&gt;typescript/strict-tsconfig&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code dir=&quot;auto&quot;&gt;&quot;strict&quot;: true&lt;/code&gt; in &lt;code dir=&quot;auto&quot;&gt;tsconfig.json&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code dir=&quot;auto&quot;&gt;typescript/banned-functions&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;No &lt;code dir=&quot;auto&quot;&gt;eval()&lt;/code&gt;, &lt;code dir=&quot;auto&quot;&gt;new Function()&lt;/code&gt;, &lt;code dir=&quot;auto&quot;&gt;.innerHTML =&lt;/code&gt;, &lt;code dir=&quot;auto&quot;&gt;document.write()&lt;/code&gt;, or &lt;code dir=&quot;auto&quot;&gt;setTimeout&lt;/code&gt; with string literal&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code dir=&quot;auto&quot;&gt;typescript/eslint-config&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;An &lt;code dir=&quot;auto&quot;&gt;.eslintrc*&lt;/code&gt;, &lt;code dir=&quot;auto&quot;&gt;eslint.config.*&lt;/code&gt;, or &lt;code dir=&quot;auto&quot;&gt;eslintConfig&lt;/code&gt; in &lt;code dir=&quot;auto&quot;&gt;package.json&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;div&gt;&lt;h3 id=&quot;go-checks&quot;&gt;Go checks&lt;/h3&gt;&lt;/div&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Check&lt;/th&gt;
&lt;th&gt;What it verifies&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code dir=&quot;auto&quot;&gt;go/golangci-config&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code dir=&quot;auto&quot;&gt;.golangci.yml&lt;/code&gt;, &lt;code dir=&quot;auto&quot;&gt;.golangci.yaml&lt;/code&gt;, or &lt;code dir=&quot;auto&quot;&gt;.golangci.toml&lt;/code&gt; present&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code dir=&quot;auto&quot;&gt;go/error-handling&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;No bare &lt;code dir=&quot;auto&quot;&gt;_ =&lt;/code&gt; or &lt;code dir=&quot;auto&quot;&gt;, _ :=&lt;/code&gt; patterns that discard return values (likely errors)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;div&gt;&lt;h3 id=&quot;elixir-checks&quot;&gt;Elixir checks&lt;/h3&gt;&lt;/div&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Check&lt;/th&gt;
&lt;th&gt;What it verifies&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code dir=&quot;auto&quot;&gt;elixir/credo-config&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code dir=&quot;auto&quot;&gt;:credo&lt;/code&gt; in &lt;code dir=&quot;auto&quot;&gt;mix.exs&lt;/code&gt; dependencies&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code dir=&quot;auto&quot;&gt;elixir/dialyzer-config&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code dir=&quot;auto&quot;&gt;:dialyxir&lt;/code&gt; in &lt;code dir=&quot;auto&quot;&gt;mix.exs&lt;/code&gt; dependencies&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;div&gt;&lt;h2 id=&quot;plugin-architecture&quot;&gt;Plugin architecture&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;Each check is a standalone bash script in &lt;code dir=&quot;auto&quot;&gt;scripts/lint-checks/&amp;#x3C;language&gt;/&lt;/code&gt;. The interface is minimal: receive the project root as &lt;code dir=&quot;auto&quot;&gt;$1&lt;/code&gt;, print one line (&lt;code dir=&quot;auto&quot;&gt;PASS|WARN|FAIL &amp;#x3C;check-name&gt; &amp;#x3C;message&gt;&lt;/code&gt;), exit with &lt;code dir=&quot;auto&quot;&gt;0&lt;/code&gt;, &lt;code dir=&quot;auto&quot;&gt;1&lt;/code&gt;, or &lt;code dir=&quot;auto&quot;&gt;2&lt;/code&gt;. Adding a new check is as simple as dropping a new script in the right directory — the orchestrator discovers it automatically.&lt;/p&gt;
&lt;p&gt;The orchestrator (&lt;code dir=&quot;auto&quot;&gt;scripts/lint-standards.sh&lt;/code&gt;) reads &lt;code dir=&quot;auto&quot;&gt;.standards.yml&lt;/code&gt; to determine which language-specific check directories to activate. Common checks always run.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;output-formats&quot;&gt;Output formats&lt;/h2&gt;&lt;/div&gt;
&lt;div&gt;&lt;h3 id=&quot;text-default&quot;&gt;Text (default)&lt;/h3&gt;&lt;/div&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;🔎 Standards Compliance Check&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;═══════════════════════════════════════&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;✅ PASS  conventional-commits    All recent commits follow Conventional Commits format&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;⚠️  WARN  test-directory         Test directory found but appears empty&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;✅ PASS  no-secrets              No hardcoded secrets detected&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;✅ PASS  coverage-config         Coverage gate found in .standards.yml (minimum: 95%)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;✅ PASS  python/type-annotations mypy strict mode enabled in pyproject.toml&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;❌ FAIL  python/banned-functions eval() at src/utils.py:42&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;✅ PASS  python/ruff-config      [tool.ruff] section configured in pyproject.toml&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;═══════════════════════════════════════&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;Results: 5 pass, 1 warn, 1 fail&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;div&gt;&lt;h3 id=&quot;json&quot;&gt;JSON&lt;/h3&gt;&lt;/div&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;./scripts/lint-standards.sh&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;--format&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;json&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;Produces a structured JSON object with &lt;code dir=&quot;auto&quot;&gt;summary&lt;/code&gt; counts and a &lt;code dir=&quot;auto&quot;&gt;results&lt;/code&gt; array — suitable for parsing in scripts, dashboards, or custom reporters.&lt;/p&gt;
&lt;div&gt;&lt;h3 id=&quot;sarif-github-code-scanning&quot;&gt;SARIF (GitHub Code Scanning)&lt;/h3&gt;&lt;/div&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;./scripts/lint-standards.sh&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;--format&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;sarif&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;results.sarif&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;SARIF 2.1.0 output maps WARN to &lt;code dir=&quot;auto&quot;&gt;warning&lt;/code&gt; and FAIL to &lt;code dir=&quot;auto&quot;&gt;error&lt;/code&gt;. Upload to GitHub Code Scanning to get inline annotations on pull requests:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;- &lt;/span&gt;&lt;span&gt;name&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;Run standards linter&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;run&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;./scripts/lint-standards.sh --format sarif &gt; standards.sarif || true&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;- &lt;/span&gt;&lt;span&gt;name&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;Upload SARIF&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;uses&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;github/codeql-action/upload-sarif@v3&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;with&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;sarif_file&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;standards.sarif&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;div&gt;&lt;h2 id=&quot;how-to-run&quot;&gt;How to run&lt;/h2&gt;&lt;/div&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;make&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;lint-standards&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;Or directly with a format flag:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;./scripts/lint-standards.sh&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;--format&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;json&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;./scripts/lint-standards.sh&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;--format&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;sarif&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;The linter exits with code &lt;code dir=&quot;auto&quot;&gt;1&lt;/code&gt; if any checks fail, making it CI-friendly as a blocking gate.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;adding-your-own-checks&quot;&gt;Adding your own checks&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;Drop a new executable &lt;code dir=&quot;auto&quot;&gt;*.sh&lt;/code&gt; script in &lt;code dir=&quot;auto&quot;&gt;scripts/lint-checks/common/&lt;/code&gt; or &lt;code dir=&quot;auto&quot;&gt;scripts/lint-checks/&amp;#x3C;language&gt;/&lt;/code&gt;. Follow the one-line output contract and the orchestrator picks it up automatically on the next run. Run &lt;code dir=&quot;auto&quot;&gt;make test-scripts&lt;/code&gt; to validate syntax before committing.&lt;/p&gt;
</content:encoded></item><item><title>Token-Efficient Agent Configs: 60% Smaller, Zero Traversal</title><link>https://coding-standards.c65llc.com/blog/token-efficient-agent-configs/</link><guid isPermaLink="true">https://coding-standards.c65llc.com/blog/token-efficient-agent-configs/</guid><pubDate>Wed, 25 Mar 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;AI coding agents are only as good as the context they’re given. Until now, our agent configs pointed agents into the standards submodule — references like “See &lt;code dir=&quot;auto&quot;&gt;standards/languages/lang-01_python_standards.md&lt;/code&gt;” meant a diligent agent might read 800-1,200+ lines of documentation per session, much of it irrelevant to the project at hand. A Python web service doesn’t need Rust, Swift, or Dart standards taking up context window space.&lt;/p&gt;
&lt;p&gt;We’ve rebuilt the entire agent configuration system around a simple idea: &lt;strong&gt;assemble one self-contained config per agent at setup time, with only the content that project actually needs.&lt;/strong&gt;&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;how-it-works&quot;&gt;How It Works&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;The setup script now assembles agent configs from three ingredients:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Base template&lt;/strong&gt; (~25-40 lines) — agent-specific behavioral rules. Cursor gets interaction modes and custom commands. Gemini gets the A-P-E workflow. Aider gets diff mode guidance. Each agent gets only what’s unique to how it works.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Content blocks&lt;/strong&gt; (~5-20 lines each) — atomic summaries of standards, stored in &lt;code dir=&quot;auto&quot;&gt;standards/shared/blocks/&lt;/code&gt;. Six common blocks (architecture, testing, security, naming, git, documentation) are always included. Language and role blocks are selected based on detection.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Language + role filtering&lt;/strong&gt; — &lt;code dir=&quot;auto&quot;&gt;detect-languages.sh&lt;/code&gt; identifies your project’s languages (13 supported, including Go and Elixir, with TypeScript, Rails, Java, and Kotlin sub-detection). You pick a project role (&lt;code dir=&quot;auto&quot;&gt;--role service|library|app|data-pipeline&lt;/code&gt;). Only relevant blocks are included.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;The result: a Python/TypeScript web service gets a ~130-line CLAUDE.md with everything the agent needs — no submodule traversal required.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;what-changed&quot;&gt;What Changed&lt;/h2&gt;&lt;/div&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Before&lt;/th&gt;
&lt;th&gt;After&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Agent reads 329-line config + traverses into 800+ lines of standards docs&lt;/td&gt;
&lt;td&gt;Agent reads one ~130-line self-contained file&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;All 13 language standards included regardless of project&lt;/td&gt;
&lt;td&gt;Only detected languages included&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Security rules duplicated across 6 agent configs&lt;/td&gt;
&lt;td&gt;Single &lt;code dir=&quot;auto&quot;&gt;security-summary.md&lt;/code&gt; block assembled into each&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;No &lt;code dir=&quot;auto&quot;&gt;.cursorrules&lt;/code&gt; template for consumer projects&lt;/td&gt;
&lt;td&gt;Full Cursor template with assembly support&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Codex used obsolete &lt;code dir=&quot;auto&quot;&gt;.codexrc&lt;/code&gt; format&lt;/td&gt;
&lt;td&gt;Migrated to &lt;code dir=&quot;auto&quot;&gt;AGENTS.md&lt;/code&gt; (current OpenAI Codex CLI)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;div&gt;&lt;h2 id=&quot;standards-cleanup&quot;&gt;Standards Cleanup&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;We also deduplicated the standards docs themselves:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;arch-01&lt;/strong&gt; reduced from 253 to ~30 lines (Sections 2-10 were verbatim copies of &lt;code dir=&quot;auto&quot;&gt;core-standards.md&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;arch-03&lt;/strong&gt; deleted entirely — content distributed to the Cursor base template and &lt;code dir=&quot;auto&quot;&gt;proc-04&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Banned-functions lists&lt;/strong&gt; removed from 8 language docs (now single source in &lt;code dir=&quot;auto&quot;&gt;sec-01&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Git aliases catalog&lt;/strong&gt; extracted from &lt;code dir=&quot;auto&quot;&gt;proc-02&lt;/code&gt; to a standalone reference doc&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;&lt;h2 id=&quot;all-six-agents-supported&quot;&gt;All Six Agents Supported&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;Every agent gets a purpose-built base template with platform-specific best practices:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Claude Code&lt;/strong&gt; — worktree conventions, key commands structure&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Cursor&lt;/strong&gt; — &lt;code dir=&quot;auto&quot;&gt;@new-feature&lt;/code&gt;/&lt;code dir=&quot;auto&quot;&gt;@refactor&lt;/code&gt;/&lt;code dir=&quot;auto&quot;&gt;@debug&lt;/code&gt;/&lt;code dir=&quot;auto&quot;&gt;@review&lt;/code&gt; modes, condensed custom commands&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;GitHub Copilot&lt;/strong&gt; — &lt;code dir=&quot;auto&quot;&gt;/explain&lt;/code&gt;, &lt;code dir=&quot;auto&quot;&gt;/fix&lt;/code&gt;, &lt;code dir=&quot;auto&quot;&gt;/tests&lt;/code&gt; guidance, code review behavior&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Gemini CLI&lt;/strong&gt; — Analyze-Plan-Execute workflow, checkpointing&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Aider&lt;/strong&gt; — two-file model (&lt;code dir=&quot;auto&quot;&gt;.aiderrc&lt;/code&gt; + &lt;code dir=&quot;auto&quot;&gt;.aider-instructions.md&lt;/code&gt;), diff mode guidance&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Codex&lt;/strong&gt; — new &lt;code dir=&quot;auto&quot;&gt;AGENTS.md&lt;/code&gt; format with sandbox awareness&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;&lt;h2 id=&quot;smart-sync-customizations-survive-updates&quot;&gt;Smart Sync: Customizations Survive Updates&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;A common worry with generated configs: what happens when you improve your CLAUDE.md with &lt;code dir=&quot;auto&quot;&gt;/claude-md-improver&lt;/code&gt; or add project-specific conventions, then sync pulls new standards? Before, your changes would be overwritten.&lt;/p&gt;
&lt;p&gt;Now, &lt;code dir=&quot;auto&quot;&gt;sync-standards&lt;/code&gt; uses &lt;strong&gt;checksum-based detection&lt;/strong&gt;. After assembling a config, the setup script records a SHA256 hash of the standards content. On the next sync, if the hash doesn’t match — meaning you’ve customized the file — the sync &lt;strong&gt;skips&lt;/strong&gt; that file and stages the update to &lt;code dir=&quot;auto&quot;&gt;.standards-pending/&lt;/code&gt; instead.&lt;/p&gt;
&lt;p&gt;To merge the pending update:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Claude Code:&lt;/strong&gt; Run &lt;code dir=&quot;auto&quot;&gt;/merge-standards&lt;/code&gt; — an included skill that reads both versions, merges section-by-section (updating standards rules while preserving your additions), and shows a diff for approval.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Any other agent:&lt;/strong&gt; Point it to &lt;code dir=&quot;auto&quot;&gt;.standards/docs/reference/merge-standards-prompt.md&lt;/code&gt; — the same merge instructions in a format any agent can follow.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This works for all six agent configs, not just CLAUDE.md. Customize your &lt;code dir=&quot;auto&quot;&gt;.cursorrules&lt;/code&gt; or &lt;code dir=&quot;auto&quot;&gt;GEMINI.md&lt;/code&gt; and they’ll be protected too.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;try-it&quot;&gt;Try It&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;Existing projects can pick up the new system by syncing their standards submodule:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;cd&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;.standards&lt;/span&gt;&lt;span&gt; &amp;#x26;&amp;#x26; &lt;/span&gt;&lt;span&gt;git&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;pull&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;./scripts/setup.sh&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;--role&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;service&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;The setup script detects your languages, assembles configs for all detected agents, and saves your selections to &lt;code dir=&quot;auto&quot;&gt;.standards-config&lt;/code&gt; for reproducible syncs.&lt;/p&gt;
&lt;p&gt;New projects get this automatically via the &lt;a href=&quot;https://coding-standards.c65llc.com/docs/getting-started/installation/&quot;&gt;standard install process&lt;/a&gt;.&lt;/p&gt;
</content:encoded></item><item><title>Eating Our Own Dogfood: A Compliance Audit</title><link>https://coding-standards.c65llc.com/blog/eating-our-own-dogfood/</link><guid isPermaLink="true">https://coding-standards.c65llc.com/blog/eating-our-own-dogfood/</guid><pubDate>Wed, 04 Mar 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;A coding standards repo that doesn’t follow its own standards is a bad look. We ran a compliance audit and fixed every gap we found.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;what-we-found&quot;&gt;What We Found&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;Our standards require several things that the repo itself was missing:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;proc-03 (Code Review)&lt;/strong&gt; requires a &lt;code dir=&quot;auto&quot;&gt;CODEOWNERS&lt;/code&gt; file — we didn’t have one&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;sec-01 (Security)&lt;/strong&gt; requires dependency scanning — no &lt;code dir=&quot;auto&quot;&gt;dependabot.yml&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;proc-01 (Documentation)&lt;/strong&gt; requires an ADR directory and README per package — missing for &lt;code dir=&quot;auto&quot;&gt;standards/&lt;/code&gt;, &lt;code dir=&quot;auto&quot;&gt;bin/&lt;/code&gt;, and the ADR directory entirely&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;sec-01&lt;/strong&gt; defines a P0/P1/P2 severity model — but our PR template had no security checklist&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Security standards&lt;/strong&gt; existed but weren’t synced to the website or shown in the sidebar&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;&lt;h2 id=&quot;what-we-fixed&quot;&gt;What We Fixed&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;New files:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code dir=&quot;auto&quot;&gt;.github/CODEOWNERS&lt;/code&gt; — all paths default to &lt;code dir=&quot;auto&quot;&gt;@c65llc&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code dir=&quot;auto&quot;&gt;.github/dependabot.yml&lt;/code&gt; — weekly scans for npm (website) and GitHub Actions&lt;/li&gt;
&lt;li&gt;&lt;code dir=&quot;auto&quot;&gt;docs/adr/0001-unified-standards-repository.md&lt;/code&gt; — documents the foundational decision&lt;/li&gt;
&lt;li&gt;&lt;code dir=&quot;auto&quot;&gt;standards/README.md&lt;/code&gt; and &lt;code dir=&quot;auto&quot;&gt;bin/README.md&lt;/code&gt; — package-level documentation&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Modified files:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;PR template now includes P0/P1/P2 security checkboxes&lt;/li&gt;
&lt;li&gt;Website sync script copies security standards with frontmatter injection&lt;/li&gt;
&lt;li&gt;Astro sidebar includes a Security section under Standards&lt;/li&gt;
&lt;li&gt;&lt;code dir=&quot;auto&quot;&gt;CHANGELOG.md&lt;/code&gt; restructured from one giant “Unreleased” block into proper versioned sections (0.1.0 through 0.5.0)&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;&lt;h2 id=&quot;the-blog-too&quot;&gt;The Blog, Too&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;While we were at it, we noticed the blog had exactly one post. A project that ships security frameworks, adds two languages, builds a CI-tested bootstrap system, and then audits itself for compliance has more than one thing to say. So we added four posts covering the release history.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;takeaway&quot;&gt;Takeaway&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;If you maintain standards, audit yourself first. It’s the fastest way to find gaps in your own documentation — and it builds credibility with the teams you’re asking to follow those standards.&lt;/p&gt;
</content:encoded></item><item><title>Language-Aware Bootstrap for Claude Code</title><link>https://coding-standards.c65llc.com/blog/language-aware-bootstrap/</link><guid isPermaLink="true">https://coding-standards.c65llc.com/blog/language-aware-bootstrap/</guid><pubDate>Tue, 03 Mar 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;The setup script now detects your project’s languages and generates a tailored Claude Code &lt;code dir=&quot;auto&quot;&gt;settings.json&lt;/code&gt; — no manual configuration needed.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;how-it-works&quot;&gt;How It Works&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;When you run &lt;code dir=&quot;auto&quot;&gt;setup.sh&lt;/code&gt;, the bootstrap system:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Scans your project&lt;/strong&gt; for language markers — &lt;code dir=&quot;auto&quot;&gt;*.py&lt;/code&gt;, &lt;code dir=&quot;auto&quot;&gt;Gemfile&lt;/code&gt;, &lt;code dir=&quot;auto&quot;&gt;package.json&lt;/code&gt;, &lt;code dir=&quot;auto&quot;&gt;Cargo.toml&lt;/code&gt;, &lt;code dir=&quot;auto&quot;&gt;*.swift&lt;/code&gt;, etc.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Maps languages to tools&lt;/strong&gt; — Python projects get &lt;code dir=&quot;auto&quot;&gt;ruff&lt;/code&gt;, &lt;code dir=&quot;auto&quot;&gt;pytest&lt;/code&gt;, &lt;code dir=&quot;auto&quot;&gt;mypy&lt;/code&gt;; Ruby projects get &lt;code dir=&quot;auto&quot;&gt;rubocop&lt;/code&gt;, &lt;code dir=&quot;auto&quot;&gt;rspec&lt;/code&gt;, &lt;code dir=&quot;auto&quot;&gt;brakeman&lt;/code&gt;; TypeScript gets &lt;code dir=&quot;auto&quot;&gt;eslint&lt;/code&gt;, &lt;code dir=&quot;auto&quot;&gt;vitest&lt;/code&gt;, &lt;code dir=&quot;auto&quot;&gt;tsc&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Generates &lt;code dir=&quot;auto&quot;&gt;settings.json&lt;/code&gt;&lt;/strong&gt; with the appropriate &lt;code dir=&quot;auto&quot;&gt;allowedTools&lt;/code&gt; configuration for Claude Code.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;The result: Claude Code can run your project’s linters, test runners, and formatters without you having to manually allowlist each tool.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;template-driven&quot;&gt;Template-Driven&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;The generation uses a base template with language-specific tool blocks injected dynamically. This means the core settings (permissions, MCP servers, etc.) stay consistent while tool access adapts to the project.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;ci-test-infrastructure&quot;&gt;CI Test Infrastructure&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;We added functional tests that validate the bootstrap pipeline:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Language detection tests&lt;/strong&gt; — verify that each file type maps to the correct language&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Settings generation tests&lt;/strong&gt; — confirm the output JSON is valid and contains expected tool entries&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Round-trip tests&lt;/strong&gt; — run setup on mock projects and validate the generated config&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;These run in CI on every PR that touches the setup scripts.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;try-it&quot;&gt;Try It&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;Update your standards submodule and re-run setup:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;cd&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;.standards&lt;/span&gt;&lt;span&gt; &amp;#x26;&amp;#x26; &lt;/span&gt;&lt;span&gt;git&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;pull&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;origin&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;main&lt;/span&gt;&lt;span&gt; &amp;#x26;&amp;#x26; &lt;/span&gt;&lt;span&gt;cd&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;..&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;make&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;setup&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;Your &lt;code dir=&quot;auto&quot;&gt;settings.json&lt;/code&gt; will be regenerated with language-appropriate tooling.&lt;/p&gt;
</content:encoded></item><item><title>P0-P2 Security Standards: Severity-Driven Code Review</title><link>https://coding-standards.c65llc.com/blog/security-standards/</link><guid isPermaLink="true">https://coding-standards.c65llc.com/blog/security-standards/</guid><pubDate>Tue, 03 Mar 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;We’ve added a comprehensive security standards framework to Coding Standards, built around a severity model that makes security findings actionable in code review.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;the-p0-p2-model&quot;&gt;The P0-P2 Model&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;Not all security issues are equal. Our framework assigns every rule a severity level:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;P0 (Critical)&lt;/strong&gt; — SQL injection, command injection, hardcoded secrets. These &lt;strong&gt;block merge immediately&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;P1 (High)&lt;/strong&gt; — Missing auth checks, insecure deserialization, XSS. Also &lt;strong&gt;merge-blocking&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;P2 (Medium)&lt;/strong&gt; — Missing rate limiting, verbose error messages, weak TLS config. Flagged as &lt;strong&gt;warnings&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This gives reviewers a clear decision framework: P0/P1 means “stop and fix,” P2 means “track and address.”&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;eight-security-categories&quot;&gt;Eight Security Categories&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;The standard covers eight areas:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Injection Prevention&lt;/strong&gt; — SQL, command, XSS, SSRF, template injection&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Authentication &amp;#x26; Authorization&lt;/strong&gt; — session management, access control&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Secrets Management&lt;/strong&gt; — hardcoded credential detection, vault usage&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Dangerous Functions&lt;/strong&gt; — &lt;code dir=&quot;auto&quot;&gt;eval()&lt;/code&gt;, &lt;code dir=&quot;auto&quot;&gt;exec()&lt;/code&gt;, insecure deserialization&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Dependency Security&lt;/strong&gt; — CVE scanning, lock files, supply chain&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Configuration Security&lt;/strong&gt; — TLS, security headers, debug mode&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Data Protection&lt;/strong&gt; — PII in logs, encryption at rest/in transit&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;SAST Tooling&lt;/strong&gt; — per-language static analysis and dependency scanning&lt;/li&gt;
&lt;/ol&gt;
&lt;div&gt;&lt;h2 id=&quot;language-specific-tooling&quot;&gt;Language-Specific Tooling&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;Every language standard now includes a security section with recommended SAST tools. For example:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Language&lt;/th&gt;
&lt;th&gt;SAST&lt;/th&gt;
&lt;th&gt;Dependency Scanner&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Python&lt;/td&gt;
&lt;td&gt;Bandit, Semgrep&lt;/td&gt;
&lt;td&gt;pip-audit, Safety&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Ruby&lt;/td&gt;
&lt;td&gt;Brakeman&lt;/td&gt;
&lt;td&gt;bundler-audit&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;TypeScript&lt;/td&gt;
&lt;td&gt;ESLint security plugins&lt;/td&gt;
&lt;td&gt;npm audit&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Rust&lt;/td&gt;
&lt;td&gt;cargo-audit&lt;/td&gt;
&lt;td&gt;cargo-deny&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;div&gt;&lt;h2 id=&quot;integrated-everywhere&quot;&gt;Integrated Everywhere&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;Security rules are baked into every AI agent config — Cursor, Copilot, Claude Code, Codex, and Gemini all reference the same P0-P2 model. The code review standard (&lt;code dir=&quot;auto&quot;&gt;proc-03&lt;/code&gt;) includes a security checklist, and the PR template now has P0/P1/P2 checkboxes.&lt;/p&gt;
&lt;p&gt;See the full standard at &lt;a href=&quot;https://coding-standards.c65llc.com/standards/security/sec-01_security_standards/&quot;&gt;sec-01: Security Standards&lt;/a&gt;.&lt;/p&gt;
</content:encoded></item><item><title>Ruby and Rails Standards: Language 10</title><link>https://coding-standards.c65llc.com/blog/ruby-rails-standards/</link><guid isPermaLink="true">https://coding-standards.c65llc.com/blog/ruby-rails-standards/</guid><pubDate>Tue, 03 Mar 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Coding Standards now covers 10 languages with the addition of Ruby (including Rails-specific standards).&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;whats-new&quot;&gt;What’s New&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;Ruby standards&lt;/strong&gt; (&lt;code dir=&quot;auto&quot;&gt;lang-10&lt;/code&gt;) cover idiomatic Ruby patterns: method naming, block usage, exception handling, Sorbet/RBS typing, and RuboCop configuration. The standard follows community conventions — &lt;code dir=&quot;auto&quot;&gt;snake_case&lt;/code&gt; methods, &lt;code dir=&quot;auto&quot;&gt;?&lt;/code&gt; and &lt;code dir=&quot;auto&quot;&gt;!&lt;/code&gt; suffixes, frozen string literals.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Ruby on Rails standards&lt;/strong&gt; (&lt;code dir=&quot;auto&quot;&gt;lang-11&lt;/code&gt;) complement the base Ruby standard and address Rails-specific patterns: Active Record best practices, controller/service object boundaries, view helpers vs. presenters, Action Cable conventions, and Rails security (strong parameters, CSRF, SQL injection via Active Record).&lt;/p&gt;
&lt;p&gt;Both standards include security sections with Brakeman for SAST and bundler-audit for dependency scanning.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;file-numbering-restructure&quot;&gt;File Numbering Restructure&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;Adding Ruby required renumbering some existing standards to maintain alphabetical ordering within the &lt;code dir=&quot;auto&quot;&gt;lang-XX&lt;/code&gt; prefix scheme. The restructure keeps the numbering consistent and leaves room for future additions.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;coverage&quot;&gt;Coverage&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;With Ruby and Rails, the framework now covers:&lt;/p&gt;
&lt;p&gt;Python, Java, Kotlin, Swift, Dart, TypeScript, JavaScript, Rust, Zig, Ruby/Rails&lt;/p&gt;
&lt;p&gt;All 10 language standards share the same structure: naming conventions, architecture patterns, testing requirements, error handling, and a security section referencing the P0-P2 severity model.&lt;/p&gt;
&lt;p&gt;See the standards: &lt;a href=&quot;https://coding-standards.c65llc.com/standards/languages/lang-10_ruby_standards/&quot;&gt;Ruby&lt;/a&gt; | &lt;a href=&quot;https://coding-standards.c65llc.com/standards/languages/lang-11_ruby_on_rails_standards/&quot;&gt;Ruby on Rails&lt;/a&gt;&lt;/p&gt;
</content:encoded></item><item><title>Introducing Coding Standards: One Framework, Every AI Agent</title><link>https://coding-standards.c65llc.com/blog/welcome/</link><guid isPermaLink="true">https://coding-standards.c65llc.com/blog/welcome/</guid><pubDate>Mon, 02 Mar 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;We’re excited to announce the public release of Coding Standards — a unified framework that keeps every AI coding assistant on the same page.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;the-problem&quot;&gt;The Problem&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;Development teams today use multiple AI coding tools: Cursor, GitHub Copilot, Claude Code, OpenAI Codex, Gemini CLI. Each tool needs its own configuration, and without a shared source of truth, they generate inconsistent code.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;the-solution&quot;&gt;The Solution&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;Coding Standards provides a single repository of standards — covering 9 programming languages, Clean Architecture patterns, and development processes — that automatically syncs to every AI agent in your workflow.&lt;/p&gt;
&lt;p&gt;Install it in seconds:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;curl&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;-fsSL&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;https://raw.githubusercontent.com/c65llc/coding-standards/main/install.sh&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;|&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;bash&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;div&gt;&lt;h2 id=&quot;whats-included&quot;&gt;What’s Included&lt;/h2&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;9 language standards&lt;/strong&gt;: Python, Java, Kotlin, Swift, Dart, TypeScript, JavaScript, Rust, Zig&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;5 AI agent configs&lt;/strong&gt;: Cursor, Copilot, Claude Code/Aider, Codex, Gemini CLI&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Architecture standards&lt;/strong&gt;: Clean Architecture, SOLID principles, and more&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Process standards&lt;/strong&gt;: Git workflow, documentation, code review&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Automation&lt;/strong&gt;: One-command setup, auto-syncing git hooks, Make targets&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;&lt;h2 id=&quot;get-started&quot;&gt;Get Started&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;Check out the &lt;a href=&quot;https://coding-standards.c65llc.com/getting-started/quick-start/&quot;&gt;Quick Start guide&lt;/a&gt; to get up and running in 5 minutes, learn &lt;a href=&quot;https://coding-standards.c65llc.com/getting-started/how-it-works/&quot;&gt;how it works&lt;/a&gt; under the hood, or browse the &lt;a href=&quot;https://coding-standards.c65llc.com/getting-started/installation/&quot;&gt;full documentation&lt;/a&gt; for all installation options.&lt;/p&gt;
&lt;p&gt;We welcome feedback via &lt;a href=&quot;https://github.com/c65llc/coding-standards/issues&quot;&gt;GitHub Issues&lt;/a&gt;. If these standards don’t fit your team perfectly, &lt;a href=&quot;https://coding-standards.c65llc.com/guides/customization/&quot;&gt;fork the repo&lt;/a&gt; and customize them.&lt;/p&gt;
</content:encoded></item></channel></rss>