docs: permit a time-boxed parallel packaging evaluation - #19
Merged
Conversation
Section 10 said "native packaging and runtime contracts stay local to their host." Read literally that forbids a single package set spanning two hosts, including one built only to assess whether a cross-host packaging format is worth adopting. That is the one sentence blocking a decided evaluation, so this adds a carve-out scoped to assessment and nothing wider. The change is additive. No existing sentence is edited or removed, so both standing prohibitions survive verbatim: no repository is generated from another at install time, and no automatic synchronization is introduced. The carve-out restates both, adds the runtime cross-loading prohibition that PLUGIN-PHILOSOPHY already carries, and requires every host repository to stay the source of truth for its host with its native catalog retained. Retirement is explicitly NOT authorized here. The carve-out names the gate a later retirement amendment must clear: the section 8 matrix exercised per skill with evidence published per section 9, and every mapped trigger verified from a clean consumer repository. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Dm3XHznFdU1M4TysnJ26gu
|
Bugbot is not enabled for your account, so this pull request was not reviewed. Enable Bugbot in the Cursor dashboard to get automatic reviews on future PRs. |
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: f4d48e247d
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
kyle-sexton
added a commit
that referenced
this pull request
Aug 16, 2026
## Summary `docs/OFFICIAL-DOCS.md` is this repository's maintained navigation index of live upstream pointers. A full live audit of the index on 2026-08-16 found two real defects. This PR fixes both. One file, **+7/-3**. **Defect 1 — the Agent Plugins specification is missing.** "Normative ecosystem contracts" indexed the **Agent Skills** specification and the Model Context Protocol specification, but not the **Agent Plugins** specification. Those are different documents with different scopes: Agent Plugins is the packaging contract that compatible clients load, and Agent Skills and MCP are two of the component contracts it packages. Reading the Agent Skills spec therefore does not discharge a preflight for a claim that rests on Agent Plugins packaging — which is precisely the failure a missing pointer invites, and the same conflation that produced a P1 review thread on #19. The fix adds the pointer and one clause of disambiguation to the section's existing lead-in. **Defect 2 — both Claude Code pointers moved host.** They return HTTP **301** to a new host and a flattened path. `AGENTS.md` names this case directly: "If a source host moves a page, update this index in the same change that relies on the new location." | Old URL | Code | New URL | | --- | --- | --- | | `docs.claude.com/en/docs/claude-code/overview` | 301 | `code.claude.com/docs/en/overview` | | `docs.claude.com/en/docs/claude-code/plugins` | 301 | `code.claude.com/docs/en/plugins` | Both new targets are confirmed against the publisher's own page list rather than against the redirect alone: `code.claude.com/docs/llms.txt` lists both, and a search of that same index for `docs.claude.com` returns **zero** hits. The old host is retired from the publisher's index, so this is a completed move, not a transitional alias. Both existing labels remain accurate at the new URLs, so no label text changes. ### Scope note, stated rather than hidden The audit behind this change recommended **splitting** these into two pull requests — two defects, two sections, two independent bodies of evidence — while recording that combining them is defensible and cheap, since the Claude Code fix is a two-line, evidence-complete change with zero interaction with the other. They are combined here deliberately: both are evidence-complete, and `AGENTS.md`'s "update this index when a pointer moves" clause is unconditional, so leaving a known-moved pointer in place once observed is the worse option. The contrary recommendation is recorded here so a reviewer can disagree with the call knowing it was made rather than overlooked. ### Deliberately NOT changed Two of the four redirects the audit found are **not** defects, recorded so they are not "fixed" later by someone who re-runs the same scan: | Pointer | Code | Why it stays | | --- | --- | --- | | MCP `/specification/latest` | **307 Temporary** | A temporary redirect on a path whose final segment is literally `latest` is the publisher operating a rotating alias. Rewriting it to the dated target would pin this index to a snapshot and defeat the alias — the opposite of what this file is for. | | `alistair.cockburn.us/hexagonal-architecture/` | **301**, same host, same path, trailing slash dropped | Pure URL canonicalization. No move, no content change. Churn with no reader benefit. | Also not added, because the defect does not require them: the spec's version and status strings (this file states in its own opening that it "is not a cached specification", and embedding `1.0.0 / Working Draft` would go stale as the draft advances), `agent-plugins.org` sub-pages, or a `/compatible-clients` pointer. ## Mandatory documentation preflight **Verification date: 2026-08-16.** Repository reads taken from `origin/main`: `README.md`, `docs/OFFICIAL-DOCS.md`, all of `docs/PLUGIN-PHILOSOPHY.md`, and `AGENTS.md`. **Every one of the 29 URLs in the index was fetched live**, not sampled. Results: **25 OK, 4 redirected, 0 dead, 0 content-drifted.** Status codes were probed deterministically and each pointer's served content was checked against the label the index gives it, because a `200` serving unrelated content is a defect no status code reveals. Live pointers consulted for the two changes specifically, all retrieved 2026-08-16: - <https://agent-plugins.org/specification> — 200, no redirect. Confirmed present in <https://agent-plugins.org/sitemap.xml>, which emits 13 entries and lists no versioned specification path, so there is no competing canonical candidate. - <https://agent-plugins.org/> — 200. Establishes the container-vs-component relationship this PR's lead-in sentence describes. - <https://code.claude.com/docs/en/overview> — 200 (from a 301). - <https://code.claude.com/docs/en/plugins> — 200 (from a 301). - <https://code.claude.com/docs/llms.txt> — 200. The publisher's own page list, used to confirm both new paths and the absence of the old host. - <https://cursor.com/docs/plugins> — 200. Independent client-side corroboration that Agent Plugins is a distinct standard. Every URL is linked, not reproduced; no upstream prose or examples are copied into this repository. **A method note this repository should hold us to.** One URL in an earlier pass of this work was produced by a page summarizer rather than by the publisher, was then fetched, and its 404 was reported as an upstream defect. It was not: the path existed nowhere upstream. Every URL in this PR is either extracted by script from the file being edited or confirmed against a publisher-emitted page list (`sitemap.xml` / `llms.txt`). No pointer here rests on a summarizer's output. ## Commands and behavioral evidence Run locally on this branch before pushing: ``` $ npm test ℹ tests 35 ℹ pass 35 ℹ fail 0 $ npm run validate PASS: marketplace <checkout>; 0 error(s), 0 warning(s). ``` The directly relevant gate is `tests/documentation-contract.test.mjs`'s "the upstream index retains every required live OpenAI pointer", which passes — this change adds a pointer and re-targets two, and removes none. "repository-owned Markdown pointers resolve" also passes. Staging used an explicit path (`git add docs/OFFICIAL-DOCS.md`). The commit is signature-verified. ## `AGENTS.md` PR contract — rows that do not apply Named rather than silently omitted. **User goal and vertical slice:** keep the upstream source map accurate, so a preflight performed against it is actually sufficient; the slice is the index file alone. **Live upstream URLs consulted and the date checked:** above. **Context inputs and precedence:** `AGENTS.md`'s preflight and PR contract, and this file's own stated purpose; no precedence conflict arose. **Native surfaces selected**, **ports and adapters introduced**, **defaults, configuration, and fallbacks**, and **migration dispositions and intentional differences** are all **not applicable** — no plugin, skill, manifest, script, or marketplace entry changes here, and no CLI surface is touched, so the `codex ... --help` inspection required for CLI-affecting changes is not triggered. ## Related **No linked issue.** This corrects a documentation index defect found while completing the live preflight requested by review on #19; it is recorded in this repository's planning artifacts rather than as a GitHub issue. This PR is independent of #19 and does not depend on it. It is offered for maintainer review on its own merits. Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
Merge authorised by the repository owner, 2026-08-16 — given out of band,
not as a review on this PR, so it is recorded here rather than inferred from
the timeline. This opened as a proposal, and the merge decision was always the
repository owner's; the owner has now taken it. Superseded, both sentences named rather than silently
dropped: this paragraph previously read "Proposal for maintainer review —
please do not merge on my account. This is drafted as a proposal; the merge
decision is the repository owner's." The first sentence is a standing
instruction that no longer holds. The second remains true and is carried forward
above in the past tense, because the decision was the owner's and that is how it
was taken.
The organization has decided to build a consolidated Agent Plugins v1 package
set in parallel, in a separate evaluation repository, and to retire
nothing.
codex-pluginsandcursor-pluginseach stay the source of truthfor their own host throughout.
One sentence in this repository blocks that evaluation. Section 10 says:
A single package set spanning two hosts is, on its face, shared native
packaging — even when it is hand-built, temporary, and exists only to answer
"is this format worth adopting?". This PR adds a carve-out for exactly that
case and nothing wider.
What this permits
A deliberate, hand-built, time-boxed parallel package set in a separate
evaluation repository, on four conditions: every host repository stays the
source of truth for its host with its own manifests, releases, tests and
adapters; every native marketplace catalog is retained; the set is built by
hand and human-reviewed, never emitted by a tool that reads one repository and
writes another; and the evaluation has a written end date and a named owner.
What stays prohibited
Both standing prohibitions, unchanged and unedited:
The carve-out restates both explicitly and adds the third prohibition that
docs/PLUGIN-PHILOSOPHY.mdalready carries — no host loads another host'spackages at run time — so the evaluation set cannot be read as exempt from any
of them.
What this does NOT authorize
Retirement is not authorized by this PR. Neither is merging host-specific
content, collapsing plugins that share a skill name across hosts, or dropping a
native catalog. The amendment says so in its own text rather than leaving it to
be inferred.
The retirement gate
Retiring a host repository is a separate, later decision needing its own
amendment, drafted against evidence that does not exist yet:
and side effects rather than wording, with the evidence published per
section 9; and
repository — the rule
claude-code-plugins/docs/MIGRATION-PLAYBOOK.mdstates directly at line 70.
Section 9 already forbids claiming parity for a component that was dropped,
replaced, or remains untested. The carve-out points at that rule instead of
inventing a new one, because a package that merely loads is not a package at
parity.
Fix
One file, one section, 31 insertions and 0 deletions. The change is purely
additive:
docs/MIGRATION-PLAYBOOK.mdsection 10 keeps its existing paragraphbyte-for-byte and gains a subsection,
### Evaluation carve-out: parallel packaging for assessment.That the diff deletes nothing is the mechanical guarantee that both
prohibitions survive verbatim — there is no rewording to audit.
Sites evaluated and deliberately NOT amended
The four-site list this work started from was treated as a sample and
re-derived independently against
origin/main(1eb67d3). Every candidatecarrier was checked; three were left alone because their text does not block a
parallel evaluation:
docs/MIGRATION-PLAYBOOK.md:204-205docs/PLUGIN-PHILOSOPHY.md:22-25AGENTS.md:3,AGENTS.md:64-65plugins/plugin-ops/skills/migrate-plugin/SKILL.md:28,:54-56README.md:3,references/component-map.md:9-10Verification
Gates run locally, on this branch, before pushing
Two gates in
tests/documentation-contract.test.mjsbear directly on thischange and both pass:
docs/MIGRATION-PLAYBOOK.mdstill matches/automatic synchronization/u. The amendment preserves that exact substringin the original sentence and repeats it in the carve-out.
The carve-out adds no links, so nothing new to resolve.
A data-freshness defect found and worked around
The evidence documents behind this decision enumerated both repositories
against working trees that were not
origin/main— thecodex-pluginscheckout was parked on
codex/humanize, a merged-and-deleted PR branch,and
cursor-pluginswas six commits behind. Their component counts aretherefore not trustworthy as stated.
This PR body deliberately cites no component counts. The argument does not
need them: it rests on the qualitative findings, which the stale-tree defect
does not touch. Figures live in the loss analysis and should be re-derived
against
origin/mainbefore anyone quotes them.The findings this PR does rely on, each traceable to its source document:
scripts/andreferences/payload. Codex users lose no capability either; Cursor's one capability loss —sync-localsevered from its repo-root scripts by the v1 path-containment rule — is repairable, by a relocation that is behaviour-affecting and carries a required default-source fixretirement-loss-analysis.md§6.1, §4.7, §10.6retirement-loss-analysis.md§4.1, §6.1client-extension-lookup.md§2.4skills/<name>/agents/openai.yamlin place inside a plugin rootclient-extension-lookup.md§3.6allow_implicit_invocationdefaults totrueclient-extension-lookup.md§6.2, quotingdevelopers.openai.com/codex/llms-full.txtL6031interview-checklist.md, question 10retirement-loss-analysis.md§4.3That last row is why the carve-out explicitly refuses to authorize collapsing
plugins that share a skill name.
Live upstream URLs consulted
The vendor documentation underpinning the two client-behavior findings above
was fetched, hashed and quoted in
client-extension-lookup.md§5 (retrieved2026-08-15):
developers.openai.com/codex/llms-full.txt,developers.openai.com/plugins/llms-full.txt,developers.openai.com/plugins/build/plugins.md,cursor.com/docs/plugins.md,cursor.com/docs/reference/plugins.md, andagent-plugins.org.Live documentation preflight (2026-08-16)
Completed live on 2026-08-16, independently of the 2026-08-15 capture, in
response to review thread
PRRT_kwDOTuHBl86Zi5Rv. Repository preflight readswere taken from
origin/main(1eb67d3), not a working tree:README.md,docs/OFFICIAL-DOCS.md, all ofdocs/PLUGIN-PHILOSOPHY.md, and all ofdocs/MIGRATION-PLAYBOOK.md.Retrieval was by direct HTTP in memory, and every page below was hashed, so the
verdicts are script-computed rather than recalled. Full hashes, line-anchored
quotations, and the sweep methodology are in the planning artifacts; this
section records the URLs, the date, and the verdicts, and links upstream
instead of reproducing upstream prose.
Pages opened live, all retrieved 2026-08-16.
Agent Plugins specification — the complete page set, cross-checked between
https://agent-plugins.org/llms.txt and https://agent-plugins.org/sitemap.xml,
which agree on a thirteen-page site, so the negative claim below rests on a
bounded sweep of the publisher's own corpus rather than on a page list of my
choosing:
https://agent-plugins.org/,
https://agent-plugins.org/llms.txt,
https://agent-plugins.org/sitemap.xml,
https://agent-plugins.org/compatible-clients,
https://agent-plugins.org/specification,
https://agent-plugins.org/schemas,
https://agent-plugins.org/plugin-authors,
https://agent-plugins.org/plugin-authors/manifest,
https://agent-plugins.org/plugin-authors/mcp-servers,
https://agent-plugins.org/plugin-authors/skills,
https://agent-plugins.org/plugin-authors/client-extensions,
https://agent-plugins.org/client-implementers,
https://agent-plugins.org/client-implementers/loading-and-discovery,
https://agent-plugins.org/client-implementers/mcp-runtime,
https://agent-plugins.org/client-implementers/conformance.
That is the complete published set — thirteen pages — and every one was
fetched. One caveat stated rather than glossed:
/compatible-clientsis a stubwhose client table renders from a dynamic component, so its rendered contents
are not in the text corpus; an independent verifier fetched the rendered page
and found no catalog format there either.
OpenAI and Codex:
https://learn.chatgpt.com/docs/llms-full.txt,
https://developers.openai.com/plugins/llms-full.txt,
https://developers.openai.com/plugins.md,
https://developers.openai.com/plugins/build/plugins,
https://developers.openai.com/plugins/build/skills,
https://developers.openai.com/plugins/concepts/plugins,
https://learn.chatgpt.com/docs/plugins.
Cursor and Claude Code. Named in the source-host rows of
docs/OFFICIAL-DOCS.md: https://cursor.com/docs/plugins,https://docs.claude.com/en/docs/claude-code/plugins. Not in that index and
fetched because the claims touch it:
https://cursor.com/docs/reference/plugins.
Normative-contract pointer from
docs/OFFICIAL-DOCS.md:https://agentskills.io/specification. The other pointer in that section,
modelcontextprotocol.io/specification/latest, was deliberately not fetched— no claim here concerns MCP. The scoping rule applied throughout is
AGENTS.md's own: the affected surface, which is cross-host packaging anddistribution policy. Index rows covering MCP servers, ChatGPT UI, connect-and-test,
and submission were scoped out on the same basis. Hashes were computed over the
.mdforms of these pages, which is what was retrieved.Did the upstream spec version move? No. Agent Plugins is still published as
version 1.0.0, status Working Draft, with the same eleven-section
structure and with §8 still "Client extensions" — the section the
supporting evidence assumes. Three independent signals agree: the site's own
sitemap dates the specification page to 2026-07-28, nine days before the
baseline capture, with nothing anywhere on the site modified later than
2026-08-06; no successor version path exists; and of the eight pages hashed on
2026-08-15, seven were re-hashed today — six byte-for-byte identical, the
seventh byte-identical at a redirected URL. The eighth, a release-notes page,
was not re-hashed: the earlier capture had already recorded it as out of scope,
and its substance sits inside the Codex full-text document that was re-hashed
identical. Nothing upstream changed in the intervening day.
Per-claim verdicts, re-tested against bytes fetched 2026-08-16 — not against
the 2026-08-15 capture, whose age is the reviewer's objection:
catalog,registr,marketplace,listing,distribut(plusdirectory ofandindex ofin the per-page pass) was run twice — once per page across all thirteen pages, and once across/llms.txt, which is not an index but a full-content concatenation of the entire site. The whole-site pass returns exactly seven lines, every one of them either a scope exclusion or non-normative design rationale. No page defines such a format anywhere. Both hosts corroborate by continuing to define their own: Codex documents its marketplace JSON catalog under.agents/plugins/, Cursor documents its own marketplace manifest and its own distribution channels — in the same page where it describes conforming to the shared format. Consolidation buys one packaging format, not one distribution channel, and today's pages say so directly.com.openai.codexdoes occur in Codex's documentation, but every occurrence is a macOS preference domain, an MDM profile key, or a log directory — platform identifiers, not an Agent Plugins extension namespace. The sweep covers official documentation, not client source, which is why the verdict stays UNDOCUMENTED.skills/<name>/agents/openai.yamlin place inside a plugin rootskill_agent_*failure codes governing that file, eight of which name its path explicitly — a validator reading it at that path inside the plugin. (Both figures were computed by script over the fetched bytes, not counted by eye.) Cross-checked against the specification, which treats the conventional skill subdirectories as non-exhaustive, so anagents/subdirectory inside a skill is not prohibited by v1. Caveat, surfaced by an adversarial verifier and confirmed independently: the words "in place" are ours, not upstream's, and one adjacent Codex surface — the app-serverskills/listmethod — documents reading interface and dependency metadata from aSKILL.jsonwhen one is present. That is conditional, concerns app-server skill scanning rather than plugin packaging, and does not contradict the documented path; but the honest form of the claim is "the path is documented and validated there", not a proven statement about the read mechanism on every Codex surface. This claim supports a findings row only — the amendment's own text does not rest on it.allow_implicit_invocationdefaults totruepolicyblock. Citation corrected: that document's former address,developers.openai.com/codex/llms-full.txt, now returns HTTP 308 tolearn.chatgpt.com/docs/llms-full.txt. The bytes and the line are unchanged; only the canonical URL moved.No claim CHANGED and none became unverifiable, so the diff is unaffected.
The one qualification — the read-mechanism caveat on the third row — narrows a
supporting finding, not the amendment. The claim the amendment itself makes is
the catalog claim, and that one is upheld by affirmative live text.
The 31-line amendment stands exactly as written. The only defects the preflight
found were in this pull-request body — the withdrawn sentence above, and a
citation to a URL that now redirects. The first is withdrawn in place. The
second is corrected here, in this section: the original citation is left
standing where it appears in the 2026-08-15 material above, because that
material is retained as a dated historical record of what was fetched then, and
rewriting it would misrepresent it. The merge decision itself
remains the repository owner's, and is recorded at the top of this body.
codex --helpdisposition — named, not skipped.AGENTS.mditem 4 requiresinspecting the installed CLI help "when CLI behavior is part of the change".
It is not part of this change: the diff touches one documentation file and
ships no command, script, skill body, manifest, or marketplace entry, and
invokes no CLI. The trigger condition is not met. The inspection was run anyway,
because two of the claims above are Codex runtime-contract claims and a silent
skip is indistinguishable from an oversight. Installed release:
codex-cli 0.147.0.codex --help,codex plugin --help, andcodex plugin marketplace --helpwere inspected. Bearing on the claims: weakly confirming for the catalogclaim, since marketplace management is a Codex-native CLI surface over a
Codex-defined catalog and the CLI exposes no format-defined catalog; and
silent for the two skill-metadata claims, which are package-format facts
rather than CLI flags. That silence is recorded as no bearing rather than
stretched into support.
One pointer follow-up, deliberately not fixed in this PR.
docs/OFFICIAL-DOCS.mdindexes the Agent Skills specification but has nopointer to the Agent Plugins specification, which is a different document and
is the one the carve-out's external claims rest on.
AGENTS.mdasks that theindex be updated when a new native surface becomes relevant. That is a change to
a second file and would break this PR's one-file, purely-additive property, so
it is recorded here as a follow-up rather than folded in.
AGENTS.mdPR contract — rows that do not applyAGENTS.md:113-122lists what a PR must state. Named rather than silentlyomitted: user goal and vertical slice, native surfaces selected, ports
and adapters introduced, defaults, configuration and fallbacks, and
migration dispositions are all not applicable — no plugin, skill, manifest,
script or marketplace entry changes here. Only
docs/MIGRATION-PLAYBOOK.mdchanges. Staging used explicit paths (
git add docs/MIGRATION-PLAYBOOK.md).Related
No linked issue. This PR proposes a policy amendment recorded in the
organization's planning artifacts rather than in a GitHub issue.
Why there is no companion PR against
cursor-pluginsThe brief for this work stated that
cursor-plugins"carries none of" theindependent-host policy, and that if it needed a matching statement for the
policy to be coherent, a second PR should open there.
That premise is false, and the correction is recorded here. A search for
source of truthmisses it becausecursor-pluginssays SSOT. It carriesindependent-host policy on
origin/main(d85ba6a). These six sites are theload-bearing ones — a sample of the sites that matter here, not an exhaustive
sweep of the concept:
docs/PLUGIN-PHILOSOPHY.md:26-27claude-code-plugins."docs/MIGRATION-PLAYBOOK.md:10-12.cursor-plugin/from Claude plugins as a continuous export into the Claude repo."docs/MIGRATION-PLAYBOOK.md:88-95docs/MIGRATION-PLAYBOOK.md:103-107claude-code-pluginsto emit Cursor artifacts again."README.md:8-9docs/OFFICIAL-DOCS.md:52No second PR is proposed anyway, and the corrected inventory is the reason
rather than an obstacle to it. Every one of those sentences is on the
Cursor ↔ Claude axis, and every one either prohibits runtime cross-loading
or automatic export, or merely scopes this repository to Cursor. None of those
is what the evaluation does. The discriminating
test — is there any sentence in
cursor-pluginsthat at face value forbids ahand-built v1 package set containing Cursor-derived skills in a third
repository? — returns nothing. The nearest candidate, "No shared marketplace
JSON between hosts", is satisfied: the evaluation keeps both native catalogs
precisely because v1 defines no catalog format.
cursor-pluginsalso has no packaging-locality sentence at all — the sentencethat blocks here has no counterpart there. Amending a policy to announce that
it does not block would authorize more than is needed and would edit prohibitions
that should stay exactly as written. If a maintainer wants the evaluation
discoverable from
cursor-plugins, a pointer note is the right instrument andis cheap to add later; it is not a policy amendment.
(
cursor-pluginsgained a rootAGENTS.mdin the commits this check pulled;it is Cursor Cloud environment guidance and carries no independent-host
policy.)