979: the fetch-variables link points at decision 19 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Lxo4MXbp6VPoDkUrTBNXJ1
239: the wiki in plain English Shorter sentences, one thought each, and common words, as the section "How we write" of AGENTS.md asks. The meaning, the headings and every link target stay as they were. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Lxo4MXbp6VPoDkUrTBNXJ1
943: a subscription asks for what the extensions read Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Lxo4MXbp6VPoDkUrTBNXJ1
938: the key fetch-variables is gone The table row goes. "What a subscription asks for" says that no key asks for more, that a value no @TaskParam declares is read from the workflow aggregate, and that a start which still sets the removed key ends. The paragraph about an unclaimed process now says it gets no subscription. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Lxo4MXbp6VPoDkUrTBNXJ1
937: a process nobody claims can be marked as somebody else's A deployed process no @WorkflowService claims ends the start unless the line implemented-externally=true at the process marks it. Such a process is deployed with its file and left alone; a process somebody else deployed is not touched at all. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Lxo4MXbp6VPoDkUrTBNXJ1
Merge story/834-implemented-externally into wave/158
834: a task something else serves is marked with implemented-externally Every task of a claimed process needs a @WorkflowTask method or the line implemented-externally=true, user tasks and listeners included, as version 1 asked for the method. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Lxo4MXbp6VPoDkUrTBNXJ1
892: the start row carries the tag where the engine names it Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01NGP1Z1mjfXKxCgHzecPvuX
890, 892: a start by message is not checked here, and the start row has no version Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01NGP1Z1mjfXKxCgHzecPvuX
735: why no expression of a model is reported here No BPMN model and no expression language, so the adapter cannot tell an expression from a literal and reports none. Points at entry 29 of GAPS.md for what an engine would have to say about itself. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_017T37nXyH8Gc8d3bcyitce2
docs: the application builds the aggregate, not the platform The reason a timer, signal or conditional start event cannot be served is that the adapter can never tell VanillaBP about the start, so VanillaBP can never ask the application's @WorkflowStartedByBpms method for the workflow aggregate. The page said VanillaBP could not build the aggregate. Since the method became mandatory the application builds it. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_017T37nXyH8Gc8d3bcyitce2
docs: what happens when a task of another application reaches yours A task subscription of this API matches a task type across the whole engine and there is no tenant, so two applications which deploy a BPMN process of the same name take each other's tasks. The Configuration page said how to keep them apart and nothing about what it costs when they are not. The new section says what the refusal is for, what the message names, and why a service task and a user task are answered differently: the service task is failed with a retry count of zero, while UserTaskCompletionApi has no way to refuse at all, so a user task ends in a log line and stays untouched. It also names the counter which answers how often this happens, and says why no delivery record is written. The Deviations entry about isolation points at it. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_0168Fox39crp8dfWkZ9W84Ub
Story 661: say which parts of a model this adapter reads A reader coming from the deviation pages of the two Camunda adapters looks for a third list of what a BPMN construct becomes, and finds nothing about compensation, loops or data objects. The reason is not an omission: this adapter reads a short list of elements out of the raw XML and hands the rest to the engine as modelled, so it has no behaviour of its own to describe. The Deviations page now names that list, and says that everything outside it belongs to the engine behind the API. It names no engine, because nothing here was measured. The transaction subprocess entry, which said part of this in passing, points at the new section instead. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_0168Fox39crp8dfWkZ9W84Ub
docs: say where this engine keeps the name of a workflow The page said the aggregate's id travels in every payload but not who chooses it. The application does, and the engine only keeps it, so the entry to look a workflow up by is the one the application knows. A foreign name cannot arrive at a start here, because this API reports no start of its own, and such a workflow shows itself at its first task. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_0168Fox39crp8dfWkZ9W84Ub
docs: cancel means two different things Separates our cancel from BPMN's. WorkflowEnd.Kind.CANCELED and cancelTask keep their meaning and now say what they are not, and each adapter says what it does with a transaction sub-process, which is nothing. Camunda 7 runs the construct, measured against the pinned engine 7.24.0. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_0168Fox39crp8dfWkZ9W84Ub
docs: an error nobody catches BPMN leaves this case to the engine, and the engines differ. Measured Camunda 7: no incident, no log line, the workflow ends at the task and the history calls it completed. Camunda 8 raises an incident, and behind the Process-Engine-API the answer belongs to whatever engine is wired there. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_0168Fox39crp8dfWkZ9W84Ub
docs: in which time zone a timer counts BPMN says nothing about time zones, so each engine answers for itself. Measured Camunda 7: a timeDate naming no zone is read in the JVM's zone, and a P1D over the autumn change is 25 hours. Names the shape which survives a change of BPMS. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_0168Fox39crp8dfWkZ9W84Ub
Story 303: what this adapter tells the startup check about a value type VanillaBP 2 looks at the type of every value which travels while the application starts, and refuses one which may not arrive as what it was unless it was declared. The platform asks every adapter of a workflow what its BPMS does with a type, and "cannot say" is a legitimate answer which costs a warning and never a failed start. The new paragraph says what this adapter answers, next to the section which already says what the BPMS stores. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_0168Fox39crp8dfWkZ9W84Ub
docs: why the core cannot work a cancellation out here either The deviation said the termination callback carries no aggregate reference. That is still true, and since story 367 it is only half the answer: the core offers a second way in for a BPMS which reports no cancellation, and this adapter cannot take it because the API has no way to ask about a task. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01RYPiyZ32jQQhqYKx44cw23
docs: what becomes of a shared value, on a page of its own The question "what happens to the values my aggregate shares" is now answered by one page per adapter wiki, with the same four questions in the same order, so two BPMS can be read side by side. This adapter said nothing so far, which let a reader assume it behaves like Camunda 7. The answer here is short and it is an admission: the Process-Engine-API carries a payload as a map and says nothing about how an engine behind it keeps one, so this adapter cannot tell you and cannot warn you either. What is pinned down is the in-memory mock, which hands back the objects it was given. The page ends with the measurement to run against the engine you really use. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01RYPiyZ32jQQhqYKx44cw23
docs: a renamed process is served where the name says so The adapter now composes subscriptions for a process id the application declares without a model, from what its own methods serve. Where a workflow module prefixes task definitions per process, the old id's tasks are routed exactly. Where the name is shared with the deployed process, one subscription serves both and only a per-delivery process id could tell them apart, which the Process-Engine-API does not define. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Re2yjHbaFRvnHyW61E3sao
docs: what the adapter remembers about your models Story 230 lets an extension ask the adapter for a deployed process by user task element id or by form reference, and it gave the meta of a delivered task one vocabulary instead of literals in two handlers. Neither was written down anywhere a reader would look. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Re2yjHbaFRvnHyW61E3sao
docs: who remembers the ids a module took VanillaBP keeps the memory now, so the sentence about the adapter handing over every module of the startup was wrong, and the message it quoted has been reworded. The page also says where the startup stops, because the first of the two modules is already in the engine by then. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Re2yjHbaFRvnHyW61E3sao
docs: what one process id in two modules costs Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Re2yjHbaFRvnHyW61E3sao
docs: what a name clash check can see here The engine behind the API cannot be asked which identifiers it already holds, for any kind. What is new is the check which needs no engine: the names a module's models declare, compared against the other modules of the same application. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Re2yjHbaFRvnHyW61E3sao
docs(deviations): what a held version cannot be asked here Without a process version catalog the start events, the forking elements and the number of workflows of a version this engine holds stay unanswered, and a `@WorkflowStartedByBpms` method of a declared-only id is judged by nothing. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_017jAAVCZuSra6VzaVeUHt1d
docs: an id-less correlation and where the records live Correlating without a correlation id names the aggregate alone, so every occurrence of that message name waiting in the workflow is a candidate and the engine behind the API decides which one receives the message. That was written nowhere. The delivery records live in the application's database, and the engine behind the API can be replaced while the adapter id stays: task IDs start over then, so a record written before the replacement can answer a delivery made after it. The step which prevents that is the same one every rebuilt backend needs and stays on the platform wiki rather than being written a second time here. Stories 196 and 199. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01XjxJNwTRcKzTmXCwLU7Wi4
docs: the configuration page starts where a newcomer starts The properties and the shape of the BPMN model are what somebody needs who has just added this adapter, so both come first now. Which engine sits behind the API, how the workflow modules are kept apart and what a subscription asks for follow behind them. Nothing was removed; the sections changed places. Every page carries a numbered table of contents. On the configuration page and on Home each entry says what its section answers; on the deviations page it does not, because every heading there is already that sentence. Where a first heading only repeated the page title GitHub prints above the page, it is gone and the page begins with its first sentence. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
docs(deviations): the optimistic probe is refused in a migration, not just warned about Same as in the Camunda 8 wiki: the adapter reports that it cannot locate workflows since story 157, so a workflow module prioritizing it next to another adapter ends the boot instead of routing by list order. The advice to use it as the only configured BPMS stays. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01CvgyhjwTEh834mwbptZZxh
docs: a dependency example carries the version you can paste The rule is about prose: a version named in a sentence reads 2.0, the release line without a patch digit. A Maven or Gradle coordinate is not prose - it is copied into a build, where 2.0 resolves to nothing - so the examples carry 2.0.0 again, and the Camunda 8 ones 2.0.0-8.9, with the suffix naming the cluster minor the artifact was built against. The sentence which told the reader to fill in a patch himself is gone with it; where it is useful to know which patches exist, the pages link Maven Central instead. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01CvgyhjwTEh834mwbptZZxh