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

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
28 changes: 14 additions & 14 deletions .bestpractices.json
Original file line number Diff line number Diff line change
Expand Up @@ -39,8 +39,8 @@
"version_semver_justification": "The repository does not publish versioned releases or use SemVer/CalVer version numbers, relying solely on Git commit identifiers (GitHub repository settings read 2026-11-01: 0 releases and 0 tags).",
"version_tags_status": "Unmet",
"version_tags_justification": "The repository does not contain Git tags identifying releases (GitHub repository settings read 2026-11-01: 0 tags; git tag produces no output).",
"release_notes_status": "Unmet",
"release_notes_justification": "No release has been published, so no release notes exist (repository releases: 0, tags: 0, read 2026-11-01). N/A does not apply: the community health files are reused by every repository in the organisation.",
"release_notes_status": "N/A",
"release_notes_justification": "N/A: the repository publishes no releases (0 releases, 0 tags, read 2026-11-08) because nothing consumes a release. GitHub serves the organisation profile and community health files from the default branch, and the reusable label workflow is called at @main and fetches labels.yml from main, so the files are continuously updated and deployed to one place, the case this criterion allows N/A for. Evidence: https://github.com/golusoris/.github/blob/main/.github/workflows/sync-labels.yml",
"release_notes_vulns_status": "N/A",
"release_notes_vulns_justification": "No release notes exist and no publicly known run-time vulnerabilities have been reported for this repository (GitHub repository settings read 2026-11-01: dependabot open: 0, releases: 0).",
"report_process_status": "Met",
Expand All @@ -65,18 +65,18 @@
"build_common_tools_justification": "No build toolchain is required to use the files in this repository (Makefile: build target is not applicable).",
"build_floss_tools_status": "N/A",
"build_floss_tools_justification": "No build tools are needed to use this repository's profile and configuration files (Makefile: build target is not applicable).",
"test_status": "Unmet",
"test_justification": "The repository contains no automated software test suite, as it holds organisation profile and community health files only (Makefile test target prints 'test: not applicable: no project code').",
"test_invocation_status": "Unmet",
"test_invocation_justification": "No software test suite is present to invoke in this repository (Makefile declares test not applicable).",
"test_status": "Met",
"test_justification": "An automated test suite under tests/ (Python unittest) checks the files the repository publishes: labels.yml against the format EndBug/label-sync reads, the .bestpractices.json answers, and the relative links of the rendered Markdown files, each with planted-defect and boundary cases. Evidence: https://github.com/golusoris/.github/tree/main/tests",
"test_invocation_status": "Met",
"test_invocation_justification": "make test runs the suite in tests/ with the standard command python3 -B -m unittest discover -s tests -t . -v, and make verify-all runs it with the other checks. Evidence: https://github.com/golusoris/.github/blob/main/Makefile",
"test_most_status": "Unmet",
"test_most_justification": "No automated test suite or code coverage measurement exists for this repository (Makefile declares test not applicable).",
"test_continuous_integration_status": "Unmet",
"test_continuous_integration_justification": "CI runs REUSE lint (.github/workflows/reuse.yml) and OpenSSF Scorecard (.github/workflows/scorecard.yml) on pushes and pull requests to main, but neither runs an automated test suite, and the repository has none.",
"test_policy_status": "Unmet",
"test_policy_justification": "No policy requiring automated tests for new functionality is defined in CONTRIBUTING.md or repository documentation, as the repository holds community files and profile documentation rather than executable software.",
"tests_are_added_status": "Unmet",
"tests_are_added_justification": "No automated tests are added with changes in the repository (git log shows commits modifying configuration and documentation without accompanying tests).",
"test_most_justification": "The suite in tests/ checks every published data file and every rendered Markdown file, but coverage is not measured: no coverage tool runs, so no figure is claimed. Evidence: https://github.com/golusoris/.github/blob/main/Makefile",
"test_continuous_integration_status": "Met",
"test_continuous_integration_justification": "The Tests workflow runs make test (tests/) on every pull request, on main and in the merge queue. Evidence: https://github.com/golusoris/.github/blob/main/.github/workflows/test.yml",
"test_policy_status": "Met",
"test_policy_justification": "README.md states the test policy: a change that adds a published file, or a rule for one, adds a test to tests/ in the same pull request with a passing case, a refused planted defect and the boundary between them, and a fix adds a test that fails without it. Evidence: https://github.com/golusoris/.github/blob/main/README.md#tests",
"tests_are_added_status": "Met",
"tests_are_added_justification": "Pull request 12 added the suite in tests/ together with a passing, a planted-defect and a boundary test for every check it introduced, and the README test policy requires the same of every later change. Evidence: https://github.com/golusoris/.github/pull/12",
"tests_documented_added_status": "Unmet",
"tests_documented_added_justification": "Instructions for change proposals in CONTRIBUTING.md do not document a policy requiring automated tests.",
"warnings_status": "Met",
Expand Down Expand Up @@ -130,7 +130,7 @@
"dynamic_analysis_unsafe_status": "N/A",
"dynamic_analysis_unsafe_justification": "The repository does not produce software written in a memory-unsafe language, containing only Markdown documentation, YAML configuration, and shell/python governance scripts.",
"dynamic_analysis_enable_assertions_status": "Unmet",
"dynamic_analysis_enable_assertions_justification": "No dynamic analysis or automated test suite is run for this repository (Makefile declares test not applicable).",
"dynamic_analysis_enable_assertions_justification": "No dynamic analysis tool runs; the suite in tests/ checks data and Markdown files, not executable software, so no run-time assertions apply. Evidence: https://github.com/golusoris/.github/blob/main/Makefile",
"dynamic_analysis_fixed_status": "N/A",
"dynamic_analysis_fixed_justification": "No dynamic analysis is run for this repository and consequently no vulnerabilities have been discovered via dynamic analysis (Makefile)."
}
9 changes: 9 additions & 0 deletions .config/tests/requirements.in
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
# SPDX-FileCopyrightText: 2026 lusoris <lusoris@pm.me>
#
# SPDX-License-Identifier: EUPL-1.2

