Liking cljdoc? Tell your friends :D

Project Tracker

Active

SpecPriorityDepends-onStatus
phase9-delete-routing-update-depsP0form-consolidation, report-consolidation, container-consolidationIN PROGRESS

Blocked

SpecPriorityDepends-onStatus
phase9-update-testsP0delete-routing-update-depsBLOCKED
phase9-update-demoP1delete-routing-update-depsBLOCKED
phase9-update-docsP2delete-routing-update-depsBLOCKED
phase8-readmeP2delete-routing-update-depsBLOCKED
phase9-final-verificationP0update-tests, update-demoBLOCKED

Backlog

(none)

Deferred

SpecPriorityReasonSummary
blob-statechartP3Handled externallyBlob/file-upload statechart conversion
auth-statechartP3Handled externallyAuth UISM to statechart conversion
rad-hooks-conversionP3React hooks banned; use statechartsRAD hooks (use-form, use-report) conversion

Done

Phase 0: Library Cleanup (pre-conversion) — completed 2026-02-21

SpecCompletedSummary
cleanup-deletions2026-02-21Deleted ~22 files (auth, blob, hooks, pathom3, DR routing, UISMs, deprecated)
dead-reference-cleanup2026-02-21Removed all requires/references to deleted namespaces from 8 files
control-multimethod-conversion2026-02-21Converted control.cljc to multimethod dispatch on [control-type style]
headless-plugin2026-02-21Created headless rendering plugin (5 files, plain HTML, all CLJC)
cleanup-verification2026-02-21Verified: 0 dead refs, CLJ compiles, 33 tests/271 assertions pass, full multimethod coverage

Phase 1: Statechart Conversion — completed 2026-02-21

SpecCompletedSummary
project-setup2026-02-21Added statecharts dep, bumped timbre/guardrails/core.async/Clojure, updated pom.xml
session-id-convention2026-02-21Created sc/session.cljc with ident->session-id, per-module helpers, 22 assertions
routing-conversion2026-02-21Created routing.cljc as thin delegation to statecharts routing
form-statechart2026-02-21Created form_chart.cljc, form_expressions.cljc, updated form.cljc public API
report-statechart2026-02-21Created report_chart.cljc, report_expressions.cljc, server-paginated + incremental variants
container-statechart2026-02-21Created container_chart.cljc, container_expressions.cljc, broadcast-to-children
control-adaptation2026-02-21Updated run! to use scf/send! with ident->session-id
macro-rewrites2026-02-21Updated defsc-form/report/container macros for sfro/statechart, removed DR hooks
headless-testing2026-02-2125 tests, 104 assertions across Tier 1 + Tier 2
app-initialization2026-02-21Added install-statecharts!, start-routing!, test helpers
public-api-mapping2026-02-21Final API audit: fixed 6 gaps, added deprecation stubs, 62 tests/397 assertions pass

Phase 2: Demo & Validation — completed 2026-02-21

SpecCompletedSummary
demo-port2026-02-21Ported Datomic demo to src/demo (11 sub-tasks): model, server, UI forms/reports, routing, REPL startup, E2E tests (39 tests, ~87 assertions)

Phase 3: Production Readiness — completed 2026-02-21

SpecCompletedSummary
routing-form-integration2026-02-21Added 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-failures2026-02-21Added 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-callback2026-02-21Fixed (constantly snapshot) race condition in report_expressions.cljc — transform function at swap-time instead of snapshot replacement. Report E2E tests pass without workaround.

Phase 4: Critique Fixes — completed 2026-02-21

