Skip to content

Latest commit

 

History

History
277 lines (256 loc) · 18.3 KB

CONTRIBUTING.md

File metadata and controls

277 lines (256 loc) · 18.3 KB

Contributing

Use a Conventional Commits pull-request title. Validate every JSON policy, run bin/validate, ShellCheck on every governance script, the publisher policy tests, and actionlint when workflows change. Review the dry-run publisher output before applying organization changes. Never commit the administrative token required by the manual publishing workflow. Package Actions-access grants that lack a documented public API belong in config/manual-settings.json; record stable package and repository IDs, grant only read access to consumer workflows, and preserve the package's existing visibility and source-repository association. Making a reusable package public requires a reviewed desired-state removal, explicit organization-owner authorization, anonymous immutable-digest verification, and removal of only the obsolete consumer grant; treat the visibility change as effectively irreversible. Manually provisioned GitHub Actions environments belong in the same inventory with a stable repository ID, exact branch policy and reviewer set, and variable and secret names only. Never commit their values, and provision them only after the workflow that uses them is merged and reviewed. GitHub Pages records likewise bind stable repository identity, the provider URL, HTTPS, the deployment environment, and an immutable marker in the owning workflow. Keep a pre-merge legacy source only as the verifier's explicit pending state, then activate the Actions source after that exact workflow lands.

Administrative Actions credentials require a value-free lifecycle entry in config/manual-settings.json. Record stable repository identity, secret scope and name, credential type and required scopes, consumers, accountable owner, verification and rotate-by dates, cadence, and the runbook. Never add value, token ID, authorization header, fixture secret, or recoverable credential material. Changes require credential-schema negative tests, the read-only bin/verify-manual-settings plan, and the documented manual and scheduled post-rotation checks.

Actions GitHub Apps require their own value-free inventory entry with stable App, installation, and repository IDs; exact permissions and event set; selected-repository verification; consumer paths; secret and variable names; accountable ownership; verification and rotation dates; and a runbook. Never store a private key, installation token, token response, or credential value. Changes require negative schema tests, read-only installation and metadata-name verification, and organization-owner confirmation of the exact selected repository set in GitHub's installation UI. Keep the App out of bypass lists, preserve read-only Actions defaults, and prove the consumer's disposable pull request receives ordinary checks without self-approval or self-merge.

External provider GitHub Apps use a separate value-free inventory entry with stable App, installation, and selected repository IDs; exact permissions and events; provider purpose and status producer; accountable review ownership; and a revocation runbook. Preserve every existing selected repository unless a separate reviewed retirement authorizes its removal, never select all repositories, and require organization-owner UI proof of the exact set when GitHub's administrative API cannot enumerate it. Provider tokens, account coordinates, and credential values do not belong in this repository.

Organization identity changes must preserve the exact public description and canonical website in config/organization.json, remain delta-aware in plan and apply modes, and include unchanged-state coverage. Keep the public profile in community-health/profile/README.md; never edit atrinik/.github directly. Public pins are stable-ID manual state in config/manual-settings.json. Verify their exact count, public/active identity, and order read-only through GraphQL, and document the organization-owner profile-settings step rather than using an undocumented mutation interface.

Synchronization authentication tests must distinguish readable from writable credentials, preserve exact CLI failure statuses, reject missing advertised classic-PAT scopes and write capabilities before mutation, and fail closed on GraphQL searches beyond GitHub's 1,000-result window.

Project synchronization health changes must preserve the separate monitoring path, the 90-minute freshness/failure contract, one marker-owned incident, and least-privilege alerting through GITHUB_TOKEN. Test fresh, stale, repeated failure, missing administration credential, trusted ownership, deduplication, recurrent-outage boundaries, and recovery paths. Do not imply that GitHub's best-effort cron is an exact 30-minute guarantee or that a monitor on GitHub Actions is external to GitHub's scheduler.

When changing organization issue forms, keep them compatible with GitHub's live validator: omit empty optional metadata and do not add a top-level type key while the live renderer rejects it. Keep form labels synchronized with config/planning.json type inference, and validate the Bug, Feature, and Task mappings before publishing.

Keep default-branch deletion and non-fast-forward rules non-bypassable during normal operation. Any organization-owner exception needed for GitHub's security-advisory lifecycle must remain isolated to an explicitly authorized window and must use pull-request-only bypass mode outside that window.

GitHub does not classify an advisory-level merge as a pull-request action. A specifically authorized Classic advisory merge window may therefore use organization-owner always bypass for the five Classic rules GitHub reports: deletion, non-fast-forward, linear history, the pull-request gate, and required CI. The reviewed rollback must empty config/advisory-merge-windows.json and be applied immediately after the advisory merge.