# Test-suite dependency: tests/ parse labels.yml with PyYAML.
PyYAML

# Test-suite dependency: tests/ parse Markdown links with markdown-it-py.
markdown-it-py
85 changes: 85 additions & 0 deletions .config/tests/requirements.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,85 @@
# This file was autogenerated by uv via the following command:
# uv pip compile --universal --generate-hashes --python-version=3.10 .config/tests/requirements.in --output-file=.config/tests/requirements.txt
markdown-it-py==4.2.0 \
--hash=sha256:04a21681d6fbb623de53f6f364d352309d4094dd4194040a10fd51833e418d49 \
--hash=sha256:9f7ebbcd14fe59494226453aed97c1070d83f8d24b6fc3a3bcf9a38092641c4a
# via -r .config/tests/requirements.in
mdurl==0.1.2 \
--hash=sha256:84008a41e51615a49fc9966191ff91509e3c40b939176e643fd50a5c2196b8f8 \
--hash=sha256:bb413d29f5eea38f31dd4754dd7377d4465116fb207585f97bf925588687c1ba
# via markdown-it-py
pyyaml==6.0.3 \
--hash=sha256:00c4bdeba853cc34e7dd471f16b4114f4162dc03e6b7afcc2128711f0eca823c \
--hash=sha256:0150219816b6a1fa26fb4699fb7daa9caf09eb1999f3b70fb6e786805e80375a \
--hash=sha256:02893d100e99e03eda1c8fd5c441d8c60103fd175728e23e431db1b589cf5ab3 \
--hash=sha256:02ea2dfa234451bbb8772601d7b8e426c2bfa197136796224e50e35a78777956 \
--hash=sha256:0f29edc409a6392443abf94b9cf89ce99889a1dd5376d94316ae5145dfedd5d6 \
--hash=sha256:10892704fc220243f5305762e276552a0395f7beb4dbf9b14ec8fd43b57f126c \
--hash=sha256:16249ee61e95f858e83976573de0f5b2893b3677ba71c9dd36b9cf8be9ac6d65 \
--hash=sha256:1d37d57ad971609cf3c53ba6a7e365e40660e3be0e5175fa9f2365a379d6095a \
--hash=sha256:1ebe39cb5fc479422b83de611d14e2c0d3bb2a18bbcb01f229ab3cfbd8fee7a0 \
--hash=sha256:214ed4befebe12df36bcc8bc2b64b396ca31be9304b8f59e25c11cf94a4c033b \
--hash=sha256:2283a07e2c21a2aa78d9c4442724ec1eb15f5e42a723b99cb3d822d48f5f7ad1 \
--hash=sha256:22ba7cfcad58ef3ecddc7ed1db3409af68d023b7f940da23c6c2a1890976eda6 \
--hash=sha256:27c0abcb4a5dac13684a37f76e701e054692a9b2d3064b70f5e4eb54810553d7 \
--hash=sha256:28c8d926f98f432f88adc23edf2e6d4921ac26fb084b028c733d01868d19007e \
--hash=sha256:2e71d11abed7344e42a8849600193d15b6def118602c4c176f748e4583246007 \
--hash=sha256:34d5fcd24b8445fadc33f9cf348c1047101756fd760b4dacb5c3e99755703310 \
--hash=sha256:37503bfbfc9d2c40b344d06b2199cf0e96e97957ab1c1b546fd4f87e53e5d3e4 \
--hash=sha256:3c5677e12444c15717b902a5798264fa7909e41153cdf9ef7ad571b704a63dd9 \
--hash=sha256:3ff07ec89bae51176c0549bc4c63aa6202991da2d9a6129d7aef7f1407d3f295 \
--hash=sha256:41715c910c881bc081f1e8872880d3c650acf13dfa8214bad49ed4cede7c34ea \
--hash=sha256:418cf3f2111bc80e0933b2cd8cd04f286338bb88bdc7bc8e6dd775ebde60b5e0 \
--hash=sha256:44edc647873928551a01e7a563d7452ccdebee747728c1080d881d68af7b997e \
--hash=sha256:4a2e8cebe2ff6ab7d1050ecd59c25d4c8bd7e6f400f5f82b96557ac0abafd0ac \
--hash=sha256:4ad1906908f2f5ae4e5a8ddfce73c320c2a1429ec52eafd27138b7f1cbe341c9 \
--hash=sha256:501a031947e3a9025ed4405a168e6ef5ae3126c59f90ce0cd6f2bfc477be31b7 \
--hash=sha256:5190d403f121660ce8d1d2c1bb2ef1bd05b5f68533fc5c2ea899bd15f4399b35 \
--hash=sha256:5498cd1645aa724a7c71c8f378eb29ebe23da2fc0d7a08071d89469bf1d2defb \
--hash=sha256:5cf4e27da7e3fbed4d6c3d8e797387aaad68102272f8f9752883bc32d61cb87b \
--hash=sha256:5e0b74767e5f8c593e8c9b5912019159ed0533c70051e9cce3e8b6aa699fcd69 \
--hash=sha256:5ed875a24292240029e4483f9d4a4b8a1ae08843b9c54f43fcc11e404532a8a5 \
--hash=sha256:5fcd34e47f6e0b794d17de1b4ff496c00986e1c83f7ab2fb8fcfe9616ff7477b \
--hash=sha256:5fdec68f91a0c6739b380c83b951e2c72ac0197ace422360e6d5a959d8d97b2c \
--hash=sha256:6344df0d5755a2c9a276d4473ae6b90647e216ab4757f8426893b5dd2ac3f369 \
--hash=sha256:64386e5e707d03a7e172c0701abfb7e10f0fb753ee1d773128192742712a98fd \
--hash=sha256:652cb6edd41e718550aad172851962662ff2681490a8a711af6a4d288dd96824 \
--hash=sha256:66291b10affd76d76f54fad28e22e51719ef9ba22b29e1d7d03d6777a9174198 \
--hash=sha256:66e1674c3ef6f541c35191caae2d429b967b99e02040f5ba928632d9a7f0f065 \
--hash=sha256:6adc77889b628398debc7b65c073bcb99c4a0237b248cacaf3fe8a557563ef6c \
--hash=sha256:79005a0d97d5ddabfeeea4cf676af11e647e41d81c9a7722a193022accdb6b7c \
--hash=sha256:7c6610def4f163542a622a73fb39f534f8c101d690126992300bf3207eab9764 \
--hash=sha256:7f047e29dcae44602496db43be01ad42fc6f1cc0d8cd6c83d342306c32270196 \
--hash=sha256:8098f252adfa6c80ab48096053f512f2321f0b998f98150cea9bd23d83e1467b \
--hash=sha256:850774a7879607d3a6f50d36d04f00ee69e7fc816450e5f7e58d7f17f1ae5c00 \
--hash=sha256:8d1fab6bb153a416f9aeb4b8763bc0f22a5586065f86f7664fc23339fc1c1fac \
--hash=sha256:8da9669d359f02c0b91ccc01cac4a67f16afec0dac22c2ad09f46bee0697eba8 \
--hash=sha256:8dc52c23056b9ddd46818a57b78404882310fb473d63f17b07d5c40421e47f8e \
--hash=sha256:9149cad251584d5fb4981be1ecde53a1ca46c891a79788c0df828d2f166bda28 \
--hash=sha256:93dda82c9c22deb0a405ea4dc5f2d0cda384168e466364dec6255b293923b2f3 \
--hash=sha256:96b533f0e99f6579b3d4d4995707cf36df9100d67e0c8303a0c55b27b5f99bc5 \
--hash=sha256:9c57bb8c96f6d1808c030b1687b9b5fb476abaa47f0db9c0101f5e9f394e97f4 \
--hash=sha256:9c7708761fccb9397fe64bbc0395abcae8c4bf7b0eac081e12b809bf47700d0b \
--hash=sha256:9f3bfb4965eb874431221a3ff3fdcddc7e74e3b07799e0e84ca4a0f867d449bf \
--hash=sha256:a33284e20b78bd4a18c8c2282d549d10bc8408a2a7ff57653c0cf0b9be0afce5 \
--hash=sha256:a80cb027f6b349846a3bf6d73b5e95e782175e52f22108cfa17876aaeff93702 \
--hash=sha256:b30236e45cf30d2b8e7b3e85881719e98507abed1011bf463a8fa23e9c3e98a8 \
--hash=sha256:b3bc83488de33889877a0f2543ade9f70c67d66d9ebb4ac959502e12de895788 \
--hash=sha256:b865addae83924361678b652338317d1bd7e79b1f4596f96b96c77a5a34b34da \
--hash=sha256:b8bb0864c5a28024fac8a632c443c87c5aa6f215c0b126c449ae1a150412f31d \
--hash=sha256:ba1cc08a7ccde2d2ec775841541641e4548226580ab850948cbfda66a1befcdc \
--hash=sha256:bdb2c67c6c1390b63c6ff89f210c8fd09d9a1217a465701eac7316313c915e4c \
--hash=sha256:c1ff362665ae507275af2853520967820d9124984e0f7466736aea23d8611fba \
--hash=sha256:c2514fceb77bc5e7a2f7adfaa1feb2fb311607c9cb518dbc378688ec73d8292f \
--hash=sha256:c3355370a2c156cffb25e876646f149d5d68f5e0a3ce86a5084dd0b64a994917 \
--hash=sha256:c458b6d084f9b935061bc36216e8a69a7e293a2f1e68bf956dcd9e6cbcd143f5 \
--hash=sha256:d0eae10f8159e8fdad514efdc92d74fd8d682c933a6dd088030f3834bc8e6b26 \
--hash=sha256:d76623373421df22fb4cf8817020cbb7ef15c725b9d5e45f17e189bfc384190f \
--hash=sha256:ebc55a14a21cb14062aa4162f906cd962b28e2e9ea38f9b4391244cd8de4ae0b \
--hash=sha256:eda16858a3cab07b80edaf74336ece1f986ba330fdb8ee0d6c0d68fe82bc96be \
--hash=sha256:ee2922902c45ae8ccada2c5b501ab86c36525b883eff4255313a253a3160861c \
--hash=sha256:efd7b85f94a6f21e4932043973a7ba2613b059c4a000551892ac9f1d11f5baf3 \
--hash=sha256:f7057c9a337546edc7973c0d3ba84ddcdf0daa14533c2065749c9075001090e6 \
--hash=sha256:fa160448684b4e94d80416c0fa4aac48967a969efe22931448d853ada8baf926 \
--hash=sha256:fc09d0aa354569bc501d4e787133afc08552722d3ab34836a80547331bb5d4a0
# via -r .config/tests/requirements.in
3 changes: 3 additions & 0 deletions .github/rulesets/main.json
Original file line number Diff line number Diff line change
Expand Up @@ -55,6 +55,9 @@
},
{
"context": "Scorecard Analysis"
},
{
"context": "make test"
}
],
"strict_required_status_checks_policy": true
Expand Down
50 changes: 50 additions & 0 deletions .github/workflows/test.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@
---
# Test suite: runs make test (tests/) on every pull request, on main and in
# the merge queue. The suite checks labels.yml, .bestpractices.json and the
# relative links of the rendered Markdown files.
name: Tests

