Commit Graph

10 Commits

Author SHA1 Message Date
Conor Bronsdon e79254c892 fix: prepare CLI package release 2026-09-11 12:29:32 -07:00
Conor Bronsdon 66da51290c fix: treat em dashes as style-only guidance 2026-09-06 08:37:06 -07:00
Conor Bronsdon 28ba61bc9f fix: preserve prose quote boundaries around malformed bare URLs 2026-09-06 08:02:44 -07:00
Conor Bronsdon 0aa0def0ee Split canonical skill and ship complete Claude bundle 2026-09-05 12:34:24 -07:00
UniversePeak 3dd72f5ec6 Fix automatic marks inference and malformed link scanning 2026-09-06 03:11:15 +08:00
Conor Bronsdon c5ec5b8a93 Complete catalog clarity rules with source-preserving guidance 2026-09-05 11:28:59 -07:00
Conor Bronsdon 081b495614 Narrow repeated reversal punchlines and integrate current main 2026-09-05 11:24:54 -07:00
Conor Bronsdon 4b92218961 Record the published directory listing and scope the notices (#147)
* Scope the terms and privacy notices to OpenAI's plugin guidelines

TERMS.md: the plugin is an editorial tool, not an authorship or eligibility
adjudicator; output about a person must not drive decisions with legal or
similarly material effect (OpenAI's consumer Terms and Usage Policies go
further than the previous "sole basis" wording); no academic dishonesty or
deceptive presentation of AI output; not designed for or marketed to
children under 13.

PRIVACY.md: states the five items OpenAI's plugin guidelines ask a privacy
policy to cover (categories of data, purposes, recipients, retention,
controls), all "none" because the developer receives no user text, and
describes public GitHub issues as the only developer-visible data.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01UaeXzpBoBZKa1dWxVS1bTE

* Record the published directory listing and tighten the notices

Codex review of the first wording pass: the "delete your issue" claim
overpromised GitHub's controls, the decision restriction stayed narrower
than OpenAI's consumer Terms, and the disclosure fragments read like a
checklist. Both notices are now plain prose and as broad as OpenAI's
restriction on person-related output.

The plugin was approved and published in the OpenAI Plugins Directory on
2026-09-04 (plugins_6a9b77b18b8881918efa9c1255868164, version 3.29.0).
README, OPENAI_PLUGIN.md, and the changelog link to it; submission/
listing.json and submission-pack.json record the published state, the
plugin id, and the archive hash that was uploaded.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01UaeXzpBoBZKa1dWxVS1bTE

---------

Co-authored-by: Claude Fable 5.1 <noreply@anthropic.com>
2026-09-04 19:33:35 -07:00
Conor Bronsdon def5e3825f Drop frontmatter metadata from the OpenAI copy of the canonical skill (#146)
* Drop frontmatter metadata from the OpenAI copy of the canonical skill

The OpenAI plugin portal rejected the Skills-only ZIP on
skills/avoid-ai-writing/SKILL.md: "Skill interface settings must use
agents/openai.yaml ... `metadata` in SKILL.md does not configure the skill
interface." That copy was byte-identical to root SKILL.md, whose frontmatter
carries an agentskills.io/OpenClaw `metadata` block (author, repository,
tags, agentskills_spec, openclaw.emoji).

- sync-plugin-skill.sh writes the OpenAI copy with the `metadata` block
  removed from the frontmatter; everything else stays identical. The Claude
  plugin copy is unchanged.
- validate-openai-plugin.py compares root-minus-metadata to the copy for its
  drift check and rejects a `metadata` key in any packaged skill's SKILL.md,
  so the portal error cannot recur silently.
- validate-openai-plugin.test.py covers the transform (body untouched,
  version/license/compatibility kept, no-frontmatter passthrough, copy in
  sync) and three red controls: a byte-identical copy fails both rules, a
  body edit still reads as drift, and `metadata` in another skill fails.

Verified: validate-openai-plugin.test.py, validate-openai-plugin.py . (OK),
npm test, and the rebuilt archive validates after extraction. The rebuilt
ZIP was accepted by the portal's upload validation.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01UaeXzpBoBZKa1dWxVS1bTE

* Single-source the metadata strip and correct the exact-copy wording

Codex review of the previous commit found the awk and Python transforms
could diverge (CRLF files, a frontmatter without a closing delimiter, a
missing final newline) and that both ended the metadata block at a blank
line, leaving orphaned nested keys.

- sync-plugin-skill.sh now calls validate-openai-plugin.py
  --strip-frontmatter-metadata, so one implementation produces the copy and
  checks it.
- strip_frontmatter_metadata keeps line endings byte-exact, treats blank
  lines inside the block as part of it, and returns text without a
  well-formed frontmatter unchanged; the drift check compares bytes again.
- Tests add the edge inputs from the review and a CLI-vs-function
  byte-equality check.
- OPENAI_PLUGIN.md, NOTICE.md, and submission-pack.json no longer call the
  bundled copy an exact copy; they state the one omitted block.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01UaeXzpBoBZKa1dWxVS1bTE

* Match only the top-level metadata key and keep comments inside the block

Codex second pass: `metadata:extra:` is a distinct YAML key and was being
stripped by the prefix match; a column-zero `#` comment inside the metadata
block ended the block early and left an orphaned nested key. The key match
now requires whitespace or end of line after `metadata:`, comment lines
inside the block are skipped with it, and both cases have tests.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01UaeXzpBoBZKa1dWxVS1bTE

---------

Co-authored-by: Claude Fable 5.1 <noreply@anthropic.com>
2026-09-04 19:10:32 -07:00
Mamdouh Aboammar 788c6675c1 Bring Avoid AI Writing to ChatGPT and Codex (#135)
* feat: seed OpenAI plugin skill resources

* feat: add OpenAI plugin manifest and public metadata

* feat: add routed ChatGPT and Codex skill graph

* test: add OpenAI plugin validation and submission pack

* fix: correct listing character-count evidence

* feat: add typed cross-skill handoff contract

* docs: encode agency review lenses for orchestration

* feat: add machine-validated typed skill graph

* feat: upgrade router to typed orchestration protocol

* feat: connect detector to typed handoff network

* feat: connect rewriter to verification and representation guards

* feat: add typed file-edit handoffs and repair loop

* feat: make preservation verifier a blocking typed gate

* feat: connect interpretation guardrail to evidence handoffs

* refactor: replace legacy yaml graph with validated json graph

* test: validate skill graph and cross-skill contracts

* ci: validate cross-skill orchestration graph

* refactor: package connection validator inside router skill

* refactor: keep connection validator inside packaged router skill

* ci: run packaged connection validator before and after extraction

* docs: align routing matrix with typed graph

* test: expand routing evals for connected skill graph

* fix: remove unintended reviewer detector cycle

* fix: make interpretation reviewer terminal in skill graph

* test: reject terminal outgoing edges and unbounded graph cycles

* docs: align handoff contract with terminal reviewer semantics

* docs: route fresh interpretation evidence through router

* docs: document graph v2 and connection validation

* fix: route fresh detector requests through orchestrator

* test: enforce agency lenses and router-return semantics

* test: cover terminal reviewer return-to-router flow

* docs: add connected skill graph v2 to release notes

* fix: remove unsupported skill policy products

* fix: remove unsupported skill policy products

* fix: remove unsupported skill policy products

* fix: remove unsupported skill policy products

* fix: remove unsupported skill policy products

* fix: remove unsupported skill policy products

* fix: remove unsupported skill policy products

* fix: align plugin validator with graph v2 and ingestion policy

* fix: synchronize bundled detector and verifier resources

* fix: bundle detector beside preservation validator

* ci: watch canonical detector resources for plugin drift

* test: smoke packaged preservation residual detector

* ci: exercise residual detector before and after packaging

* fix(port): sync ChatGPT/Codex plugin version with canonical SKILL.md

The merge with main moves the canonical skill to 3.28.0; the plugin
manifest, listing, and submission pack still carried 3.25.1, so
scripts/sync-plugin-skill.sh and scripts/validate-openai-plugin.py both
exit 1 on the effective merge. Bump the three manifests and regenerate
the copies the sync script owns.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>

* fix(port): publish the plugin from the canonical repository

Every public destination in the ChatGPT/Codex package pointed at the
contributor's fork: websiteURL, privacyPolicyURL, termsOfServiceURL,
homepage, repository, the submission listing, and SUPPORT.md. After a
merge the canonical owner would not control the published legal and
support pages. Point them all at conorbronsdon/avoid-ai-writing and make
developerName/packagePublisher the identity that will be verified in the
OpenAI portal. Packaging credit stays: NOTICE.md and listing.json now
name the contributor explicitly.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>

* fix(detector): CRLF input no longer bypasses the preservation validator

validate() extracts frontmatter, tables and headings with regexes that
anchor on a bare newline. A CRLF document matched none of them, so
changing 'title: one' to 'title: two' in Windows-formatted frontmatter
returned { ok: true, errors: [] }. This is a pre-existing bug in the
canonical detector, not something PR #135 introduced - the bundled
plugin copy is byte-identical to detector/validate.js - so the fix and
the must-fire fixtures go in the canonical source and the generated copy
is re-synced from it.

Adds four CRLF fixtures to detector/validate.test.js; all four fail
against the unpatched validator.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>

* fix(port): make the manifest the only source for listing metadata

submission/listing.json restates twelve manifest fields and only three
of them were asserted, so the listing could ship a different developer
name, support URL or description than the manifest it claims to
describe - which is exactly the drift that put a fork's URLs into the
public package. Assert every duplicated field against
.codex-plugin/plugin.json, derive the hand-maintained character counts
instead of trusting them, and require every public URL to sit under the
canonical author.url so publication cannot move off this repository
without turning the check red.

Also: guard the canonical-copy comparison against a missing plugin copy
(it raised FileNotFoundError instead of reporting), scope the hygiene
scan to the packaged surface instead of walking .git, and restore the
CLAUDE.md path-filter rationale the port deleted from the workflow.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>

* fix(port): bundle every resource the canonical skill references

OpenAI's submission contract says each skill must include any referenced
scripts, templates, or assets, and the Codex skill layout has no shared-
resource mechanism, so skills/avoid-ai-writing/SKILL.md (byte-identical to
root SKILL.md) now ships with synced copies of detector/patterns.js,
detector/validate.js, detector/CATEGORIES.md, scripts/check-style.js, and
examples/ at the same relative paths. scripts/sync-plugin-skill.sh produces
them and the existing regenerate-then-diff CI gate covers them. A new smoke
test runs check-style and the preservation validator from inside the
bundled tree and from an extracted package.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>

* fix(port): manifest supportURL, ancestry-checked baseCommit, policy.products

interface.supportURL now lives in .codex-plugin/plugin.json and the listing
value is validated against it. Both submission files record baseCommit as
the origin/main merge-base and the validator checks it is an ancestor of
HEAD so it cannot drift silently; the verifier's copied patterns.js joins
the deterministic-resource inventory. The validator accepts
policy.products with CHAT and/or CODEX per the current agents/openai.yaml
schema and keeps rejecting unknown policy keys, with tests.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>

* fix(port): follow main to 3.29.0 after #128 landed

Bump .codex-plugin/plugin.json and the submission metadata to 3.29.0, set
baseCommit to the new origin/main merge-base, and regenerate the bundled
copies so the sync gate is clean on the merge ref.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>

* fix(port): changelog and README for the plugin package; harden packager and validator

Qodo re-review items: a dated 3.29.0 changelog entry and a README section
for the native ChatGPT/Codex package; the packager and validator now reject
symlinked top-level package files; JSON loading rejects a non-object root
with a validation error instead of crashing, with tests for list and null
roots and for the symlink case (skipped where symlinks need privileges).

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>

* fix(port): packager and validator hardening, lone-CR preservation, workflow paths

Qodo re-review items 6-11: the marketplace policy no longer demands
install-time authentication for a skills-only package (ON_USE, the only
other documented value); the packager rejects an output path that is a
packaged input or sits inside an included directory and fails on a missing
top-level package file instead of silently omitting it; the validator
type-checks nested submission objects before access; the preservation
validator normalizes CRLF only, so a lone carriage return changed inside
code is reported again; LICENSE joins the workflow path filters. Tests for
each; bundled validator copies re-synced.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>

* fix(port): marketplace authentication policy is first-use, not install-time

The skills-only package has no authentication flow or hosted service. The
marketplace docs say policy.authentication decides whether auth happens on
install or first use; first use never triggers for local skills, so ON_USE
replaces ON_INSTALL. (Qodo item 6, deferred from the previous commit because
the implementer sandbox could not write .agents/.)

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>

* fix(port): graph validator rejects malformed JSON cleanly; canonical URL is a constant

Qodo items 8 and 9. validate_connections.py now checks the graph root and
edge field types and reports through its validation path instead of
raising, with a test script wired into CI. validate-openai-plugin.py pins
CANONICAL_PROJECT_URL and requires author.url to equal it, so changing every
public URL to a fork no longer passes; test added.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>

* fix(port): bound SVG parsing and stop empty skill names polluting the graph set

Qodo items 19 and 20. The validator rejects SVGs carrying <!DOCTYPE or
<!ENTITY declarations and anything over 256 KiB before handing text to
ElementTree, closing the entity-expansion path; a skill whose frontmatter
lacks a name reports that error once instead of inserting an empty name
that cascades into router-graph errors. Tests for both.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>

* ci(port): full-history checkout so the baseCommit ancestry check can run

The validator's merge-base --is-ancestor check needs the base commit in the
checkout; actions/checkout's default depth of 1 made CI report it as "not a
valid commit name".

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>

---------

Co-authored-by: Conor Bronsdon <120674402+conorbronsdon@users.noreply.github.com>
Co-authored-by: Claude Fable 5.1 <noreply@anthropic.com>
2026-09-03 14:45:51 -07:00