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
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
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
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: 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
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: 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 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: 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 rule says where its decision is written down The rules of this wiki carry a (why) link now, pointing at the numbered entry of this adapter's decision log which decided them. The form and the reason are the same across all four VanillaBP wikis, and the platform wiki's Home page explains them once. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01CvgyhjwTEh834mwbptZZxh
docs: an overdue open task is only reported here VanillaBP measures how long a task left open by a @TaskId handler has been waiting and says so once it passed vanillabp.delivery.max-task-age. The API hands out a task subscription rather than a lock this adapter renews, so there is nothing to stop and no incident to raise instead. Story 89. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Say what this BPMS does with a task whose transaction failed A version conflict on the workflow aggregate is one of the ways a task fails, and story 59 asks every adapter's wiki to say what becomes of such a task here. Points at the platform wiki's new section for the rule itself.
Say what VanillaBP does with the older versions a BPMS holds Story 57: the start looks at the versions still deployed, reports the task definitions of older ones no method serves any more, and offers 'outfaded-versions' to declare a version obsolete. Each adapter page says what its BPMS can answer - Camunda 7 everything with the engine at hand, Camunda 8 only with secondary storage, the Process-Engine-API nothing. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01MUj1bzCMbmhZYtg6u7fWD8
Say what a task without a version tag reaches Where the engine supplies no version tag, methods without the version attribute are the only ones a delivery reaches - a task whose every method names versions fails the delivery instead of running one of them. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_0182ZE1WCkm5p3ogRFxusoKT
Story 55: trim the wiki to configuration and deviations The wiki now carries only what a user of this adapter needs and the main VanillaBP wiki cannot tell them: how to configure it, how to plug in a real engine, what the BPMN model has to look like, and where the Process-Engine-API does not carry a VanillaBP feature. Workflow-tasks, Message-correlation, Transactional-behavior and Viewing-workflows are gone. Their user-facing parts moved into Configuration, the rest is contributor material which GAPS.md and the README already carry. New page Deviations turns the gaps into one sentence each, linking the GAPS.md entry with the full reasoning. Three of them were missing from the wiki entirely: starts the engine performs itself, the end of a workflow and aggregateChanged.