From d8bf8703fc85e99a3a9bd4095d4c0858a0813b57 Mon Sep 17 00:00:00 2001 From: Seongho Bae Date: Sat, 12 Sep 2026 20:11:43 +0900 Subject: [PATCH 01/41] chore(metadata): carry config/repository-metadata.json from #1639 --- config/repository-metadata.json | 371 ++++++++++++++++++++++++++++++-- 1 file changed, 349 insertions(+), 22 deletions(-) diff --git a/config/repository-metadata.json b/config/repository-metadata.json index bb95527ee7..bce04b2dc2 100644 --- a/config/repository-metadata.json +++ b/config/repository-metadata.json @@ -4,133 +4,460 @@ "repositories": { "CalendarWeave": { "description": "CalendarWeave — governed calendar resources, iCalendar semantics, and interoperable scheduling infrastructure.", - "topics": ["calendar", "caldav", "icalendar", "scheduling", "rust", "contextualwisdomlab"], + "topics": [ + "calendar", + "caldav", + "icalendar", + "scheduling", + "rust", + "contextualwisdomlab" + ], "deepwiki": true, "pages": true }, "ConceptWeave": { "description": "ConceptWeave — turn enterprise data into governed semantic models and reusable meaning.", - "topics": ["semantic-model", "ontology", "knowledge-graph", "data-governance", "rust", "contextualwisdomlab"], + "topics": [ + "semantic-model", + "ontology", + "knowledge-graph", + "data-governance", + "rust", + "contextualwisdomlab" + ], "deepwiki": true, "pages": true }, "context-graph-contracts": { "description": "Context Graph Contracts — versioned interoperability contracts for context, lineage, provenance, and architecture facts.", - "topics": ["interoperability", "json-schema", "asyncapi", "cloudevents", "provenance", "context-graph", "contextualwisdomlab"], + "topics": [ + "interoperability", + "json-schema", + "asyncapi", + "cloudevents", + "provenance", + "context-graph", + "contextualwisdomlab" + ], "deepwiki": true, "pages": true }, "ThreadWeave": { "description": "ThreadWeave — standards-grounded, deterministic email conversation threading for Python.", - "topics": ["email", "threading", "imap", "rfc5256", "python", "mail", "contextualwisdomlab"], + "topics": [ + "email", + "threading", + "imap", + "rfc5256", + "python", + "mail", + "contextualwisdomlab" + ], "deepwiki": true, "pages": true }, "RankWeave": { "description": "RankWeave — deterministic retrieval fusion, evaluation, statistical comparison, and auditable ranking workflows for Python.", - "topics": ["information-retrieval", "ranking", "retrieval", "reciprocal-rank-fusion", "trec", "python", "contextualwisdomlab"], + "topics": [ + "information-retrieval", + "ranking", + "retrieval", + "reciprocal-rank-fusion", + "trec", + "python", + "contextualwisdomlab" + ], "deepwiki": true, "pages": true }, "fast-mlsirm": { "description": "fast-mlsirm — high-performance psychometric modeling, calibration, and evaluation with a Rust numerical core.", - "topics": ["irt", "item-response-theory", "mlsirm", "psychometrics", "calibration", "measurement", "rust", "python", "simulation", "contextualwisdomlab"], + "topics": [ + "irt", + "item-response-theory", + "mlsirm", + "psychometrics", + "calibration", + "measurement", + "rust", + "python", + "simulation", + "contextualwisdomlab" + ], "deepwiki": true, "pages": true }, "EgressWeave": { "description": "EgressWeave — SSRF- and DNS-rebinding-safe outbound HTTP for Python.", - "topics": ["egress", "ssrf", "dns-rebinding", "http", "network-security", "httpx", "python", "contextualwisdomlab"], + "topics": [ + "egress", + "ssrf", + "dns-rebinding", + "http", + "network-security", + "httpx", + "python", + "contextualwisdomlab" + ], "deepwiki": true, "pages": true }, "psychometrics-commons": { "description": "Psychometrics Commons — governed psychometric assessment, longitudinal measurement, and consent-aware research workflows.", - "topics": ["psychometrics", "assessment", "measurement", "longitudinal", "research", "privacy", "rust", "contextualwisdomlab"], + "topics": [ + "psychometrics", + "assessment", + "measurement", + "longitudinal", + "research", + "privacy", + "rust", + "contextualwisdomlab" + ], "deepwiki": true, "pages": true }, "keyverse": { "description": "Keyverse — passwordless identity, federation, provisioning, account unification, and authorization services for ContextualWisdomLab.", - "topics": ["identity", "openid-connect", "oauth2", "scim", "keycloak", "python", "contextualwisdomlab"], + "topics": [ + "identity", + "openid-connect", + "oauth2", + "scim", + "keycloak", + "python", + "contextualwisdomlab" + ], "deepwiki": true, "pages": true }, "OriginWeave": { "description": "Let agents use the web without losing control. OriginWeave gives AI agents a Chromium-compatible web runtime with isolated sessions, typed actions, resource governance, and verifiable evidence.", - "topics": ["browser-automation", "ai-agents", "chromium", "security", "rust", "web", "contextualwisdomlab"], + "topics": [ + "browser-automation", + "ai-agents", + "chromium", + "security", + "rust", + "web", + "contextualwisdomlab" + ], "deepwiki": true, "pages": true }, "accounting-information-platform": { "description": "Accounting Information Platform — statutory accounting, journal posting, period control, reconciliation, and financial reporting authority for ContextualWisdomLab.", - "topics": ["accounting", "ledger", "journal", "reconciliation", "financial-reporting", "postgresql", "python", "contextualwisdomlab"], + "topics": [ + "accounting", + "ledger", + "journal", + "reconciliation", + "financial-reporting", + "postgresql", + "python", + "contextualwisdomlab" + ], "deepwiki": true, "pages": true }, "pg-erd-cloud": { "description": "PostgreSQL 스키마를 리버스 엔지니어링하고 ERD·DDL 공유 흐름으로 관리하는 클라우드 서비스.", - "topics": ["cloud", "database-schema", "ddl", "erd", "postgresql", "reverse-engineering", "saas", "python", "javascript", "contextualwisdomlab"], + "topics": [ + "cloud", + "database-schema", + "ddl", + "erd", + "postgresql", + "reverse-engineering", + "saas", + "python", + "javascript", + "contextualwisdomlab" + ], "deepwiki": true, "pages": true }, "clearfolio": { "description": "Clearfolio — secure document conversion, tenant-scoped viewing, and controlled artifact delivery.", - "topics": ["document-viewer", "document-conversion", "file-preview", "pdf", "java", "spring-boot", "javascript", "web-app", "contextualwisdomlab"], + "topics": [ + "document-viewer", + "document-conversion", + "file-preview", + "pdf", + "java", + "spring-boot", + "javascript", + "web-app", + "contextualwisdomlab" + ], "deepwiki": true, "pages": true }, "DiagramWeave": { "description": "DiagramWeave — a source-first, AI-assisted editor and tooling platform for PlantUML diagrams.", - "topics": ["diagram-editor", "plantuml", "developer-tools", "language-server", "javascript", "ai-assisted", "contextualwisdomlab"], + "topics": [ + "diagram-editor", + "plantuml", + "developer-tools", + "language-server", + "javascript", + "ai-assisted", + "contextualwisdomlab" + ], "deepwiki": true, "pages": true }, "semantic-data-portal": { "description": "Semantic Data Portal — governed discovery, graph traversal, and semantic search for enterprise data catalogs.", - "topics": ["data-catalog", "knowledge-graph", "ontology", "semantic-web", "semantic-search", "data-governance", "postgresql", "python", "contextualwisdomlab"], + "topics": [ + "data-catalog", + "knowledge-graph", + "ontology", + "semantic-web", + "semantic-search", + "data-governance", + "postgresql", + "python", + "contextualwisdomlab" + ], "deepwiki": true, "pages": true }, "contextual-orchestrator": { "description": "Contextual Orchestrator — an OpenAI-compatible control plane for model routing, delegation, verification, and multi-agent orchestration.", - "topics": ["enterprise-admin", "llm-orchestration", "model-orchestration", "model-routing", "ai-agents", "openai-compatible", "research", "python", "contextualwisdomlab"], + "topics": [ + "enterprise-admin", + "llm-orchestration", + "model-orchestration", + "model-routing", + "ai-agents", + "openai-compatible", + "research", + "python", + "contextualwisdomlab" + ], + "deepwiki": true, + "pages": true + }, + "noema": { + "description": "Noema — evidence-producing credential and maintenance control plane for governed GitHub automation.", + "topics": [ + "automation", + "code-review", + "control-plane", + "github-actions", + "github-app", + "llm", + "oidc", + "python", + "security", + "typescript", + "contextualwisdomlab" + ], "deepwiki": true, "pages": true }, "mhtml-etl-gateway": { "description": "Enterprise MHTML ingestion gateway that converts browser, SAP ALV, and Excel Web Archive exports into governed PostgreSQL data assets.", - "topics": ["mhtml", "etl", "data-ingestion", "sap", "postgresql", "data-governance", "python", "contextualwisdomlab"], + "topics": [ + "mhtml", + "etl", + "data-ingestion", + "sap", + "postgresql", + "data-governance", + "python", + "contextualwisdomlab" + ], "deepwiki": true, "pages": true }, "PolicyWeave": { "description": "PolicyWeave — local-first privacy-policy fact authoring, completeness review, and deterministic draft generation for web and app operators.", - "topics": ["privacy", "privacy-policy", "privacy-engineering", "policy-authoring", "local-first", "react", "typescript", "vite", "contextualwisdomlab"], + "topics": [ + "privacy", + "privacy-policy", + "privacy-engineering", + "policy-authoring", + "local-first", + "react", + "typescript", + "vite", + "contextualwisdomlab" + ], "deepwiki": true, "pages": true }, "supply-chain-control-plane": { "description": "Supply Chain Control Plane — evidence-backed supply-network dependency modeling and deterministic downstream disruption-impact analysis.", - "topics": ["supply-chain", "disruption-management", "dependency-graph", "provenance", "risk-analysis", "rust", "contextualwisdomlab"], + "topics": [ + "supply-chain", + "disruption-management", + "dependency-graph", + "provenance", + "risk-analysis", + "rust", + "contextualwisdomlab" + ], "deepwiki": true, "pages": true }, "learning-management-platform": { "description": "Learning Management Platform — enrollment, learning-journey, completion, and credential orchestration for employee and external learners.", - "topics": ["learning-management-system", "learning-platform", "enrollment", "completion", "credentialing", "rust", "postgresql", "contextualwisdomlab"], + "topics": [ + "learning-management-system", + "learning-platform", + "enrollment", + "completion", + "credentialing", + "rust", + "postgresql", + "contextualwisdomlab" + ], "deepwiki": true, "pages": true }, "learning-content-studio": { "description": "Learning Content Studio — evidence-bound LCMS for authoring, approving, releasing, and deterministically publishing reusable learning content.", - "topics": ["lcms", "learning-content", "content-authoring", "content-management", "accessibility", "scorm", "cmi5", "rust", "contextualwisdomlab"], + "topics": [ + "lcms", + "learning-content", + "content-authoring", + "content-management", + "accessibility", + "scorm", + "cmi5", + "rust", + "contextualwisdomlab" + ], "deepwiki": true, "pages": true }, "learning-record-store": { "description": "Authoritative xAPI learning-record persistence for the CWL Learning Platform.", - "topics": ["learning-record-store", "xapi", "cmi5", "learning-technology", "interoperability", "contextualwisdomlab"], + "topics": [ + "learning-record-store", + "xapi", + "cmi5", + "learning-technology", + "interoperability", + "contextualwisdomlab" + ], + "deepwiki": true, + "pages": true + }, + "bandscope": { + "description": "로컬 우선 리허설 앱: 곡을 섹션·역할·템포·연습 우선순위로 분석합니다.", + "topics": [ + "audio-analysis", + "local-first", + "music", + "practice-tool", + "python", + "rehearsal", + "contextualwisdomlab" + ], + "deepwiki": true, + "pages": true + }, + "saju-caldav": { + "description": "saju-caldav — personalized Four Pillars calendars published through CalDAV and iCalendar.", + "topics": [ + "caldav", + "fastapi", + "four-pillars", + "icalendar", + "saju", + "python", + "contextualwisdomlab" + ], + "deepwiki": true, + "pages": true + }, + "governance-risk-compliance": { + "description": "Governance, risk, control, evidence, and compliance workflows with auditable policy and standards mapping.", + "topics": [ + "governance", + "risk-management", + "compliance", + "grc", + "audit", + "python", + "contextualwisdomlab" + ], + "deepwiki": true, + "pages": true + }, + "metering-billing-platform": { + "description": "Metering & Billing Platform — provider-neutral usage attribution, metering, rating, entitlements, invoice intent, and reconciliation.", + "topics": [ + "metering", + "billing", + "usage-based-billing", + "entitlements", + "reconciliation", + "finops", + "python", + "postgresql", + "contextualwisdomlab" + ], + "deepwiki": true, + "pages": true + }, + "learning-interoperability-contracts": { + "description": "Learning Interoperability Contracts — versioned learning schemas, profiles, mappings, and conformance contracts.", + "topics": [ + "learning-technology", + "interoperability", + "xapi", + "cmi5", + "json-schema", + "contracts", + "contextualwisdomlab" + ], + "deepwiki": true, + "pages": true + }, + "litellm-patched-proxy": { + "description": "litellm-patched-proxy — hardened downstream LiteLLM proxy images with bounded production patches and supply-chain evidence.", + "topics": [ + "litellm", + "llm-proxy", + "container-image", + "supply-chain-security", + "vulnerability-scanning", + "sbom", + "python", + "contextualwisdomlab" + ], + "deepwiki": true, + "pages": true + }, + "pingora-gateway": { + "description": "Pingora Gateway — a shared Rust edge runtime for explicit, bounded reverse-proxy traffic and secure service ingress.", + "topics": [ + "reverse-proxy", + "edge-computing", + "pingora", + "rust", + "network-security", + "observability", + "contextualwisdomlab" + ], + "deepwiki": true, + "pages": true + }, + "Veilpick": { + "description": "Veilpick — ontology-guided, policy-governed web acquisition and evidence-backed structured extraction.", + "topics": [ + "web-acquisition", + "data-extraction", + "ontology", + "provenance", + "rust", + "browser-automation", + "contextualwisdomlab" + ], "deepwiki": true, "pages": true } From b29fde710810a8e94ded18086d4add3dbdec2223 Mon Sep 17 00:00:00 2001 From: Seongho Bae Date: Sat, 12 Sep 2026 20:11:44 +0900 Subject: [PATCH 02/41] chore(metadata): carry scripts/ci/reconcile_repository_metadata.py from #1639 --- scripts/ci/reconcile_repository_metadata.py | 47 +++++++++++++++++++-- 1 file changed, 43 insertions(+), 4 deletions(-) diff --git a/scripts/ci/reconcile_repository_metadata.py b/scripts/ci/reconcile_repository_metadata.py index 36a910ffa8..d73c1e12b0 100644 --- a/scripts/ci/reconcile_repository_metadata.py +++ b/scripts/ci/reconcile_repository_metadata.py @@ -1,7 +1,7 @@ """Reconcile public GitHub repository metadata from a reviewed desired-state manifest. The reconciler is intentionally narrow: it changes repository descriptions, -repository topics, and GitHub Pages settings. README content remains owned by +homepage URLs, repository topics, and GitHub Pages settings. README content remains owned by the target repository so badge/content changes can pass through that repository's normal review path. """ @@ -9,6 +9,7 @@ from __future__ import annotations import argparse +import ipaddress import json import os import re @@ -17,6 +18,7 @@ from pathlib import Path from typing import Any from urllib.error import URLError +from urllib.parse import urlsplit from urllib.request import HTTPRedirectHandler, Request, build_opener @@ -58,10 +60,10 @@ def _validate_repository(name: str, raw: Any) -> dict[str, Any]: raise ManifestError("repository names must preserve exact GitHub-safe casing") item = _require_exact_dict(raw, field=f"repositories.{name}") required = {"description", "topics", "deepwiki", "pages"} - allowed = required | {"pages_mode"} + allowed = required | {"homepage", "pages_mode"} if not required.issubset(item) or not set(item).issubset(allowed): raise ManifestError( - f"repositories.{name} must contain exactly {sorted(required)} plus optional pages_mode" + f"repositories.{name} must contain exactly {sorted(required)} plus optional homepage/pages_mode" ) description = item["description"] @@ -92,6 +94,30 @@ def _validate_repository(name: str, raw: Any) -> dict[str, Any]: if len(set(topics)) != len(topics): raise ManifestError(f"repositories.{name}.topics contains duplicates") + if "homepage" in item: + homepage = item["homepage"] + if homepage is not None: + if type(homepage) is not str or homepage != homepage.strip(): + raise ManifestError(f"repositories.{name}.homepage is invalid") + parsed = urlsplit(homepage) + hostname = parsed.hostname + try: + internal_address = hostname is not None and not ipaddress.ip_address( + hostname + ).is_global + except ValueError: + internal_address = False + if ( + parsed.scheme != "https" + or not hostname + or parsed.username is not None + or parsed.password is not None + or hostname == "localhost" + or hostname.endswith((".internal", ".local", ".localhost")) + or internal_address + ): + raise ManifestError(f"repositories.{name}.homepage is invalid") + if type(item["deepwiki"]) is not bool or type(item["pages"]) is not bool: raise ManifestError( f"repositories.{name} deepwiki/pages flags must be booleans" @@ -112,6 +138,8 @@ def _validate_repository(name: str, raw: Any) -> dict[str, Any]: "deepwiki": item["deepwiki"], "pages": item["pages"], } + if "homepage" in item: + validated["homepage"] = item["homepage"] if "pages_mode" in item: validated["pages_mode"] = pages_mode return validated @@ -385,11 +413,18 @@ def reconcile_repository(repository: str, desired: dict[str, Any]) -> None: _pages_precondition(repository, default_branch, desired) _workflow_pages_live_precondition(repository, desired) + repository_patch = {} if repository_payload.get("description") != desired["description"]: + repository_patch["description"] = desired["description"] + if "homepage" in desired and (repository_payload.get("homepage") or None) != desired[ + "homepage" + ]: + repository_patch["homepage"] = desired["homepage"] + if repository_patch: _gh_api( "PATCH", f"repos/{ORGANIZATION}/{repository}", - body={"description": desired["description"]}, + body=repository_patch, ) current_topics = json.loads( @@ -441,6 +476,10 @@ def verify_repository(repository: str, desired: dict[str, Any]) -> None: raise RuntimeError(f"default branch could not be resolved for {repository}") if repository_payload.get("description") != desired["description"]: raise RuntimeError(f"description did not converge for {repository}") + if "homepage" in desired and (repository_payload.get("homepage") or None) != desired[ + "homepage" + ]: + raise RuntimeError(f"homepage did not converge for {repository}") current_topics = json.loads( _gh_api("GET", f"repos/{ORGANIZATION}/{repository}/topics") From 343e737b2eeb0cd6b903c3276d7e4bd2b11d5af6 Mon Sep 17 00:00:00 2001 From: Seongho Bae Date: Sat, 12 Sep 2026 20:11:45 +0900 Subject: [PATCH 03/41] chore(metadata): carry tests/test_repository_metadata_reconciliation.py from #1639 --- ...test_repository_metadata_reconciliation.py | 83 ++++++++++++++++++- 1 file changed, 80 insertions(+), 3 deletions(-) diff --git a/tests/test_repository_metadata_reconciliation.py b/tests/test_repository_metadata_reconciliation.py index 2bfc9d1386..17d227d45f 100644 --- a/tests/test_repository_metadata_reconciliation.py +++ b/tests/test_repository_metadata_reconciliation.py @@ -79,12 +79,21 @@ def test_metadata_manifest_declares_exact_casing_and_public_surfaces() -> None: "DiagramWeave": ("diagram-editor", "plantuml"), "semantic-data-portal": ("data-catalog", "semantic-search"), "contextual-orchestrator": ("llm-orchestration", "model-routing"), + "noema": ("control-plane", "oidc"), "mhtml-etl-gateway": ("mhtml", "etl"), "PolicyWeave": ("privacy-policy", "typescript"), "supply-chain-control-plane": ("supply-chain", "rust"), "learning-management-platform": ("learning-management-system", "rust"), "learning-content-studio": ("lcms", "content-authoring"), "learning-record-store": ("learning-record-store", "xapi"), + "bandscope": ("audio-analysis", "rehearsal"), + "saju-caldav": ("caldav", "four-pillars"), + "governance-risk-compliance": ("governance", "grc"), + "metering-billing-platform": ("metering", "billing"), + "learning-interoperability-contracts": ("xapi", "json-schema"), + "litellm-patched-proxy": ("llm-proxy", "supply-chain-security"), + "pingora-gateway": ("reverse-proxy", "rust"), + "Veilpick": ("web-acquisition", "rust"), } assert set(repositories) == set(expected) for repository, required_topics in expected.items(): @@ -132,6 +141,25 @@ def test_require_exact_dict_and_repository_validation() -> None: with pytest.raises(RECONCILER.ManifestError): RECONCILER._validate_repository("Repo", {**valid, field: value}) + assert RECONCILER._validate_repository( + "Repo", desired(homepage=None) + )["homepage"] is None + assert RECONCILER._validate_repository( + "Repo", desired(homepage="https://example.com/docs") + )["homepage"] == "https://example.com/docs" + for homepage in [ + " https://example.com", + "http://example.com", + "not-a-url", + "https://localhost/docs", + "https://127.0.0.1/docs", + "https://service.internal/docs", + ]: + with pytest.raises(RECONCILER.ManifestError, match="homepage"): + RECONCILER._validate_repository( + "Repo", desired(homepage=homepage) + ) + def test_load_manifest_contracts(tmp_path) -> None: """Manifest root schema, ownership, and non-empty fleet scope are enforced.""" @@ -406,12 +434,38 @@ def gh_api(method, endpoint, **kwargs): topics=["new"], deepwiki=True, pages=True, + homepage="https://example.com/docs", ), ) - assert any(call[0] == "PATCH" for call in calls) + repository_patches = [ + call for call in calls if call[0] == "PATCH" and call[1].endswith("/Repo") + ] + assert [call[2]["body"] for call in repository_patches] == [ + { + "description": "new", + "homepage": "https://example.com/docs", + } + ] assert any(call[0] == "PUT" and call[1].endswith("/topics") for call in calls) assert any(call[0] == "POST" and call[1].endswith("/pages") for call in calls) + calls.clear() + RECONCILER.reconcile_repository( + "Repo", + desired( + description="old", + topics=["old"], + deepwiki=True, + homepage="https://example.com/docs", + ), + ) + repository_patches = [ + call for call in calls if call[0] == "PATCH" and call[1].endswith("/Repo") + ] + assert [call[2]["body"] for call in repository_patches] == [ + {"homepage": "https://example.com/docs"} + ] + calls.clear() monkeypatch.setattr(RECONCILER, "_pages_exists", lambda *args: True) RECONCILER.reconcile_repository( @@ -450,7 +504,7 @@ def gh_api(method, endpoint, **kwargs): monkeypatch.setattr(RECONCILER, "_gh_api", gh_api) monkeypatch.setattr(RECONCILER, "_deepwiki_badge_exists", lambda *args: False) monkeypatch.setattr(RECONCILER, "_pages_exists", lambda *args: False) - RECONCILER.reconcile_repository("Repo", desired()) + RECONCILER.reconcile_repository("Repo", desired(homepage=None)) assert [call[0] for call in calls] == ["GET", "GET"] calls.clear() @@ -461,6 +515,29 @@ def gh_api(method, endpoint, **kwargs): assert [call[0] for call in calls] == ["GET", "GET", "GET"] +def test_verify_rejects_homepage_drift(monkeypatch) -> None: + """Verification fails closed when managed homepage state drifts.""" + + def gh_api(method, endpoint, **kwargs): + if endpoint.endswith("/topics"): + return json.dumps({"names": ["python"]}) + return json.dumps( + { + "default_branch": "main", + "description": "Useful product.", + "homepage": "https://wrong.example.com", + } + ) + + monkeypatch.setattr(RECONCILER, "_gh_api", gh_api) + monkeypatch.setattr(RECONCILER, "_deepwiki_badge_exists", lambda *args: False) + monkeypatch.setattr(RECONCILER, "_pages_exists", lambda *args: False) + with pytest.raises(RuntimeError, match="homepage did not converge"): + RECONCILER.verify_repository( + "Repo", desired(homepage="https://example.com/docs") + ) + + def test_parse_args(monkeypatch, tmp_path) -> None: """CLI supports validation and narrow repository selection.""" @@ -574,4 +651,4 @@ def test_module_main_guard(monkeypatch, tmp_path) -> None: ) with pytest.raises(SystemExit) as exc: runpy.run_path(str(SCRIPT), run_name="__main__") - assert exc.value.code == 0 + assert exc.value.code == 0 \ No newline at end of file From ed8ea40bed08711b956c72a85c23b452dd482ed9 Mon Sep 17 00:00:00 2001 From: Seongho Bae Date: Sat, 12 Sep 2026 22:59:48 +0900 Subject: [PATCH 04/41] test(metadata): reject trailing-dot internal homepages --- tests/test_repository_metadata_reconciliation.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/tests/test_repository_metadata_reconciliation.py b/tests/test_repository_metadata_reconciliation.py index 17d227d45f..970ee1b713 100644 --- a/tests/test_repository_metadata_reconciliation.py +++ b/tests/test_repository_metadata_reconciliation.py @@ -152,8 +152,10 @@ def test_require_exact_dict_and_repository_validation() -> None: "http://example.com", "not-a-url", "https://localhost/docs", + "https://localhost./docs", "https://127.0.0.1/docs", "https://service.internal/docs", + "https://service.internal./docs", ]: with pytest.raises(RECONCILER.ManifestError, match="homepage"): RECONCILER._validate_repository( From 8371f623de21f4560d48972b06d6b63e0cfc5927 Mon Sep 17 00:00:00 2001 From: Seongho Bae Date: Sat, 12 Sep 2026 23:02:59 +0900 Subject: [PATCH 05/41] fix(metadata): normalize homepage hostnames --- scripts/ci/reconcile_repository_metadata.py | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/scripts/ci/reconcile_repository_metadata.py b/scripts/ci/reconcile_repository_metadata.py index d73c1e12b0..cc0f5eae8c 100644 --- a/scripts/ci/reconcile_repository_metadata.py +++ b/scripts/ci/reconcile_repository_metadata.py @@ -101,19 +101,20 @@ def _validate_repository(name: str, raw: Any) -> dict[str, Any]: raise ManifestError(f"repositories.{name}.homepage is invalid") parsed = urlsplit(homepage) hostname = parsed.hostname + normalized_hostname = hostname.rstrip(".").casefold() if hostname else "" try: - internal_address = hostname is not None and not ipaddress.ip_address( - hostname + internal_address = bool(normalized_hostname) and not ipaddress.ip_address( + normalized_hostname ).is_global except ValueError: internal_address = False if ( parsed.scheme != "https" - or not hostname + or not normalized_hostname or parsed.username is not None or parsed.password is not None - or hostname == "localhost" - or hostname.endswith((".internal", ".local", ".localhost")) + or normalized_hostname == "localhost" + or normalized_hostname.endswith((".internal", ".local", ".localhost")) or internal_address ): raise ManifestError(f"repositories.{name}.homepage is invalid") From f897f65644724663ab381f65e7b1a8109b699fba Mon Sep 17 00:00:00 2001 From: Seongho Bae Date: Sun, 13 Sep 2026 01:18:13 +0900 Subject: [PATCH 06/41] test(metadata): require global HS trade public surface --- tests/test_repository_metadata_reconciliation.py | 1 + 1 file changed, 1 insertion(+) diff --git a/tests/test_repository_metadata_reconciliation.py b/tests/test_repository_metadata_reconciliation.py index 970ee1b713..823bc49afd 100644 --- a/tests/test_repository_metadata_reconciliation.py +++ b/tests/test_repository_metadata_reconciliation.py @@ -93,6 +93,7 @@ def test_metadata_manifest_declares_exact_casing_and_public_surfaces() -> None: "learning-interoperability-contracts": ("xapi", "json-schema"), "litellm-patched-proxy": ("llm-proxy", "supply-chain-security"), "pingora-gateway": ("reverse-proxy", "rust"), + "global-hs-trade": ("international-trade", "hs-code"), "Veilpick": ("web-acquisition", "rust"), } assert set(repositories) == set(expected) From f415d91f783a14068001235e2dd25124acc44e7d Mon Sep 17 00:00:00 2001 From: Seongho Bae Date: Sun, 13 Sep 2026 01:18:30 +0900 Subject: [PATCH 07/41] feat(metadata): enroll global HS trade public surface --- config/repository-metadata.json | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/config/repository-metadata.json b/config/repository-metadata.json index bce04b2dc2..09288a953b 100644 --- a/config/repository-metadata.json +++ b/config/repository-metadata.json @@ -447,6 +447,21 @@ "deepwiki": true, "pages": true }, + "global-hs-trade": { + "description": "Global HS Trade — evidence-aware collection, validation, and aggregation of rights-scoped company-by-HS trade observations.", + "topics": [ + "international-trade", + "hs-code", + "customs-data", + "trade-data", + "data-provenance", + "python", + "sqlite", + "contextualwisdomlab" + ], + "deepwiki": true, + "pages": true + }, "Veilpick": { "description": "Veilpick — ontology-guided, policy-governed web acquisition and evidence-backed structured extraction.", "topics": [ From 04dbb27eba7638cbe76b22cb5b58e7dafcbf1614 Mon Sep 17 00:00:00 2001 From: Seongho Bae Date: Sat, 19 Sep 2026 20:06:33 +0900 Subject: [PATCH 08/41] test(metadata): require newly drifted topic surfaces --- tests/test_repository_metadata_reconciliation.py | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) diff --git a/tests/test_repository_metadata_reconciliation.py b/tests/test_repository_metadata_reconciliation.py index 823bc49afd..7e73eff415 100644 --- a/tests/test_repository_metadata_reconciliation.py +++ b/tests/test_repository_metadata_reconciliation.py @@ -62,7 +62,7 @@ def test_metadata_manifest_declares_exact_casing_and_public_surfaces() -> None: payload = json.loads(MANIFEST.read_text(encoding="utf-8")) repositories = payload["repositories"] - expected = { + public_surfaces = { "CalendarWeave": ("calendar", "icalendar"), "ConceptWeave": ("semantic-model", "ontology"), "context-graph-contracts": ("interoperability", "cloudevents"), @@ -96,12 +96,22 @@ def test_metadata_manifest_declares_exact_casing_and_public_surfaces() -> None: "global-hs-trade": ("international-trade", "hs-code"), "Veilpick": ("web-acquisition", "rust"), } - assert set(repositories) == set(expected) - for repository, required_topics in expected.items(): + topics_only = { + "BizPlanningWizard": ("business-planning", "productivity"), + "litellm": ("llm-gateway", "openai-compatible"), + "opencode": ("coding-agent", "developer-tools"), + } + assert set(repositories) == set(public_surfaces) | set(topics_only) + for repository, required_topics in public_surfaces.items(): state = repositories[repository] assert state["deepwiki"] is True assert state["pages"] is True assert all(topic in state["topics"] for topic in required_topics) + for repository, required_topics in topics_only.items(): + state = repositories[repository] + assert state["deepwiki"] is False + assert state["pages"] is False + assert all(topic in state["topics"] for topic in required_topics) def test_require_exact_dict_and_repository_validation() -> None: From b360990b42380169d1bccc9f4b2dc83b7336bc63 Mon Sep 17 00:00:00 2001 From: Seongho Bae Date: Sat, 19 Sep 2026 20:06:55 +0900 Subject: [PATCH 09/41] fix(metadata): enroll drifted topic surfaces --- config/repository-metadata.json | 39 +++++++++++++++++++++++++++++++++ 1 file changed, 39 insertions(+) diff --git a/config/repository-metadata.json b/config/repository-metadata.json index 09288a953b..2c804e4b69 100644 --- a/config/repository-metadata.json +++ b/config/repository-metadata.json @@ -475,6 +475,45 @@ ], "deepwiki": true, "pages": true + }, + "BizPlanningWizard": { + "description": "A downstream of Business Plan Generator v2.0", + "topics": [ + "business-planning", + "business-plan", + "planning", + "productivity", + "contextualwisdomlab" + ], + "deepwiki": false, + "pages": false + }, + "litellm": { + "description": "The fastest, litest AI Gateway. Rust core with Python SDK. Call 100+ LLM APIs in OpenAI (or native) format with cost tracking, guardrails, load balancing, and logging [Bedrock, Azure, OpenAI, Anthropic, OpenAI, VertexAI, vLLM, Nvidia NIM]", + "topics": [ + "llm-gateway", + "openai-compatible", + "model-routing", + "load-balancing", + "guardrails", + "python", + "rust", + "contextualwisdomlab" + ], + "deepwiki": false, + "pages": false + }, + "opencode": { + "description": "The open source coding agent.", + "topics": [ + "coding-agent", + "ai-agents", + "developer-tools", + "terminal", + "contextualwisdomlab" + ], + "deepwiki": false, + "pages": false } } } From 85a6b61c44200961ba408f5f61f8c98061bc5a00 Mon Sep 17 00:00:00 2001 From: Seongho Bae Date: Sat, 19 Sep 2026 21:00:41 +0900 Subject: [PATCH 10/41] test(metadata): require orca topic surface --- tests/test_repository_metadata_reconciliation.py | 1 + 1 file changed, 1 insertion(+) diff --git a/tests/test_repository_metadata_reconciliation.py b/tests/test_repository_metadata_reconciliation.py index 7e73eff415..90404d9cef 100644 --- a/tests/test_repository_metadata_reconciliation.py +++ b/tests/test_repository_metadata_reconciliation.py @@ -100,6 +100,7 @@ def test_metadata_manifest_declares_exact_casing_and_public_surfaces() -> None: "BizPlanningWizard": ("business-planning", "productivity"), "litellm": ("llm-gateway", "openai-compatible"), "opencode": ("coding-agent", "developer-tools"), + "orca": ("ai-orchestration", "git-worktrees"), } assert set(repositories) == set(public_surfaces) | set(topics_only) for repository, required_topics in public_surfaces.items(): From 5d0969f53f2ff944c139908efe9e133778e71231 Mon Sep 17 00:00:00 2001 From: Seongho Bae Date: Sat, 19 Sep 2026 21:00:49 +0900 Subject: [PATCH 11/41] fix(metadata): enroll orca topic surface --- config/repository-metadata.json | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/config/repository-metadata.json b/config/repository-metadata.json index 2c804e4b69..58b01c2a1b 100644 --- a/config/repository-metadata.json +++ b/config/repository-metadata.json @@ -514,6 +514,20 @@ ], "deepwiki": false, "pages": false + }, + "orca": { + "description": "Orca is the ADE for working with a fleet of parallel agents. Run any coding agent with your own subscription. Available on desktop, mobile and remote runtime.", + "topics": [ + "ai-orchestration", + "coding-agents", + "git-worktrees", + "developer-tools", + "desktop-app", + "terminal", + "contextualwisdomlab" + ], + "deepwiki": false, + "pages": false } } } From 5b352b625795e166d2ddf77b65fc9356ce4e00c6 Mon Sep 17 00:00:00 2001 From: Seongho Bae Date: Sat, 19 Sep 2026 23:01:43 +0900 Subject: [PATCH 12/41] test(metadata): preserve protected repository-name validation --- tests/test_repository_metadata_reconciliation.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/test_repository_metadata_reconciliation.py b/tests/test_repository_metadata_reconciliation.py index 90404d9cef..dd058485e5 100644 --- a/tests/test_repository_metadata_reconciliation.py +++ b/tests/test_repository_metadata_reconciliation.py @@ -124,7 +124,7 @@ def test_require_exact_dict_and_repository_validation() -> None: valid = desired() assert RECONCILER._validate_repository("Repo", valid) == valid - for name in [1, "bad name"]: + for name in [1, "bad name", "Repo..Name", "Repo."]: with pytest.raises(RECONCILER.ManifestError, match="exact GitHub-safe casing"): RECONCILER._validate_repository(name, valid) with pytest.raises(RECONCILER.ManifestError, match="contain exactly"): From 9a35171b524e01a0b77c6e217b7e98f5a74e1997 Mon Sep 17 00:00:00 2001 From: Seongho Bae Date: Sun, 20 Sep 2026 03:05:43 +0900 Subject: [PATCH 13/41] test(metadata): require DiskSage public surface --- tests/test_repository_metadata_reconciliation.py | 1 + 1 file changed, 1 insertion(+) diff --git a/tests/test_repository_metadata_reconciliation.py b/tests/test_repository_metadata_reconciliation.py index dd058485e5..fa4a98b4da 100644 --- a/tests/test_repository_metadata_reconciliation.py +++ b/tests/test_repository_metadata_reconciliation.py @@ -94,6 +94,7 @@ def test_metadata_manifest_declares_exact_casing_and_public_surfaces() -> None: "litellm-patched-proxy": ("llm-proxy", "supply-chain-security"), "pingora-gateway": ("reverse-proxy", "rust"), "global-hs-trade": ("international-trade", "hs-code"), + "disksage": ("disk-cleanup", "rust"), "Veilpick": ("web-acquisition", "rust"), } topics_only = { From d2efde7a3cfabcdffcbddfda64ad597fc4f40146 Mon Sep 17 00:00:00 2001 From: Seongho Bae Date: Sun, 20 Sep 2026 03:06:15 +0900 Subject: [PATCH 14/41] feat(metadata): enroll DiskSage public surface --- config/repository-metadata.json | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/config/repository-metadata.json b/config/repository-metadata.json index 58b01c2a1b..4b71e2d330 100644 --- a/config/repository-metadata.json +++ b/config/repository-metadata.json @@ -462,6 +462,22 @@ "deepwiki": true, "pages": true }, + "disksage": { + "description": "DiskSage — local-first, evidence-backed disk inventory and reversible cleanup for Windows, Linux, and macOS.", + "topics": [ + "disk-cleanup", + "disk-usage", + "local-first", + "file-management", + "tauri", + "rust", + "svelte", + "cross-platform", + "contextualwisdomlab" + ], + "deepwiki": true, + "pages": true + }, "Veilpick": { "description": "Veilpick — ontology-guided, policy-governed web acquisition and evidence-backed structured extraction.", "topics": [ From 308b81a2b5c440b9290126ba3eb52a972bd47d6b Mon Sep 17 00:00:00 2001 From: Seongho Bae Date: Sun, 20 Sep 2026 04:07:05 +0900 Subject: [PATCH 15/41] test(metadata): preserve legacy root Pages source --- ...test_repository_metadata_reconciliation.py | 40 +++++++++++++++++++ 1 file changed, 40 insertions(+) diff --git a/tests/test_repository_metadata_reconciliation.py b/tests/test_repository_metadata_reconciliation.py index fa4a98b4da..2c1ae346d6 100644 --- a/tests/test_repository_metadata_reconciliation.py +++ b/tests/test_repository_metadata_reconciliation.py @@ -421,6 +421,46 @@ def test_reconcile_preconditions(monkeypatch) -> None: RECONCILER.reconcile_repository("Repo", desired()) + +def test_legacy_root_pages_contract(monkeypatch) -> None: + """Legacy root Pages preserve the / source and require root index.html.""" + + state = RECONCILER._validate_repository( + "Repo", desired(pages=True, pages_mode="legacy-root") + ) + calls = [] + + def gh_api(method, endpoint, **kwargs): + calls.append((method, endpoint, kwargs)) + if endpoint.endswith("/topics"): + return json.dumps({"names": ["python"]}) + if endpoint.endswith("/pages"): + return json.dumps( + {"build_type": "legacy", "source": {"branch": "main", "path": "/docs"}} + ) + if method == "GET": + return json.dumps( + {"default_branch": "main", "description": "Useful product."} + ) + return "" + + monkeypatch.setattr(RECONCILER, "_gh_api", gh_api) + monkeypatch.setattr(RECONCILER, "_deepwiki_badge_exists", lambda *args: False) + monkeypatch.setattr( + RECONCILER, + "_repository_file_exists", + lambda repository, branch, path: path == "index.html", + ) + monkeypatch.setattr(RECONCILER, "_pages_exists", lambda *args: True) + RECONCILER.reconcile_repository("Repo", state) + + pages_updates = [ + call for call in calls if call[0] == "PUT" and call[1].endswith("/pages") + ] + assert [call[2]["body"] for call in pages_updates] == [ + {"build_type": "legacy", "source": {"branch": "main", "path": "/"}} + ] + def test_reconcile_mutation_matrix(monkeypatch) -> None: """Descriptions, topics, Pages create/update/disable all reconcile.""" From 6529dcdda1bdecd35587e330ea379ed12aa61016 Mon Sep 17 00:00:00 2001 From: Seongho Bae Date: Sun, 20 Sep 2026 04:07:57 +0900 Subject: [PATCH 16/41] feat(metadata): preserve legacy root Pages source --- scripts/ci/reconcile_repository_metadata.py | 40 ++++++++++++++++----- 1 file changed, 32 insertions(+), 8 deletions(-) diff --git a/scripts/ci/reconcile_repository_metadata.py b/scripts/ci/reconcile_repository_metadata.py index 5786b81cc5..6c53245e18 100644 --- a/scripts/ci/reconcile_repository_metadata.py +++ b/scripts/ci/reconcile_repository_metadata.py @@ -27,7 +27,7 @@ TOPIC_RE = re.compile(r"^[a-z0-9][a-z0-9-]{0,49}$") MAX_DESCRIPTION_CHARS = 350 PAGES_BASE_URL = f"https://{ORGANIZATION.casefold()}.github.io" -PAGES_MODES = {"legacy", "workflow"} +PAGES_MODES = {"legacy", "legacy-root", "workflow"} class ManifestError(ValueError): @@ -231,15 +231,17 @@ def _pages_configuration(repository: str) -> dict[str, Any]: return _require_exact_dict(payload, field=f"Pages configuration for {repository}") -def _pages_configuration_matches(current: dict[str, Any], default_branch: str) -> bool: - """Return whether Pages already serves the desired legacy /docs source.""" +def _pages_configuration_matches( + current: dict[str, Any], default_branch: str, source_path: str = "/docs" +) -> bool: + """Return whether Pages already serves the desired legacy source path.""" source = current.get("source") if type(source) is not dict: return False return ( source.get("branch") == default_branch - and source.get("path") == "/docs" + and source.get("path") == source_path and current.get("build_type") in (None, "legacy") ) @@ -308,6 +310,12 @@ def _docs_index_exists(repository: str, default_branch: str) -> bool: return _repository_file_exists(repository, default_branch, "docs/index.md") +def _root_index_exists(repository: str, default_branch: str) -> bool: + """Return whether the reviewed default branch contains root index.html.""" + + return _repository_file_exists(repository, default_branch, "index.html") + + def _workflow_pages_definition_exists(repository: str, default_branch: str) -> bool: """Return whether the standard reviewed Pages workflow exists on the default branch.""" @@ -370,6 +378,12 @@ def _pages_precondition(repository: str, default_branch: str, desired: dict[str, f"workflow Pages requested for {repository} but .github/workflows/pages.yml is not on {default_branch}" ) return + if pages_mode == "legacy-root": + if not _root_index_exists(repository, default_branch): + raise RuntimeError( + f"root Pages requested for {repository} but index.html is not on {default_branch}" + ) + return if not _docs_index_exists(repository, default_branch): raise RuntimeError( f"Pages requested for {repository} but docs/index.md is not on {default_branch}" @@ -444,9 +458,10 @@ def reconcile_repository(repository: str, desired: dict[str, Any]) -> None: pages_exists = _pages_exists(repository) if desired["pages"]: + source_path = "/" if pages_mode == "legacy-root" else "/docs" pages_body = { "build_type": "legacy", - "source": {"branch": default_branch, "path": "/docs"}, + "source": {"branch": default_branch, "path": source_path}, } if not pages_exists: _gh_api( @@ -455,7 +470,7 @@ def reconcile_repository(repository: str, desired: dict[str, Any]) -> None: body=pages_body, ) elif not _pages_configuration_matches( - _pages_configuration(repository), default_branch + _pages_configuration(repository), default_branch, source_path ): _gh_api( "PUT", @@ -498,6 +513,9 @@ def verify_repository(repository: str, desired: dict[str, Any]) -> None: raise RuntimeError( f"Pages workflow source did not converge for {repository}" ) + elif pages_mode == "legacy-root": + if not _root_index_exists(repository, default_branch): + raise RuntimeError(f"Pages root source did not converge for {repository}") elif not _docs_index_exists(repository, default_branch): raise RuntimeError(f"Pages source did not converge for {repository}") @@ -512,8 +530,14 @@ def verify_repository(repository: str, desired: dict[str, Any]) -> None: raise RuntimeError( f"GitHub Pages deployment mode did not converge for {repository}" ) - elif not _pages_configuration_matches(current_pages, default_branch): - raise RuntimeError(f"GitHub Pages configuration did not converge for {repository}") + else: + source_path = "/" if pages_mode == "legacy-root" else "/docs" + if not _pages_configuration_matches( + current_pages, default_branch, source_path + ): + raise RuntimeError( + f"GitHub Pages configuration did not converge for {repository}" + ) _pages_publication_ready(repository, current_pages) elif pages_exists: raise RuntimeError(f"GitHub Pages remained published for {repository}") From 3277f67c02a98d25d8998b860f5db9fac72707a3 Mon Sep 17 00:00:00 2001 From: Seongho Bae Date: Sun, 20 Sep 2026 04:09:14 +0900 Subject: [PATCH 17/41] =?UTF-8?q?test(metadata):=20require=20J=ED=94=8C?= =?UTF-8?q?=EB=9E=98=EB=84=88=20root=20Pages=20state?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- tests/test_repository_metadata_reconciliation.py | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/tests/test_repository_metadata_reconciliation.py b/tests/test_repository_metadata_reconciliation.py index 2c1ae346d6..1982f923b0 100644 --- a/tests/test_repository_metadata_reconciliation.py +++ b/tests/test_repository_metadata_reconciliation.py @@ -94,6 +94,7 @@ def test_metadata_manifest_declares_exact_casing_and_public_surfaces() -> None: "litellm-patched-proxy": ("llm-proxy", "supply-chain-security"), "pingora-gateway": ("reverse-proxy", "rust"), "global-hs-trade": ("international-trade", "hs-code"), + "j-planner": ("travel-planner", "pwa"), "disksage": ("disk-cleanup", "rust"), "Veilpick": ("web-acquisition", "rust"), } @@ -114,6 +115,10 @@ def test_metadata_manifest_declares_exact_casing_and_public_surfaces() -> None: assert state["deepwiki"] is False assert state["pages"] is False assert all(topic in state["topics"] for topic in required_topics) + assert repositories["j-planner"]["pages_mode"] == "legacy-root" + assert repositories["j-planner"]["homepage"] == ( + "https://contextualwisdomlab.github.io/j-planner/" + ) def test_require_exact_dict_and_repository_validation() -> None: From c34795db609d48713d9bcebb320bcf6e33fe1d61 Mon Sep 17 00:00:00 2001 From: Seongho Bae Date: Sun, 20 Sep 2026 04:09:37 +0900 Subject: [PATCH 18/41] =?UTF-8?q?feat(metadata):=20enroll=20J=ED=94=8C?= =?UTF-8?q?=EB=9E=98=EB=84=88=20root=20Pages=20state?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- config/repository-metadata.json | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/config/repository-metadata.json b/config/repository-metadata.json index 4b71e2d330..416593678d 100644 --- a/config/repository-metadata.json +++ b/config/repository-metadata.json @@ -462,6 +462,22 @@ "deepwiki": true, "pages": true }, + "j-planner": { + "description": "로그인 없이 일정, 지도 경로, 예약서류, 알람을 브라우저에 저장하는 개인용 여행 플래너 PWA.", + "topics": [ + "travel-planner", + "pwa", + "offline-first", + "leaflet", + "javascript", + "web-app", + "contextualwisdomlab" + ], + "deepwiki": true, + "pages": true, + "homepage": "https://contextualwisdomlab.github.io/j-planner/", + "pages_mode": "legacy-root" + }, "disksage": { "description": "DiskSage — local-first, evidence-backed disk inventory and reversible cleanup for Windows, Linux, and macOS.", "topics": [ From 3051b2c0b10eac7d06ba5dab14eaa77cb476a0d1 Mon Sep 17 00:00:00 2001 From: Seongho Bae Date: Sun, 20 Sep 2026 05:06:58 +0900 Subject: [PATCH 19/41] test(metadata): require custom Actions Pages workflow path --- ...test_repository_metadata_reconciliation.py | 50 +++++++++++++++++++ 1 file changed, 50 insertions(+) diff --git a/tests/test_repository_metadata_reconciliation.py b/tests/test_repository_metadata_reconciliation.py index 1982f923b0..e576155eea 100644 --- a/tests/test_repository_metadata_reconciliation.py +++ b/tests/test_repository_metadata_reconciliation.py @@ -94,6 +94,7 @@ def test_metadata_manifest_declares_exact_casing_and_public_surfaces() -> None: "litellm-patched-proxy": ("llm-proxy", "supply-chain-security"), "pingora-gateway": ("reverse-proxy", "rust"), "global-hs-trade": ("international-trade", "hs-code"), + "LineageWeave": ("data-lineage", "knowledge-graph"), "j-planner": ("travel-planner", "pwa"), "disksage": ("disk-cleanup", "rust"), "Veilpick": ("web-acquisition", "rust"), @@ -119,6 +120,13 @@ def test_metadata_manifest_declares_exact_casing_and_public_surfaces() -> None: assert repositories["j-planner"]["homepage"] == ( "https://contextualwisdomlab.github.io/j-planner/" ) + assert repositories["LineageWeave"]["pages_mode"] == "workflow" + assert repositories["LineageWeave"]["pages_workflow"] == ( + ".github/workflows/ontology-pages.yml" + ) + assert repositories["LineageWeave"]["homepage"] == ( + "https://contextualwisdomlab.github.io/LineageWeave/" + ) def test_require_exact_dict_and_repository_validation() -> None: @@ -427,6 +435,48 @@ def test_reconcile_preconditions(monkeypatch) -> None: +def test_custom_workflow_pages_contract(monkeypatch) -> None: + """Actions Pages may name one reviewed repository-owned workflow.""" + + state = RECONCILER._validate_repository( + "Repo", + desired( + pages=True, + pages_mode="workflow", + pages_workflow=".github/workflows/ontology-pages.yml", + ), + ) + seen = [] + monkeypatch.setattr( + RECONCILER, + "_repository_file_exists", + lambda repository, branch, path: seen.append(path) or True, + ) + RECONCILER._pages_precondition("Repo", "main", state) + assert seen == [".github/workflows/ontology-pages.yml"] + + for path in [ + "ontology-pages.yml", + ".github/workflows/../pages.yml", + ".github/workflows/pages.yaml.txt", + ]: + with pytest.raises(RECONCILER.ManifestError, match="pages_workflow"): + RECONCILER._validate_repository( + "Repo", + desired( + pages=True, + pages_mode="workflow", + pages_workflow=path, + ), + ) + + with pytest.raises(RECONCILER.ManifestError, match="pages_workflow"): + RECONCILER._validate_repository( + "Repo", + desired(pages=True, pages_workflow=".github/workflows/pages.yml"), + ) + + def test_legacy_root_pages_contract(monkeypatch) -> None: """Legacy root Pages preserve the / source and require root index.html.""" From 4255b2197fbe5c3b3ad333f04df543db843f7b5a Mon Sep 17 00:00:00 2001 From: Seongho Bae Date: Sun, 20 Sep 2026 05:07:41 +0900 Subject: [PATCH 20/41] feat(metadata): support reviewed Actions Pages workflow paths --- scripts/ci/reconcile_repository_metadata.py | 39 +++++++++++++++------ 1 file changed, 29 insertions(+), 10 deletions(-) diff --git a/scripts/ci/reconcile_repository_metadata.py b/scripts/ci/reconcile_repository_metadata.py index 6c53245e18..7d6de9b879 100644 --- a/scripts/ci/reconcile_repository_metadata.py +++ b/scripts/ci/reconcile_repository_metadata.py @@ -28,6 +28,8 @@ MAX_DESCRIPTION_CHARS = 350 PAGES_BASE_URL = f"https://{ORGANIZATION.casefold()}.github.io" PAGES_MODES = {"legacy", "legacy-root", "workflow"} +DEFAULT_PAGES_WORKFLOW = ".github/workflows/pages.yml" +PAGES_WORKFLOW_RE = re.compile(r"^\.github/workflows/[A-Za-z0-9_.-]+\.ya?ml$") class ManifestError(ValueError): @@ -60,10 +62,10 @@ def _validate_repository(name: str, raw: Any) -> dict[str, Any]: raise ManifestError("repository names must preserve exact GitHub-safe casing") item = _require_exact_dict(raw, field=f"repositories.{name}") required = {"description", "topics", "deepwiki", "pages"} - allowed = required | {"homepage", "pages_mode"} + allowed = required | {"homepage", "pages_mode", "pages_workflow"} if not required.issubset(item) or not set(item).issubset(allowed): raise ManifestError( - f"repositories.{name} must contain exactly {sorted(required)} plus optional homepage/pages_mode" + f"repositories.{name} must contain exactly {sorted(required)} plus optional homepage/pages_mode/pages_workflow" ) description = item["description"] @@ -132,6 +134,15 @@ def _validate_repository(name: str, raw: Any) -> dict[str, Any]: raise ManifestError( f"repositories.{name}.pages_mode is only valid when Pages is enabled" ) + pages_workflow = item.get("pages_workflow", DEFAULT_PAGES_WORKFLOW) + if "pages_workflow" in item and ( + pages_mode != "workflow" + or type(pages_workflow) is not str + or not PAGES_WORKFLOW_RE.fullmatch(pages_workflow) + ): + raise ManifestError( + f"repositories.{name}.pages_workflow requires a safe Actions workflow path" + ) validated = { "description": description, @@ -143,6 +154,8 @@ def _validate_repository(name: str, raw: Any) -> dict[str, Any]: validated["homepage"] = item["homepage"] if "pages_mode" in item: validated["pages_mode"] = pages_mode + if "pages_workflow" in item: + validated["pages_workflow"] = pages_workflow return validated @@ -316,12 +329,12 @@ def _root_index_exists(repository: str, default_branch: str) -> bool: return _repository_file_exists(repository, default_branch, "index.html") -def _workflow_pages_definition_exists(repository: str, default_branch: str) -> bool: - """Return whether the standard reviewed Pages workflow exists on the default branch.""" +def _workflow_pages_definition_exists( + repository: str, default_branch: str, workflow_path: str = DEFAULT_PAGES_WORKFLOW +) -> bool: + """Return whether the reviewed Pages workflow exists on the default branch.""" - return _repository_file_exists( - repository, default_branch, ".github/workflows/pages.yml" - ) + return _repository_file_exists(repository, default_branch, workflow_path) def _deepwiki_badge_linked(readme: str, repository: str) -> bool: @@ -373,9 +386,12 @@ def _pages_precondition(repository: str, default_branch: str, desired: dict[str, return pages_mode = desired.get("pages_mode", "legacy") if pages_mode == "workflow": - if not _workflow_pages_definition_exists(repository, default_branch): + workflow_path = desired.get("pages_workflow", DEFAULT_PAGES_WORKFLOW) + if not _workflow_pages_definition_exists( + repository, default_branch, workflow_path + ): raise RuntimeError( - f"workflow Pages requested for {repository} but .github/workflows/pages.yml is not on {default_branch}" + f"workflow Pages requested for {repository} but {workflow_path} is not on {default_branch}" ) return if pages_mode == "legacy-root": @@ -509,7 +525,10 @@ def verify_repository(repository: str, desired: dict[str, Any]) -> None: if desired["pages"]: pages_mode = desired.get("pages_mode", "legacy") if pages_mode == "workflow": - if not _workflow_pages_definition_exists(repository, default_branch): + workflow_path = desired.get("pages_workflow", DEFAULT_PAGES_WORKFLOW) + if not _workflow_pages_definition_exists( + repository, default_branch, workflow_path + ): raise RuntimeError( f"Pages workflow source did not converge for {repository}" ) From 6db07cce6fd1a672837c255e33003dd3f51c7ec9 Mon Sep 17 00:00:00 2001 From: Seongho Bae Date: Sun, 20 Sep 2026 05:07:58 +0900 Subject: [PATCH 21/41] feat(metadata): enroll LineageWeave public surface --- config/repository-metadata.json | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/config/repository-metadata.json b/config/repository-metadata.json index 416593678d..5bddf4db1b 100644 --- a/config/repository-metadata.json +++ b/config/repository-metadata.json @@ -462,6 +462,25 @@ "deepwiki": true, "pages": true }, + "LineageWeave": { + "description": "LineageWeave — evidence-bound reconstruction of branching lineage and project journeys from scattered records.", + "topics": [ + "data-lineage", + "lineage", + "knowledge-graph", + "provenance", + "semantic-web", + "evidence", + "python", + "typescript", + "contextualwisdomlab" + ], + "deepwiki": true, + "pages": true, + "homepage": "https://contextualwisdomlab.github.io/LineageWeave/", + "pages_mode": "workflow", + "pages_workflow": ".github/workflows/ontology-pages.yml" + }, "j-planner": { "description": "로그인 없이 일정, 지도 경로, 예약서류, 알람을 브라우저에 저장하는 개인용 여행 플래너 PWA.", "topics": [ From bf7c9ab3942323ae64fc5da9029c8026764327c3 Mon Sep 17 00:00:00 2001 From: Seongho Bae Date: Sun, 20 Sep 2026 05:59:22 +0900 Subject: [PATCH 22/41] test(metadata): require Pingora Gateway Actions Pages intent --- tests/test_repository_metadata_reconciliation.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/tests/test_repository_metadata_reconciliation.py b/tests/test_repository_metadata_reconciliation.py index e576155eea..eaf62d1c0a 100644 --- a/tests/test_repository_metadata_reconciliation.py +++ b/tests/test_repository_metadata_reconciliation.py @@ -127,6 +127,10 @@ def test_metadata_manifest_declares_exact_casing_and_public_surfaces() -> None: assert repositories["LineageWeave"]["homepage"] == ( "https://contextualwisdomlab.github.io/LineageWeave/" ) + assert repositories["pingora-gateway"]["pages_mode"] == "workflow" + assert repositories["pingora-gateway"]["homepage"] == ( + "https://contextualwisdomlab.github.io/pingora-gateway/" + ) def test_require_exact_dict_and_repository_validation() -> None: From 146d2cc0a071a56b4974ed097aeb39fa536a101a Mon Sep 17 00:00:00 2001 From: Seongho Bae Date: Sun, 20 Sep 2026 05:59:41 +0900 Subject: [PATCH 23/41] fix(metadata): preserve Pingora Gateway Actions Pages --- config/repository-metadata.json | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/config/repository-metadata.json b/config/repository-metadata.json index 5bddf4db1b..5b41752d38 100644 --- a/config/repository-metadata.json +++ b/config/repository-metadata.json @@ -445,7 +445,9 @@ "contextualwisdomlab" ], "deepwiki": true, - "pages": true + "pages": true, + "homepage": "https://contextualwisdomlab.github.io/pingora-gateway/", + "pages_mode": "workflow" }, "global-hs-trade": { "description": "Global HS Trade — evidence-aware collection, validation, and aggregation of rights-scoped company-by-HS trade observations.", From 772bf7553fa682bac229a975d9fc85ab9385b854 Mon Sep 17 00:00:00 2001 From: Seongho Bae Date: Sun, 20 Sep 2026 06:03:54 +0900 Subject: [PATCH 24/41] test(metadata): require enterprise architecture public surface --- tests/test_repository_metadata_reconciliation.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/tests/test_repository_metadata_reconciliation.py b/tests/test_repository_metadata_reconciliation.py index eaf62d1c0a..1eae2e425d 100644 --- a/tests/test_repository_metadata_reconciliation.py +++ b/tests/test_repository_metadata_reconciliation.py @@ -66,6 +66,7 @@ def test_metadata_manifest_declares_exact_casing_and_public_surfaces() -> None: "CalendarWeave": ("calendar", "icalendar"), "ConceptWeave": ("semantic-model", "ontology"), "context-graph-contracts": ("interoperability", "cloudevents"), + "enterprise-architecture-core": ("enterprise-architecture", "context-map"), "ThreadWeave": ("rfc5256", "python"), "RankWeave": ("information-retrieval", "trec"), "fast-mlsirm": ("psychometrics", "rust"), @@ -131,6 +132,9 @@ def test_metadata_manifest_declares_exact_casing_and_public_surfaces() -> None: assert repositories["pingora-gateway"]["homepage"] == ( "https://contextualwisdomlab.github.io/pingora-gateway/" ) + assert repositories["enterprise-architecture-core"]["homepage"] == ( + "https://contextualwisdomlab.github.io/enterprise-architecture-core/" + ) def test_require_exact_dict_and_repository_validation() -> None: From b97cd8d080f05e92283eb60c4247fa7368da4a8b Mon Sep 17 00:00:00 2001 From: Seongho Bae Date: Sun, 20 Sep 2026 06:04:16 +0900 Subject: [PATCH 25/41] feat(metadata): enroll enterprise architecture public surface --- config/repository-metadata.json | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/config/repository-metadata.json b/config/repository-metadata.json index 5b41752d38..266b6211c2 100644 --- a/config/repository-metadata.json +++ b/config/repository-metadata.json @@ -42,6 +42,21 @@ "deepwiki": true, "pages": true }, + "enterprise-architecture-core": { + "description": "Enterprise Architecture Core — authoritative enterprise context maps, transformation decisions, and cross-context governance.", + "topics": [ + "enterprise-architecture", + "context-map", + "architecture-decisions", + "governance", + "transformation", + "domain-driven-design", + "contextualwisdomlab" + ], + "deepwiki": true, + "pages": true, + "homepage": "https://contextualwisdomlab.github.io/enterprise-architecture-core/" + }, "ThreadWeave": { "description": "ThreadWeave — standards-grounded, deterministic email conversation threading for Python.", "topics": [ From 37ff5da037296d05dac6227dc21978b1119ac356 Mon Sep 17 00:00:00 2001 From: Seongho Bae Date: Sun, 20 Sep 2026 07:09:43 +0900 Subject: [PATCH 26/41] test(metadata): require EmbedRelay public surface --- tests/test_repository_metadata_reconciliation.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/tests/test_repository_metadata_reconciliation.py b/tests/test_repository_metadata_reconciliation.py index 1eae2e425d..5c5c7020b8 100644 --- a/tests/test_repository_metadata_reconciliation.py +++ b/tests/test_repository_metadata_reconciliation.py @@ -67,6 +67,7 @@ def test_metadata_manifest_declares_exact_casing_and_public_surfaces() -> None: "ConceptWeave": ("semantic-model", "ontology"), "context-graph-contracts": ("interoperability", "cloudevents"), "enterprise-architecture-core": ("enterprise-architecture", "context-map"), + "EmbedRelay": ("embeddings", "data-migration"), "ThreadWeave": ("rfc5256", "python"), "RankWeave": ("information-retrieval", "trec"), "fast-mlsirm": ("psychometrics", "rust"), @@ -135,6 +136,9 @@ def test_metadata_manifest_declares_exact_casing_and_public_surfaces() -> None: assert repositories["enterprise-architecture-core"]["homepage"] == ( "https://contextualwisdomlab.github.io/enterprise-architecture-core/" ) + assert repositories["EmbedRelay"]["homepage"] == ( + "https://contextualwisdomlab.github.io/EmbedRelay/" + ) def test_require_exact_dict_and_repository_validation() -> None: From fedc301ee0df3b2efeea6fd56b2f699a4ad0893b Mon Sep 17 00:00:00 2001 From: Seongho Bae Date: Sun, 20 Sep 2026 07:10:09 +0900 Subject: [PATCH 27/41] chore(metadata): enroll EmbedRelay public surface --- config/repository-metadata.json | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/config/repository-metadata.json b/config/repository-metadata.json index 266b6211c2..3aa02d2fda 100644 --- a/config/repository-metadata.json +++ b/config/repository-metadata.json @@ -57,6 +57,21 @@ "pages": true, "homepage": "https://contextualwisdomlab.github.io/enterprise-architecture-core/" }, + "EmbedRelay": { + "description": "EmbedRelay — governed embedding identity, compatibility, provenance, and migration for safe vector-model transitions.", + "topics": [ + "embeddings", + "vector-database", + "data-migration", + "model-migration", + "data-provenance", + "interoperability", + "contextualwisdomlab" + ], + "deepwiki": true, + "pages": true, + "homepage": "https://contextualwisdomlab.github.io/EmbedRelay/" + }, "ThreadWeave": { "description": "ThreadWeave — standards-grounded, deterministic email conversation threading for Python.", "topics": [ From a0172e184bcfd72cc6155bc8c8f7c5b5c413ecbf Mon Sep 17 00:00:00 2001 From: Seongho Bae Date: Sun, 20 Sep 2026 07:14:05 +0900 Subject: [PATCH 28/41] test(metadata): require pg-llm-batch public surface --- tests/test_repository_metadata_reconciliation.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/tests/test_repository_metadata_reconciliation.py b/tests/test_repository_metadata_reconciliation.py index 5c5c7020b8..c6f04f9b04 100644 --- a/tests/test_repository_metadata_reconciliation.py +++ b/tests/test_repository_metadata_reconciliation.py @@ -68,6 +68,7 @@ def test_metadata_manifest_declares_exact_casing_and_public_surfaces() -> None: "context-graph-contracts": ("interoperability", "cloudevents"), "enterprise-architecture-core": ("enterprise-architecture", "context-map"), "EmbedRelay": ("embeddings", "data-migration"), + "pg-llm-batch": ("postgresql", "batch-processing"), "ThreadWeave": ("rfc5256", "python"), "RankWeave": ("information-retrieval", "trec"), "fast-mlsirm": ("psychometrics", "rust"), @@ -139,6 +140,9 @@ def test_metadata_manifest_declares_exact_casing_and_public_surfaces() -> None: assert repositories["EmbedRelay"]["homepage"] == ( "https://contextualwisdomlab.github.io/EmbedRelay/" ) + assert repositories["pg-llm-batch"]["homepage"] == ( + "https://contextualwisdomlab.github.io/pg-llm-batch/" + ) def test_require_exact_dict_and_repository_validation() -> None: From 6690e56aec7a5568c96ee3d2ef44dae719936ed8 Mon Sep 17 00:00:00 2001 From: Seongho Bae Date: Sun, 20 Sep 2026 07:14:23 +0900 Subject: [PATCH 29/41] chore(metadata): enroll pg-llm-batch public surface --- config/repository-metadata.json | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/config/repository-metadata.json b/config/repository-metadata.json index 3aa02d2fda..9707d78fc1 100644 --- a/config/repository-metadata.json +++ b/config/repository-metadata.json @@ -72,6 +72,22 @@ "pages": true, "homepage": "https://contextualwisdomlab.github.io/EmbedRelay/" }, + "pg-llm-batch": { + "description": "pg-llm-batch — PostgreSQL-authoritative token counting, bounded JSONL batch assembly, and durable OpenAI-compatible batch lifecycle.", + "topics": [ + "postgresql", + "batch-processing", + "tokenization", + "openai-compatible", + "llm", + "jsonl", + "python", + "contextualwisdomlab" + ], + "deepwiki": true, + "pages": true, + "homepage": "https://contextualwisdomlab.github.io/pg-llm-batch/" + }, "ThreadWeave": { "description": "ThreadWeave — standards-grounded, deterministic email conversation threading for Python.", "topics": [ From 341318a6e43e0a675c34e50b5c1dbef635dc0b00 Mon Sep 17 00:00:00 2001 From: Seongho Bae Date: Sun, 20 Sep 2026 08:06:44 +0900 Subject: [PATCH 30/41] test(metadata): require Inkspan public surface --- tests/test_repository_metadata_reconciliation.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/tests/test_repository_metadata_reconciliation.py b/tests/test_repository_metadata_reconciliation.py index c6f04f9b04..a95c8b3be7 100644 --- a/tests/test_repository_metadata_reconciliation.py +++ b/tests/test_repository_metadata_reconciliation.py @@ -69,6 +69,7 @@ def test_metadata_manifest_declares_exact_casing_and_public_surfaces() -> None: "enterprise-architecture-core": ("enterprise-architecture", "context-map"), "EmbedRelay": ("embeddings", "data-migration"), "pg-llm-batch": ("postgresql", "batch-processing"), + "inkspan": ("markdown-editor", "collaborative-editing"), "ThreadWeave": ("rfc5256", "python"), "RankWeave": ("information-retrieval", "trec"), "fast-mlsirm": ("psychometrics", "rust"), @@ -143,6 +144,9 @@ def test_metadata_manifest_declares_exact_casing_and_public_surfaces() -> None: assert repositories["pg-llm-batch"]["homepage"] == ( "https://contextualwisdomlab.github.io/pg-llm-batch/" ) + assert repositories["inkspan"]["homepage"] == ( + "https://contextualwisdomlab.github.io/inkspan/" + ) def test_require_exact_dict_and_repository_validation() -> None: From af57dd2e394cb62debbcd184d549babed76f2be3 Mon Sep 17 00:00:00 2001 From: Seongho Bae Date: Sun, 20 Sep 2026 08:07:09 +0900 Subject: [PATCH 31/41] feat(metadata): enroll Inkspan public surface --- config/repository-metadata.json | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/config/repository-metadata.json b/config/repository-metadata.json index 9707d78fc1..ecb3d56ff0 100644 --- a/config/repository-metadata.json +++ b/config/repository-metadata.json @@ -627,6 +627,23 @@ ], "deepwiki": false, "pages": false + }, + "inkspan": { + "description": "Inkspan — modular Markdown and HTML authoring, collaboration, safe serialization, and deterministic Office document rendering.", + "topics": [ + "collaborative-editing", + "markdown-editor", + "office-documents", + "prosemirror", + "react", + "tiptap", + "typescript", + "wysiwyg-editor", + "contextualwisdomlab" + ], + "deepwiki": true, + "pages": true, + "homepage": "https://contextualwisdomlab.github.io/inkspan/" } } } From 13787663a73e1998a806e61fa8644db7fa58a483 Mon Sep 17 00:00:00 2001 From: Seongho Bae Date: Sun, 20 Sep 2026 08:10:14 +0900 Subject: [PATCH 32/41] test(metadata): require AppGuardrail public surface --- tests/test_repository_metadata_reconciliation.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/tests/test_repository_metadata_reconciliation.py b/tests/test_repository_metadata_reconciliation.py index a95c8b3be7..bce2f3b980 100644 --- a/tests/test_repository_metadata_reconciliation.py +++ b/tests/test_repository_metadata_reconciliation.py @@ -70,6 +70,7 @@ def test_metadata_manifest_declares_exact_casing_and_public_surfaces() -> None: "EmbedRelay": ("embeddings", "data-migration"), "pg-llm-batch": ("postgresql", "batch-processing"), "inkspan": ("markdown-editor", "collaborative-editing"), + "appguardrail": ("application-security", "sarif"), "ThreadWeave": ("rfc5256", "python"), "RankWeave": ("information-retrieval", "trec"), "fast-mlsirm": ("psychometrics", "rust"), @@ -147,6 +148,9 @@ def test_metadata_manifest_declares_exact_casing_and_public_surfaces() -> None: assert repositories["inkspan"]["homepage"] == ( "https://contextualwisdomlab.github.io/inkspan/" ) + assert repositories["appguardrail"]["homepage"] == ( + "https://contextualwisdomlab.github.io/appguardrail/" + ) def test_require_exact_dict_and_repository_validation() -> None: From fe00cab32c12594710ac6df2140fa496a227aa9b Mon Sep 17 00:00:00 2001 From: Seongho Bae Date: Sun, 20 Sep 2026 08:10:32 +0900 Subject: [PATCH 33/41] feat(metadata): enroll AppGuardrail public surface --- config/repository-metadata.json | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/config/repository-metadata.json b/config/repository-metadata.json index ecb3d56ff0..0f3f7ca573 100644 --- a/config/repository-metadata.json +++ b/config/repository-metadata.json @@ -644,6 +644,22 @@ "deepwiki": true, "pages": true, "homepage": "https://contextualwisdomlab.github.io/inkspan/" + }, + "appguardrail": { + "description": "AppGuardrail — security scanning, SARIF evidence, and guided remediation for AI-assisted applications.", + "topics": [ + "application-security", + "security-scanner", + "static-analysis", + "sarif", + "devsecops", + "ai-assisted-development", + "python", + "contextualwisdomlab" + ], + "deepwiki": true, + "pages": true, + "homepage": "https://contextualwisdomlab.github.io/appguardrail/" } } } From 23f39cddfe91ebdf9adbb824b87479e57565196a Mon Sep 17 00:00:00 2001 From: Seongho Bae Date: Sun, 20 Sep 2026 09:02:07 +0900 Subject: [PATCH 34/41] test(metadata): require ELUNVERA public surface --- tests/test_repository_metadata_reconciliation.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/tests/test_repository_metadata_reconciliation.py b/tests/test_repository_metadata_reconciliation.py index bce2f3b980..4215ad84f4 100644 --- a/tests/test_repository_metadata_reconciliation.py +++ b/tests/test_repository_metadata_reconciliation.py @@ -71,6 +71,7 @@ def test_metadata_manifest_declares_exact_casing_and_public_surfaces() -> None: "pg-llm-batch": ("postgresql", "batch-processing"), "inkspan": ("markdown-editor", "collaborative-editing"), "appguardrail": ("application-security", "sarif"), + "ELUNVERA": ("crm", "relationship-intelligence"), "ThreadWeave": ("rfc5256", "python"), "RankWeave": ("information-retrieval", "trec"), "fast-mlsirm": ("psychometrics", "rust"), @@ -151,6 +152,9 @@ def test_metadata_manifest_declares_exact_casing_and_public_surfaces() -> None: assert repositories["appguardrail"]["homepage"] == ( "https://contextualwisdomlab.github.io/appguardrail/" ) + assert repositories["ELUNVERA"]["homepage"] == ( + "https://contextualwisdomlab.github.io/ELUNVERA/" + ) def test_require_exact_dict_and_repository_validation() -> None: From 5fb40adf247ee8a2748ed10da81011e1353f9050 Mon Sep 17 00:00:00 2001 From: Seongho Bae Date: Sun, 20 Sep 2026 09:02:33 +0900 Subject: [PATCH 35/41] chore(metadata): enroll ELUNVERA public surface --- config/repository-metadata.json | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/config/repository-metadata.json b/config/repository-metadata.json index 0f3f7ca573..0481ab030d 100644 --- a/config/repository-metadata.json +++ b/config/repository-metadata.json @@ -660,6 +660,22 @@ "deepwiki": true, "pages": true, "homepage": "https://contextualwisdomlab.github.io/appguardrail/" + }, + "ELUNVERA": { + "description": "ELUNVERA — evidence-centered enterprise CRM and relationship intelligence for governed commercial accounts, stakeholders, commitments, opportunities, and customer outcomes.", + "topics": [ + "crm", + "relationship-intelligence", + "customer-success", + "sales", + "account-management", + "data-governance", + "domain-driven-design", + "contextualwisdomlab" + ], + "deepwiki": true, + "pages": true, + "homepage": "https://contextualwisdomlab.github.io/ELUNVERA/" } } } From 4df681e2888003350078247775e7c937cd566d09 Mon Sep 17 00:00:00 2001 From: Seongho Bae Date: Sun, 20 Sep 2026 09:06:29 +0900 Subject: [PATCH 36/41] test(metadata): require Four Pillars public surface --- tests/test_repository_metadata_reconciliation.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/tests/test_repository_metadata_reconciliation.py b/tests/test_repository_metadata_reconciliation.py index 4215ad84f4..924bc672df 100644 --- a/tests/test_repository_metadata_reconciliation.py +++ b/tests/test_repository_metadata_reconciliation.py @@ -72,6 +72,7 @@ def test_metadata_manifest_declares_exact_casing_and_public_surfaces() -> None: "inkspan": ("markdown-editor", "collaborative-editing"), "appguardrail": ("application-security", "sarif"), "ELUNVERA": ("crm", "relationship-intelligence"), + "four-pillars": ("four-pillars", "korean-calendar"), "ThreadWeave": ("rfc5256", "python"), "RankWeave": ("information-retrieval", "trec"), "fast-mlsirm": ("psychometrics", "rust"), @@ -155,6 +156,9 @@ def test_metadata_manifest_declares_exact_casing_and_public_surfaces() -> None: assert repositories["ELUNVERA"]["homepage"] == ( "https://contextualwisdomlab.github.io/ELUNVERA/" ) + assert repositories["four-pillars"]["homepage"] == ( + "https://contextualwisdomlab.github.io/four-pillars/" + ) def test_require_exact_dict_and_repository_validation() -> None: From c0a35c9eddbd29d542ef2978dfa227e3344842c6 Mon Sep 17 00:00:00 2001 From: Seongho Bae Date: Sun, 20 Sep 2026 09:06:44 +0900 Subject: [PATCH 37/41] chore(metadata): enroll Four Pillars public surface --- config/repository-metadata.json | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/config/repository-metadata.json b/config/repository-metadata.json index 0481ab030d..c4609d4794 100644 --- a/config/repository-metadata.json +++ b/config/repository-metadata.json @@ -676,6 +676,23 @@ "deepwiki": true, "pages": true, "homepage": "https://contextualwisdomlab.github.io/ELUNVERA/" + }, + "four-pillars": { + "description": "Four Pillars — deterministic Korean Four Pillars calendar calculation with schema-validated, evidence-bounded report generation.", + "topics": [ + "four-pillars", + "korean-calendar", + "calendar-calculation", + "saju", + "fastapi", + "python", + "llm", + "pdf-generation", + "contextualwisdomlab" + ], + "deepwiki": true, + "pages": true, + "homepage": "https://contextualwisdomlab.github.io/four-pillars/" } } } From 43448d7e61ea018d9f9c85c917263cdecf1d2788 Mon Sep 17 00:00:00 2001 From: Seongho Bae Date: Sun, 20 Sep 2026 10:02:00 +0900 Subject: [PATCH 38/41] test(metadata): require quarantine runtime public surface --- tests/test_repository_metadata_reconciliation.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/tests/test_repository_metadata_reconciliation.py b/tests/test_repository_metadata_reconciliation.py index 924bc672df..61a644a70a 100644 --- a/tests/test_repository_metadata_reconciliation.py +++ b/tests/test_repository_metadata_reconciliation.py @@ -73,6 +73,7 @@ def test_metadata_manifest_declares_exact_casing_and_public_surfaces() -> None: "appguardrail": ("application-security", "sarif"), "ELUNVERA": ("crm", "relationship-intelligence"), "four-pillars": ("four-pillars", "korean-calendar"), + "quarantine-sandbox-runtime": ("sandbox", "container-security"), "ThreadWeave": ("rfc5256", "python"), "RankWeave": ("information-retrieval", "trec"), "fast-mlsirm": ("psychometrics", "rust"), @@ -159,6 +160,9 @@ def test_metadata_manifest_declares_exact_casing_and_public_surfaces() -> None: assert repositories["four-pillars"]["homepage"] == ( "https://contextualwisdomlab.github.io/four-pillars/" ) + assert repositories["quarantine-sandbox-runtime"]["homepage"] == ( + "https://contextualwisdomlab.github.io/quarantine-sandbox-runtime/" + ) def test_require_exact_dict_and_repository_validation() -> None: From b11a99ed47109ff6744a3c4f7822534146ce3f09 Mon Sep 17 00:00:00 2001 From: Seongho Bae Date: Sun, 20 Sep 2026 10:02:24 +0900 Subject: [PATCH 39/41] chore(metadata): enroll quarantine sandbox runtime --- config/repository-metadata.json | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/config/repository-metadata.json b/config/repository-metadata.json index c4609d4794..f3ce378903 100644 --- a/config/repository-metadata.json +++ b/config/repository-metadata.json @@ -693,6 +693,23 @@ "deepwiki": true, "pages": true, "homepage": "https://contextualwisdomlab.github.io/four-pillars/" + }, + "quarantine-sandbox-runtime": { + "description": "Quarantine Sandbox Runtime — credential-free hostile-workload isolation and deterministic artifact-analysis evidence for security and Agent control planes.", + "topics": [ + "sandbox", + "container-security", + "malware-analysis", + "artifact-analysis", + "isolation", + "podman", + "rust", + "security", + "contextualwisdomlab" + ], + "deepwiki": true, + "pages": true, + "homepage": "https://contextualwisdomlab.github.io/quarantine-sandbox-runtime/" } } } From aa8eef4d1144040146f2a3ba5516893216644099 Mon Sep 17 00:00:00 2001 From: Seongho Bae Date: Sun, 20 Sep 2026 10:05:34 +0900 Subject: [PATCH 40/41] test(metadata): require TEPP public surface --- tests/test_repository_metadata_reconciliation.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/tests/test_repository_metadata_reconciliation.py b/tests/test_repository_metadata_reconciliation.py index 61a644a70a..495ff37b0e 100644 --- a/tests/test_repository_metadata_reconciliation.py +++ b/tests/test_repository_metadata_reconciliation.py @@ -74,6 +74,7 @@ def test_metadata_manifest_declares_exact_casing_and_public_surfaces() -> None: "ELUNVERA": ("crm", "relationship-intelligence"), "four-pillars": ("four-pillars", "korean-calendar"), "quarantine-sandbox-runtime": ("sandbox", "container-security"), + "TEPP": ("psychometrics", "temporal-analysis"), "ThreadWeave": ("rfc5256", "python"), "RankWeave": ("information-retrieval", "trec"), "fast-mlsirm": ("psychometrics", "rust"), @@ -163,6 +164,9 @@ def test_metadata_manifest_declares_exact_casing_and_public_surfaces() -> None: assert repositories["quarantine-sandbox-runtime"]["homepage"] == ( "https://contextualwisdomlab.github.io/quarantine-sandbox-runtime/" ) + assert repositories["TEPP"]["homepage"] == ( + "https://contextualwisdomlab.github.io/TEPP/" + ) def test_require_exact_dict_and_repository_validation() -> None: From 62c30e0a83054573efaac72be3c0f2dc68afc3aa Mon Sep 17 00:00:00 2001 From: Seongho Bae Date: Sun, 20 Sep 2026 10:05:53 +0900 Subject: [PATCH 41/41] feat(metadata): enroll TEPP public surface --- config/repository-metadata.json | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/config/repository-metadata.json b/config/repository-metadata.json index f3ce378903..d324d45085 100644 --- a/config/repository-metadata.json +++ b/config/repository-metadata.json @@ -710,6 +710,23 @@ "deepwiki": true, "pages": true, "homepage": "https://contextualwisdomlab.github.io/quarantine-sandbox-runtime/" + }, + "TEPP": { + "description": "TEPP — multilingual, temporal, relational psychometrics with evidence-bound measurement, uncertainty, and event-time analysis.", + "topics": [ + "psychometrics", + "temporal-analysis", + "event-data", + "multilingual", + "longitudinal-data", + "measurement", + "data-provenance", + "rust", + "contextualwisdomlab" + ], + "deepwiki": true, + "pages": true, + "homepage": "https://contextualwisdomlab.github.io/TEPP/" } } }