An advanced CodeQL inventory change must be coordinated with an open, review-ready workflow pull request in the target repository. Validate that the plan attaches the advanced-allowed security configuration before disabling default setup, and include the immediate workflow rerun and rollback owner in the deployment handoff.

An immutable-release inventory change stages desired state and must be activated only with a merged, qualified draft-first release workflow in every newly selected repository. Every registry upload must verify the actual source release is immutable. Ordinary workflow tokens cannot query administrative immutability settings; keep the supported source-release evidence boundary. Review the repository name and stable numeric ID, the exact organization selected set, owner-enforcement verification, and snapshot rollback tests. Merge the policy before requesting explicit authorization for bin/publish --apply; never deploy the setting from an unmerged policy branch.

Security publisher changes must test both real drift convergence and a fully converged rerun. The converged case must not update a security configuration, replace its default, or re-attach repositories, because attachment starts an asynchronous enablement event.

Do not require a new workflow context until that exact aggregate context has landed and passed on the protected branch. In particular, add Classic's CodeQL validation requirement only after its advanced workflow is merged; otherwise the required check would prevent the workflow pull request itself from merging.

Add a repository to the merge_queue inventory only after every one of its required checks reports on the merge_group event on its default branch. Keep 08 - Merge queue repository-owned, because GitHub rejects the rule in organization rulesets. Keep its parameters within GitHub's API ranges, and use the organization's only merge method. Queued repositories drop the up-to-date requirement from required CI and never require Dependency review. Merge-queue changes need schema negative tests and publisher tests for creation, a converged rerun, drift convergence, required CI that stays strict without a verified queue, retained foreign or modified rules, the identity and final-read fences before retirement, and install-before-relax and restore-before-retire ordering. They also need audit scenarios for a missing queue, parameter drift, organization ownership, strict drift, and a retained queue.

Maintenance-branch retirement removes the active entry from config/repositories.json and adds an immutable recovery record to config/retired-maintenance-branches.json. Validate the complete repository, then review the targeted bin/publish --retire-maintenance REPOSITORY/BRANCH output. It must contain exactly one planned mutation: the declared ruleset deletion. Merge the desired state before requesting explicit organization-owner authorization for --apply. Re-run the complete preflight after apply and again before separately authorized exact branch deletion; never combine either operation with tag, release, asset, default-branch, or unrelated policy changes.

Dependency review is advisory across all active repositories. Keep dependency_review: [] and activation.dependency_review: {} in config/security-merge-protection.json; do not add a required dependency-review context. Report on eligible ordinary pull-request runs without target-branch filters or a merge-group trigger. The workflow must exist on the relevant PR/merge revision; adding it on main does not automatically cover historical branches or authorize backports, retired-branch recreation, or additional supported maintenance lines. Keep low-through-critical vulnerability and license findings advisory, all dependency scopes, warn-only: true, license-check: true, summary comments, and step-level continue-on-error: true. License metadata is not compatibility certification; existing repository license compatibility rules still apply. Preserve per-PR/ref concurrency and the failure-report step. Operational errors remain nonblocking and visible; retain available reports, and state that vulnerability/license results are unknown when a report is absent. Fork/Dependabot comment denials warn and fall back to job summaries. Implementing agents must read the latest run and job summary for the current PR head before merge, even when an older bot comment exists. Fix actionable findings, or record explicit maintainer-accepted risk; inspect logs and explain missing reports rather than claiming a clean scan. This process adds no required human approvals or vulnerability CI barrier. Preserve ordinary required CI, CodeQL, SHA policy, and standard lock files without adding advisory or action-version catalogs. Retained generic hard-gate tooling must reject advisory producer evidence; it may retire only recognized owned old dependency gates through the existing fenced process.

CodeQL merge controls use repository-level rules in both publisher scopes. Keep CodeQL targets and activation entries in config/security-merge-protection.json aligned with required_ci and preserve ordinary aggregates. New CodeQL gates require successful current-head analyses, including required languages. Record successful initial qualification in the policy PR and promote the CodeQL gate's activation entry from pending to enforced through source review before its first live installation. Pending publication only probes readiness. Enforced intent survives missing rules and later producer failures, allowing restoration without fresh initial proof; it does not claim live installation success. Remove activation entries with retired targets, preserving exact owned-rule rollback. Re-read the exact security-rule payload after the repository metadata fence immediately before deletion, retaining concurrent modifications. Audit retained named security rules on non-target repositories as drift regardless of their enforcement or ref applicability. For an existing repository-owned 03 - Required CI rule, also record exact repository and ruleset IDs and its prior contexts in config/retired-required-ci.json. Validate retained/modified/foreign rules and fresh identity checks; keep records for idempotent retirement. Missing provenance must retain the rule. Tests must cover missing/failed producers, unreadable evidence, archived targets, language unions, both scopes, and zero security mutations on a converged rerun. SHA enforcement must remain pending until an ordinary action-update canary proves successful PR-bound current-head CI without an allowlist edit and the persistent rollout source is promoted to enforced with that accepted PR. Later disabled enforcement is drift, not pending rollout; ordinary publication revalidates the recorded proof before restoring it. Test rule retirement, effective default-branch applicability, and repository workflow permission overrides. Action allowances use owner/action wildcards; full commit pins belong in workflows, not redundant version assertions. Canary legacy-check absence requires verified protection evidence; bare or ambiguous 404 responses fail closed. Publisher identity and absence decisions require a complete validated ruleset inventory across all pages, including retirement and ordinary repository/organization rules.

