Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
47 commits
Select commit Hold shift + click to select a range
71ba4ae
docs(standards): add organization health defaults
scttbnsn Aug 13, 2026
22feaaa
ci(greptile): require manual review requests (#11)
scttbnsn Aug 14, 2026
932eb95
chore(sync): reconcile main before promotion
scttbnsn Aug 14, 2026
bc5ab59
ci(workflows): add reusable CI foundation (#13)
scttbnsn Aug 14, 2026
5ee1885
chore(sync): reconcile main before promotion
scttbnsn Aug 14, 2026
16a6680
feat(quality): standardize long-run reporting (#15)
scttbnsn Aug 14, 2026
cd3c68f
chore(sync): reconcile main before promotion
scttbnsn Aug 14, 2026
99a7a99
fix(quality): enforce report contract boundaries
scttbnsn Aug 14, 2026
9a5362a
fix(quality): decode reports as utf-8
scttbnsn Aug 14, 2026
a39c5bd
test(quality): pin fixture encoding
scttbnsn Aug 14, 2026
7be30f3
ci(profile): make asset generation read-only (#10)
scttbnsn Aug 14, 2026
55c58e8
ci(review): add deduplicated Greptile summon (#9)
scttbnsn Aug 14, 2026
e30a84d
chore(sync): reconcile main before promotion
scttbnsn Aug 14, 2026
6e7a78d
ci(workflows): add run-test and run-lint toggles to go-ci (#19)
scttbnsn Aug 16, 2026
f347593
chore(sync): reconcile main before promotion
scttbnsn Aug 16, 2026
04ad251
ci(workflows): add module-directory input to node-ci (#22)
scttbnsn Aug 16, 2026
67d152a
chore(sync): reconcile main before promotion
scttbnsn Aug 16, 2026
7f9be8b
docs(onboarding): record the qlty alignment baseline (#24)
scttbnsn Aug 16, 2026
922de8f
chore(sync): reconcile main before promotion
scttbnsn Aug 16, 2026
f4c1d50
docs(onboarding): align with the codified standards registry (#26)
scttbnsn Aug 16, 2026
e211199
chore(sync): reconcile main before promotion
scttbnsn Aug 16, 2026
5ac2e3f
chore(repo): meet our own onboarding checklist (#28)
scttbnsn Aug 16, 2026
5bc5208
chore(sync): reconcile main before promotion
scttbnsn Aug 16, 2026
30d6b13
docs(community): org-default code of conduct + community checklist (#30)
scttbnsn Aug 17, 2026
3e80630
chore(sync): reconcile main before promotion
scttbnsn Aug 17, 2026
dd74a99
feat(workflows): add the shared star-chart refresh reusable workflow …
scttbnsn Aug 20, 2026
82f48ca
chore(sync): reconcile main before promotion
scttbnsn Aug 20, 2026
79801af
Main-is-released check, and the codified star-chart shape (#34)
scttbnsn Aug 21, 2026
e2c03ba
chore(sync): reconcile main before promotion
scttbnsn Aug 21, 2026
58c1fd4
fix(workflows): close three shared-workflow defects (#36)
scttbnsn Aug 21, 2026
22d2706
chore(sync): reconcile main before promotion
scttbnsn Aug 21, 2026
0dd3d77
chore: gitignore .claude/ so a nested worktree can't be staged as a g…
scttbnsn Aug 27, 2026
54f1b86
fix(starchart): the documented dispatch step needs actions:write (#39)
scttbnsn Aug 27, 2026
0151d3e
chore(renovate): tidy go.sum after a gomod update (#40)
scttbnsn Aug 27, 2026
759794f
chore(sync): reconcile main before promotion
scttbnsn Aug 27, 2026
eb74985
chore(renovate): move the vite ecosystem as one group (#42)
scttbnsn Aug 27, 2026
d2120bc
chore(sync): reconcile main before promotion
scttbnsn Aug 27, 2026
eddc1af
chore(renovate): scope Portwing lock maintenance exception (#44)
scttbnsn Aug 30, 2026
5d4b724
chore(sync): reconcile main before promotion
scttbnsn Aug 30, 2026
d0f3e5b
fix(renovate): scope lock maintenance to npm
scttbnsn Aug 30, 2026
0aa77c2
docs(onboarding): add the .planning/ gitignore checkbox (#46)
scttbnsn Sep 7, 2026
495a52a
chore(sync): reconcile main before promotion
scttbnsn Sep 7, 2026
49a5982
fix(quality): isolate validation and pace hosted work (#48)
scttbnsn Oct 25, 2026
6bc2e35
chore(sync): reconcile main before promotion
scttbnsn Oct 25, 2026
2684d4d
chore(renovate): target dev/repository-standards (#50)
scttbnsn Oct 26, 2026
488b322
docs(onboarding): align checklist with contextual guidance (#51)
scttbnsn Oct 26, 2026
aa8c2ad
chore(sync): reconcile main before promotion
scttbnsn Oct 26, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
11 changes: 11 additions & 0 deletions .github/tests/community_health_contract_test.py
Original file line number Diff line number Diff line change
Expand Up @@ -183,6 +183,17 @@ def test_standards_workflow_pins_actions_and_runs_every_contract(self):
):
self.assertIn(expected, workflow)

def test_local_validation_runs_every_ci_contract_suite(self):
pattern = r"(?m)^[ \t]*python3[ \t]+\.github/tests/([A-Za-z0-9_]+_test\.py)[ \t]*$"
ci = set(re.findall(
pattern, self.read_text(".github/workflows/standards-validation.yml"),
))
local = set(re.findall(pattern, self.read_text("scripts/validate.sh")))
present = {path.name for path in (ROOT / ".github/tests").glob("*_test.py")}

self.assertEqual(ci, local)
self.assertEqual(present, ci)

def test_zizmor_action_owns_its_supported_cli_version(self):
workflow = self.read_text(".github/workflows/standards-validation.yml")
zizmor_step = workflow.split(
Expand Down
25 changes: 21 additions & 4 deletions .github/tests/tracked_validation_test.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
from pathlib import Path
import os
import subprocess
import sys
import tempfile
Expand All @@ -9,14 +10,21 @@
VALIDATOR = ROOT / "scripts/validate_tracked_files.py"


def git_env():
names = subprocess.check_output(
["git", "rev-parse", "--local-env-vars"], text=True,
).split()
return {key: value for key, value in os.environ.items() if key not in names}


class TrackedValidationTest(unittest.TestCase):
def setUp(self):
self.temp = tempfile.TemporaryDirectory(prefix="tracked-validation-")
self.addCleanup(self.temp.cleanup)
self.repo = Path(self.temp.name)
subprocess.run(
["git", "init", "--quiet", str(self.repo)], check=True,
capture_output=True,
capture_output=True, env=git_env(),
)
self.write(".gitignore", ".planning/\n.claude/\n__pycache__/\n", tracked=True)

Expand All @@ -27,13 +35,13 @@ def write(self, name, content, tracked=False):
if tracked:
subprocess.run(
["git", "add", "--", name], cwd=self.repo, check=True,
capture_output=True,
capture_output=True, env=git_env(),
)

def run_validation(self, kind):
def run_validation(self, kind, env=None):
return subprocess.run(
[sys.executable, str(VALIDATOR), kind], cwd=self.repo,
capture_output=True, text=True, timeout=60,
capture_output=True, text=True, timeout=60, env=env,
)

def assert_valid(self, kind):
Expand Down Expand Up @@ -92,6 +100,15 @@ def test_profile_keeps_its_separate_rules(self):
self.write("profile/README.md", "<div>Profile</div> \n", tracked=True)
self.assert_invalid("markdown", "MD009")

def test_repo_local_git_environment_is_ignored(self):
self.write(".github/bad.json", "{broken", tracked=True)
env = {**os.environ, "GIT_INDEX_FILE": str(self.repo / "bogus-index")}
result = self.run_validation("data", env=env)
self.assertNotEqual(0, result.returncode, result.stdout + result.stderr)
self.assertIn("JSONDecodeError", result.stdout + result.stderr)
self.write(".github/bad.json", '{"ok": true}\n', tracked=True)
self.assertEqual(0, self.run_validation("data", env=env).returncode)

def test_empty_tracked_input_sets_succeed(self):
for kind in ("python", "data", "markdown"):
with self.subTest(kind=kind):
Expand Down
2 changes: 2 additions & 0 deletions .github/workflows/main-is-released.yml
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,8 @@ name: Main Is Released
# permissions: {}
# jobs:
# released:
# permissions:
# contents: read # A reusable workflow cannot raise its caller's grant.
# uses: CodesWhat/.github/.github/workflows/main-is-released.yml@<full SHA>
#
# Continuously deployed repositories that never tag (a website, a meta repo)
Expand Down
21 changes: 13 additions & 8 deletions AGENTS.md
Original file line number Diff line number Diff line change
Expand Up @@ -25,21 +25,26 @@ contract tests that pin the shapes other repositories depend on.
with safe defaults, never repurpose an existing input, and let consumers
adopt by rolling their pin deliberately.
- PRs target `dev/repository-standards`. `main` advances only through
promotion PRs. Reconcile before promoting:
promotion PRs. Before reconciling, account for released content:
`git log --oneline origin/dev/repository-standards..origin/main` should list
only the previous promotion's squash commit. Any other commit is content that
landed on `main` directly; forward-port it to dev through a normal reviewed PR
first, because the `ours` merge keeps dev's tree and silently drops it. Then
reconcile:
`git merge -s ours origin/main -m "chore(sync): reconcile main before promotion"`.
Verify promotions with tree equality
(`git diff --quiet origin/main origin/dev/repository-standards`), never
commit ancestry.
- Admit new hosted review/heavy CI work through the shared capacity roster.
Keep preparation local while queued. After admission, add `review-ready` for
the first CodeRabbit review; request subsequent fix-batch reviews explicitly.
- There is no shared admission queue; pace hosted review and heavy CI with
the maintainer directly. Add `review-ready` for a PR's first CodeRabbit
review and request subsequent fix-batch reviews explicitly.
Freeze pushes while review runs, read its output and verify the covered head.
`.coderabbit.yaml` keeps default/dev targets but disables automatic review on
ordinary pushes. Required review and protection remain effective.
- Approve ordinary dependency updates in the Renovate dashboard only after
admission. This repo's wrapper limits ordinary PRs/branches to one at a time
and one new PR per hour. The shared preset is unchanged; urgent vulnerability
updates keep their separate handling.
- Approve ordinary dependency updates in the Renovate dashboard one at a time.
This repo's wrapper targets `dev/repository-standards` and limits ordinary
PRs/branches to one at a time and one new PR per hour. The shared preset is
unchanged; urgent vulnerability updates keep their separate handling.
- Commits are plain Conventional Commits, `<type>(scope): <description>`,
no emoji, no AI attribution trailers.
- Never weaken branch protection or rulesets to land a change.
Expand Down
Loading
Loading