Incidents

The rules stand in AGENTS.md. This is the record of what was measured to arrive at them, in date order — each entry keeps its date, its measured output and, where the first diagnosis was wrong, the retraction. Nothing here is an instruction: where an entry and AGENTS.md disagree, AGENTS.md is the current position and the entry is history. A new trap adds a rule with its one-line consequence there and an entry here, never a section per incident there (Crm#100 — the split ReleasedPlatformCi already uses for the CI history).

Two write-path traps measured on the first deploy (2026-08-28)

Three more traps measured on the live portal (2026-08-29)

The migration that ran the previous build (2026-08-30)

Crm/Migration was then a compiled control plane — a request node that fired at requestedAction: Run — and it was removed the same day, once the work was done. Three rules came out of this one day and stand in AGENTS.md: A dry run shows the PLAN, not the RESULT — verify the WRITE, A NodeType's self-report is not proof — exercise the change, and Do one-off data work with a script, not a NodeType. This is what was measured.

The dry run approved it; the write was empty

Planning before writing is still right, and the all-client dry run on 2026-08-30 caught a document reference about to become a contact, and the tool offering a client's own DEAL as a promotion candidate. But the first real run still destroyed data the dry run had approved:

The four documents were recovered from version history (get_versionsrestore_version). The rest of the day is recorded beside the rules it produced, in AGENTS.md: the migration ran the PREVIOUS build while compilationStatus: Ok and compiledSources == currentSourceVersions both read healthy (A NodeType's self-report is not proof); forcing a compile and a recycle to make the fix live broke Crm/Migration itself, and requestedReleaseForce was silently discarded one layer down (Never force a compile or recycle); the four offers were finally promoted by rbuergi/Script/promote-offers, carrying every body intact and verifying each one (Do one-off data work with a script).

The stronger rule that followed, and the deploy that falsified it

⚠️ AGENTS.md said something stronger and it was WRONG. For a few hours on 2026-08-30 it told you to compare the NodeType against its Release and, on a mismatch, to stop — the portal is not running your change. Then the very next deploy falsified it: Crm/Offer had all three fields mismatched —

NodeType   latestAssemblyPath: Crm_Offer/v63-s13fb7c2-8c434fd42aa0.dll
           compiledFrameworkVersion: s13fb7c25…      compiledSources[CrmQueries]: …098599428010
Release    assemblyContentPath: Crm_Offer/v25-s770d75c-bcfce1529bfe.dll
           artifacts[0].frameworkIdentity: s770d75c…  sourceVersions[CrmQueries]: …424514972670

— and was serving perfectly: PG3/FundReportingPilotOffer/area/Offer rendered its title, its status pill and all 7,111 characters of its body. latestReleasePath lags routinely. A rule that halts a deploy on that would halt every deploy, which is worse than the gap it was meant to close.

What survives is what AGENTS.md states now: compilationStatus: Ok plus compiledSources == currentSourceVersions does NOT mean your code is running, no field on the NodeType settles it either way, and the only check that held is BEHAVIOURAL.

Two layout traps measured on the live portal (2026-09-05)

Reconnecting…
The server was updated. Reloading the page to pick up the latest version.