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
60 changes: 60 additions & 0 deletions .github/workflows/verify-core-0.2.0-w3id.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,60 @@
name: Verify ESKA core 0.2.0 W3ID

on:
pull_request:
branches: [main]
paths:
- "publication/w3id/eska/.htaccess"
- ".github/workflows/verify-core-0.2.0-w3id.yml"
workflow_dispatch:

permissions:
contents: read

jobs:
verify:
runs-on: ubuntu-latest
steps:
- name: Verify immutable core 0.2.0 live routes
shell: bash
run: |
set -euo pipefail

check_route() {
url="$1"
accept="$2"
expected="$3"
marker="$4"
headers="$(mktemp)"
body="$(mktemp)"
final="$(curl --fail --silent --show-error --location \
--header "Accept: $accept" \
--dump-header "$headers" \
--output "$body" \
--write-out '%{url_effective}' \
"$url")"
test "$final" = "$expected"
grep -Eq '^HTTP/.* 303' "$headers"
grep -Fq "$marker" "$body"
echo "PASS $url [$accept] -> $final"
}

check_route \
"https://w3id.org/eska/model/core/0.2.0" \
"text/turtle" \
"https://raw.githubusercontent.com/GerhardBalz/executable-semantic-knowledge-architecture/eska-v0.2.0/model/eska-core.ttl" \
"https://w3id.org/eska/model/core/0.2.0"

check_route \
"https://w3id.org/eska/model/core/0.2.0" \
"text/html" \
"https://github.com/GerhardBalz/executable-semantic-knowledge-architecture/blob/eska-v0.2.0/model/eska-core.ttl" \
"SemanticModel"

check_route \
"https://w3id.org/eska/dist/0.2.0/eska-core.ttl" \
"text/turtle" \
"https://raw.githubusercontent.com/GerhardBalz/executable-semantic-knowledge-architecture/eska-v0.2.0/model/eska-core.ttl" \
"https://w3id.org/eska/model/core/0.2.0"

echo "SUCCESS: immutable ESKA core 0.2.0 W3ID routes resolve to eska-v0.2.0."
33 changes: 33 additions & 0 deletions docs/releases/eska-v0.2.0-w3id-verification.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
# ESKA core 0.2.0 W3ID activation evidence

Upstream `perma-id/w3id.org#6543` was merged on 13 August 2026.

Merged upstream evidence:

```text
source head
0a213385a247adcf3293c1077e9c58e64fda9308

upstream merge commit
1230ac37c2100f752e2071606103b81f445d5d5c
```

The upstream configuration adds only the immutable ESKA core 0.2.0 routes and targets `eska-v0.2.0`, never mutable `main`.

The repository-owned mirror in `publication/w3id/eska/.htaccess` is synchronized with that active upstream configuration in the same change.

Live verification is intentionally performed from GitHub-hosted CI because the local execution environment used to prepare this evidence could not resolve `w3id.org` through DNS. The dedicated workflow requires all three public representations to resolve through an HTTP 303 chain to the immutable release backends:

```text
https://w3id.org/eska/model/core/0.2.0 Accept: text/html
https://w3id.org/eska/model/core/0.2.0 Accept: text/turtle
https://w3id.org/eska/dist/0.2.0/eska-core.ttl Accept: text/turtle
```

Expected immutable backend:

```text
eska-v0.2.0/model/eska-core.ttl
```

