Demo
The sources' own worked example, run by a reference engine. Not a product.
What you are looking at
Every business application tracks objects through a lifecycle: a customer is signed up, then verified, then active. Almost every system does that with a status column somebody's code has to keep right.
PMDA does it the other way round. An object's State is computed from its data, by rule: an Artist with a createdDate is a Created Artist, one with an activatedDate is Active. Nothing is stored, so nothing goes stale. And every change to an object passes through one gate declared in the model: a Filter says when an Operation is offered, Derivations fill in values, Conditions say what the result must satisfy.
This page runs the sources' own worked example against a small engine that implements exactly what the specification currently says. Pick a scenario, then change anything and watch both panels recompute.
Why it matters
- One model decides, not scattered code.
- What is allowed, what is required and what is filled in are all declared next to the object they govern. Change the model and the application follows. shown below
- Status is never stale.
- There is no status column to migrate or reconcile; an object is whatever its data says it is. shown below
- Every refusal names its rule.
- A rejected change carries the Condition that rejected it, in the message the model author wrote. shown below
- Replayable, deterministic behaviour.
- The method's headline claim. Not yet provable as written: the sources leave one rule undefined and two formulas read the clock. Both are on this page. open, Q-G-0001, Q-G-0034
Pick a scenario
Each one sets the data, the Operation and the Authorization, then runs. Everything below stays editable afterwards; the moment you change something it is your scenario.
State is computed, never stored
The engine holds no status field. It reads the object's data against each State's restriction and reports every State that holds. Edit the data on the right and the set on the left recomputes.
computing…
Two States hold at once, and the sources give no rule for choosing. Restrictions written in the sources' own style only accrete. This is the one blocking question for the whole method. CONFLICT PM-STR-0030, Q-G-0001.
Two candidate repairs, previewed here and applied nowhere:
Its data
The names and dates are the demo's own; no source gives instance data. Only the model is Guil's.
Every transition passes through the same gate
An Operation is a request to move an object to a State. The gate below is the method's answer, step by step. Click a step to read what it checked.
No transcribed table pairs an Operation with the State it achieves; the pairing in the Operation list is read off the sources' naming convention (Create → Created, Instantiate → New, Activate → Active). Q-G-0041.
What the sources leave open
A reference implementation surfaces what prose hides. Four things this page shows that the blog and the patent do not settle:
- Which State an object is in when several restrictions hold. The State panel shows the set; the repair previews show the two candidate rules. Q-G-0001.
- Whether the example can be replayed. Both worked Derivation formulas read the clock or the acting user, so the demo makes you supply them. Q-G-0034.
- Five Conditions that attach to nothing. The source spells their State "Create Artist" and "CreatedUser"; no State has either name. Q-G-0042.
- Five Conditions that cannot be evaluated. Their "enforces property" cell holds a State name instead. Q-G-0040.
The model, as transcribed
Show the four tables the engine runs against
Parsed from the three figure transcripts, not retyped. Every row links to the cell it was read from; a row marked UNCERTAIN is a cell the transcript itself could not read with confidence, and one marked RECONSTRUCTED is our extrapolation, not a source.
Verification status of the three source transcripts: conditions-validates-state (unverified), derivation-garantees-states (unverified), filter-and-operations (unverified). No human has re-read the source images against any of the transcribed text below. An UNCERTAIN mark is the transcriber's own flag, raised at transcription time — it is not the product of a review. The absence of a mark is not verification. An unmarked row has not been checked any more than a marked one; it simply was not flagged as uncertain by whoever transcribed it. See /evidence for the verification ladder in full.
States
| Name | Thing | Restrictions | Source |
|---|---|---|---|
| New Artist | Artist | has no createdDate | BLG:business-capability-definition-using-pciml-in-detail |
| Created Artist | Artist | has createdDate | BLG:business-capability-definition-using-pciml-in-detail |
| Active Artist | Artist | has activatedDate | BLG:business-capability-definition-using-pciml-in-detail |
| New User | User | has no createdDate | RECONSTRUCTED — not in any source |
| Created User | User | has createdDate | RECONSTRUCTED — not in any source |
| New Artefact | Artefact | has no createdDate | RECONSTRUCTED — not in any source |
| Created Artefact | Artefact | has createdDate | RECONSTRUCTED — not in any source |
Filters
| ID | Operation | Subject | Predicate | Object | Source |
|---|---|---|---|---|---|
| Filter 1 | Create Artist | — | — | New Artist | IMG:filter-and-operations#r3 |
| Filter 2 | Instantiate User | — | — | Created Artist | IMG:filter-and-operations#r4 |
| Filter 3 | Create User | Created Artist | hasUser | New User | IMG:filter-and-operations#r5 |
| Filter 4 | Activate Artist | Created Artist | hasUser | Created User | IMG:filter-and-operations#r6 |
| Filter 5 | Instantiate Artefact | — | — | Active Artist | IMG:filter-and-operations#r7 |
| Filter 6 | Create Artefact | Active Artist | isAuthorOf | New Artefact | IMG:filter-and-operations#r8 |
| Filter 7 | Publish Artefact | Active Artist | isAuthorOf | Created Artefact | IMG:filter-and-operations#r9 |
Conditions
| Name | Target State | Type | Enforces | Source |
|---|---|---|---|---|
| New Artist requires artistID | New Artist | Error | artistID | IMG:conditions-validates-state#r3 |
| Created Artist requires firstName | Create Artistno State of this name — nearest "Created Artist". Q-G-0042 | Error | firstName | IMG:conditions-validates-state#r4 UNCERTAIN |
| Created Artist requires lastName | Create Artistno State of this name — nearest "Created Artist". Q-G-0042 | Error | lastName | IMG:conditions-validates-state#r5 UNCERTAIN |
| Created Artist requires artisticName | Create Artistno State of this name — nearest "Created Artist". Q-G-0042 | Error | artisticName | IMG:conditions-validates-state#r6 UNCERTAIN |
| Active Artist requires hasUser | Active Artist | Error | hasUser | IMG:conditions-validates-state#r7 |
| Created User requires userName | CreatedUserno State of this name — nearest "Created User". Q-G-0042 | Error | userName | IMG:conditions-validates-state#r8 UNCERTAIN |
| Created User requires password | CreatedUserno State of this name — nearest "Created User". Q-G-0042 | Error | password | IMG:conditions-validates-state#r9 UNCERTAIN |
| New Artefact requires artefactID | New Artefact | Error | New Artefactnames a State, not a property — unevaluable, Q-G-0040 | IMG:conditions-validates-state#r10 UNCERTAIN |
| CreatedArtefact requires hasPhoto | Created Artefact | Error | Created Artefactnames a State, not a property — unevaluable, Q-G-0040 | IMG:conditions-validates-state#r11 UNCERTAIN |
| CreatedArtefact requires isTaggedWith | Created Artefact | Warning | Created Artefactnames a State, not a property — unevaluable, Q-G-0040 | IMG:conditions-validates-state#r12 UNCERTAIN |
| CreatedArtefact requires artefactName | Created Artefact | Error | Created Artefactnames a State, not a property — unevaluable, Q-G-0040 | IMG:conditions-validates-state#r13 UNCERTAIN |
| CreatedArtefact requires artefactDescription | Created Artefact | Error | Created Artefactnames a State, not a property — unevaluable, Q-G-0040 | IMG:conditions-validates-state#r14 UNCERTAIN |
Derivations
| Name | Target State | Formula | Writes | Enforced On | Source |
|---|---|---|---|---|---|
| CreatedDate Default Value | Created Artefact | afn:now() ambient — breaks replay, Q-G-0034 | createdDate | ArtistandArtefactPublishingAuthorization | IMG:derivation-garantees-states#r3 UNCERTAIN |
| CreatedBy Default Value | Created Artefact | pmda:User() ambient — breaks replay, Q-G-0034 | createdBy | ArtistandArtefactPublishingAuthorization | IMG:derivation-garantees-states#r4 UNCERTAIN |