Skip to content

History / Workflow aggregates

Revisions

  • 968: an aggregate ID over 1024 bytes on Oracle and DB2 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Lxo4MXbp6VPoDkUrTBNXJ1

    @stephanpelikan stephanpelikan committed Oct 12, 2026
  • Make the wiki say what the code does Fix counts, an anchor, an example which did not match its Java code, a stale sentence about Camunda 8.10, and the gap of the election cache which the start row already closes in most cases. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Lxo4MXbp6VPoDkUrTBNXJ1

    @stephanpelikan stephanpelikan committed Oct 12, 2026
  • Rewrite Workflow tasks, Workflow aggregates and Migrating from version 1 in plain English Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Lxo4MXbp6VPoDkUrTBNXJ1

    @stephanpelikan stephanpelikan committed Oct 11, 2026
  • 736: the wiki names the expression check and accept-expressions-in-the-model Workflow aggregates gets the rule next to the getter example, the multi-instance exception where the path stands, and the line which accepts a process. Workflow modules lists the three levels of the key. Migrating from version 1 gets the user side of the UPGRADE.md entry. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Lxo4MXbp6VPoDkUrTBNXJ1

    @stephanpelikan stephanpelikan committed Oct 10, 2026
  • Say that every type can be declared, and how the two directions differ Story 787. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01RVEfP4rFpf8XUVXB9CFuL7

    @stephanpelikan stephanpelikan committed Oct 6, 2026
  • Say that a second workflow on one aggregate is supported, not recommended Story 901. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01RVEfP4rFpf8XUVXB9CFuL7

    @stephanpelikan stephanpelikan committed Oct 6, 2026
  • Blueprints 12: injected beans are named after their role Code examples now call the ProcessService bpms and the use case service loanApproval, the names the blueprints use from now on. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01RVEfP4rFpf8XUVXB9CFuL7

    @stephanpelikan stephanpelikan committed Oct 5, 2026
  • docs: compensation is a second writer the start now warns about A compensation throw event which undoes two finished activities starts both handlers, so the workflow holds a token per handler and each of them writes the same workflow aggregate. The start now says so where that aggregate has no version attribute, naming the process, the throw event and the handlers. What each engine really does was measured. Camunda 8 hands out both handler jobs at the same moment. Camunda 7 starts them one after the other, and the order it undoes them in is not stable: it sorts the subscriptions by a creation time of millisecond resolution, so two activities compensated within one millisecond are undone in the order they ran in. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_0168Fox39crp8dfWkZ9W84Ub

    @stephanpelikan stephanpelikan committed Sep 28, 2026
  • Stories 303 and 503: which types travel, and what a section's null object does 303 adds the section "Which types may travel": only a plain boolean and a text reach the BPMS unasked, everything else is declared first, and the two directions are judged by different things. It also says what a declared path which does not resolve does, and how a substitute is written. 503 adds the paragraph about sections of a larger process to "Decoupling BPMN from the data model", with the blueprint bpmn-process-sections and the getter which answers whether a section ran. The last sentence of it was measured while that blueprint was built: an existence gateway cannot sit directly behind a call activity, because what a called process shares stays in the child instance. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_0168Fox39crp8dfWkZ9W84Ub

    @stephanpelikan stephanpelikan committed Sep 28, 2026
  • docs: the counter for work which is not ours A new section says what happens when a BPMS hands this application a task of a workflow another application owns, with the counter to watch and why no delivery record is written. The meter table got its row, and the paragraph about a deleted workflow aggregate no longer names deletion as the only reading. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_0168Fox39crp8dfWkZ9W84Ub

    @stephanpelikan stephanpelikan committed Sep 27, 2026
  • docs: what becomes of a BPMN data object The aggregate takes the place of the data BPMN keeps in the process, and that was written down everywhere except where somebody draws a data object. Nothing reads one, and neither Camunda engine does either. Story 471. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_0168Fox39crp8dfWkZ9W84Ub

    @stephanpelikan stephanpelikan committed Sep 26, 2026
  • docs: Spring Boot writes its outbox itself On a relational database both platforms now run the same store, so the Spring Boot page names the tables VanillaBP owns instead of gruelbox' one, and the table which says what each store does differently has the opted-in gruelbox in its last row. New on both platforms: the outbox dispatches several entries at once and the workflow aggregate decides which thread takes one. The Spring Boot page explains it, the Quarkus page and the observability page point at it. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01RYPiyZ32jQQhqYKx44cw23

    @stephanpelikan stephanpelikan committed Sep 21, 2026
  • docs: the flattening rule links on to what each BPMS makes of it Every adapter wiki now carries a page "What becomes of a shared value", answering the same four questions in the same order. This wiki keeps the rule which is the same everywhere and points at the three pages instead of repeating them. Workflow-aggregates: the sharing rule links on to the three pages, and the serialization-format link of the Camunda 7 adapter follows the chapter which moved out of its configuration page. Choosing-a-BPMS gains the row a reader comparing two BPMS was missing, what becomes of a value the engine has no type of its own for, and BPMS-adapters names the new page among what an adapter wiki carries. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01RYPiyZ32jQQhqYKx44cw23

    @stephanpelikan stephanpelikan committed Sep 18, 2026
  • docs(aggregates): an aggregate which shares everything has to say so Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>

    VanillaBP committed Sep 18, 2026
  • docs(start): a process runs in the present Story 329 asked whether the aggregate changing between a delayed start and the first gateway needs handling. Measured: no BPMS reads the live aggregate, VanillaBP writes the shared values at every sync point from a fresh load, and the window is milliseconds unless an entry stays behind. So there is nothing to build, only something to say. The start page says which state the process starts with. The aggregates page says what follows for an attribute a gateway reads, and that the choice belongs in the aggregate. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01RYPiyZ32jQQhqYKx44cw23

    VanillaBP committed Sep 17, 2026
  • docs(outbox): an entry no longer asks for the aggregate as it was The seam had one reader, a report to the Business Cockpit, and that report is now built at the event itself and travels as a payload. So the aggregates page drops the two auditing methods and the extensions page drops the second way of carrying a state, together with the link between them. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>

    @stephanpelikan stephanpelikan committed Sep 17, 2026
  • docs(outbox): an entry may report the state of its event An outbox entry is sent after the transaction it was written in, so what it reads is the aggregate of that moment. An entry which reports may now say which state it means, and the aggregates page says what an application answers for that while the extensions page shows the two ways of carrying a state to a receiver. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> (cherry picked from commit e7fea773a8497a0cf48ce673da7ad7a15de412cd)

    VanillaBP committed Sep 17, 2026
  • docs(aggregates): a shared Calendar stops the application from starting An attribute of type java.util.Calendar reached the BPMS as the debug form of the implementation. VanillaBP refuses it now, so the page says that such an aggregate does not start and what to share instead. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>

    Claude committed Sep 17, 2026
  • docs(tasks): which types a @TaskParam may be declared as The table listed @TaskParam with the type "any" and pointed at nothing, while the platform carries a fixed set of types both ways. The parameter section now says which types travel, that the set is a selection rather than a promise about the JDK, and links to the table in the migration adapter's README. The aggregate page said "java.time values / UUIDs and similar JDK types their string form", which is no longer the whole truth: a Date travels as the instant it holds and a TimeZone as the id of its zone, and every other JDK type travels one way only. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>

    Claude committed Sep 17, 2026
  • docs: what an extension does, and in which order Wave 10 gave an extension three things the wiki did not describe: a contract may say it never writes the workflow aggregate, the order of the keys an invocation offers decides which method runs, and an adapter runs before every extension while extensions are not ordered against each other. The new page collects what an extension author needs. The pages about workflow aggregates and about ordering point at it instead of repeating it. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Re2yjHbaFRvnHyW61E3sao

    @stephanpelikan stephanpelikan committed Sep 13, 2026
  • docs(aggregates): every writer pair and its way out The section about two writers explained one of them, the second BPMN token, and left the reader to guess about the rest. It now names the pairs which really meet on one workflow aggregate, with the window each of them needs, the way out which reaches it and the way out which does not. Two pairs from the list were struck after reading the code. A repeated dispatch is one writer twice rather than a pair, and a version attribute notices nothing about it. A handler running inside the caller's transaction is no longer a second writer at all, because the seam joins that transaction. Both are named in the new section about what looks like this and is not. Added with them: a retry somebody can copy, and the way to make that retry safe by sending a call to the outside through an outbox. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Re2yjHbaFRvnHyW61E3sao

    @stephanpelikan stephanpelikan committed Sep 12, 2026
  • docs(aggregates): where an ad-hoc subprocess fits among the second writers The list of constructs putting a second token into a workflow now names the ad-hoc subprocess, with the sentence which makes it different from the others: how many tokens it produces is not in the drawing, because the activities to run are picked while the workflow already stands there. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_017jAAVCZuSra6VzaVeUHt1d

    @stephanpelikan stephanpelikan committed Sep 9, 2026
  • docs: what a version your BPMS still holds says about starts and about forks The concurrent-token report and the check of a `@WorkflowStartedByBpms` method now read the versions the BPMS still holds, not only the model of this boot. Spring Boot names the class which carries `@WorkflowService` without being a bean, and Quarkus meets that case while building. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_017jAAVCZuSra6VzaVeUHt1d

    @stephanpelikan stephanpelikan committed Sep 9, 2026
  • docs: the page is called integration SPI The artifact is io.vanillabp:vanillabp-integration-spi, so the wiki calls the thing what its coordinate calls it instead of inventing a second name. Page renamed, all links and the glossary entry follow. The adapter SPI is gone from the wiki: it is nothing a reader of these pages implements. Where the start instant explains its own name, the reason is now VanillaBP's rather than an SPI the page never introduces. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01XjxJNwTRcKzTmXCwLU7Wi4

    @stephanpelikan stephanpelikan committed Sep 1, 2026
  • docs: a page for the business SPI, testing parked The wiki mentioned the business SPI and the two support modules without ever saying what they are or why they exist. Business-SPI.md answers both: the two APIs and their directions, why these interfaces are released with the platform instead of with the SPI for Java, the five contracts an application may implement, and how the artifact reaches a build. Linked from Home, the migration page, both platform pages and the aggregates page. Migrating from version 1 no longer mentions states version 2 passed through on its way, and no longer names the Process-Engine-API adapter: version 1 had no support for that BPMS, so nobody upgrades from it. Testing.md moves to parked/Testing.md.txt. GitHub creates a page for every file with a markup extension, so the .txt keeps it out of the wiki's page list while the text stays in the history until the reworked testing strategy arrives with the blueprints. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01XjxJNwTRcKzTmXCwLU7Wi4

    @stephanpelikan stephanpelikan committed Sep 1, 2026
  • docs: four rules a user needs, said on the wiki Four things an evaluator asks about before writing code were answered one layer below the person who needs them, in a contributor README or in an exception message. The wiki now carries them where their topic is: what to do when a push has to reach the BPMS before the completion behind it, that VanillaBP deploys BPMN and knows no DMN model type, what a task delivery finds when the workflow aggregate was deleted, and why a BPMS backend rebuilt under an unchanged adapter id needs its delivery records deleted. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01XjxJNwTRcKzTmXCwLU7Wi4

    @stephanpelikan stephanpelikan committed Aug 31, 2026
  • docs: every page opens with what to do and carries a table of contents A reader who has never used VanillaBP met the reasoning for a rule before the rule itself, and had no way of telling how far to read before writing a first workflow. The pages now start with the sentence somebody can act on and keep the background where it belongs, further down. Nothing was deleted; what explains a rule moved behind it. Every page gained a numbered table of contents in the shape Home and the Spring Boot page already used, so a reader sees the sections and what each of them answers before scrolling. Where a first heading only repeated the title GitHub shows above the page, it is gone and the page starts with its first sentence. Home is now ordered the way a newcomer needs it, and what VanillaBP is sized for became a page of its own: it answers a question somebody asks before they start, not one they trip over in the middle of the introduction. The architecture picture from the repository's diagrams folder is embedded there, linking to its Excalidraw source. The horizontal rules of the workflow-module pages are gone, the heading is the separator everywhere else. Hints are written as sentences rather than marked with a label, headings sit at one depth per page, and the paragraphs written by hand over the last months were brought to the tone of the rest without changing a single statement they make. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>

    @stephanpelikan stephanpelikan committed Aug 31, 2026
  • docs: an adapter which can only guess is refused, and nothing waits in your transaction Three pages still described the state before stories 157, 159 and 163. BPMS-migration said what a guessing adapter costs in a migration and left the reader to avoid it. VanillaBP refuses such a setup at startup now, so the page says that, and shows 'election.guessing-adapters: ACCEPTED' for whoever wants the routing anyway. The same section still claimed the election waits inside the caller's transaction and told operators to size their connection pool for it; the waiting moved to the dispatch, so that advice is gone and what replaces it says where the waiting happens now. Workflow-aggregates said a pre-commit check is a thing remote BPMS ask for; it is a thing any adapter may ask for, and it never waits. Starting-workflows names why the SPI calls the value a start instant rather than a trigger time. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01CvgyhjwTEh834mwbptZZxh

    @stephanpelikan stephanpelikan committed Aug 29, 2026
  • docs: adapter-specific notes move to the adapter which owns them A platform page says what every BPMS has to deliver and where they differ; how one BPMS does it is that adapter's wiki. Several pages carried the second kind. Message correlation lost the Camunda 8 section about what a repetition costs. What stays is the rule underneath it: a BPMS may deduplicate on its own, in a window VanillaBP neither sets nor shortens, and whether that happens is on the adapter's wiki. The Camunda 8 wiki carries the detail now, including the log line naming both readings of a refusal. The model-side table keeps one clause per adapter instead of the recipe, the phase-one list keeps the comparison and leaves the reasoning to the Camunda 8 page, which gained the section explaining why the cluster is not asked, and the signal table says what a broadcast reaches rather than which client command sends it. Workflow tasks stops naming the Camunda 8 property behind an overdue task, the Camunda 7 wiring which completes a task too early, and the two version-tag attributes; in all three the message and the adapter's wiki say it. Workflow modules replaces the two bullets about what a BPMS says about a tenant with the rule and a pointer. BPMS migration replaces the Camunda-8 and Camunda-7 prerequisites of a side-by-side setup with what every BPMS is asked and links both. Observability drops two Camunda 8 examples which illustrated platform rules. Aggregate synchronisation keeps the comparison of what ignoring the recommendation costs but links the Camunda 7 page for the serialization format. The comparisons themselves stay, on purpose: which BPMS reports what, what identifies a delivery, what a model needs so it correlates. That is what a reader comes to the platform wiki for. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01CvgyhjwTEh834mwbptZZxh

    @stephanpelikan stephanpelikan committed Aug 28, 2026
  • docs: a rule says where its decision is written down Five decision logs hold 61 entries, the wikis linked none of them, and 22 of the 42 objections an outside review raised were already answered in one. A reader who wondered why a rule is what it is had no way there short of reading source repositories. So a rule carries a (why) link now, pointing at the numbered entry which decided it. Home says once what the links are and where the logs live, and the form is the same on every page of every wiki: an inline link at the end of the sentence stating the rule. Numbers are handed out once and never reused, so the links keep resolving. The rules the review named are linked first - the outbox on Camunda 7, probing per operation, the two retentions, sharing aggregate values, the Camunda 8 correlation key - and the remaining entries follow wherever a page states their rule. BPMS-adapters also says in one sentence what the module migration-adapter is, which it linked without explaining. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01CvgyhjwTEh834mwbptZZxh

    @stephanpelikan stephanpelikan committed Aug 27, 2026