(none)
| Spec | Priority | Reason | Summary |
|---|
| blob-statechart | P3 | Handled externally | Blob/file-upload statechart conversion |
| auth-statechart | P3 | Handled externally | Auth UISM to statechart conversion |
| rad-hooks-conversion | P3 | React hooks banned; use statecharts | RAD hooks (use-form, use-report) conversion |
| Spec | Completed | Summary |
|---|
| cleanup-deletions | 2026-02-21 | Deleted ~22 files (auth, blob, hooks, pathom3, DR routing, UISMs, deprecated) |
| dead-reference-cleanup | 2026-02-21 | Removed all requires/references to deleted namespaces from 8 files |
| control-multimethod-conversion | 2026-02-21 | Converted control.cljc to multimethod dispatch on [control-type style] |
| headless-plugin | 2026-02-21 | Created headless rendering plugin (5 files, plain HTML, all CLJC) |
| cleanup-verification | 2026-02-21 | Verified: 0 dead refs, CLJ compiles, 33 tests/271 assertions pass, full multimethod coverage |
| Spec | Completed | Summary |
|---|
| project-setup | 2026-02-21 | Added statecharts dep, bumped timbre/guardrails/core.async/Clojure, updated pom.xml |
| session-id-convention | 2026-02-21 | Created sc/session.cljc with ident->session-id, per-module helpers, 22 assertions |
| routing-conversion | 2026-02-21 | Created routing.cljc as thin delegation to statecharts routing |
| form-statechart | 2026-02-21 | Created form_chart.cljc, form_expressions.cljc, updated form.cljc public API |
| report-statechart | 2026-02-21 | Created report_chart.cljc, report_expressions.cljc, server-paginated + incremental variants |
| container-statechart | 2026-02-21 | Created container_chart.cljc, container_expressions.cljc, broadcast-to-children |
| control-adaptation | 2026-02-21 | Updated run! to use scf/send! with ident->session-id |
| macro-rewrites | 2026-02-21 | Updated defsc-form/report/container macros for sfro/statechart, removed DR hooks |
| headless-testing | 2026-02-21 | 25 tests, 104 assertions across Tier 1 + Tier 2 |
| app-initialization | 2026-02-21 | Added install-statecharts!, start-routing!, test helpers |
| public-api-mapping | 2026-02-21 | Final API audit: fixed 6 gaps, added deprecation stubs, 62 tests/397 assertions pass |
| Spec | Completed | Summary |
|---|
| demo-port | 2026-02-21 | Ported Datomic demo to src/demo (11 sub-tasks): model, server, UI forms/reports, routing, REPL startup, E2E tests (39 tests, ~87 assertions) |
| Spec | Completed | Summary |
|---|
| routing-form-integration | 2026-02-21 | Added form-route-state/report-route-state to routing.cljc, replaced deprecated sfr/form-state (UISM) with statechart-based form launch. Fixed 22/34 form E2E failures. |
| fix-e2e-test-failures | 2026-02-21 | Added 4 missing headless field renderers (decimal, ref, ref/pick-one, instant/date-at-noon), removed silent (when ...) guards, fixed invoice render exception. All form+routing E2E tests pass. |
| headless-load-callback | 2026-02-21 | Fixed (constantly snapshot) race condition in report_expressions.cljc — transform function at swap-time instead of snapshot replacement. Report E2E tests pass without workaround. |
| Item | Completed | Summary |
|---|
| I1: Dead UISM code removal | 2026-02-21 | Removed ~900 lines: form-machine, report-machine, UISM helpers, dead requires from 10 files |
| I2: Stale docstrings | 2026-02-21 | Updated fo/triggers and 6 ro/* docstrings from UISM to statechart signatures |
| I3: start-report! bug | 2026-02-21 | Fixed to read sfro/statechart-id / sfro/statechart instead of ::machine |
| I4: Form stubs removed | 2026-02-21 | Deleted view!/edit!/create! stubs from form.cljc (working versions in routing.cljc) |
| I5: edit! session verified | 2026-02-21 | Verified correct — delegates to scr/route-to! properly |
| I6: Side effects extracted | 2026-02-21 | Moved rc/transact! and route-to! out of fops/apply-action closures in 4 locations |
| I7: on-loaded-expr decomposed | 2026-02-21 | Extracted build-autocreate-ops and build-ui-props-ops helper functions |
| I8: Container tests | 2026-02-21 | Tier 1: 5 specs pass. Tier 2: 2 specs have child-report lifecycle issues (test setup) |
| I9: Server-paginated tests | 2026-02-21 | 6 specs, 28 assertions, 0 failures |
| I10: Incrementally-loaded tests | 2026-02-21 | 9 specs, 36 assertions, 0 failures |
| I13: Documentation | 2026-02-21 | README.adoc rewritten, docs/migration-guide.adoc created |
| I14: Routing API docs | 2026-02-21 | rroute/ documented as recommended API in README + migration guide |
| I15: Dead options | 2026-02-21 | ro/route reference removed from defsc-report docstring |
| C2: pom.xml | 2026-02-21 | Fulcro 3.9.3, Clojure 1.11.4, statecharts 1.4.0-RC2-SNAPSHOT |
| S1: postprocess-page-state | 2026-02-21 | Removed no-op dead code from report_expressions.cljc |
| S4: Stale comments | 2026-02-21 | Fixed in form_expressions.cljc, report_expressions.cljc, headless_routing_tests.clj |
| S5: Container docstring | 2026-02-21 | Fixed :route-segment reference |
| S9: Network blacklist | 2026-02-21 | Replaced ::uism/asm-id with raw keyword |
| Spec | Completed | Summary |
|---|
| H1: Field CLJ onChange | 2026-02-21 | All field types (string, int, double, boolean, enum, instant, decimal, ref) work in CLJ via !! mutations |
| H2: Ref/picker dropdown | 2026-02-21 | <select> from po/current-form-options, falls back to <span>, subforms render nil |
| H3: Report form-links | 2026-02-21 | row-form-link reads from Row class options (where macro stores them), wraps cells in <a> |
| H4: Report row selection | 2026-02-21 | Row <tr> onClick calls report/select-row!, index via metadata |
| H5: Column sort CLJ | 2026-02-21 | Removed #?(:cljs ... :clj nil) wrapper from sort onClick |
| H6: Report pagination | 2026-02-21 | Prev/Next buttons in footer, page info, disabled at boundaries |
| H7: Subform add/delete | 2026-02-21 | Add button (fo/can-add?), Delete per row (fo/can-delete?), prepend support |
| H8: Controls CLJ onChange | 2026-02-21 | String/boolean controls work in CLJ |
| H9: Enum keyword bug | 2026-02-21 | Strip leading colon from (str keyword) before (keyword s) |
| T1: Unit rendering tests | 2026-02-21 | headless_rendering_spec.cljc — 15 specs, 81 assertions, 0 failures |
| T2: Integration rendering tests | 2026-02-21 | headless_rendering_test.cljc — 3 specs, 16 assertions, 0 failures |
| Item | Completed | Summary |
|---|
| headless-chrome-test | 2026-02-22 | All 6 demo pages tested in Chrome: Inventory Report (data, sort, form-links→ItemForm nav), New Account (form+subforms+dropdowns), New Item (form fields), Invoices (report data+formatting), New Invoice (form+date picker+add), Acct 101 Invoices (parameterized report). Fixed form-links bug: row-form-link now reads report options first. |
| Spec | Completed | Summary |
|---|
| phase9-form-consolidation | 2026-02-22 | Merged form_chart, form_expressions, form_machines into form.cljc; moved form-route-state/edit!/create! from routing; deleted form-fn-registry |
| phase9-report-consolidation | 2026-02-22 | Merged report_chart, report_expressions into report.cljc; moved report-route-state from routing |
| phase9-container-consolidation | 2026-02-22 | Merged container_chart, container_expressions into container.cljc; resolved broadcast-to-children! collision |
Final Test Suite: 77 tests, 366 assertions, 0 failures
All test namespaces passing:
- com.fulcrologic.rad.statechart.form-statechart-test
- com.fulcrologic.rad.statechart.report-statechart-test
- com.fulcrologic.rad.statechart.container-statechart-test
- com.fulcrologic.rad.rendering.headless-rendering-test
- com.fulcrologic.rad.statechart.session-spec
- com.fulcrologic.rad.statechart.form-statechart-spec
- com.fulcrologic.rad.statechart.form-spec
- com.fulcrologic.rad.statechart.report-statechart-spec
- com.fulcrologic.rad.statechart.container-statechart-spec
- com.fulcrologic.rad.statechart.incrementally-loaded-report-spec
- com.fulcrologic.rad.statechart.server-paginated-report-spec
- com.fulcrologic.rad.statechart.options-validation-spec
- com.fulcrologic.rad.statechart.report-test
Minor implementation items in demo app (not blocking release):
- master_detail.cljc: Needs statechart reimplementation (currently a stub routing to inventory)
- line_item_forms.cljc:
on-change trigger is a no-op stub (form still functional, just doesn't auto-persist line items)
| Round | Date | Result | Link |
|---|
| 1 | 2026-02-20 | 7 critical, 7 important, 5 suggested | critique-round-1 |
| 2 | 2026-02-20 | 0 critical, 2 important, 4 suggested -- READY | critique-round-2 |
| 3 | 2026-02-21 | 0 critical (after fix), 5 important, 4 suggested | Phase 2 demo-port critique |
| 4 | 2026-02-21 | 1 critical, 2 important | Full quality audit (5-agent team): compile/test, API, architecture, test validity, ecosystem |
| 5 | 2026-02-21 | 0 critical | Phase 3 final verification: 83 tests, 473 assertions, 0 failures |
| 6 | 2026-02-21 | 2 critical, 15 important, 12 suggested | critique-consolidated — 4-agent deep critique + cross-review |
- cleanup-deletions (delete ~22 files)
- dead-reference-cleanup (remove dead requires/code)
- control-multimethod-conversion (map-based → multimethod)
- headless-plugin (sparse rendering for testing)
- cleanup-verification (compile, test, audit)
- project-setup (deps, artifact, config)
- session-id-convention (cross-cutting decision)
- routing-conversion (infrastructure)
- app-initialization
- form-statechart (most complex, foundational)
- report-statechart (similar pattern to form)
- container-statechart (depends on report)
- control-adaptation
- macro-rewrites (depends on form, report, container, routing)
- headless-testing (depends on all above)
- public-api-mapping (update after all conversions)
- demo-port (Datomic demo with headless testing) — 11 sub-tasks completed
- routing-form-integration (P0 — replaced UISM with statechart form launch)
- fix-e2e-test-failures (P1 — field renderers, silent guards, invoice render)
- headless-load-callback (P1 — snapshot race condition fix)
- phase8-upstream-impl-extraction (P0, upstream fulcro-rad PR)
- phase8-deps-and-identical-cleanup (P0, deps.edn + delete identical files)
- phase8-form-namespace-restructure (P0, rad.form → rad.statechart.form)
- phase8-report-namespace-restructure (P1, rad.report → rad.statechart.report)
- phase8-supporting-namespace-restructure (P1, routing/session/container/control → statechart.*)
- phase8-options-namespace-split (P1, create sfo/ and sro/ namespaces)
- phase8-compile-time-options-validation (P1, macro validation of option keys)
- phase8-test-migration (P1, update test requires and file locations)
- phase8-demo-migration (P2, update demo app)
All questions resolved by human review 2026-02-20. See critique-round-2.md Section "Consolidated Open Questions for Human Review" for the full list with DECIDED annotations. Only 2 minor items remain open (ident->session-id separator edge case, statecharts release version).
- C1: Statecharts not released to Clojars — local path dep blocks downstream consumption. Must release statecharts library first.
scf/current-configuration returns nil in headless Root render: Route-denied modal can't be tested via hiccup.- Container Tier 2 tests: 6 assertion failures — child report lifecycle not starting in test setup. Tier 1 passes.
- 6 pre-existing report Tier 2 errors:
v20150901_impl.cljc:836 protocol incompatibility in statecharts test mocks. - No rendering plugin ported: semantic-ui/react-bootstrap need multimethod conversion for browser use.
- ~~CLJS keyword encoding invalid~~ →
ident->session-id now uses KW.ns..name encoding (no colons in keyword names) - ~~
requiring-resolve CLJS warnings~~ → Registry pattern for form fn cross-ns resolution; direct requires for routing/scr - ~~closure-compiler-unshaded conflict~~ → Removed override; shadow-cljs 3.3.6 bundles its own
- CLJS compiles with 0 warnings (396 files)
- All 24 deps upgraded to latest versions
- ~~
sfr/edit! wrong session~~ → Verified correct: delegates to scr/route-to! - ~~~650 lines dead UISM code~~ → Removed: form-machine, report-machine, all UISM helpers, dead requires
- ~~start-report! reads ::machine~~ → Fixed: reads sfro/statechart-id / sfro/statechart
- ~~form/view!/edit!/create! broken stubs~~ → Removed (working versions in routing.cljc)
- ~~Side effects in apply-action~~ → Extracted to expression body in 4 locations
- ~~on-loaded-expr too dense~~ → Decomposed into 3 helper functions
- ~~pom.xml version mismatches~~ → Updated Fulcro 3.9.3, Clojure 1.12.4, statecharts 1.4.0-RC2-SNAPSHOT
- ~~No user documentation~~ → README rewritten, migration guide created
- ~~Stale UISM docstrings~~ → Updated to statechart signatures
- ~~Container/server-paginated/incremental untested~~ → Tier 1 tests added for all three
- ~~postprocess-page-state no-op~~ → Removed dead code
- ~~Routing→form integration uses UISM~~ → Fixed:
form-route-state uses form/start-form! → scf/start! - ~~
fops/load ok-action doesn't fire in headless mode~~ → Fixed: (constantly snapshot) race condition - ~~8 routing E2E test failures~~ → Fixed: all 10 routing tests pass
- ~~Form E2E silent
(when ...) guards~~ → Fixed: replaced with explicit assertions - ~~Invoice form render exception~~ → Fixed: added missing headless field renderers
- 77 tests, 366 assertions (CLJ) — all passing
- CLJS compilation: 396 files, 0 warnings
- All Tier 1 pure chart tests pass (form, report, container, server-paginated, incrementally-loaded)
- E2E tests: 21 total (form 8, routing 10, report 3) — all pass
- Zero UISM/DR references in production code
- Zero
requiring-resolve in CLJS code paths - pom.xml matches deps.edn
- All 24 deps at latest versions
- README and migration guide complete
- Phase 8 Restructuring: All form/report/supporting namespaces restructured as rad.statechart.* with upstream re-exports
- Demo App: Migrated to statechart.* namespaces, compiles successfully
- fulcro-rad-datomic is at
../fulcro-rad-datomic/ for reference — do NOT edit it, but maintain compatible names so it can reference this library - All sibling projects referenced by specs live in the parent directory (
../). See WORKFLOW.md for the full convention. - Classpath warning: The demo deps.edn MUST use
:override-deps to exclude old fulcro-rad from transitive dependencies. Old RAD on the classpath will cause conflicts.