diff --git a/.github/workflows/ci.yml b/.github/workflows/validate-organization.yml
similarity index 91%
rename from .github/workflows/ci.yml
rename to .github/workflows/validate-organization.yml
index 5b01ab1..e57a002 100644
--- a/.github/workflows/ci.yml
+++ b/.github/workflows/validate-organization.yml
@@ -1,4 +1,5 @@
-name: CI
+name: Validate organization catalog and profile
+# Validate the catalog and generated profile, then request the member-profile refresh.
on: [push, pull_request, workflow_dispatch]
permissions: { contents: read }
jobs:
diff --git a/.github/workflows/verify.yml b/.github/workflows/verify-project.yml
similarity index 99%
rename from .github/workflows/verify.yml
rename to .github/workflows/verify-project.yml
index 01b2876..6b016e3 100644
--- a/.github/workflows/verify.yml
+++ b/.github/workflows/verify-project.yml
@@ -1,4 +1,5 @@
-name: Verify
+name: Reusable build, test and package verification
+# Reusable manifest-driven build, test, formatting and native-package verification.
on:
workflow_call:
permissions:
diff --git a/README.md b/README.md
index 172af7e..2cedbca 100644
--- a/README.md
+++ b/README.md
@@ -66,7 +66,7 @@ path is included because that workflow is delivered here.
## Shared Verify
-`.github/workflows/verify.yml` remains `workflow_call`-only and read-only. The
+`.github/workflows/verify-project.yml` remains `workflow_call`-only and read-only. The
manifest is the single authority for build options; the catalog holds identity.
Preparation validates the manifest before selecting the C++ container or native
Python matrix. The canonical caller uses only `workflow_dispatch`: full
@@ -116,7 +116,7 @@ files against existing repository formatting policies. Documentation and present
### Shared Verify updates
-The five product callers and `templates/ci.yml` use `verify.yml@main`, following the API-verified default branch of this control repository. A merged shared-workflow change is used by their next manually started CI runs; it does not start those runs. Callers pass no secrets unless Verify actually reads one (currently none). Product CI remains `workflow_dispatch`-only, independent of version-tag package pipelines.
+The five product callers and `templates/build-and-test.yml` use `verify-project.yml@main`, following the API-verified default branch of this control repository. A merged shared-workflow change is used by their next manually started CI runs; it does not start those runs. Callers pass no secrets unless Verify actually reads one (currently none). Product CI remains `workflow_dispatch`-only, independent of version-tag package pipelines.
Existing tags are historical snapshots and are never moved. Page-header, menu and profile generation are separate from build CI; documentation changes require neither a Verify release nor caller updates. `docs-audit` is optional local/PR review tooling and is never a build, signing or publication gate.
diff --git a/profile/README.md b/profile/README.md
index c141b71..0a9d77e 100644
--- a/profile/README.md
+++ b/profile/README.md
@@ -34,10 +34,10 @@ SNodeC builds event-driven networking in C++. At its centre is [SNode.C](https:/
| Project | What it is for | Status |
| --- | --- | --- |
-| **[SNode.C](https://github.com/SNodeC/snode.c#project-overview)** | Write networked programs and your own protocols in C++: event-driven, with HTTP, WebSocket, SSE and MQTT
[Quick start](https://github.com/SNodeC/snode.c#quick-start) · [Install](https://github.com/SNodeC/snode.c#install) · [Releases](https://github.com/SNodeC/snode.c/releases) | [](https://github.com/SNodeC/snode.c/actions/workflows/ci.yml) |
-| **[MQTTSuite](https://github.com/SNodeC/mqttsuite#project-overview)** | Run an MQTT broker, translate topics, bridge brokers and store messages
[Quick start](https://github.com/SNodeC/mqttsuite#quick-start) · [Install](https://github.com/SNodeC/mqttsuite#install) · [Releases](https://github.com/SNodeC/mqttsuite/releases) | [](https://github.com/SNodeC/mqttsuite/actions/workflows/ci.yml) |
-| **[AISuite](https://github.com/SNodeC/AISuite#project-overview)** | Connect applications to coding agents: asynchronous C++ and TypeScript
[Quick start](https://github.com/SNodeC/AISuite#quick-start) · [Install](https://github.com/SNodeC/AISuite#install) | [](https://github.com/SNodeC/AISuite/actions/workflows/ci.yml) |
-| **[Codex(W)UI](https://github.com/SNodeC/CodexUI#project-overview)** | Follow a coding agent's work in a native Qt or browser workspace
[Quick start](https://github.com/SNodeC/CodexUI#quick-start) · [Install](https://github.com/SNodeC/CodexUI#install) | [](https://github.com/SNodeC/CodexUI/actions/workflows/ci.yml) |
+| **[SNode.C](https://github.com/SNodeC/snode.c#project-overview)** | Write networked programs and your own protocols in C++: event-driven, with HTTP, WebSocket, SSE and MQTT
[Quick start](https://github.com/SNodeC/snode.c#quick-start) · [Install](https://github.com/SNodeC/snode.c#install) · [Releases](https://github.com/SNodeC/snode.c/releases) | [](https://github.com/SNodeC/snode.c/actions/workflows/build-and-test.yml) |
+| **[MQTTSuite](https://github.com/SNodeC/mqttsuite#project-overview)** | Run an MQTT broker, translate topics, bridge brokers and store messages
[Quick start](https://github.com/SNodeC/mqttsuite#quick-start) · [Install](https://github.com/SNodeC/mqttsuite#install) · [Releases](https://github.com/SNodeC/mqttsuite/releases) | [](https://github.com/SNodeC/mqttsuite/actions/workflows/build-and-test.yml) |
+| **[AISuite](https://github.com/SNodeC/AISuite#project-overview)** | Connect applications to coding agents: asynchronous C++ and TypeScript
[Quick start](https://github.com/SNodeC/AISuite#quick-start) · [Install](https://github.com/SNodeC/AISuite#install) | [](https://github.com/SNodeC/AISuite/actions/workflows/build-and-test.yml) |
+| **[Codex(W)UI](https://github.com/SNodeC/CodexUI#project-overview)** | Follow a coding agent's work in a native Qt or browser workspace
[Quick start](https://github.com/SNodeC/CodexUI#quick-start) · [Install](https://github.com/SNodeC/CodexUI#install) | [](https://github.com/SNodeC/CodexUI/actions/workflows/build-and-qualify.yml) |
| **[SNode.C-idp](https://github.com/SNodeC/snode.c-idp)** | SNode.C Identity Provider: OAuth2 and OpenID Connect with TOTP multi-factor authentication | |
## Install
diff --git a/profile/github-metadata.json b/profile/github-metadata.json
index 229415a..1796a3a 100644
--- a/profile/github-metadata.json
+++ b/profile/github-metadata.json
@@ -1,18 +1,18 @@
{
".github": {
"default_branch": "main",
- "workflow": ".github/workflows/ci.yml"
+ "workflow": ".github/workflows/validate-organization.yml"
},
"AISuite": {
"default_branch": "master",
"readme_anchor": "project-overview",
- "source_commit": "2ca800516b45eba7f5fb2c055adebfe7c53ee51f",
- "workflow": ".github/workflows/ci.yml"
+ "source_commit": "45bbc477546bca8055575c17cebbb16db7bb24be",
+ "workflow": ".github/workflows/build-and-test.yml"
},
"AutoTalk": {
"default_branch": "main",
- "source_commit": "36ab5fb80b029e6ecaf292353c0b6ff9f9ca6671",
- "workflow": ".github/workflows/ci.yml"
+ "source_commit": "cef28ba531e25116ed7b5557886b9d88867f61d2",
+ "workflow": ".github/workflows/test-and-package.yml"
},
"CLI11": {
"default_branch": "main",
@@ -22,13 +22,13 @@
"CodexUI": {
"default_branch": "master",
"readme_anchor": "project-overview",
- "source_commit": "292d45a616daabc32a58fc4742dfb82657d0d107",
- "workflow": ".github/workflows/ci.yml"
+ "source_commit": "33a5357bee5978ecaa31a2b7dab55b858843e9f7",
+ "workflow": ".github/workflows/build-and-qualify.yml"
},
"DistributionPackages": {
"default_branch": "main",
- "source_commit": "40d7a9638125de8e384150693cf3328d6afaed72",
- "workflow": ".github/workflows/release.yml"
+ "source_commit": "f941021a88953cf962ac2b926e456cb25d2fda18",
+ "workflow": ".github/workflows/sign-and-publish-packages.yml"
},
"GpsdOsmViewer": {
"default_branch": "master",
@@ -116,8 +116,8 @@
"prerelease": false,
"tag": "v1.0.2"
},
- "source_commit": "af349df3a418a046796c80debe1a960e5243793d",
- "workflow": ".github/workflows/ci.yml"
+ "source_commit": "3cfaa5dde4af54970ef3f5132d2cd26c4d5277a8",
+ "workflow": ".github/workflows/build-and-test.yml"
},
"mqttsuite-doc": {
"default_branch": "main",
@@ -139,8 +139,8 @@
"prerelease": false,
"tag": "v2.0.0"
},
- "source_commit": "692c914dd8bcfa2cc070cfb589f5b645185efad5",
- "workflow": ".github/workflows/ci.yml"
+ "source_commit": "2ab5974153f7e36641e77791a888debd575b897f",
+ "workflow": ".github/workflows/build-and-test.yml"
},
"snode.c-doc": {
"default_branch": "main",
diff --git a/templates/build-and-test.yml b/templates/build-and-test.yml
new file mode 100644
index 0000000..ec848d0
--- /dev/null
+++ b/templates/build-and-test.yml
@@ -0,0 +1,6 @@
+name: Build and test project
+on: [workflow_dispatch]
+permissions: { contents: read }
+jobs:
+ snodec:
+ uses: SNodeC/.github/.github/workflows/verify-project.yml@main
diff --git a/templates/ci.yml b/templates/ci.yml
deleted file mode 100644
index dc5ec0d..0000000
--- a/templates/ci.yml
+++ /dev/null
@@ -1,6 +0,0 @@
-name: CI
-on: [workflow_dispatch]
-permissions: { contents: read }
-jobs:
- snodec:
- uses: SNodeC/.github/.github/workflows/verify.yml@main
diff --git a/tests/test_verify.py b/tests/test_verify.py
index 3713388..94ac61a 100644
--- a/tests/test_verify.py
+++ b/tests/test_verify.py
@@ -12,7 +12,7 @@
import yaml
ROOT = Path(__file__).resolve().parents[1]
-WORKFLOW = yaml.load((ROOT / ".github/workflows/verify.yml").read_text(), Loader=yaml.BaseLoader)
+WORKFLOW = yaml.load((ROOT / ".github/workflows/verify-project.yml").read_text(), Loader=yaml.BaseLoader)
def script(job, name):
@@ -141,18 +141,18 @@ def test_jobs_have_bounded_timeouts_fixed_linux_and_full_action_pins(self):
for step in job["steps"]:
if "uses" in step:
self.assertRegex(step["uses"], r"^actions/(checkout|setup-python|upload-artifact)@[0-9a-f]{40}$")
- text = (ROOT / ".github/workflows/verify.yml").read_text()
+ text = (ROOT / ".github/workflows/verify-project.yml").read_text()
for line in text.splitlines():
if "uses:" in line:
self.assertRegex(line, r"@[0-9a-f]{40} # v[0-9]+\.[0-9]+\.[0-9]+$")
def test_template_exact_and_control_checks_independent(self):
- self.assertEqual((ROOT / "templates/ci.yml").read_text(),
- "name: CI\non: [workflow_dispatch]\n"
+ self.assertEqual((ROOT / "templates/build-and-test.yml").read_text(),
+ "name: Build and test project\non: [workflow_dispatch]\n"
"permissions: { contents: read }\njobs:\n snodec:\n"
- " uses: SNodeC/.github/.github/workflows/verify.yml@main\n")
- ci = yaml.load((ROOT / ".github/workflows/ci.yml").read_text(), Loader=yaml.BaseLoader)
+ " uses: SNodeC/.github/.github/workflows/verify-project.yml@main\n")
+ ci = yaml.load((ROOT / ".github/workflows/validate-organization.yml").read_text(), Loader=yaml.BaseLoader)
steps = ci["jobs"]["control"]["steps"]
self.assertEqual(ci["on"], ["push", "pull_request", "workflow_dispatch"])
self.assertEqual(ci["jobs"]["control"]["runs-on"], "ubuntu-24.04")