'on':
pull_request:
types: [opened, synchronize, reopened, ready_for_review]
push:
branches: ['main']
merge_group:
Comment thread
sourcery-ai[bot] marked this conversation as resolved.
Resolved
concurrency:
group: ${{ github.workflow }}-${{ github.event.number || github.run_id }}
cancel-in-progress: ${{ github.event_name == 'pull_request' }}

permissions:
contents: read

jobs:
test:
name: make test
Comment thread
sourcery-ai[bot] marked this conversation as resolved.
Resolved
runs-on: ubuntu-26.04
timeout-minutes: 10
steps:
- name: Stop on a draft pull request
if: github.event.pull_request.draft == true
shell: bash
env:
TITLE: Gate not run on a draft
MESSAGE: >-
The gate did not run because the pull request is a draft.
It runs when the pull request is marked ready for review.
run: |
echo "::error title=$TITLE::$MESSAGE"
echo "$MESSAGE" >> "$GITHUB_STEP_SUMMARY"
exit 1
- name: Check out the source
if: github.event.pull_request.draft != true
# yamllint disable-line rule:line-length
uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
with:
persist-credentials: false
- name: make test
if: github.event.pull_request.draft != true
run: |
python3 -m venv "$RUNNER_TEMP/tests"
"$RUNNER_TEMP/tests/bin/python" -m pip install \
--require-hashes -r .config/tests/requirements.txt
make test PYTHON="$RUNNER_TEMP/tests/bin/python"
6 changes: 3 additions & 3 deletions .paperclip/harness.json
Original file line number Diff line number Diff line change
Expand Up @@ -11,10 +11,10 @@
],
"push_format": "git push origin HEAD:refs/heads/paperclip/\u003cissue-id\u003e",
"invariants": [
"HISS-01: recursion prohibited; call graph = DAG; Go, C/C++: zero `goto`",
"HISS-02: scalar upper bound on every loop; explicit deadline on every I/O call; Go: I/O takes `context.Context` deadline",
"HISS-01: recursion prohibited; call graph = DAG",
"HISS-02: scalar upper bound on every loop; explicit deadline on every I/O call",
"HISS-04: McCabe cyclomatic \u003c= 15, cognitive \u003c= 20, statements \u003c= 75; func LOC \u003c= 60 (audit ceiling)",
"HISS-07: every error handled or wrapped with context; Go: zero unchecked `error` return; Rust: zero `.unwrap()` / `.expect()` outside tests",
"HISS-07: every error handled or wrapped with context",
"HISS-10: zero warnings: compiler, linter, format sweeps",
"HISS-15: positive + negative + boundary tests, every public interface",
"HISS-16: single canonical `AGENTS.md`; vendor files compiled via `praetorctl compile-context`"
Expand Down
8 changes: 3 additions & 5 deletions .paperclip/rules.md
Original file line number Diff line number Diff line change
Expand Up @@ -22,13 +22,11 @@ git push origin HEAD:refs/heads/paperclip/<issue-id>

## High-Integrity Invariants

- HISS-01: recursion prohibited; call graph = DAG; Go, C/C++: zero `goto`
- HISS-02: scalar upper bound on every loop; explicit deadline on every I/O
call; Go: I/O takes `context.Context` deadline
- HISS-01: recursion prohibited; call graph = DAG
- HISS-02: scalar upper bound on every loop; explicit deadline on every I/O call
- HISS-04: McCabe cyclomatic <= 15, cognitive <= 20, statements <= 75; func
LOC <= 60 (audit ceiling)
- HISS-07: every error handled or wrapped with context; Go: zero unchecked
`error` return; Rust: zero `.unwrap()` / `.expect()` outside tests
- HISS-07: every error handled or wrapped with context
- HISS-10: zero warnings: compiler, linter, format sweeps
- HISS-15: positive + negative + boundary tests, every public interface
- HISS-16: single canonical `AGENTS.md`; vendor files compiled via `praetorctl
Expand Down
2 changes: 1 addition & 1 deletion .standards.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,7 @@ register:
sources:
expected: 13
sha256:
sha256:bae7c17912f7d873769ddeae9dce1cf267e94eedd838228a219463bf5cb35efa
sha256:ac76ac78e354aa8628cf74916271fef35ec9de2af6244ce254ee449ffabd121e
inputs:
- path: .paperclip/harness.json
surface: prompts
Expand Down
8 changes: 6 additions & 2 deletions Makefile
Original file line number Diff line number Diff line change
@@ -1,7 +1,11 @@
# Generated by Praetor from declared project commands; execution is unverified.
# Generated by Praetor from declared project commands. The test target runs the
# repository's own suite under tests/; praetorctl adopt keeps a custom recipe.
-include .config/praetor/engine.mk
# Praetor ships one binary under two names; resolve whichever is installed.
PRAETORCTL ?= $(shell command -v praetorctl 2>/dev/null || command -v standardsctl 2>/dev/null || echo praetorctl)
# The suite needs Python 3.10 or later with PyYAML and markdown-it-py
# (.config/tests/requirements.txt).
PYTHON ?= python3
.PHONY: all verify-all compile-context compile-context-verify caveman-sources audit build test

all: build
Expand All @@ -21,7 +25,7 @@ audit:
@$(PRAETORCTL) audit

test: build
@printf '%s\n' 'test: not applicable: no project code; verify-all checks the agent context (compile-context-verify), the caveman sources and the audit.'
@$(PYTHON) -B -m unittest discover -s tests -t . -v

build:
@printf '%s\n' 'build: not applicable: this repository holds organisation profile and community files only; nothing compiles.'
Loading