From 9dfb67e48f7c021f63ead2c19c9385ebd57993c7 Mon Sep 17 00:00:00 2001 From: Alan Szmyt Date: Sat, 29 Aug 2026 06:56:27 -0400 Subject: [PATCH] fix: resolve social catalog rights gate --- catalog/external/source-candidates.v1.json | 10 +++--- catalog/first-party/catalog.v1.json | 2 +- catalog/social-surfaces/README.md | 17 +++++---- catalog/social-surfaces/RIGHTS_REVIEW.md | 36 +++++++++++++++++++ catalog/social-surfaces/catalog.v1.json | 10 +++--- .../social-surface-specs/catalog.v1.json | 10 +++--- .../distribution-manifest.v1.json | 6 ++-- dist/skills/social-surface-specs/SKILL.md | 9 ++--- .../distribution-manifest.v1.json | 4 +-- .../references/freshness-and-rights.md | 10 +++--- .../references/social-surface-catalog.v1.json | 10 +++--- .../marketing/social-surface-specs/SKILL.md | 9 ++--- .../references/freshness-and-rights.md | 10 +++--- tests/test_social_surface_catalog.py | 11 ++++-- 14 files changed, 102 insertions(+), 52 deletions(-) create mode 100644 catalog/social-surfaces/RIGHTS_REVIEW.md diff --git a/catalog/external/source-candidates.v1.json b/catalog/external/source-candidates.v1.json index 929514f..f67b6a0 100644 --- a/catalog/external/source-candidates.v1.json +++ b/catalog/external/source-candidates.v1.json @@ -20,17 +20,17 @@ "value": "13a44970b5d1fd7a232eabc6a2abe42e7ba5c4a6a68e21484717f2b70509a0ac" }, "acquired_at": "2026-08-28T17:07:39Z", - "reviewed_at": "unknown", - "review_state": "pending", - "trust_classification": "unknown", + "reviewed_at": "2026-08-29", + "review_state": "reviewed", + "trust_classification": "restricted", "compatibility": { "required_tools": [] }, "executable_resources": "unknown", "consumer_profile": "human-review", "pinned_install_example": "not-installable: the supplied snapshot is an external source candidate and is not redistributed by Aether", - "redistribution_permission": "unknown", - "redistribution_status": "unverified" + "redistribution_permission": "disallowed", + "redistribution_status": "verified" } ] } diff --git a/catalog/first-party/catalog.v1.json b/catalog/first-party/catalog.v1.json index 53e69cf..d8f7ca2 100644 --- a/catalog/first-party/catalog.v1.json +++ b/catalog/first-party/catalog.v1.json @@ -1342,7 +1342,7 @@ "scope": "organization", "source_digest": { "algorithm": "sha256-utf8-lf", - "value": "ba2d0baa2dc8ecbfe3f268ac64dcaf31d9ab2dccb111b2f2a8ff7f44c4441a49" + "value": "33c29870108626a5f73267f97120d389447f52c96bb7d2587feeb6519b724b33" }, "source_path": "library/organization/skills/marketing/social-surface-specs/SKILL.md", "supersedes_ids": [], diff --git a/catalog/social-surfaces/README.md b/catalog/social-surfaces/README.md index bbad40c..54fc650 100644 --- a/catalog/social-surfaces/README.md +++ b/catalog/social-surfaces/README.md @@ -10,15 +10,18 @@ and pinned subset for a Brand Kit. `catalog.v1.json` records the supplied 2026-08-28 source snapshot by exact SHA-256 digest, capture timestamp, and inventory counts. The source candidate -is registered in `../external/source-candidates.v1.json` with a pending rights -review; [#54](https://github.com/egohygiene/aether/issues/54) owns that -decision. The archive and its SVG templates are deliberately absent from this -repository. +is registered in `../external/source-candidates.v1.json`. The rights review in +[#54](https://github.com/egohygiene/aether/issues/54) permits using the source +for creative reference, but does not establish permission to republish the +full directory as a normalized public catalog. The archive, source-derived +records, and SVG templates are deliberately absent from this repository. See +[`RIGHTS_REVIEW.md`](RIGHTS_REVIEW.md) for the recorded evidence and decision. No source-derived surface records may be added while the catalog's -`rights_review.state` is `pending` or `rejected`. A review decision must name -the permitted use and its evidence before changing the catalog to stable or -release-included. +`rights_review.state` is `rejected`. A future approval that clearly authorizes +public normalized-record publication must name the permitted use and evidence, +pin a new catalog version and digest, and pass ordinary release validation +before changing the catalog to stable or release-included. ## Contract and unknowns diff --git a/catalog/social-surfaces/RIGHTS_REVIEW.md b/catalog/social-surfaces/RIGHTS_REVIEW.md new file mode 100644 index 0000000..6928d45 --- /dev/null +++ b/catalog/social-surfaces/RIGHTS_REVIEW.md @@ -0,0 +1,36 @@ +# Media Cheat Sheet rights review + +## Decision + +- Source candidate: `external/media-cheat-sheet-social-surface-snapshot` +- Snapshot captured: `2026-08-28T17:07:39Z` +- Snapshot SHA-256: `13a44970b5d1fd7a232eabc6a2abe42e7ba5c4a6a68e21484717f2b70509a0ac` +- Terms reviewed: +- Terms last updated by the source: `2026-08-21` +- Review date: `2026-08-29` +- Reviewer: OpenAI Codex, applying Aether's conservative source-governance policy; this is a repository publication decision, not legal advice. +- Decision record: +- Resulting catalog version: `1.0.1` +- Resulting catalog digest (`sha256-utf8-lf`): `cc8186add31b923ceabdd0516c8f959823b36a0397262c2a03a1eef6d380e17e` + +| Use | Decision | Evidence and boundary | +| --- | --- | --- | +| Private/internal reference | Permitted for creative work | The terms allow using specifications and guidance for personal or commercial creative work, subject to live verification. | +| Public normalized factual catalog | Not authorized from this snapshot | The terms do not expressly permit republication of the full specification directory; website content remains protected and only limited quotation/linking is identified. Aether therefore treats bulk normalized publication as disallowed. | +| Raw archive or SVG template redistribution | Prohibited | Templates may be used, modified, and shared with same-project collaborators, but may not be republished or redistributed as a competing library or standalone product. Aether does not redistribute them at all. | + +## Repository consequences + +- The catalog remains experimental and contains zero source-derived records. +- The source candidate is reviewed but restricted and non-publishable. +- The archive and its 302 SVG templates remain absent. +- The catalog and skill remain useful as an offline contract, deterministic + query implementation, synthetic fixture, provenance record, and consumer + lock boundary. +- A future independently gathered official-source catalog, or explicit + permission covering normalized republication, must use a new version and + digest and pass the normal Aether release gate. + +Platform specifications can change. Any production use must verify selected +requirements against the linked official platform source before publishing or +spending money. diff --git a/catalog/social-surfaces/catalog.v1.json b/catalog/social-surfaces/catalog.v1.json index f3bcd60..016c934 100644 --- a/catalog/social-surfaces/catalog.v1.json +++ b/catalog/social-surfaces/catalog.v1.json @@ -2,7 +2,7 @@ "schema_version": "aether.social-surface-catalog/v1", "catalog": { "id": "catalog/social-surface-specs", - "version": "1.0.0", + "version": "1.0.1", "lifecycle": { "state": "experimental" }, @@ -21,14 +21,14 @@ "template_count": 302 }, "rights_review": { - "state": "pending", - "reviewed_at": null, + "state": "rejected", + "reviewed_at": "2026-08-29", "decision_reference": "https://github.com/egohygiene/aether/issues/54", - "notes": "The supplied source describes use as personal and non-commercial. Live terms and redistribution rights must be reviewed before any source-derived record is published in this public catalog." + "notes": "Terms reviewed on 2026-08-29 permit using specifications for personal or commercial creative work, but do not expressly authorize republication of the full directory as a public normalized catalog. Website content remains protected and template republication is prohibited. Aether therefore publishes no source-derived records or templates from this snapshot." }, "release": { "included": false, - "reason": "Experimental catalog: source-rights review is pending, so no source-derived records or templates are distributed." + "reason": "Experimental metadata-only catalog: the source-rights review did not authorize public redistribution of normalized records or templates." } }, "records": [] diff --git a/dist/catalogs/social-surface-specs/catalog.v1.json b/dist/catalogs/social-surface-specs/catalog.v1.json index f3bcd60..016c934 100644 --- a/dist/catalogs/social-surface-specs/catalog.v1.json +++ b/dist/catalogs/social-surface-specs/catalog.v1.json @@ -2,7 +2,7 @@ "schema_version": "aether.social-surface-catalog/v1", "catalog": { "id": "catalog/social-surface-specs", - "version": "1.0.0", + "version": "1.0.1", "lifecycle": { "state": "experimental" }, @@ -21,14 +21,14 @@ "template_count": 302 }, "rights_review": { - "state": "pending", - "reviewed_at": null, + "state": "rejected", + "reviewed_at": "2026-08-29", "decision_reference": "https://github.com/egohygiene/aether/issues/54", - "notes": "The supplied source describes use as personal and non-commercial. Live terms and redistribution rights must be reviewed before any source-derived record is published in this public catalog." + "notes": "Terms reviewed on 2026-08-29 permit using specifications for personal or commercial creative work, but do not expressly authorize republication of the full directory as a public normalized catalog. Website content remains protected and template republication is prohibited. Aether therefore publishes no source-derived records or templates from this snapshot." }, "release": { "included": false, - "reason": "Experimental catalog: source-rights review is pending, so no source-derived records or templates are distributed." + "reason": "Experimental metadata-only catalog: the source-rights review did not authorize public redistribution of normalized records or templates." } }, "records": [] diff --git a/dist/catalogs/social-surface-specs/distribution-manifest.v1.json b/dist/catalogs/social-surface-specs/distribution-manifest.v1.json index baf0f3f..46bb99f 100644 --- a/dist/catalogs/social-surface-specs/distribution-manifest.v1.json +++ b/dist/catalogs/social-surface-specs/distribution-manifest.v1.json @@ -1,17 +1,17 @@ { "catalog_digest": { "algorithm": "sha256-utf8-lf", - "value": "fbe8a65f103aa3806bd1e9abb3d1661d0594cc88fdaac6a3f764943e22d503bb" + "value": "cc8186add31b923ceabdd0516c8f959823b36a0397262c2a03a1eef6d380e17e" }, "catalog_id": "catalog/social-surface-specs", - "catalog_version": "1.0.0", + "catalog_version": "1.0.1", "generated_paths": [ "dist/catalogs/social-surface-specs/catalog.v1.json", "dist/catalogs/social-surface-specs/distribution-manifest.v1.json" ], "generator": "catalog/social-surfaces/build-distribution.py", "publication": { - "reason": "Experimental catalog: source-rights review is pending, so no source-derived records or templates are distributed.", + "reason": "Experimental metadata-only catalog: the source-rights review did not authorize public redistribution of normalized records or templates.", "state": "blocked" }, "schema_version": "aether.catalog-distribution-manifest/v1" diff --git a/dist/skills/social-surface-specs/SKILL.md b/dist/skills/social-surface-specs/SKILL.md index bf8092d..086c3c3 100644 --- a/dist/skills/social-surface-specs/SKILL.md +++ b/dist/skills/social-surface-specs/SKILL.md @@ -3,7 +3,7 @@ name: social-surface-specs description: Select and explain pinned social-media or advertising creative surfaces from a provenance-governed offline catalog. Use when work needs platform placement, dimensions, media limits, safe zones, or organic-versus-advertising distinctions. license: MIT metadata: - aether-version: "1.0.0" + aether-version: "1.0.1" aether-status: "experimental" aether-scope: "organization" aether-domain: "marketing" @@ -63,6 +63,7 @@ consequential, paid, or production requirements, verify the record's linked official source and say that a live check occurred. Do not copy source-pack templates, inject unpublished source data, or change rights/review status. -The current catalog is experimental and rights-pending. Its empty records list -is intentional: the source archive is registered by digest but is not -redistributed through this skill until an explicit review authorizes that use. +The current catalog is experimental and metadata-only. Its empty records list +is intentional: the source review permits creative reference but did not +authorize republication of the full directory as a normalized public catalog. +The skill must not redistribute the source archive, records, or templates. diff --git a/dist/skills/social-surface-specs/distribution-manifest.v1.json b/dist/skills/social-surface-specs/distribution-manifest.v1.json index 011bbc7..dadb60d 100644 --- a/dist/skills/social-surface-specs/distribution-manifest.v1.json +++ b/dist/skills/social-surface-specs/distribution-manifest.v1.json @@ -1,6 +1,6 @@ { "artifact_id": "skill/social-surface-specs", - "artifact_version": "1.0.0", + "artifact_version": "1.0.1", "compatibility": { "required_tools": [] }, @@ -19,6 +19,6 @@ "schema_version": "aether.distribution-manifest/v1", "source_digest": { "algorithm": "sha256-utf8-lf", - "value": "ba2d0baa2dc8ecbfe3f268ac64dcaf31d9ab2dccb111b2f2a8ff7f44c4441a49" + "value": "33c29870108626a5f73267f97120d389447f52c96bb7d2587feeb6519b724b33" } } diff --git a/dist/skills/social-surface-specs/references/freshness-and-rights.md b/dist/skills/social-surface-specs/references/freshness-and-rights.md index 9b124fe..690e6a2 100644 --- a/dist/skills/social-surface-specs/references/freshness-and-rights.md +++ b/dist/skills/social-surface-specs/references/freshness-and-rights.md @@ -9,7 +9,9 @@ linked official source, verify the relevant values, and note the check in the handoff. If the live source differs, do not silently edit the pinned catalog: submit a reviewed catalog update with a new source snapshot and release lock. -The external source candidate has a pending redistribution review in -[#54](https://github.com/egohygiene/aether/issues/54). Do not copy the source -archive, SVG templates, or source-derived records into another repository -unless the recorded rights decision explicitly authorizes that use. +The external source candidate's redistribution review is recorded in +[#54](https://github.com/egohygiene/aether/issues/54). The reviewed terms allow +using specifications for creative work, but do not expressly authorize +republication of the full directory as a normalized public catalog. Do not +copy the source archive, SVG templates, or source-derived records into another +repository unless a later recorded decision explicitly authorizes that use. diff --git a/dist/skills/social-surface-specs/references/social-surface-catalog.v1.json b/dist/skills/social-surface-specs/references/social-surface-catalog.v1.json index f3bcd60..016c934 100644 --- a/dist/skills/social-surface-specs/references/social-surface-catalog.v1.json +++ b/dist/skills/social-surface-specs/references/social-surface-catalog.v1.json @@ -2,7 +2,7 @@ "schema_version": "aether.social-surface-catalog/v1", "catalog": { "id": "catalog/social-surface-specs", - "version": "1.0.0", + "version": "1.0.1", "lifecycle": { "state": "experimental" }, @@ -21,14 +21,14 @@ "template_count": 302 }, "rights_review": { - "state": "pending", - "reviewed_at": null, + "state": "rejected", + "reviewed_at": "2026-08-29", "decision_reference": "https://github.com/egohygiene/aether/issues/54", - "notes": "The supplied source describes use as personal and non-commercial. Live terms and redistribution rights must be reviewed before any source-derived record is published in this public catalog." + "notes": "Terms reviewed on 2026-08-29 permit using specifications for personal or commercial creative work, but do not expressly authorize republication of the full directory as a public normalized catalog. Website content remains protected and template republication is prohibited. Aether therefore publishes no source-derived records or templates from this snapshot." }, "release": { "included": false, - "reason": "Experimental catalog: source-rights review is pending, so no source-derived records or templates are distributed." + "reason": "Experimental metadata-only catalog: the source-rights review did not authorize public redistribution of normalized records or templates." } }, "records": [] diff --git a/library/organization/skills/marketing/social-surface-specs/SKILL.md b/library/organization/skills/marketing/social-surface-specs/SKILL.md index bf8092d..086c3c3 100644 --- a/library/organization/skills/marketing/social-surface-specs/SKILL.md +++ b/library/organization/skills/marketing/social-surface-specs/SKILL.md @@ -3,7 +3,7 @@ name: social-surface-specs description: Select and explain pinned social-media or advertising creative surfaces from a provenance-governed offline catalog. Use when work needs platform placement, dimensions, media limits, safe zones, or organic-versus-advertising distinctions. license: MIT metadata: - aether-version: "1.0.0" + aether-version: "1.0.1" aether-status: "experimental" aether-scope: "organization" aether-domain: "marketing" @@ -63,6 +63,7 @@ consequential, paid, or production requirements, verify the record's linked official source and say that a live check occurred. Do not copy source-pack templates, inject unpublished source data, or change rights/review status. -The current catalog is experimental and rights-pending. Its empty records list -is intentional: the source archive is registered by digest but is not -redistributed through this skill until an explicit review authorizes that use. +The current catalog is experimental and metadata-only. Its empty records list +is intentional: the source review permits creative reference but did not +authorize republication of the full directory as a normalized public catalog. +The skill must not redistribute the source archive, records, or templates. diff --git a/library/organization/skills/marketing/social-surface-specs/references/freshness-and-rights.md b/library/organization/skills/marketing/social-surface-specs/references/freshness-and-rights.md index 9b124fe..690e6a2 100644 --- a/library/organization/skills/marketing/social-surface-specs/references/freshness-and-rights.md +++ b/library/organization/skills/marketing/social-surface-specs/references/freshness-and-rights.md @@ -9,7 +9,9 @@ linked official source, verify the relevant values, and note the check in the handoff. If the live source differs, do not silently edit the pinned catalog: submit a reviewed catalog update with a new source snapshot and release lock. -The external source candidate has a pending redistribution review in -[#54](https://github.com/egohygiene/aether/issues/54). Do not copy the source -archive, SVG templates, or source-derived records into another repository -unless the recorded rights decision explicitly authorizes that use. +The external source candidate's redistribution review is recorded in +[#54](https://github.com/egohygiene/aether/issues/54). The reviewed terms allow +using specifications for creative work, but do not expressly authorize +republication of the full directory as a normalized public catalog. Do not +copy the source archive, SVG templates, or source-derived records into another +repository unless a later recorded decision explicitly authorizes that use. diff --git a/tests/test_social_surface_catalog.py b/tests/test_social_surface_catalog.py index 40857f1..e0d1963 100644 --- a/tests/test_social_surface_catalog.py +++ b/tests/test_social_surface_catalog.py @@ -37,8 +37,13 @@ def test_source_candidate_is_registered_without_raw_archive_or_templates(self): ) candidate = candidate_catalog["entries"][0] self.assertEqual(candidate["id"], "external/media-cheat-sheet-social-surface-snapshot") - self.assertEqual(candidate["review_state"], "pending") - self.assertEqual(candidate["redistribution_permission"], "unknown") + self.assertEqual(candidate["review_state"], "reviewed") + self.assertEqual(candidate["trust_classification"], "restricted") + self.assertEqual(candidate["redistribution_permission"], "disallowed") + self.assertEqual(candidate["redistribution_status"], "verified") + catalog = json.loads((CATALOG_DIR / "catalog.v1.json").read_text(encoding="utf-8")) + self.assertEqual(catalog["catalog"]["rights_review"]["state"], "rejected") + self.assertEqual(catalog["records"], []) self.assertFalse(any(path.suffix.lower() == ".svg" for path in CATALOG_DIR.rglob("*"))) self.assertFalse((ROOT / "catalog/social-surfaces/social-media-specs.zip").exists()) @@ -69,7 +74,7 @@ def test_catalog_distribution_is_deterministic_and_lockable(self): (output / "catalogs/social-surface-specs/distribution-manifest.v1.json").read_text(encoding="utf-8") ) self.assertEqual(manifest["catalog_id"], "catalog/social-surface-specs") - self.assertEqual(manifest["catalog_version"], "1.0.0") + self.assertEqual(manifest["catalog_version"], "1.0.1") self.assertRegex(manifest["catalog_digest"]["value"], r"^[a-f0-9]{64}$") self.assertEqual(manifest["publication"]["state"], "blocked")