Clarify that /api/* HTTP endpoints are @internal and not a stable contract
>>> [!note] Migrated issue
<!-- Drupal.org comment -->
<!-- Migrated from issue #3591542. -->
Reported by: [d34dman](https://www.drupal.org/user/751698)
>>>
<h3 id="summary-problem-motivation">Problem/Motivation</h3>
<p>The published BC policy at docs/reference/api/bc-policy.md previously claimed FlowDrop's REST API was stable starting with 1.0.0 and that response structure was additive-only ("existing fields will not be removed or renamed"). That promise does not match how the codebase is actually evolving.</p>
<p>The HTTP endpoints under /api/* (flowdrop_pipeline, flowdrop_playground, flowdrop_interrupt, flowdrop_job, flowdrop_trigger, flowdrop_runtime snapshot, flowdrop_chat) exist to serve the bundled @flowdrop/flowdrop JavaScript library — the FlowDrop Editor and Playground components — and the wire format is dictated by what the editor of a given version needs to render and operate on. Every controller class is already marked @internal. The 1.4 cycle alone reshaped at least two endpoints (pipeline node_statuses field renames, playground /messages cursor + hasMore restructure) in ways that violate the additive-only claim.</p>
<p>We need the documented policy to match the contract that has always actually been in force.</p>
<p>Replace the "REST API Stability" section in docs/reference/api/bc-policy.md with an "HTTP API Stability" section that:</p>
<h3 id="summary-proposed-resolution">Proposed resolution</h3>
<p>Replace the "REST API Stability" section in docs/reference/api/bc-policy.md with an "HTTP API Stability" section that:</p>
<ul>
<li>States that /api/* endpoints are @internal, served to the bundled JS library, and not a public REST contract.</li>
<li>Spells out that paths, query params, request bodies, and response shapes may change between minor releases without a deprecation cycle.</li>
<li>Explains the technical reasoning so the choice is auditable:</li>
<li>Editor features extend the wire shape; freezing the shape would freeze editor evolution.</li>
<li>The module and the bundled editor are versioned and shipped together — one client, one server, version-matched by construction, so the standard motivation for REST stability doesn't apply.</li>
<li>URL versioning (/api/v1, /api/v2) would duplicate controller code and security surface for no consumer benefit.</li>
<li>This matches Drupal core's posture on its internal AJAX / layout-builder / big-pipe / CKEditor endpoints.</li>
<li>Points consumers needing a stable programmatic interface at the @api PHP layer (FlowDropNodeProcessor, Orchestrator, Trigger, Workflow Executor, StateGraph).</li>
<li>Invites anyone with a genuine HTTP-client use case to open an issue so a deliberately-stable surface can be considered separately.</li>
</ul>
<p>Update CHANGELOG.md with a callout at the top of the [1.4.0] entry linking to the new section, and drop the "⚠ breaking" framing from the two /api/* shape-change bullets.</p>
<h3 id="summary-remaining-tasks">Remaining tasks</h3>
<h3 id="summary-ui-changes">User interface changes</h3>
<h3 id="summary-api-changes">API changes</h3>
<p>No code changes. PHP @api surface unchanged. HTTP endpoints' @internal status was always true at the class level; this issue only updates the published BC policy to match.</p>
<h3 id="summary-data-model-changes">Data model changes</h3>
<p>None</p>
issue