Repository settings (lead maintainer)#
Some parts of the project infrastructure are account-level settings that no file in the
repository can make: they have to be clicked by an owner of the dyng-dev organization. This
page lists every such setting, in the order in which they should be made, each with the exact
click path (GitHub web interface as of September 2026; GitHub occasionally renames an entry, and
each section links the GitHub documentation). PLAN Sections 8.8, 8.9 and 10.1 define what is
required; Appendix E and GOVERNANCE.md record the decisions.
“Settings” always means the repository settings of dyng-dev/dyng
(dyng-dev/dyng) unless the step says organization settings
(organizations/dyng-dev).
Checklist#
“Done” means applied by the lead maintainer (through the GitHub API, 2026-09-27) and checked
against the read-only API on 2026-09-28 (gh api repos/dyng-dev/dyng, its actions/permissions,
rulesets, environments and security endpoints, and gh api orgs/dyng-dev). The state of
2026-09-30 (the DCO check required, the signing key) and of 2026-10-01 (M5 merged, the 24
required checks, pypa/cibuildwheel on the Actions allow-list), of 2026-10-02 (the environments
and pending publishers of the CUDA plugins), of 2026-10-06 (GitHub Pages), of 2026-10-07 (M6b
merged, the first Pages deployment, the website, the 27 required checks) and of 2026-10-09 (the
plugins’ trusted publishers re-created on TestPyPI and checked on PyPI) was reported by the
author or the orchestrator and is recorded in the approvals log of GOVERNANCE.md.
# |
Setting |
When |
Status |
|---|---|---|---|
1 |
Organization: two-factor authentication, base permissions |
now |
done (2FA required, base permission Read; the optional restriction of repository creation, 1.3, is not set) |
2 |
About: description, website, topics |
now |
done (description and the 14 topics); the website |
3 |
Features: Issues, Discussions, no wiki |
now |
done (Issues and Discussions on; wiki and projects off) |
4 |
Pull requests: merge commits only (ADR 0019, amended 2026-10-14) |
now |
done; squash merging turned off by the author’s decision of 2026-10-14 (applied through the API) |
5 |
Actions: permissions, SHA pinning, fork approval |
now |
done (allow-list, |
6 |
Security: private vulnerability reporting, Dependabot, secret scanning |
now |
done (private vulnerability reporting; Dependabot alerts and security updates; secret scanning with push protection; CodeQL, optional, not set up) |
7 |
The DCO app and web sign-off |
now |
done (DCO app installed on |
8 |
Labels |
after the M4 merge |
pending: the |
9 |
Ruleset for |
after every required workflow has run once on a pull request |
done after pull request #1 (INT1, merged with the merge commit |
10 |
Ruleset for release tags |
now |
done ( |
11 |
Environments |
now |
done ( |
11b |
Environments of the CUDA plugins |
before the first |
done: the pending trusted publishers of |
12 |
Discussions: categories and the pinned roadmap |
after step 3 |
open (the default categories, Polls included; no pinned roadmap yet) |
13 |
GitHub Pages: the documentation site (the plan’s fallback to Read the Docs, chosen by the author on 2026-10-02) |
before the M6b pull request ( |
done by the author on 2026-10-06 (source GitHub Actions, https://dyng-dev.github.io/dyng/, HTTPS enforced; GitHub created the environment |
14 |
Zenodo |
later: checkpoint A4, milestone M6 (PLAN 11.2); not connected for 0.1.0, so 0.1.0 has no DOI (the author, 2026-10-01; section 14) |
later |
1. Organization security#
PLAN Section 10.1 requires two-factor authentication for the organization.
Organization settings → sidebar Security → Authentication security → tick Require two-factor authentication for everyone in the dyng-dev organization → Save. (Members without 2FA are removed, so enable 2FA on your own account first: your avatar → Settings → Password and authentication.)
Organization settings → sidebar Access → Member privileges → Base permissions: Read (members get write access per repository, through teams or invitations).
Organization settings → Member privileges → Repository creation: untick Public and Private (only owners create repositories).
Docs: https://docs.github.com/en/organizations/keeping-your-organization-secure.
2. About: description, website, topics#
Open dyng-dev/dyng. In the right column, click the gear icon next to About.
Description:
Dynamic graph and hypergraph algorithms on GPUs: keep shortest paths, cycle counts, triads and labels up to date under batch updates (C++17/CUDA, OpenMP; Python planned).Website:
https://dyng-dev.github.io/dyng/(the documentation site, step 13; tick Use your GitHub Pages website once Pages is enabled, which fills in the same address).Topics (type each and press Enter):
dynamic-graphs,graph-algorithms,hypergraphs,gpu,cuda,openmp,cpp17,hpc,shortest-paths,cycle-counting,label-propagation,graph-analytics,batch-updates,python.Under Include in the home page, keep Releases ticked; untick Packages and Deployments (the PyPI environment deployments would otherwise be shown).
Save changes.
The citation button (“Cite this repository”) appears automatically from CITATION.cff; the
security policy, Code of Conduct, contributing guide and support file are detected from the
root files (check the Insights → Community standards page: every item should be ticked).
3. Features: Issues, Discussions, wiki#
Settings → General → section Features:
Wikis: untick (the documentation lives in
docs/).Issues: keep ticked. The issue forms and
config.ymlin.github/ISSUE_TEMPLATE/are used automatically.Sponsorships: leave unticked.
Discussions: tick, then click Set up discussions. GitHub opens a draft welcome post: write two sentences (what dynG is, where the roadmap is, that questions go here) and click Start discussion. The categories are set in step 12.
Projects: optional (untick if not used).
4. Pull requests: merge commits only#
Since 2026-10-14 (the author’s decision, GOVERNANCE.md approvals log; ADR 0019’s
amendment): every pull request is merged with a merge commit; Allow squash merging and
Allow rebase merging are off (allow_squash_merge and allow_rebase_merge false in
gh api repos/dyng-dev/dyng), and the main ruleset allows the merge method Merge alone
(step 9). The decision followed the squash merge of M8a (pull request #14, 2de6ebe). Until
then, the settings below applied, with squash merging on for external contributions; to apply
today’s settings, untick Allow squash merging in item 2.
Until 2026-10-14:
The merge policy (ADR 0019, GOVERNANCE.md): pull requests of milestone and integration
work are merged with a merge commit, so the commit SHAs that parity certificates,
retrospectives and ADRs cite stay reachable from main; external contributions are
squash-merged, and their title (Conventional Commits) becomes the commit subject; rebase
merging is disabled. (This replaces the plan’s “squash merges only”, PLAN Section 8.9.)
Settings → General → section Pull Requests:
Tick Allow merge commits; Default commit message: Pull request title and description.
Tick Allow squash merging; Default commit message: Pull request title and description.
Untick Allow rebase merging.
Tick Always suggest updating pull request branches.
Tick Allow auto-merge (optional; merges once the required checks pass).
Tick Automatically delete head branches.
Each change is saved immediately.
5. Actions#
Settings → sidebar Actions → General:
Actions permissions: select Allow dyng-dev, and select non-dyng-dev, actions and reusable workflows; tick Allow actions created by GitHub, untick Allow actions by Marketplace verified creators (least privilege: every other action is listed by name); in Allow specified actions and reusable workflows enter:
pypa/gh-action-pypi-publish@*, pypa/cibuildwheel@*, crazy-max/ghaction-github-labeler@*, mamba-org/setup-micromamba@*
(
pypa/cibuildwheelis new in M5, forwheels.yml; added to the setting by the maintainer through the API on 2026-09-30, before the M5 pull request ran.)and tick Require actions to be pinned to a full-length commit SHA (every workflow in
.github/workflows/already is; dependabot keeps the pins current). Save. When a workflow adds an action from another owner, add it to this list in the same pull request.Fork pull request workflows from outside collaborators: select Require approval for all external contributors (PLAN Sections 8.8 and 10.1). Save.
Workflow permissions: select Read repository contents and packages permissions, and untick Allow GitHub Actions to create and approve pull requests. Save. (Every workflow sets its own least-privilege
permissions:; jobs that need more, likelabels.ymlorrelease.yml, ask for it per job.)
6. Security#
Settings → sidebar section Security and quality → Advanced Security:
Private vulnerability reporting: click Enable (Appendix E, decision O13;
SECURITY.mdpoints reporters to it). Reporters then see Report a vulnerability on the repository’s Security tab.Dependency graph: on (always on for public repositories).
Dependabot alerts: Enable. Dependabot security updates: Enable. (Version updates are configured by
.github/dependabot.yml.)Secret Protection (free for public repositories): Enable, and Push protection: Enable.
Code scanning → CodeQL analysis: optional; Set up → Default → Enable CodeQL scans C/C++ without a build, Python and the workflows.
To receive the reports, make sure your notification settings deliver security alerts: your avatar → Settings → Notifications → Security alerts.
7. The DCO app and web sign-off#
External contributors sign off their commits (CONTRIBUTING.md); the DCO app checks every pull
request and reports a check named DCO. .github/dco.yml exempts members of dyng-dev.
Open apps/dco → Install (or Configure if it is installed elsewhere).
Choose the dyng-dev organization.
Select Only select repositories → choose dyng-dev/dyng → Install.
After the next pull request, the check DCO appears; add it to the required checks (step 9) once the maintainers’ membership of
dyng-devis public. The app exempts only public members (require.members: false), and only for signed commits, so a maintainer’s commits carry noSigned-off-byline but must be signed (SSH or GPG, with the key registered as a signing key on their GitHub account). Status (2026-09-30): done.DCOis a required check of themainruleset (id 24131378; the check’s source is the DCO app, integration id 1861), the 18th. The author’s membership is public (2026-09-29) and every commit of the maintainer is SSH-signed with the key “dynG commit signing”, registered as a signing key on the author’s account on 2026-09-29; the local repository signs automatically (commit.gpgsign=true,gpg.format=ssh). External contributors sign off (git commit -s), as CONTRIBUTING.md says.So that contributors who fix a typo in GitHub’s web editor pass the check: Settings → General → in the first section (below Template repository) tick Require contributors to sign off on web-based commits. GitHub then adds the
Signed-off-byline to every commit made in the web interface (CONTRIBUTING.md says so).
.github/dco.yml also allows remediation commits: a contributor who forgot the sign-off
during a review adds an empty signed-off commit instead of rewriting the branch
(CONTRIBUTING.md, “Fixing a missing sign-off”).
8. Labels#
.github/labels.yml defines the labels (docs/developer/labels.md). The labels workflow
applies it automatically on every push to main that changes the file, so after the M4 merge
the labels exist without any click. To apply it by hand: Actions tab → workflow labels
→ Run workflow → branch main → Run workflow. Do not edit labels in the web
interface: the next run resets listed labels to the file.
9. Ruleset for main#
PLAN Section 8.9: everything goes through a pull request and the required checks must be green; the merge methods follow ADR 0019 (merge commits for milestone and integration work, squash merges for contributions; since 2026-10-14, merge commits only, ADR 0019’s amendment). While the lead maintainer is the only maintainer, zero approvals are required (the author merges their own pull request once the checks pass); from the day a second maintainer exists, raise it to one.
Status: done (checked 2026-09-28; DCO added 2026-09-30; the M5 checks added 2026-10-01; the
sanitizer checks added 2026-10-07).
The ruleset main (id 24131378)
was created after pull request #1 (INT1, merged with the merge commit eda8b8b) had run every
workflow: pull request required (0 approvals, stale approvals dismissed, conversation resolution
required, merge methods merge and squash), the required checks of the table below (4 lint,
10 cpu (the 9 matrix jobs and scaffold), 3 cuda-build, 1 docs, 4 python, 1 api-check,
3 sanitizers and DCO: 27 in all; 17 at creation, 18 with DCO from 2026-09-30, 24 with
the M5 checks from 2026-10-01, 27 with the sanitizer checks from 2026-10-07) with Require branches to be up to date (strict), deletions and force pushes blocked. The Repository admin role is
on the bypass list in the mode For pull requests only: an administrator can merge a pull
request whose checks are not green, but cannot push to main directly. GitHub offers a
required check in the ruleset only after it has run in the last 7 days, which is why the
ruleset had to wait for the first pull request. The steps below record how it was made.
Settings → sidebar section Code and automation → Rules → Rulesets → New ruleset → New branch ruleset.
Ruleset name:
main. Enforcement status: Active.Bypass list: Add bypass → Repository admin → mode For pull requests only (see the note below).
Target branches → Add target → Include default branch.
Tick these rules:
Restrict deletions.
Leave Require linear history unticked: milestone merges are merge commits (ADR 0019).
Require a pull request before merging, and open its options:
Required approvals:
0now;1once there is a second maintainer.Dismiss stale pull request approvals when new commits are pushed: tick.
Require review from Code Owners: untick now; tick with the second maintainer.
Require approval of the most recent reviewable push: untick now; tick with the second maintainer.
Require conversation resolution before merging: tick.
Allowed merge methods: Merge and Squash (not Rebase); since 2026-10-14 Merge alone (the author’s decision;
allowed_merge_methods["merge"]).
Require status checks to pass, and open its options:
Require branches to be up to date before merging: tick.
Add checks → type each name below and pick the entry whose source is GitHub Actions (for DCO, the source is the DCO app).
Block force pushes.
Create.
Required checks (the job names as they appear in a pull request’s checks list):
Workflow |
Check names |
|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
DCO app (integration id 1861) |
|
Do not require checks of workflows that run only for some files (labels.yml;
wheels.yml, which runs on pull requests only when they touch the packaging or the library; fuzz.yml, only
when they touch a reader), only on tags (release.yml), only on some events (welcome.yml, the
first-interaction greeting) or only on a schedule (the external-links job of docs.yml,
property.yml): a required check that never runs blocks every pull request.
sanitizers.yml (M6b) runs on every pull request, so it can be required: the author decided on
2026-10-07 to require its three checks once they were green on pull request #10 (M6b), and the
ruleset has required them since then (24 -> 27; GOVERNANCE.md, approvals log).
When a workflow is added (python, api-check; PLAN Section 8.8), a job of the cpu matrix is
renamed, or a toolkit of the cuda-build matrix is bumped (its version is part of the check
name), update this list and the ruleset in the same pull request.
Note on bypassing. With the Repository admin role allowed to bypass for pull requests
only, nobody can push to main directly, including the organization owners: milestone and
integration work reaches main through pull requests, merged with a merge commit (ADR 0019;
the AI assistant can open them). The bypass only lets an administrator merge a pull request
whose required checks are not all green (for example when a hosted runner is down); record
every such merge in the pull request. An empty bypass list would remove that escape hatch; mode
Always allow would re-open direct pushes and must then be recorded in GOVERNANCE.md.
11. Environments pypi and testpypi#
Both environments exist (created for the name reservation, docs/developer/pypi_name_reservation.md);
their names are bound to the PyPI trusted publishers: never rename them.
Settings → sidebar Environments → pypi.
Deployment protection rules: tick Required reviewers → add SMShovan; leave Prevent self-review unticked while you are the only maintainer → Save protection rules. Every PyPI upload then waits for your approval in the workflow run (Review deployments → Approve and deploy).
Deployment branches and tags: select Selected branches and tags → Add deployment branch or tag rule → Ref type: Tag → Name pattern:
v*→ Add rule.Untick Allow administrators to bypass configured protection rules.
Back to Environments → testpypi: repeat step 3 (tag rule
v*); required reviewers are optional here (release candidates go to TestPyPI only).
The CUDA plugins (from 0.2.0; ADR 0032). PyPI does not accept two identical pending
publishers, so each plugin distribution publishes through its own environments (the author’s
decision of 2026-10-02, GOVERNANCE.md): release.yml publishes dyng-cu12 through
testpypi-cu12 and pypi-cu12, and dyng-cu13 through testpypi-cu13 and pypi-cu13. The
author registered the pending publishers on PyPI and TestPyPI on 2026-10-02 (project
dyng-cu12 with pypi-cu12 / testpypi-cu12, project dyng-cu13 with pypi-cu13 /
testpypi-cu13, repository dyng-dev/dyng, workflow release.yml); the maintainer created
the four environments through the API the same day with the rules of pypi / testpypi,
checked on 2026-10-06 (item 11b).
The publishers’ state (2026-10-09). The release run of v0.2.0rc1 (37871452302) failed twice
in the TestPyPI publish jobs of the plugins: attempt 1 with invalid-publisher (no TestPyPI
publisher matched the environments testpypi-cu12 / testpypi-cu13), attempt 2 with “400
Non-user identities cannot create new projects” (a publisher matched, but not one for the project
name dyng-cu12 / dyng-cu13). The author re-created both TestPyPI pending publishers (project
dyng-cu12 with environment testpypi-cu12, project dyng-cu13 with testpypi-cu13, workflow
release.yml, repository dyng-dev/dyng), and attempt 3 created the two projects on TestPyPI
with 0.2.0rc1, so their publishers are now ordinary (no longer pending) publishers. On PyPI the
author checked the pending publishers the same day (dyng-cu12 -> pypi-cu12, dyng-cu13 ->
pypi-cu13, workflow release.yml, repository dyng-dev/dyng): they match release.yml, and
the names stay unreserved until 0.2.0’s upload creates the projects (the author’s decision of
2026-10-09, GOVERNANCE.md). How such a failure is avoided and repaired: Release process, “If a
publish job fails”. To recreate the environments:
Environments → New environment (if GitHub has not created it at the first run) →
pypi-cu12→ steps 2 to 4 (required reviewer SMShovan, tag rulev*, no administrator bypass); the same forpypi-cu13.testpypi-cu12andtestpypi-cu13: step 3 (tag rulev*).
A final release with the plugins then waits for three approvals in two Review deployments
dialogs of the run, because publish-pypi (environment pypi) needs publish-pypi-plugins to
succeed first (ADR 0032 item 6): first pypi-cu12 and pypi-cu13, waiting together (the dialog
lists them with a checkbox each: tick both → Approve and deploy); then, once both plugins are
on PyPI, pypi alone, in a second dialog. Never rename the six environments.
12. Discussions: categories and the pinned roadmap#
Discussions tab → next to Categories, click the pencil icon.
Keep Announcements (maintainers only), General, Ideas, Q&A (answerable) and Show and tell; delete Polls if unused. Save after each change.
The public roadmap (PLAN Section 10.5): New discussion → category Announcements → title
dynG roadmap→ a short summary with a link todocs/roadmap.md→ Start discussion; then, in the discussion’s right column, Pin discussion → Pin discussion.
13. GitHub Pages: the documentation site#
Status: done. Steps 1 and 2 by the author on 2026-10-06 (source GitHub Actions, HTTPS
enforced; GitHub created the environment github-pages, deployable from main only); steps 3
and 4 on 2026-10-07, after the M6b merge (8b9067e): the first deployment (docs.yml run
37628205848) shows 0.2.0.dev0 with the development banner, and the repository website is set.
The documentation is hosted on GitHub Pages at https://dyng-dev.github.io/dyng/ (the
author’s decision of 2026-10-02, PLAN Appendix F: the plan’s fallback to Read the Docs; recorded
in GOVERNANCE.md). .github/workflows/docs.yml builds the site on every pull request and push;
on a push to main its deploy job publishes it with actions/configure-pages,
actions/upload-pages-artifact and actions/deploy-pages (no gh-pages branch, no Jekyll). The
deploy job alone has pages: write and id-token: write; it runs in the environment
github-pages. The actions are made by GitHub, so the Actions allow-list (step 5, Allow actions
created by GitHub) already admits them.
Settings → sidebar Pages → Build and deployment → Source: select GitHub Actions (not “Deploy from a branch”). Nothing else on the page needs a value: no custom domain; Enforce HTTPS is on for
github.ioaddresses.Settings → Environments → github-pages (GitHub creates it with step 1, or with the first deployment) → Deployment branches and tags: Selected branches and tags with the single rule
main(GitHub’s default for Pages; check it, and remove any other rule). No required reviewers: the site ofmainis published as soon as it is built.After the next push to
main: Actions → workflow docs → the run’sdeployjob shows the address; open it and check the home page and one algorithm page. The repository home page shows the deployment under Deployments only if that box is ticked (step 2, item 5: it is not).Set the repository website (step 2) to
https://dyng-dev.github.io/dyng/.
If a deployment fails with “Get Pages site failed” (configure-pages), step 1 was not made.
Read the Docs (the plan’s first choice, approval checkpoint A4) is not connected.
.readthedocs.yaml is kept and checked, so it can be added later for pull-request previews and
version switching without new work: https://app.readthedocs.org → Add project →
dyng-dev/dyng (the Read the Docs GitHub App on dyng-dev, Only select repositories) →
Settings → Pull request builds; record the decision in GOVERNANCE.md first.
14. Zenodo (later: checkpoint A4)#
A DOI per release (PLAN Section 10.4). Zenodo archives each GitHub Release (not a bare tag)
and takes the metadata from CITATION.cff.
Open https://zenodo.org → Log in → Log in with GitHub → authorize Zenodo.
Give Zenodo access to the organization: on GitHub, your avatar → Settings → Applications → Authorized OAuth Apps → Zenodo → under Organization access, click Grant next to dyng-dev.
On Zenodo: your account menu (top right) → GitHub → Sync now → find
dyng-dev/dyng→ switch it On.The next published GitHub Release (step 11 of Release process, created after the tag) is archived and gets a DOI. Add the DOI badge to
README.mdand thedoifield toCITATION.cffin the next pull request, and record A4 inGOVERNANCE.md.
Zenodo’s GitHub integration archives only the releases published after the repository is
switched on; it does not go back to earlier ones. 0.1.0 has no DOI: the author decided on
2026-10-01 not to connect Zenodo for 0.1.0 (GOVERNANCE.md, approvals log), so its GitHub
Release is not archived. Zenodo may be connected later (checkpoint A4, steps 1-3, planned with
M6, PLAN 11.2); the first DOI then comes with the first GitHub Release published after that
(0.1.1 or later), and each later release gets its own. Archiving 0.1.0 afterwards would need an
upload by hand (New upload, the release’s source archive and the metadata of
CITATION.cff), which would be a new decision of the author.
Docs: https://help.zenodo.org/docs/github/enable-repository/.