Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -160,7 +160,7 @@ The repository root is a skill-only plugin for OpenAI/Codex and Claude. `.codex-

Skill Feedback Engine has no MCP component, and none is declared by these manifests. The registration files prepare local discovery only; they do not install, authenticate, publish, or activate anything externally.

`publisher/publisher.json` derives Openly Useful identity and public policy URLs from <https://openlyuseful.org/publisher/manifest.json>. Openly Useful LLC remains a planned, formation-pending publisher/operator/licensee, and external publication authorization remains withheld.
`publisher/publisher.json` derives Openly Useful identity and public policy URLs from <https://openlyuseful.org/publisher/manifest.json>. Openly Useful is founder-operated while Openly Useful LLC remains formation-pending. External publication is authorized directly by the founder-owner, subject to namespace verification, provider-account authentication, and provider review. This does not represent the planned LLC as formed, active, or the current operator.

## Daily review on macOS

Expand Down
19 changes: 16 additions & 3 deletions publisher/publisher.json
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,12 @@
"licensee"
]
},
"currentOperator": {
"status": "founder-operated",
"type": "founder-individual",
"displayName": "Founder of Openly Useful",
"operatingAs": "Openly Useful"
},
"policies": {
"privacy": "https://openlyuseful.org/legal/privacy",
"terms": "https://openlyuseful.org/legal/terms",
Expand All @@ -39,8 +45,15 @@
],
"mcp": false
},
"externalPublication": {
"allowed": false,
"authorization": "withheld"
"publication": {
"externalPublicationAllowed": true,
"authorization": "granted",
"authorizationBasis": "founder-owner-direct",
"effectiveWhileFormationPending": true,
"blockingRequirements": [
"namespace-verification",
"provider-account-authentication",
"provider-review"
]
}
}
23 changes: 21 additions & 2 deletions scripts/validate_registration.py
Original file line number Diff line number Diff line change
Expand Up @@ -46,8 +46,27 @@ def validate_registration(root: Path = ROOT) -> List[str]:
errors.append("planned entity must be Openly Useful LLC with formation-pending status")
elif sorted(legal.get("roles", [])) != ["licensee", "operator", "publisher"]:
errors.append("planned entity roles are invalid")
if publisher.get("externalPublication") != {"allowed": False, "authorization": "withheld"}:
errors.append("external publication must remain withheld")
expected_operator = {
"status": "founder-operated",
"type": "founder-individual",
"displayName": "Founder of Openly Useful",
"operatingAs": "Openly Useful",
}
if publisher.get("currentOperator") != expected_operator:
errors.append("current operation must remain founder-operated while formation is pending")
expected_publication = {
"externalPublicationAllowed": True,
"authorization": "granted",
"authorizationBasis": "founder-owner-direct",
"effectiveWhileFormationPending": True,
"blockingRequirements": [
"namespace-verification",
"provider-account-authentication",
"provider-review",
],
}
if publisher.get("publication") != expected_publication:
errors.append("external publication must use founder-owner-direct authority while formation is pending")

component = publisher.get("component")
if not isinstance(component, dict):
Expand Down
44 changes: 44 additions & 0 deletions tests/test_registration.py
Original file line number Diff line number Diff line change
Expand Up @@ -67,6 +67,50 @@ def test_validator_rejects_premature_llc_activation(self):
errors = validate_registration(fixture)
self.assertTrue(any("formation-pending" in error for error in errors))

def test_validator_rejects_non_founder_current_operator(self):
with tempfile.TemporaryDirectory() as directory:
fixture = Path(directory)
for relative in [
"publisher/publisher.json",
".codex-plugin/plugin.json",
".claude-plugin/plugin.json",
".claude-plugin/marketplace.json",
".agents/plugins/marketplace.json",
"skills/skill-feedback-engine/SKILL.md",
]:
source = ROOT / relative
target = fixture / relative
target.parent.mkdir(parents=True, exist_ok=True)
target.write_bytes(source.read_bytes())
publisher_path = fixture / "publisher" / "publisher.json"
publisher = json.loads(publisher_path.read_text(encoding="utf-8"))
publisher["currentOperator"]["status"] = "llc-operated"
publisher_path.write_text(json.dumps(publisher), encoding="utf-8")
errors = validate_registration(fixture)
self.assertTrue(any("founder-operated" in error for error in errors))

def test_validator_rejects_publication_without_founder_authority(self):
with tempfile.TemporaryDirectory() as directory:
fixture = Path(directory)
for relative in [
"publisher/publisher.json",
".codex-plugin/plugin.json",
".claude-plugin/plugin.json",
".claude-plugin/marketplace.json",
".agents/plugins/marketplace.json",
"skills/skill-feedback-engine/SKILL.md",
]:
source = ROOT / relative
target = fixture / relative
target.parent.mkdir(parents=True, exist_ok=True)
target.write_bytes(source.read_bytes())
publisher_path = fixture / "publisher" / "publisher.json"
publisher = json.loads(publisher_path.read_text(encoding="utf-8"))
publisher["publication"]["authorizationBasis"] = "planned-entity"
publisher_path.write_text(json.dumps(publisher), encoding="utf-8")
errors = validate_registration(fixture)
self.assertTrue(any("founder-owner-direct" in error for error in errors))


if __name__ == "__main__":
unittest.main()
Loading