Feature status
한국어. Contracts are defined in spec.
Tests and deployment are recorded separately. pending is not a passing result.
| ID | Feature | Implementation | Verification | Deployment | Evidence |
|---|---|---|---|---|---|
| condition-trees | The rule conditionTree, which checks that a field value is a condition tree of all, any, field comparisons and judged text, in six validators |
implemented | passed | not-deployed | Condition trees, validation rule, shared cases |
| condition-control | A condition field whose textarea holds its condition tree as JSON text, rendered by eight renderers, decoded back into the tree by connectForm and the browser validation, and checked by its required conditionTree rule |
implemented | passed | not-deployed | Specification, form markup, condition values; the shared form cases condition-* compare React, Vue, Svelte, the HTML renderer, PHP, the PHP extension, Go, Rust and Python; shared validation case condition-field-values; browser decoding in connectForm (cases) and @polyspec/crudui-form-binding (data cases) |
| condition-editor | A structured editor of a condition field (design.editor: structured) that every renderer writes as a view of the condition tree after its hidden textarea, with a named error and the visible textarea for a value it cannot show, and whose controls and buttons connectForm applies to the tree |
implemented | passed | not-deployed | Specification, form markup, condition values; the shared form cases condition-editor-* and condition-fields-* compare React, Vue, Svelte, the HTML renderer, PHP, the PHP extension, Go, Rust and Python; shared spec case ok-condition-editor; the editor edits of connectForm (cases) |
| control-attributes | Declared attributes of a field's control and its node written as attributes in eight renderers, limited to data-* and aria-* names |
implemented | passed | not-deployed | Specification, form markup; @polyspec/crudui-generator-core (model and check cases), @polyspec/crudui-generator-html (byte cases), React (byte cases), the JSON Schema and the typed specification models of the PHP, Go and Rust validators; the shared form cases control-attributes-* compare React, Vue, Svelte, the HTML renderer, PHP, the PHP extension, Go and Rust |
| switch-control | A switcher field rendered as a switch (role="switch") distinct from a checkbox in eight renderers |
implemented | passed | not-deployed | Form markup; @polyspec/crudui-generator-core (model cases), @polyspec/crudui-generator-html (byte cases), React (byte case), Vue (case), Svelte (case), the stylesheet (browser check), and PHP, the PHP extension, Go and Rust in the native suite with the shared form cases switcher-bare and control-attributes-checkbox |
| range-control | A range field rendered as a slider with its bounds, step and current value in eight renderers and validated in five validators |
implemented | passed | not-deployed | Specification, form markup; implemented in @polyspec/crudui-generator-core (model and check cases), @polyspec/crudui-generator-html (byte cases), the stylesheet and the JSON Schema; the existing range and step rules validate the value (TypeScript cases, shared validation case range-field-values); the shared form cases range-* compare React, Vue, Svelte and, in the native suite, PHP, the PHP extension, Go and Rust |
| button-control | A button field rendered as a button element with its content and attributes and no script in eight renderers |
implemented | passed | not-deployed | Form markup; @polyspec/crudui-generator-core (model cases), @polyspec/crudui-generator-html (byte cases), React (byte cases, script check), Vue (cases), Svelte (cases), the stylesheet (browser layout check), and PHP, the PHP extension, Go and Rust in the native suite with the shared form cases button-empty, action-alias, button-behavior-onclick and control-attributes-file-display-button |
| choice-appearance | A class and style for each choice of a choice field in eight renderers, so a choice field can render as a grid of swatches | implemented | passed | not-deployed | Specification, form markup; implemented in @polyspec/crudui-generator-core (model and check cases) and @polyspec/crudui-generator-html (byte cases) and the JSON Schema; the shared form cases choice-appearance-* compare React, Vue, Svelte and, in the native suite, PHP, the PHP extension, Go and Rust |
| display-switching | Fields and groups shown by the design.show of their parent values in the browser binding, relative paths that treat a repeated row as one level, the hidden paths in the validation result and shared cases of conditional required fields in five validators |
implemented | pending | not-deployed | Display, visibility, relative paths; the binding cases, the hidden path cases, the shared validation cases switch-*, visibility-row-parent-* and visibility-show-literal-identifier, the shared expression cases path-row-* and the shared form cases design-show-row-parent-*; the native and browser comparisons run in CI |
| choice-groups | Group entries in the choice list of a select field rendered as optgroup elements with their options in eight renderers, and the values inside groups accepted as the field's choices by in in five validators |
implemented | passed | not-deployed | Specification, form markup; implemented in @polyspec/crudui-generator-core (model and check cases), @polyspec/crudui-generator-html (byte cases), React (byte and component cases), Vue (cases), Svelte (cases), the TypeScript validator's in (cases), its types and the JSON Schema; the shared form cases choice-groups-*, the list case reject-format-items-choice-group and the shared validation cases value-in-choice-groups* compare the implementations, including PHP, the PHP extension, Go and Rust in the native suite and the PHP, PHP extension, Go and Rust validators |
| inline-layout | A form layout that places each field's label and control on one row in eight renderers | implemented | passed | not-deployed | Specification, form markup; implemented in @polyspec/crudui-generator-core (model and check cases), @polyspec/crudui-generator-html (byte cases), the stylesheet (browser layout check) and the JSON Schema; the label of a checkbox or switcher field in the header of an inline layout is implemented in the node model and in React (server and component cases), Vue (cases) and Svelte (cases); the shared form cases inline-layout-* and six written layout cases compare the eight renderers, including PHP, the PHP extension, Go and Rust in the native suite |
| collection-controls | Proposal outside the current row contract: declared texts and attributes of row controls and an add control after the last row in eight renderers | not-started | pending | not-deployed | Form markup |
| validator-responses | Validator process status and complete response checks | implemented | passed | not-deployed | Response tests, Validator process cases |
| php-api | Common PHP and extension classes with identical methods | implemented | passed | not-deployed | PHP API contract |
| generator-php | PHP form generation and SSR | implemented | passed | not-deployed | Runtime contract |
| generator-go | Go form generation and SSR | implemented | passed | not-deployed | Runtime contract |
| generator-rust | Rust form generation and SSR | implemented | passed | not-deployed | Runtime contract |
| generator-python | Python form generation, list and detail rendering, and the native generator checks of the Python program | implemented | passed | not-deployed | Runtime contract |
| validator-python | Python validation of forms, lists and details, the composition and expression rules of the shared fixtures | implemented | passed | not-deployed | Runtime contract |
| generator-html | Framework-independent form and list HTML rendering | implemented | passed | not-deployed | Feature contract |
| php-extension | Native PHP form generation and validation | implemented | passed | not-deployed | Extension contract |
| server-template-browser | Current keyed browser instances from serialized server-compiled templates | implemented | passed | not-deployed | Local verification (make crudui-test-form-comparison-checks, CI job form-comparison-browser): the initialization reports of check.mjs |
| native-generation-integration | Current four-server generation, SSR, transport, persistence and browser integration | implemented | passed | not-deployed | Local verification (make crudui-test-form-comparison-checks, CI job form-comparison-browser and form-comparison-checks): check-generation.mjs, check-servers.mjs, check-pipeline.mjs and check.mjs |
| expressions | Shared expression grammar and boolean conversion | implemented | passed | not-deployed | Expression contract |
| cli | Catalog, static checks and specification descriptions | implemented | passed | not-deployed | CLI procedure |
| unique-json-members | Reject repeated decoded JSON member names in specification text | implemented | passed | not-deployed | Input text contract, parser tests |
| json-text-values | Preserve JSON object member names, values and order during Rust validation | implemented | passed | not-deployed | Input text contract, Rust text cases |
| viewport-widths | Every shared render case fits viewports of 360 and 1280 CSS pixels with crudui.css, a list scrolling a wide table on its own |
implemented | passed | not-deployed | Viewport widths, viewport test |
| tailwind-styles | crudui.css imported into the Tailwind CSS layer components (no generated file), with the same computed styles |
implemented | passed | not-deployed | Tailwind CSS, comparison test |
| complete-form | Complete form with form element, hidden inputs, form and node errors in eight string renderers | implemented | passed | not-deployed | Complete form, shared cases |
| choice-lists | Choice lists of value and label pairs in written order for any values, in eight form renderers, five display renderers, five validators and the CLI | implemented | passed | not-deployed | Choice lists, form cases, validation cases |
| display-descriptions-actions | Form root and list descriptions and detail actions in eight renderers | implemented | passed | not-deployed | Display formats, complete form, list cases, detail cases |
| action-event-attributes | List and detail action behavior members written once as their event attributes in eight renderers |
implemented | passed | not-deployed | Display formats, list cases, detail cases |
| script-action-click | A list or detail script action runs its script on the click of its button in eight renderers and three browsers | implemented | passed | not-deployed | Display formats, list cases, detail cases, browser case |
| browser-validation | Browser validation of a server-rendered form with the specification of the server: data from the named controls as a submission sends it, the error markup of renderForm, aria-invalid, validation when a changed field loses focus and on submit, and cancellation of an invalid submission before other submit listeners |
implemented | passed | not-deployed | Browser validation, parity cases, browser case in Chromium, Firefox and WebKit, public package checks, install check, reproducible build |
| test-hook-failures | Every failure of a node --test or Vitest run, a failed or timed-out hook included, printed with its test file and elapsed time |
implemented | passed | not-deployed | Test runner |
| load-independent-checks | Linear-time checks of the validators and the PHP extension engine that read no clock | implemented | passed | not-deployed | Time and load, clock check |
| single-choice-data | Reject an array or object as the value of a single-choice field in five validators | implemented | passed | not-deployed | Validation rules, shared cases |
| empty-membership | An empty in list or map that matches no value in five validators |
implemented | passed | not-deployed | Validation rules, shared cases |
| declared-form-data | Reject undeclared submitted fields in form data at every group level | implemented | passed | not-deployed | Validation contract, shared cases |
| form-controls | Labels, multiple choice arrays and field container paths | implemented | passed | not-deployed | Shared control assertions |
| package-exports | Packaged exports, separate React component and server entries, type declarations and install production build | implemented | passed | not-deployed | Install check, React entry check |
| package-install | Resolved dependencies and normal installation | implemented | passed | not-deployed | npm ci / test:packages |
| package-build | Independent public declaration compilation | implemented | passed | not-deployed | Build checks, public type check |
| package-api | Initial package API and version metadata | implemented | passed | not-deployed | API contract |
| form-template | Data-independent form templates and JSON caching | implemented | passed | not-deployed | Core tests |
| form-initialization | Initial data, repeated injection and record restoration | implemented | passed | not-deployed | Runtime contract |
| form-inspector | Parsed DOM, raw HTML, CSS and state comparison with retained differences | implemented | passed | not-deployed | Inspector tests |
| form-rows | Scoped nested row operations and saved sequence keys | implemented | passed | not-deployed | Core tests |
| form-empty-rendering | Explicit empty collection rendering in the merged runtime | implemented | passed | not-deployed | Empty collection tests |
| form-browser | Data injection and row actions in three frameworks | implemented | passed | not-deployed | Shared DOM scenario |
| form-typing | Native input updates with stable editable controls, focus and renderer completion | implemented | passed | not-deployed | Local verification (make crudui-test-form-comparison-checks, CI job form-comparison-checks): check-typing.mjs |
| form-empty-focus | Focus after an empty collection creates its first row | implemented | passed | not-deployed | Shared DOM scenario |
| form-focus | Focus movement to the affected row after row operations | implemented | passed | not-deployed | Local verification (make crudui-test-form-comparison-checks, CI job form-comparison-browser): the interaction checks of check-interaction.mjs |
| form-markup | Recursive form nodes, list/detail display blocks, row cards and interface messages in five implementations | implemented | passed | not-deployed | Form markup, display formats |
| crudui-details | Read-only detail specification, model, framework-independent HTML rendering and structure validation | implemented | passed | not-deployed | Specification, display formats, feature contract, shared detail fixture, native comparison, detail validity cases |
| form-view-state | Row collapse and merged undo/redo history outside record data | implemented | passed | not-deployed | Node tests |
| display-declarations | List and detail declaration checks at render in JavaScript, the HTML renderer, PHP, the PHP extension, Go and Rust | implemented | passed | not-deployed | Display format declarations, shared list fixture, shared detail fixture, native comparison, render validity test |
| form-outline | Structure map and current data view | implemented | passed | not-deployed | Form markup |
| form-initialization-comparison | Side-by-side stage comparison of forms created with data and forms injected after mounting | implemented | passed | not-deployed | Form comparison |
| keyed-validation | Key-preserving group and scalar validation in four languages | implemented | passed | not-deployed | Shared validation cases |
| docs-check | Document checks and event-driven development rebuilds | implemented | passed | not-deployed | Documentation procedure |
| docs-pages | Static documentation with English, Korean and API pages | implemented | passed | deployed | Page tests, publication procedure, published web |
Comparison verification of 2026-09-19
On 2026-09-19 the comparison deployment verification ran in 5m20s with zero failures.
PHP, PHP extension, Go and Rust
passed 450 generation checks, 120 persistence checks and 7,008 browser checks, and the canonical
flow passed all 40 combinations of five servers, four clients and both initializations, with zero
failures. The run started from repositories holding non-default records, so every initialization
column loaded its own reset record. Every browser report and phase completed within its own limit,
and the container reported zero zombie processes after verification. The public root is the
canonical page: list, detail, form, save and refreshed list; the separate benchmark screen is
/benchmark-console/. The 45-record canonical list uses three pages of 20, 20 and 5 records.
Page-level SSR contains the selected server's list, detail or form markup, while CSR contains only
the stage shell that the selected client fills. Initialization comparison preserves
framework-owned container markers and compares rendered container contents; Vue's data-v-app is
not removed.
PHP 8.4 and later are supported. .php-version selects the CI toolchain; it does not set an upper bound on supported PHP releases. The dated verification sections record the versions and results of those runs. Their historical PHP 8.5.10 measurements remain unchanged and do not verify the current tree.
Checklist verification
On 2026-10-26, a full run on PHP 8.4.26 completed 39 targets: 20 passed and 19 failed.
The report is var/report/final-checklist/record.json. The failures are tracked with their corrections and owning checks in the kit standard checklist.
The run did not declare CRUDUI_CONFORMANCE_EVIDENCE, so its conformance aggregation has no evidence directory. The full run records failures before the corrections; it does not verify the combined corrected tree. The corrections are verified by their selected owning checks. The extension-wide library run also loaded PHP implementation-only helper files, so it does not establish an extension-only result for those internal tests.
Release preparation
The 2026-10-26 review classifies the ten impossible checklist rows by their current cause. Unicode data uses the locked Unicode package. The HTTP forwarding adapter filters connection-specific headers in both directions. The documentation renderer retains a directly managed Markdown parser because the evaluated VitePress distributions embed the affected parser. The documentation and HTTP forwarding records state the requirements, evaluated tools and retry conditions.
Native package managers select current sibling sources for local preparation. Composer uses one root declaration and lock and selects PHPUnit within its declared constraint. React and React DOM 19.3.1 run client widget scripts from an effect after rendering an inert template; server rendering and hydration retain script elements. The React dependency-policy exceptions are removed. The withdrawn sprintf-js advisory does not require a package update.
The refreshed dependency review covers 88 registry dependencies and 14 locks and records no security advisories. The npm locks select patched Markdown, URI, HTTP client and schema packages, and the Rust comparison server lock selects Tokio 1.53.3. Go 1.27.3 satisfies the linked module's minimum and permits its advisory scan.
The release configuration classifies the native PHP extension manifest as version-only. C18.5 prepares version 0.0.8
manifests, internal dependencies and native locks before CI. Package coverage and version checks are separate from
publication. A release still requires successful ci-passed and push-gate checks on its commit; local preparation and
owning unit checks do not establish that result.
The release preparation checklist, C18.1–C18.10, is complete. Current source dependency and consumer checks, full CI, tag verification and public archive installation checks passed.
Local source development
Installed npm and Composer polyspec packages resolve to current sibling sources. Root Composer declarations and the native lock describe the actual local package versions. Local preparation verifies the current OrderedJSON source, including its order, values and empty types, through the package manager's installed autoload. It does not substitute an older public OrderedJSON archive or maintain a second archive-compatibility installation profile. C18.1 records the final native validation, platform and consumer results before candidate CI.
Display declaration verification
On 2026-09-24 the working tree of the display declaration change passed on macOS arm64 with PHP 8.5.10, Node.js 26.8.1, Go 1.27.0 and Rust 1.98.0:
- The native generator suite passed 596 checks in each of JavaScript, the HTML renderer, PHP, Go, Rust and native PHP (3,576 in total, zero failed), including the 142 list and 44 detail cases.
- The form packages passed core 247, HTML 406, React 794, Vue 597, Svelte 590 and 14 mounted Svelte checks, and the node form checks passed 57 and 24. The generator packages passed 249 PHP, 116 Go and 36 Rust tests, and the PHP extension suite passed 46 tests; its address-sanitizer test runs on Linux.
- The cross-check console passed 1,039 tests, the specification CLI 38, the form-comparison source
suite 194, its Go and Rust servers 14 and 18,
npm run manifest:test21 commands,npm run test:packagesseven steps andnpm run test:runtimes65 tests.npm run spec:schema,npm run lint,npm run typecheck,make format-checkandmake docs-checkpassed.
Native package verification
On 2026-09-17 the working tree passed make ci, which runs every checking command of the CI
workflow and checks the conformance evidence against contracts/features.json, on macOS arm64 with
PHP 8.5.10, Node.js 26.8.1, Go 1.27.0 and Rust 1.98.1:
- The validators passed 580 JavaScript, 698 PHP, 587 Go and 111 Rust tests, each including all 250 shared validation cases, and the 80 shared input-text cases across the validation and generation operations. The PHP extension suite passed 42 tests; its address-sanitizer test runs on Linux.
- The shared generator report passed 501 checks in each of JavaScript, the HTML renderer, PHP, Go, Rust and native PHP (3,006 in total, zero failed), and its inputs did not change during the run. The generator packages passed 240 PHP, 115 Go and 35 Rust tests.
- The cross-check console passed 914 tests, which send every shared validation, list, detail and input-text case and the request cases through all five validator processes.
- The form packages passed core 216, HTML 308, React 502, Vue 472, Svelte 467 and twelve mounted
Svelte checks; the specification CLI passed 38; the node form checks passed 54, including the
stylesheet layout in Chromium, Firefox and WebKit. The form-comparison source suite passed 149
checks,
npm run lintreported no problem across the repository, the package install check seven steps, andmake format-checkpassed. - In the Linux toolchain image the PHP extension engine passed 33 tests, including the address-sanitizer and comma-decimal-locale runs. The Linux stylesheet checks in Chromium, Firefox and WebKit run in the CI job that runs the form tests.
Conformance is checked from evidence. Every suite that runs a shared fixture records which feature,
fixture case and runtime passed, and make conformance (and the final CI job) compares that evidence
with contracts/features.json: a supported runtime without a passing record for every declared case
fails. Conformance defines the standard. Package publication is recorded below;
the native PHP extension remains a version-only release component.
Retained form comparison results
The retained external environment at https://crudui.test/ uses an earlier library tree,
with PHP, PHP with native JSON parsing, Go and Rust as separate HTTP targets.
All 240 HTTP checks and PHP processor-mode enforcement passed.
Both PHP targets use the PHP validator. These retained results do not verify the
current native CRUDUI form generation or validation integration.
| Server | Scenarios | Interactions | Page errors |
|---|---|---|---|
| PHP | 120/120 passed | 30/30 passed | 0 |
| PHP with native JSON parsing | 120/120 passed | 30/30 passed | 0 |
| Go | 120/120 passed | 30/30 passed | 0 |
| Rust | 120/120 passed | 30/30 passed | 0 |
Each target covers React, Vue and Svelte with form and ordered JSON transport.
Reports include initial data, later injection, repeated injection, record
restoration, raw HTML, DOM, CSS, control state and row operations. Evidence is
stored in the external comparison workspace under
.form-comparison/results-<revision>/report-<server>.json.
Report metadata records source revisions. A total of 108 interaction checks includes all four comparison
modes; 30 belong to the current implementation.
Between the library tree and the verified tree, five TypeScript files changed only API comments and an unused type import; their executable JavaScript is identical. Generated PHP dependencies and the Go binary were removed from Git. The new image installs the same locked PHP dependency versions and builds the server binaries from source.
Retained comparison implementations have diagnostic failures. Their failures remain in the reports and cause the complete comparison runner to return a nonzero status. A passing current implementation does not make those retained implementations pass. Earlier reports do not verify the current dependency graph.
Deployment
CRUDUI 0.0.8 is public with 11 package archives.
Commit 47612fe4297203d46232646eba8365a6fbda43ef passed full CI and push checks.
The release workflow installed and checked all 11 archives outside the checkout before publication.
Both Go module tags identify the same commit.
The table records completed browser checks for all four servers.
Retained implementation failures remain in the reports.
TypeScript, Go, Rust and PHP API generation and the strict static web build passed. Two complete generations produced identical API documentation, native HTML assets and schema output. Eight generator failure tests passed, and the raw form inspector passed 18 cases.
PHP test scope verification
On 2026-10-26, PHP 8.4.26 source runs passed all 859 generator and 985 validator cases. Public runs against the built extension passed all 841 generator and 633 validator cases with the PHP library source-load guard enabled. Native expression and composition engine units passed 94 cases. Native PHPUnit XML listings preserve all original case IDs across the three mixed-class splits, and the scope unit verifies complete source and public selections. These owning results correct the earlier extension-wide test-scope limitation; they do not replace full candidate CI verification.
Scoped CI environments
Kit 0.0.63 installs each CI job's selected locked tools. Go and Rust jobs run their own validator and generator suites; JavaScript generator units run separately. Cross-language generator and validator comparisons prepare their own complete environments without waiting for language jobs. PHP extension jobs prepare arginfo explicitly, and CI Composer installation uses the lock without updates. Conformance consumes the isolated evidence; final CI requires all mandatory results.