Prechádzať zdrojové kódy

docs(design): record maintainer sign-off — all six plugin-API open questions resolved as recommended (CG-63)

Trust prompt scoped to path specifiers only (bare packages load
unprompted, including in non-interactive contexts); no first-class
install dir for non-Node repos; plugin synth passes run worker-side;
'replaces' lives in config only; the types package stays unpublished
until CG-71 proves the API; sandboxing confirmed out of scope for v1,
revisited alongside CG-72.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Colby McHenry 6 dní pred
rodič
commit
62058b64f5
1 zmenil súbory, kde vykonal 23 pridanie a 12 odobranie
  1. 23 12
      docs/design/plugin-api.md

+ 23 - 12
docs/design/plugin-api.md

@@ -1,8 +1,10 @@
 # Plugin API — surfaces, config, trust, compat
 # Plugin API — surfaces, config, trust, compat
 
 
-**Status:** design; independent review pass applied 2026-09-02 — five findings
-amended in place (§4.3 rules 4 & 7, §6.5, §7.3 graph equivalence, Windows notes).
-Awaiting maintainer sign-off. Nothing here is implemented yet.
+**Status:** design, **signed off**. Independent review pass applied 2026-09-02 —
+five findings amended in place (§4.3 rules 4 & 7, §6.5, §7.3 graph equivalence,
+Windows notes); the maintainer resolved all six [open questions](#open-questions)
+the same day, each as recommended — the *Decision* lines there are binding.
+Nothing here is implemented yet.
 **Implements:** GH [#1376](https://github.com/colbymchenry/codegraph/issues/1376) · epic CG-62.
 **Implements:** GH [#1376](https://github.com/colbymchenry/codegraph/issues/1376) · epic CG-62.
 **Gates:** CG-64 (internal registry), CG-65 (config), CG-66 (types package), CG-67
 **Gates:** CG-64 (internal registry), CG-65 (config), CG-66 (types package), CG-67
 (loader), CG-68 (end-to-end), CG-69 (example + harness), CG-70 (docs), CG-71
 (loader), CG-68 (end-to-end), CG-69 (example + harness), CG-70 (docs), CG-71
@@ -455,6 +457,11 @@ payoff for code `npm install` already executed. If the prompt is judged too
 much UX for v1, the fallback is "path specifiers require the stamp, bare
 much UX for v1, the fallback is "path specifiers require the stamp, bare
 specifiers do not" — listed in [Open questions](#open-questions).
 specifiers do not" — listed in [Open questions](#open-questions).
 
 
+**Decision (2026-09-02): that split IS the v1 behavior.** The stamp-and-prompt
+flow above applies to **path-specifier entries only**; bare package entries load
+without a stamp. Consequently a non-interactive context (daemon, MCP serve, CI)
+skips only *unstamped path-specifier* plugins — bare packages still load there.
+
 ### 6.4 Interaction with the ui-server loopback boundary
 ### 6.4 Interaction with the ui-server loopback boundary
 
 
 None, by construction (§3): `codegraph ui` is a read surface, it never loads plugin
 None, by construction (§3): `codegraph ui` is a read surface, it never loads plugin
@@ -733,36 +740,40 @@ richer per-language matrix.
 
 
 ## Open questions
 ## Open questions
 
 
+**All six resolved by the maintainer on 2026-09-02 — each as recommended.** Kept
+in question form for the reasoning; the *Decision* line on each item is the
+binding part.
+
 1. **Trust prompt in v1?** §6.3 proposes a machine-local trust stamp plus an
 1. **Trust prompt in v1?** §6.3 proposes a machine-local trust stamp plus an
    interactive prompt, with non-interactive contexts skipping plugins. It is the
    interactive prompt, with non-interactive contexts skipping plugins. It is the
    right security posture and it is real UX work. Alternative: require the stamp
    right security posture and it is real UX work. Alternative: require the stamp
    only for **path** specifiers (code shipped inside the repo) and let bare
    only for **path** specifiers (code shipped inside the repo) and let bare
    installed packages load unprompted, on the grounds that installing them already
    installed packages load unprompted, on the grounds that installing them already
-   executed their install scripts. *Recommendation: ship the stamp, prompt only for
-   path specifiers in v1.*
+   executed their install scripts. *Decision (2026-09-02): prompt for path
+   specifiers only; bare installed packages load unprompted.*
 2. **A first-class install dir for non-Node repos?** §7.1 recommends committed path
 2. **A first-class install dir for non-Node repos?** §7.1 recommends committed path
    specifiers and no new mechanism. If the maintainer wants `codegraph plugins
    specifiers and no new mechanism. If the maintainer wants `codegraph plugins
    install` with its own dir, it must live somewhere committed (`tools/codegraph/`,
    install` with its own dir, it must live somewhere committed (`tools/codegraph/`,
    not `.codegraph/`), and it is a new sub-project's worth of npm plumbing.
    not `.codegraph/`), and it is a new sub-project's worth of npm plumbing.
-   *Recommendation: no; revisit if plugin authorship actually takes off.*
+   *Decision (2026-09-02): no first-class install dir; committed path specifiers.*
 3. **Do plugin synth passes run in resolver workers in v1?** §4.4 says yes, since
 3. **Do plugin synth passes run in resolver workers in v1?** §4.4 says yes, since
    parse workers already need plugin loading for `extract()` and the fallback path
    parse workers already need plugin loading for `extract()` and the fallback path
    (a pass that fails on a worker retries on the main thread) already exists.
    (a pass that fails on a worker retries on the main thread) already exists.
    Main-thread-only would be simpler but serializes plugin passes on exactly the
    Main-thread-only would be simpler but serializes plugin passes on exactly the
-   repos where synthesis is expensive. *Recommendation: worker-side.*
+   repos where synthesis is expensive. *Decision (2026-09-02): worker-side.*
 4. **`replaces` on the config entry vs the manifest.** Config (§7.2) puts the
 4. **`replaces` on the config entry vs the manifest.** Config (§7.2) puts the
    decision with the person who owns the repo; a manifest field would let a plugin
    decision with the person who owns the repo; a manifest field would let a plugin
-   author displace a built-in for every user who installs it. *Recommendation:
-   config only.*
+   author displace a built-in for every user who installs it. *Decision (2026-09-02): config only.*
 5. **Publish the types package in v1?** §9.3 recommends prepared-not-published
 5. **Publish the types package in v1?** §9.3 recommends prepared-not-published
    until CG-71 passes, mirroring `codegraph-ui`. The counter-argument is that an
    until CG-71 passes, mirroring `codegraph-ui`. The counter-argument is that an
    unpublished package makes external authorship awkward (plugin authors would
    unpublished package makes external authorship awkward (plugin authors would
-   vendor the types). *Recommendation: unpublished through CG-71, publish with the
-   release that ships CG-68.*
+   vendor the types). *Decision (2026-09-02): unpublished through CG-71;
+   publish with the release that ships plugin support.*
 6. **Per-plugin sandboxing** (§6.1) is out of scope for v1. If it ever becomes a
 6. **Per-plugin sandboxing** (§6.1) is out of scope for v1. If it ever becomes a
    requirement, the shape is a separate process with an IPC contribution protocol —
    requirement, the shape is a separate process with an IPC contribution protocol —
    which the file/batch-grained boundary in CG-72 would also want. Worth keeping
    which the file/batch-grained boundary in CG-72 would also want. Worth keeping
-   the two in the same conversation.
+   the two in the same conversation. *Decision (2026-09-02): confirmed out of
+   scope for v1; revisit alongside CG-72.*
 
 
 ---
 ---