Advanced CodeQL readiness must validate executable YAML wiring from classifier invocation and outputs through the dynamic analysis matrix, scoped generated configuration, official full-SHA CodeQL actions, and the unconditional aggregate. Require the live default branch's ordinary pull-request trigger without path filters, including opened, synchronize and reopened events. Use the existing validation dependency with duplicate-key rejection. Test comments-only markers, disconnected inputs, disabled or failure-suppressed steps, checkout revision drift, and ambiguous YAML; preserve full-SHA updates, formatting changes, additional partitions, and category renames. Classification path semantics remain in trusted producer helpers; do not add a central source-path or action-version catalog or claim resistance to malicious repository writers.

Security gate updates must re-read and validate ownership and the recognized payload immediately before PUT, preserving concurrent modifications. Bind the final metadata default branch to the branch used for pending-gate qualification or existing effective-gate proof; a changed branch must not activate a gate. Pending existing-gate proof requires unchanged enforcement and ref applicability in the final rule read; enforced intent retains recognized restoration. Audit legacy protection on active default and maintenance branches as drift under the canonical ruleset contract; distinguish verified unprotected responses from unreadable evidence, and never remove protection during audit. Compare the complete effective default and maintenance branch policy with declared allowed rule types and parameters; additional undeclared integrity or restriction types are drift. The exact repository-disabled REST response may use the fixed read-only GraphQL fallback; require matching repository identity and branch, active state and an explicit null legacy-rule association. Errors and missing or conflicting fields fail closed; preserve unrelated historical rules.

Crates.io publication contracts bind exact repository/workflow/environment and official auth-action identities with full immutable workflow SHA references; preserve the reviewed rust-lang/crates-io-auth-action@* allowance for normal Dependabot updates without a central version lock. Automatic publication follows reviewed source/version merges with zero environment reviewers/wait and no registry secrets. Keep pending onboarding distinct from observed source/environment and owner-observed external registration; verify live protected main and exact refs. First owner-local API-token bootstrap is restricted to the seven listed toolkit libraries and ends with revocation; subsequent releases use OIDC only. Protocol 0.2 retains its approved manual path. Crate publication must qualify both exact-main workflows, isolate inert source signing from build/semantic-release OIDC, and keep automatic verify permissions read-only. The inert publisher alone adds contents write for the global crate/version upload intent and receives its intent token only in the upload step. Runtime certificate/source-run verification and create-only reservation readback precede upload. Reject matrix/reusable execution in the automatic verify/publish and source package/sign/release jobs; recursively reject step references outside the exact upload-token input and confirmation condition. An existing/ambiguous intent blocks absent-version retries and is never automatically reset. Activate immutable-release policy only through the documented narrow snapshot/readback/verified-rollback window; do not broad-apply unrelated publisher-plan mutations. Broad apply must qualify newly added live producer selections before its first mutation, with observed inventory and fresh scoped source/environment checks. Initial independently qualified draft-first code is sufficient for setup; actual immutable public release and registry proof remain later runtime obligations. Dependency-update App setup is client only, exact contents/PR write and metadata read, repository credential names only, registry readiness before owned PR creation, and ordinary review/checks without auto-merge. Distinguish observed installation and credential-name provisioning from pending reviewed workflow activation and real successful-owned-PR proof; owner-authorized early setup does not prove effective secret values. Inventory exact workflow consumer paths, observed key creation/verification dates, rotation owner, and a deadline within 90 days of key creation; that internal deadline does not assert upstream expiry. Verify a replacement key in the owning writing workflow before revoking the old key. Keep App-authenticated selected-set readback or owner UI evidence, and do not infer the webhook switch from an empty event set. A selected-set change after that readback stays pending re-verification until a later readback is recorded. An owner-accepted key exposure stays until the key rotates and never extends the rotate-by deadline; both records pin the exact editor transfer. Private linux-build consumption needs separate client-only read grants through owner UI. Keep exact private package/source identities and pending grant state until observed; metadata and owner pulls do not prove an effective owning workflow pull. Preserve foreign grants and visibility. Changes require negative schema and live-metadata fixture tests plus a complete publisher plan; publishers do not provision these integrations.