ItemCompletedSummary
I1: Dead UISM code removal2026-02-21Removed ~900 lines: form-machine, report-machine, UISM helpers, dead requires from 10 files
I2: Stale docstrings2026-02-21Updated fo/triggers and 6 ro/* docstrings from UISM to statechart signatures
I3: start-report! bug2026-02-21Fixed to read sfro/statechart-id / sfro/statechart instead of ::machine
I4: Form stubs removed2026-02-21Deleted view!/edit!/create! stubs from form.cljc (working versions in routing.cljc)
I5: edit! session verified2026-02-21Verified correct — delegates to scr/route-to! properly
I6: Side effects extracted2026-02-21Moved rc/transact! and route-to! out of fops/apply-action closures in 4 locations
I7: on-loaded-expr decomposed2026-02-21Extracted build-autocreate-ops and build-ui-props-ops helper functions
I8: Container tests2026-02-21Tier 1: 5 specs pass. Tier 2: 2 specs have child-report lifecycle issues (test setup)
I9: Server-paginated tests2026-02-216 specs, 28 assertions, 0 failures
I10: Incrementally-loaded tests2026-02-219 specs, 36 assertions, 0 failures
I13: Documentation2026-02-21README.adoc rewritten, docs/migration-guide.adoc created
I14: Routing API docs2026-02-21rroute/ documented as recommended API in README + migration guide
I15: Dead options2026-02-21ro/route reference removed from defsc-report docstring
C2: pom.xml2026-02-21Fulcro 3.9.3, Clojure 1.11.4, statecharts 1.4.0-RC2-SNAPSHOT
S1: postprocess-page-state2026-02-21Removed no-op dead code from report_expressions.cljc
S4: Stale comments2026-02-21Fixed in form_expressions.cljc, report_expressions.cljc, headless_routing_tests.clj
S5: Container docstring2026-02-21Fixed :route-segment reference
S9: Network blacklist2026-02-21Replaced ::uism/asm-id with raw keyword

Phase 6: Headless UI Functional + Tests — completed 2026-02-21

SpecCompletedSummary
H1: Field CLJ onChange2026-02-21All field types (string, int, double, boolean, enum, instant, decimal, ref) work in CLJ via !! mutations
H2: Ref/picker dropdown2026-02-21<select> from po/current-form-options, falls back to <span>, subforms render nil
H3: Report form-links2026-02-21row-form-link reads from Row class options (where macro stores them), wraps cells in <a>
H4: Report row selection2026-02-21Row <tr> onClick calls report/select-row!, index via metadata
H5: Column sort CLJ2026-02-21Removed #?(:cljs ... :clj nil) wrapper from sort onClick
H6: Report pagination2026-02-21Prev/Next buttons in footer, page info, disabled at boundaries
H7: Subform add/delete2026-02-21Add button (fo/can-add?), Delete per row (fo/can-delete?), prepend support
H8: Controls CLJ onChange2026-02-21String/boolean controls work in CLJ
H9: Enum keyword bug2026-02-21Strip leading colon from (str keyword) before (keyword s)
T1: Unit rendering tests2026-02-21headless_rendering_spec.cljc — 15 specs, 81 assertions, 0 failures
T2: Integration rendering tests2026-02-21headless_rendering_test.cljc — 3 specs, 16 assertions, 0 failures

Phase 7: Chrome Browser Testing — completed 2026-02-22

ItemCompletedSummary
headless-chrome-test2026-02-22All 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.

Phase 9: Namespace Consolidation (partial) — completed 2026-02-22

SpecCompletedSummary
phase9-form-consolidation2026-02-22Merged form_chart, form_expressions, form_machines into form.cljc; moved form-route-state/edit!/create! from routing; deleted form-fn-registry
phase9-report-consolidation2026-02-22Merged report_chart, report_expressions into report.cljc; moved report-route-state from routing
phase9-container-consolidation2026-02-22Merged container_chart, container_expressions into container.cljc; resolved broadcast-to-children! collision

Phase 8: Library Restructuring — completed 2026-02-22

SpecCompletedSummary
phase8-upstream-impl-extraction2026-02-22Extract ~52 form + ~25 report pure functions into form.impl/report.impl in UPSTREAM fulcro-rad
phase8-deps-and-identical-cleanup2026-02-22Add fulcro-rad dep, delete 29 forked files
phase8-form-namespace-restructure2026-02-22Move rad.form → rad.statechart.form, re-export from form.impl
phase8-report-namespace-restructure2026-02-22Move rad.report → rad.statechart.report, same pattern
phase8-supporting-namespace-restructure2026-02-22Move routing, session, container, control to statechart.*
phase8-options-namespace-split2026-02-22Create sfo/ and sro/ with engine-specific option keys only
phase8-compile-time-options-validation2026-02-22defsc-form/report macros reject wrong-engine option keys at compile time
phase8-test-migration2026-02-22Update all test requires and move test files — 77 tests, 366 assertions, 0 failures
phase8-demo-migration2026-02-22Update demo app requires and option keys — compiles, uses statechart.* namespaces

Test Summary

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

Remaining TODOs

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)

Critique Specs

SpecReviewerScope
critique-uism-remnantsuism-criticDead UISM/DR code audit (~650 removable lines)
critique-api-designapi-criticPublic API surface, user experience, routing clarity
critique-architecturearch-criticStatechart design, Fulcro principles, expression quality
critique-production-readinessprod-criticTest coverage, ecosystem gaps, deployment blockers
critique-consolidatedcross-criticCross-review: 2 critical, 15 important, 12 suggested

Critique History

RoundDateResultLink
12026-02-207 critical, 7 important, 5 suggestedcritique-round-1
22026-02-200 critical, 2 important, 4 suggested -- READYcritique-round-2
32026-02-210 critical (after fix), 5 important, 4 suggestedPhase 2 demo-port critique
42026-02-211 critical, 2 importantFull quality audit (5-agent team): compile/test, API, architecture, test validity, ecosystem
52026-02-210 criticalPhase 3 final verification: 83 tests, 473 assertions, 0 failures
62026-02-212 critical, 15 important, 12 suggestedcritique-consolidated — 4-agent deep critique + cross-review

Implementation Order (Recommended)

Phase 0: Cleanup — DONE

  1. cleanup-deletions (delete ~22 files)
  2. dead-reference-cleanup (remove dead requires/code)
  3. control-multimethod-conversion (map-based → multimethod)
  4. headless-plugin (sparse rendering for testing)
  5. cleanup-verification (compile, test, audit)

Phase 1: Conversion — DONE

  1. project-setup (deps, artifact, config)
  2. session-id-convention (cross-cutting decision)
  3. routing-conversion (infrastructure)
  4. app-initialization
  5. form-statechart (most complex, foundational)
  6. report-statechart (similar pattern to form)
  7. container-statechart (depends on report)
  8. control-adaptation
  9. macro-rewrites (depends on form, report, container, routing)
  10. headless-testing (depends on all above)
  11. public-api-mapping (update after all conversions)

Phase 2: Demo & Validation — DONE

  1. demo-port (Datomic demo with headless testing) — 11 sub-tasks completed

Phase 3: Production Readiness — DONE

  1. routing-form-integration (P0 — replaced UISM with statechart form launch)
  2. fix-e2e-test-failures (P1 — field renderers, silent guards, invoice render)
  3. headless-load-callback (P1 — snapshot race condition fix)

Phase 8: Library Restructuring — DONE (9 tasks completed)

  1. phase8-upstream-impl-extraction (P0, upstream fulcro-rad PR)
  2. phase8-deps-and-identical-cleanup (P0, deps.edn + delete identical files)
  3. phase8-form-namespace-restructure (P0, rad.form → rad.statechart.form)
  4. phase8-report-namespace-restructure (P1, rad.report → rad.statechart.report)
  5. phase8-supporting-namespace-restructure (P1, routing/session/container/control → statechart.*)
  6. phase8-options-namespace-split (P1, create sfo/ and sro/ namespaces)
  7. phase8-compile-time-options-validation (P1, macro validation of option keys)
  8. phase8-test-migration (P1, update test requires and file locations)
  9. phase8-demo-migration (P2, update demo app)

Open Questions for Human Review

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).

Known Issues

Critical

  • C1: Statecharts not released to Clojars — local path dep blocks downstream consumption. Must release statecharts library first.

Remaining Important

  • 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.

Resolved in Phase 5 (CLJS Compat)

  • ~~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

Resolved in Phase 4

  • ~~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

Resolved in Phase 3

  • ~~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

Verified Working (Post Phase 8)

  • 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

Important Notes

  • 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.

Can you improve this documentation?Edit on GitHub

cljdoc builds & hosts documentation for Clojure/Script libraries

Keyboard shortcuts
Ctrl+kJump to recent docs
Move to previous article
Move to next article
Ctrl+/Jump to the search field
× close