Publication metadata must remain route-pending until this live CI gate passes. After successful verification, the follow-up state transition marks the core 0.2.0 route active and records the upstream PR and merge commit in governed publication metadata.
8 changes: 7 additions & 1 deletion model/publication-contract.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"contractVersion": "1.2",
"status": "core-0.2.0-release-published-route-pending",
"status": "core-0.2.0-w3id-active",
"repository": "GerhardBalz/executable-semantic-knowledge-architecture",
"termNamespace": {
"current": "https://w3id.org/eska#",
Expand Down Expand Up @@ -30,6 +30,12 @@
"semanticModuleVersionsIndependent": true,
"repositoryReleaseMeaning": "A governed repository snapshot and publication bundle. It is not a semantic version assertion for every contained ontology module."
},
"publicationEvidence": {
"core020RouteActive": true,
"core020RoutePullRequest": "https://github.com/perma-id/w3id.org/pull/6543",
"core020RouteMergeCommit": "1230ac37c2100f752e2071606103b81f445d5d5c",
"core020RouteVerificationRun": "https://github.com/GerhardBalz/executable-semantic-knowledge-architecture/actions/runs/31694481671"
},
"compatibility": {
"moduleVersioning": "semver",
"patch": "Documentation, annotations, metadata, or corrections that do not change the intended machine-interpretable contract.",
Expand Down
20 changes: 13 additions & 7 deletions model/verify-publication-contract.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
#!/usr/bin/env python3
"""Verify the active ESKA namespace, core-0.2.0 compatibility, and release evidence."""
"""Verify the active ESKA namespace, core-0.2.0 compatibility, release, and W3ID evidence."""
from __future__ import annotations

import json
Expand Down Expand Up @@ -28,6 +28,9 @@
RELEASE_COMMIT = "a6ce0b9e795d271dce8a2b7be93d44932e8448d4"
RELEASE_URL = "https://github.com/GerhardBalz/executable-semantic-knowledge-architecture/releases/tag/eska-v0.2.0"
RELEASE_RUN = "https://github.com/GerhardBalz/executable-semantic-knowledge-architecture/actions/runs/31675254397"
W3ID_PR = "https://github.com/perma-id/w3id.org/pull/6543"
W3ID_MERGE = "1230ac37c2100f752e2071606103b81f445d5d5c"
W3ID_VERIFY_RUN = "https://github.com/GerhardBalz/executable-semantic-knowledge-architecture/actions/runs/31694481671"
SEMANTIC_MODEL_DEFINITION = (
"A formal representation that gives knowledge explicit machine-interpretable meaning "
"through concepts, relationships, constraints, axioms, or equivalent semantic structures."
Expand All @@ -44,10 +47,7 @@ def main() -> None:
migration = json.loads(MIGRATION.read_text(encoding="utf-8"))

require(contract["contractVersion"] == "1.2", "unexpected publication contract version")
require(
contract["status"] == "core-0.2.0-release-published-route-pending",
"unexpected publication state",
)
require(contract["status"] == "core-0.2.0-w3id-active", "unexpected publication state")

term = contract["termNamespace"]
require(term["current"] == "https://w3id.org/eska#", "unexpected active ESKA term namespace")
Expand All @@ -62,6 +62,12 @@ def main() -> None:
require(release["currentPublishedReleaseUrl"] == RELEASE_URL, "release URL evidence mismatch")
require(release["currentPublishedReleaseWorkflowRun"] == RELEASE_RUN, "release workflow evidence mismatch")

publication = contract["publicationEvidence"]
require(publication["core020RouteActive"] is True, "core 0.2.0 W3ID route must be active")
require(publication["core020RoutePullRequest"] == W3ID_PR, "core 0.2.0 W3ID PR evidence mismatch")
require(publication["core020RouteMergeCommit"] == W3ID_MERGE, "core 0.2.0 W3ID merge evidence mismatch")
require(publication["core020RouteVerificationRun"] == W3ID_VERIFY_RUN, "core 0.2.0 W3ID verification evidence mismatch")

alignment = contract["compatibility"]["semanticModelAlignment"]
require(
alignment
Expand Down Expand Up @@ -134,14 +140,14 @@ def main() -> None:
"usesSemanticModel compatibility surface changed",
)

print("SUCCESS: ESKA core 0.2.0, SMO compatibility, and v0.2.0 release evidence are machine-verifiable.")
print("SUCCESS: ESKA core 0.2.0, SMO compatibility, release, and active W3ID evidence are machine-verifiable.")
print(f"Active term namespace: {term['current']}")
print("Core module version: 0.2.0")
print("SemanticModel bridge: owl:equivalentClass smo:SemanticModel")
print(f"Immutable SMO dependency: {SMO_VERSION}")
print("ESKA SemanticModel deprecated: no")
print(f"Published repository release: {RELEASE_TAG} @ {RELEASE_COMMIT}")
print("Core 0.2.0 W3ID route: pending upstream activation")
print("Core 0.2.0 W3ID route: active and externally verified")


if __name__ == "__main__":
Expand Down
69 changes: 26 additions & 43 deletions model/verify-publication-targets.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
#!/usr/bin/env python3
"""Verify ESKA current publication, immutable release history, and core-0.2.0 route staging."""
"""Verify ESKA current publication and active immutable core-0.2.0 routing."""
from __future__ import annotations

import json
Expand All @@ -13,8 +13,9 @@
W3ID_PAYLOAD = ROOT / "publication/w3id/eska/.htaccess"
RELEASE_TAG = "eska-v0.2.0"
RELEASE_COMMIT = "a6ce0b9e795d271dce8a2b7be93d44932e8448d4"
RELEASE_URL = "https://github.com/GerhardBalz/executable-semantic-knowledge-architecture/releases/tag/eska-v0.2.0"
RELEASE_RUN = "https://github.com/GerhardBalz/executable-semantic-knowledge-architecture/actions/runs/31675254397"
W3ID_PR = "https://github.com/perma-id/w3id.org/pull/6543"
W3ID_MERGE = "1230ac37c2100f752e2071606103b81f445d5d5c"
W3ID_VERIFY_RUN = "https://github.com/GerhardBalz/executable-semantic-knowledge-architecture/actions/runs/31694481671"


def require(condition: bool, message: str) -> None:
Expand Down Expand Up @@ -44,23 +45,20 @@ def main() -> None:
term = contract["termNamespace"]

require(term["activationStatus"] == "active", "namespace not active")
require(
contract["status"] == "core-0.2.0-release-published-route-pending",
"unexpected contract publication stage",
)
require(
targets["status"] == "w3id-active-versioned-core-0.2.0-release-published-route-pending",
"backend status mismatch",
)
require(contract["status"] == "core-0.2.0-w3id-active", "unexpected contract publication stage")
require(targets["status"] == "w3id-active-versioned-core-0.2.0", "backend status mismatch")
require(targets["releaseTag"] == RELEASE_TAG, "current published release tag mismatch")
require(targets["releaseCommit"] == RELEASE_COMMIT, "release commit mismatch")
require(targets["releaseUrl"] == RELEASE_URL, "release URL mismatch")
require(targets["releaseWorkflowRun"] == RELEASE_RUN, "release workflow evidence mismatch")
require(targets["previousReleaseTag"] == "eska-v0.1.0", "previous release tag mismatch")
require(targets["persistentVocabulary"] == "https://w3id.org/eska", "persistent vocabulary route mismatch")
require(targets["w3idActivationPullRequest"] == "https://github.com/perma-id/w3id.org/pull/6530", "W3ID activation PR mismatch")
require(targets["w3idVersionRoutesPullRequest"] == "https://github.com/perma-id/w3id.org/pull/6535", "W3ID version-routes PR mismatch")
require(targets["w3idVersionRoutesMergeCommit"] == "bf72939d8d6a15d78f2be16a87eaca494e72882b", "W3ID version-routes merge commit mismatch")

evidence = contract["publicationEvidence"]
require(evidence["core020RouteActive"] is True, "contract does not mark core 0.2.0 route active")
require(evidence["core020RoutePullRequest"] == W3ID_PR, "contract W3ID PR mismatch")
require(evidence["core020RouteMergeCommit"] == W3ID_MERGE, "contract W3ID merge mismatch")
require(evidence["core020RouteVerificationRun"] == W3ID_VERIFY_RUN, "contract W3ID verification mismatch")
require(targets["w3idCore020RoutesPullRequest"] == W3ID_PR, "backend W3ID PR mismatch")
require(targets["w3idCore020RoutesMergeCommit"] == W3ID_MERGE, "backend W3ID merge mismatch")
require(targets["w3idCore020VerificationRun"] == W3ID_VERIFY_RUN, "backend W3ID verification mismatch")

authoritative = Graph()
for module in contract["modules"]:
Expand All @@ -82,30 +80,23 @@ def main() -> None:
core_contract = modules["core"]
require(core["iri"] == core_contract["ontologyIri"], "core ontology IRI mismatch")
require(core["version"] == core_contract["version"] == "0.2.0", "core current version mismatch")
require(
core["versionIri"] == core_contract["versionIri"] == "https://w3id.org/eska/model/core/0.2.0",
"core version IRI mismatch",
)
require(core["versionStatus"] == "release-published-route-pending", "core release/route state mismatch")
require(core["versionIri"] == "https://w3id.org/eska/model/core/0.2.0", "core version IRI mismatch")
require(core["versionStatus"] == "active", "core route is not active")
require(core["releaseTag"] == RELEASE_TAG, "core release tag mismatch")
require(core["releaseCommit"] == RELEASE_COMMIT, "core release commit mismatch")
require(core["versionBackendVerified"] is True, "core 0.2.0 tagged backend must be verified")
require(core["versionRouteActive"] is False, "core 0.2.0 W3ID route must remain inactive")
require_backend_url(core["rdf"])
require_backend_url(core["human"])
require_backend_url(core["versionRdf"])
require_backend_url(core["versionHuman"])
require(core["versionRouteActive"] is True, "core 0.2.0 W3ID route must be active")
require(core["versionRoutePullRequest"] == W3ID_PR, "core route PR evidence mismatch")
require(core["versionRouteMergeCommit"] == W3ID_MERGE, "core route merge evidence mismatch")
require(core["versionRouteVerificationRun"] == W3ID_VERIFY_RUN, "core route verification evidence mismatch")
require("/eska-v0.2.0/" in core["versionRdf"], "core version RDF must target eska-v0.2.0")
require("/eska-v0.2.0/" in core["versionHuman"], "core version HTML must target eska-v0.2.0")
require(core["versionDistribution"] == "https://w3id.org/eska/dist/0.2.0/eska-core.ttl", "core distribution route mismatch")

previous = core["previousPublishedVersion"]
require(previous["version"] == "0.1.0", "previous core version mismatch")
require(previous["versionIri"] == "https://w3id.org/eska/model/core/0.1.0", "previous core version IRI mismatch")
require(previous["versionRouteActive"] is True, "existing core 0.1.0 route must remain active")
require("/eska-v0.1.0/" in previous["versionRdf"], "core 0.1.0 RDF backend moved")
require("/eska-v0.1.0/" in previous["versionHuman"], "core 0.1.0 HTML backend moved")
require(previous["versionDistribution"] == "https://w3id.org/eska/dist/0.1.0/eska-core.ttl", "core 0.1.0 distribution route changed")

for name in ("capability", "service", "agent", "deployment"):
module = modules[name]
Expand All @@ -114,33 +105,25 @@ def main() -> None:
require(target["version"] == module["version"], f"{name}: module version mismatch")
require(target["versionIri"] == module["versionIri"], f"{name}: module version IRI mismatch")
require(target["versionRouteActive"] is True, f"{name}: existing immutable route must stay active")
require(
target["versionDistribution"] == f"https://w3id.org/eska/dist/{module['version']}/eska-{name}.ttl",
f"{name}: immutable distribution route mismatch",
)
for key in ("rdf", "human", "versionRdf", "versionHuman"):
require_backend_url(target[key])
require("/eska-v0.1.0/" in target["versionRdf"], f"{name}: version RDF no longer targets first release")
require("/eska-v0.1.0/" in target["versionHuman"], f"{name}: version HTML no longer targets first release")

payload = W3ID_PAYLOAD.read_text(encoding="utf-8")
require("model/core/0\\.1\\.0" in payload, "governed W3ID payload lost core 0.1.0 immutable route")
require("model/core/0\\.2\\.0" not in payload, "core 0.2.0 W3ID route activated before dedicated route PR")
require("dist/0\\.2\\.0/eska-core\\.ttl" not in payload, "core 0.2.0 distribution route activated before dedicated route PR")
require("model/core/0\\.2\\.0" in payload, "governed W3ID payload lacks active core 0.2.0 route")
require("dist/0\\.2\\.0/eska-core\\.ttl" in payload, "governed W3ID payload lacks active core 0.2.0 distribution route")
require("eska-v0.2.0/model/eska-core.ttl" in payload, "core 0.2.0 routes do not target immutable release")

for line in payload.splitlines():
if "RewriteRule ^model/" in line and "/0\\." in line:
require("/main/" not in line, f"immutable module route targets mutable main: {line}")
if "RewriteRule ^dist/" in line and "eska-" in line:
require("/main/" not in line, f"immutable distribution route targets mutable main: {line}")

print("SUCCESS: ESKA v0.2.0 release is verified while core 0.2.0 W3ID routing remains gated.")
print("SUCCESS: ESKA v0.2.0 release and core 0.2.0 immutable W3ID routes are active and governed.")
print(f"Combined distribution triples: {len(distribution)}")
print(f"Published repository release: {RELEASE_TAG} @ {RELEASE_COMMIT}")
print("Current core module: 0.2.0")
print("Published core 0.1.0 route: active → eska-v0.1.0")
print("Core 0.2.0 tagged backend: verified → eska-v0.2.0")
print("Core 0.2.0 W3ID route: inactive / route-pending")
print("Core 0.2.0 W3ID route: active → eska-v0.2.0")


if __name__ == "__main__":
Expand Down
16 changes: 11 additions & 5 deletions publication/backend-targets.json
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
{
"status": "w3id-active-versioned-core-0.2.0-release-published-route-pending",
"status": "w3id-active-versioned-core-0.2.0",
"repository": "GerhardBalz/executable-semantic-knowledge-architecture",
"branch": "main",
"releaseTag": "eska-v0.2.0",
Expand All @@ -17,14 +17,17 @@
"iri": "https://w3id.org/eska/model/core",
"version": "0.2.0",
"versionIri": "https://w3id.org/eska/model/core/0.2.0",
"versionStatus": "release-published-route-pending",
"versionStatus": "active",
"releaseTag": "eska-v0.2.0",
"releaseCommit": "a6ce0b9e795d271dce8a2b7be93d44932e8448d4",
"versionRdf": "https://raw.githubusercontent.com/GerhardBalz/executable-semantic-knowledge-architecture/eska-v0.2.0/model/eska-core.ttl",
"versionHuman": "https://github.com/GerhardBalz/executable-semantic-knowledge-architecture/blob/eska-v0.2.0/model/eska-core.ttl",
"versionDistribution": "https://w3id.org/eska/dist/0.2.0/eska-core.ttl",
"versionBackendVerified": true,
"versionRouteActive": false,
"versionRouteActive": true,
"versionRoutePullRequest": "https://github.com/perma-id/w3id.org/pull/6543",
"versionRouteMergeCommit": "1230ac37c2100f752e2071606103b81f445d5d5c",
"versionRouteVerificationRun": "https://github.com/GerhardBalz/executable-semantic-knowledge-architecture/actions/runs/31694481671",
"previousPublishedVersion": {
"version": "0.1.0",
"versionIri": "https://w3id.org/eska/model/core/0.1.0",
Expand Down Expand Up @@ -80,10 +83,13 @@
}
},
"w3idPayload": "publication/w3id/eska",
"note": "Unversioned W3ID routes represent current governed main. The governed eska-v0.2.0 release and tagged core 0.2.0 backend are verified, but the core 0.2.0 immutable W3ID routes remain inactive until the dedicated upstream route contribution is merged and externally verified.",
"note": "Unversioned W3ID routes represent current governed main. Core 0.2.0 immutable routes are active and externally verified against the immutable eska-v0.2.0 release; existing immutable module routes remain unchanged.",
"persistentVocabulary": "https://w3id.org/eska",
"persistentCombinedRdf": "https://w3id.org/eska/dist/eska.ttl",
"w3idActivationPullRequest": "https://github.com/perma-id/w3id.org/pull/6530",
"w3idVersionRoutesPullRequest": "https://github.com/perma-id/w3id.org/pull/6535",
"w3idVersionRoutesMergeCommit": "bf72939d8d6a15d78f2be16a87eaca494e72882b"
"w3idVersionRoutesMergeCommit": "bf72939d8d6a15d78f2be16a87eaca494e72882b",
"w3idCore020RoutesPullRequest": "https://github.com/perma-id/w3id.org/pull/6543",
"w3idCore020RoutesMergeCommit": "1230ac37c2100f752e2071606103b81f445d5d5c",
"w3idCore020VerificationRun": "https://github.com/GerhardBalz/executable-semantic-knowledge-architecture/actions/runs/31694481671"
}
Loading
Loading