Every ticket as the root of its provenance graph — goal, patch, approval, runs and (as the ticket-class build lands) mandate, manifestations, guarantees, journey, artifacts and children. Rendered through the <<<TicketGraphList>>> tag.
Forms: better deserialization technique for the POM/session
goal
The form/POM state is persisted across requests via PHP serialize()/__wakeup into $_SESSION['POM']. Replace with a more robust, portable technique (e.g. explicit JSON (de)serialization of form results) so form state survives class changes and is inspectable; reduces reliance on __wakeup class-reloading.
[PLAN #45 — POM serialize()→JSON]
Surface: PersistentObjectManager::pack/unpack store the POM via PHP serialize() into $_SESSION['POM']
(PersistentObjectManager.php ~L41-42) and StandardForm::__wakeup reloads element classes on unserialize.
Plan (one element type per crank, keep old path until all converted):
1. Add to_array()/from_array() to StandardForm and each form-element class (RadioSelect, TextBox, TextField, DbSelect,
Checkbox, FormConfigElement) — plain data, no behavior.
2. Change PersistentObjectManager to json_encode a registry [{type, data}] into $_SESSION['POM'] and json_decode+rebuild
on load (dispatch by type via the tag/class loader), replacing serialize/__wakeup.
3. Test EACH step by driving the multi-step ticket form + tag/category forms in headless chromium — the FCE action/oncomplete
flow depends on results surviving the session round-trip, so verify getResults() still returns after Continue->Continue. [crank 1 DONE] AbstractFormElement.to_array/from_array (base fields, extra* hooks, circular form ref excluded) + RadioSelect + tools/formelement_roundtrip.php gate. Remaining elements: TextBox, TextField, BigTextBox, DbSelect, Checkbox, FormConfigElement; then StandardForm (composes element arrays); then flip POM pack/unpack serialize->JSON + chromium form test. serialize() still live. [crank 2 DONE] TextBox verified covered by base (no per-class hooks); gate case added. Remaining: TextField, BigTextBox, DbSelect, Checkbox, FormConfigElement, StandardForm. [crank 3 DONE] TextField base-covered; gate case added. Remaining: BigTextBox, DbSelect, Checkbox, FormConfigElement, StandardForm. [crank 4 DONE] BigTextBox base-covered; gate case. Remaining: DbSelect (own state), Checkbox, FormConfigElement, StandardForm. [crank 5 DONE] DbSelect: extraFromArray re-derives options from elementString; gate defines CONGRUENCY_SQLITE from install.json. Remaining: Checkbox, FormConfigElement, StandardForm. [crank 6 DONE] Checkbox base-covered; gate case. Remaining: FormConfigElement, StandardForm. [crank 7 DONE] FormConfigElement base-covered (config re-parsed from elementString). All 6 elements + FCE JSON-serializable. Remaining: StandardForm, then PAUSE for greenlight on the pack/unpack flip. [crank 8 DONE — SAFE PHASE COMPLETE] StandardForm JSON-serializable. All 6 elements + FCE + StandardForm now have to_array/from_array; gate 8/8. Remaining: the RISKY flip of PersistentObjectManager::pack/unpack serialize()->JSON registry + drop StandardForm::__wakeup, needs chromium form verification — PAUSED for human greenlight. [#45 CLOSED] POM form persistence moved serialize()->JSON. All 6 elements+FCE+StandardForm+FormManager have to_array/from_array (gate 9/9); POM pack/unpack use JSON envelopes with serialize-fallback for non-form objects (ClassLoader/Document/etc); StandardForm::__wakeup dropped. Verified end-to-end in chromium (ticket + tag/category forms). Form state is now inspectable JSON and survives class changes.
patch
none
approval
unapproved
runs
no runs recorded
mandate (clauses)
not yet recorded — lands with the ticket-class build
manifestations
not yet recorded — lands with the ticket-class build
guarantees
not yet recorded — lands with the ticket-class build
journey (blunders & successes)
not yet recorded — lands with the ticket-class build
artifacts (forge)
not yet recorded — lands with the ticket-class build