Commit Graph

1339 Commits

Author SHA1 Message Date
dff931c865 docs(18-03): record plan 03 progress in STATE and ROADMAP 2026-10-13 14:01:50 +02:00
9b193c1c4c docs(18-03): complete payment gateway admin screens plan 2026-10-13 14:01:16 +02:00
49fef6c35a docs(18-02): complete payment gateway domain core plan 2026-10-13 13:20:20 +02:00
Jakub Zych
a22bd8a934 docs(18-02): decision note for the go-hashids dependency
- github.com/speps/go-hashids/v2 v2.0.1 for sm-paymentgateway-plugin (24/24 PHP vectors)
- stripe-go v87.0.0 stays a D-12 decision for sm-pgstripe-plugin; shopspring/decimal indirect only, never money
2026-10-13 12:10:41 +02:00
Jakub Zych
3572030c74 docs(18-01): complete framework admin pieces plan 2026-10-13 11:49:55 +02:00
Jakub Zych
1e841b4281 feat(18-01): write-only settings secrets, richeditor and tabs on settings forms (task 3)
- type: password on a settings form binds a lagoon.Encrypted column as a
  write-only secret (any other column fails boot naming the field): the
  GET omits it from data and reports stored, env or empty per field in
  meta.secrets; on PUT an absent key or "" keeps the value, null clears
  it, a non-string is a 422; the answer never carries a value
- cabana.SecretFallbacks (field to config key) gives the env state;
  cabana.SettingsMeta, SecretStored/SecretEnv/SecretEmpty exported
- settings forms accept richeditor: the Put sanitizes through seaglass
  like a controller save and returns meta.notices; repeater and
  dependsOn stay refused (settingsFormOnly next to controllerFormOnly)
- backend::lang secret.* phrases in en and pl
- admin SPA: PasswordField secret status line (stored with Remove stored
  value, env, empty, pending clear with Undo), SettingsFormView tabs with
  error-tab activation and the secrets/notices meta, settings payload
  that never sends an untouched secret; regenerated OpenAPI and TS
  types; rebuilt dist
- vault fixture, TestSettingsSecretCompile, Docker TestSettingsSecretSmoke
  and TestSettingsRichEditorSmoke, conform settings fixture with a
  password field; settings.md sections, forms.md notes, cabana README
2026-10-13 11:36:12 +02:00
Jakub Zych
0c8605123e feat(18-01): money list column, danger record actions, preview Edit rule and table kit (task 2)
- columns.yaml type: money with currency or currencyFrom (exactly one),
  never searchable, not sortable by default; every list row carries the
  currencyFrom column's value under its own key; the schema serves
  currency and currencyFrom on the column
- pact.AdminRecordAction.Danger, served as danger on cabana.RecordAction
  (absent when false); RecordActions.vue passes it to the confirm dialog
- CellValue money kind through formatMoney with the row's code, the em
  dash when empty and the amount alone without a code; DataTable aligns
  money headers and cells to the right
- PreviewView renders Edit only when a registered value field allows
  update (F6)
- main.css .summer-table* and .summer-stat__note kit classes (F7) over
  --c-* variables; cabana README kit rows
- fixture record actions void (danger) and resend; TestMoneyListCompile,
  TestMoneyListSmoke and TestRecordActionDangerSmoke; regenerated OpenAPI
  and TS types; rebuilt dist; lists-and-filters and admin-controllers docs
2026-10-13 11:22:36 +02:00
Jakub Zych
20385e53ee feat(18-01): add the cabana money field (task 1)
- type: money on fields.yaml with currency or currencyFrom, scale (2..4,
  default 4) and max; boot fails naming the field on two sources, none,
  a bad scale or max, a column that is not a string or a Scanner/Valuer,
  or a currencyFrom that is not a string column
- a save answers 422 money.invalid, money.too_precise or money.too_large
  on the field and fills the accepted decimal string unchanged; the same
  check runs on controller, settings and relation child saves
- backend::lang money.* phrases in en and pl
- admin SPA: money.ts (parseMoneyInput, trimMoneyDisplay, formatMoney over
  Intl with the string itself), MoneyField.vue with the currency suffix,
  blur validation and the read-only box, preview through the control,
  the field scope on PreviewView; regenerated OpenAPI and TS types,
  rebuilt modules/boardwalk/dist
- acme.payments fixture with TestMoneyFieldCompile and the Docker
  TestMoneyFieldSmoke; forms.md Money section and cabana README
2026-10-13 11:15:05 +02:00
Jakub Zych
99ccae232c docs(18): create phase plan 2026-10-13 05:17:07 +02:00
Jakub Zych
79b1f85564 docs(phase-17): update security threat verification (T-17-15 closed, 0 open) 2026-10-13 01:23:04 +02:00
Jakub Zych
faa749f5a9 docs(quick-261013-0wa): close T-17-15 in the sitemap frontend_url rewrite v0.1.24 2026-10-13 01:03:05 +02:00
Jakub Zych
6e5a8e761f test(17): require the sitemap review-fix and T-17-15 tests by name 2026-10-13 01:00:17 +02:00
Jakub Zych
3a101cc6e1 docs(18): amend D-09 to scale-4 int64 money after plan-count checkpoint 2026-10-13 00:35:13 +02:00
Jakub Zych
7fa648dcaf docs(phase-17): add security threat verification (1 open: T-17-15) 2026-10-13 00:25:42 +02:00
c21d1135b0 docs(18): approve UI design contract and close probe gaps
Checker approved 6/7 PASS + spacing FLAG. Post-verification probe re-run raised 109 pairs; uncovered ones added, PgCart hides Remove on the last item.
2026-10-12 22:45:52 +02:00
8e55dc2837 docs(17): match fix report headings to the review titles 2026-10-12 21:50:05 +02:00
e990524732 docs(17): record code review disposition 2026-10-12 21:50:02 +02:00
1298bfd222 docs(17): record code review disposition 2026-10-12 21:49:51 +02:00
138631fe51 docs(17): add code review fix report 2026-10-12 21:49:38 +02:00
d9d6b267ec test(17): WR-07 keep the phase 17 gate's required singleton test name 2026-10-12 21:45:16 +02:00
27bb13b4cb build(17): rebuild admin dist with the reorder save queue and singleton list redirect (WR-02, WR-07) 2026-10-12 21:43:44 +02:00
9d7c21d800 fix(17): WR-07 open a singleton's record from its list route
A settings link to a singleton controller only worked on a plain left
click; a new tab landed on the list route, which answers 404, and every
non-singleton link paid an extra /singleton request. The settings index
now links like any controller link, and the list view opens the
controller's one record when its list answers 404 and the singleton
route answers an id.
2026-10-12 21:43:07 +02:00
fb10b06b21 docs(18): UI design contract 2026-10-12 21:35:51 +02:00
e1ac983f1c fix(17): WR-02 keep one reorder save in flight and ignore stale responses
A move made while a save runs is queued and sent after it settles, so
out-of-order completion can no longer leave the database on an older tree
than the screen. A failure that a waiting save supersedes keeps the later
moves, and a response tied to an earlier load or partition leaves the
current tree and its last saved state alone.
2026-10-12 21:32:56 +02:00
964f1a7f11 fix(17): CR-01 ignore an item URL pattern override that is not a path
signpost.Registry.Pattern now takes an item override only when it starts
with a single "/" and holds no surrounding whitespace or control
characters (signpost.ValidItemPattern); a javascript: URL or a
protocol-relative //host falls through to the next layer.
2026-10-12 21:25:30 +02:00
d3a7f798f0 docs(17): add code review report 2026-10-12 21:23:10 +02:00
ce088855ee docs(quick-261012-s3g): Phase 10 security blockers plan, summary and deferred fonoteka.go route allowlist 2026-10-12 21:07:05 +02:00
708b3ec581 docs(10): refresh security review evidence after the DOMPurify fix (T-10-16, T-10-24) 2026-10-12 21:05:09 +02:00
f269d886f1 build(quick-261012-s3g): rebuild admin dist with the DOMPurify display sanitizer 2026-10-12 20:41:50 +02:00
2343788624 fix(boardwalk): add form-action and frame-src to the admin CSP
- form-action 'self': injected markup cannot post a native form off-origin
- frame-src 'none': no framed content; a sandboxed srcdoc preview is not
  fetched and still renders
- header tests, README and admin-spa docs name the directives
2026-10-12 20:41:21 +02:00
71bd614a95 test(admin): import the reorder modules by path
- the reorder route renders ReorderView with a ReorderBranch per level
- ReorderBranch renders nodes from the REORDER_PAGE context and moves
  through it
2026-10-12 20:40:24 +02:00
fd46d475a2 fix(scripts): green check-phase10 hygiene after Phase 17 and run it from check-phase17 (T-10-24, T-10-25)
- line-exact, path-bound T-17-10 raw-HTML exceptions for the RichEditorField
  read-only display and the inert template parse in lossy.ts
- dist-origin allow-list adds the never-requested literals
  https://prosemirror.net and https://admin.invalid
- self-test plants: the display line in another file, a template parse
  elsewhere, a foreign origin in the dist JS
- --spa also runs the Vitest browser suite, fail-closed
- check-phase17: browser-suite required names in the admin stage, Phase 10
  hygiene in the docs stage, asserted by its self-test
2026-10-12 20:40:24 +02:00
c1d767f0f8 fix(admin): sanitize the richeditor read-only display with DOMPurify (T-10-16)
- displayHtml uses a dedicated DOMPurify 3.4.16 instance: EDITOR_TAGS, href
  only on <a> through isAllowedLink, DROPPED elements go with their content
- string in, string out: parsed into DOMPurify's inert document, nothing
  adopted into the live document before binding
- fails closed (empty string) unless isSupported and a fixed canary hold
- Vitest browser mode in Playwright Chromium (npm run test:browser) covers
  the clobbering vectors, off-origin form, iframe, meta refresh, links and
  the inert parse; happy-dom keeps engine-independent assertions
2026-10-12 20:35:57 +02:00
fba15c9378 docs(quick-261012-s3g): decision note naming DOMPurify and Vitest browser mode for the admin 2026-10-12 20:31:34 +02:00
b30317b2fb docs(phase-18): add validation strategy 2026-10-12 20:27:30 +02:00
3db1419f58 docs(phase-18): research the payment gateway port 2026-10-12 20:27:30 +02:00
2d1f494748 docs(phase-10): add security threat verification 2026-10-12 20:10:44 +02:00
16211fa9eb docs(phase-12.1): add security threat verification 2026-10-12 19:59:46 +02:00
073fd129f9 docs(17-06): advance state and roadmap after the unit tests and phase gate plan 2026-10-12 19:54:11 +02:00
3a0c4f72d7 docs(17-06): summary of the unit tests and phase gate plan 2026-10-12 19:53:26 +02:00
31adf71b82 docs(17-06): deferred items from the unit tests plan 2026-10-12 19:51:33 +02:00
2274cd6b9b docs(17-06): fill the phase 17 validation map from the gate run 2026-10-12 19:51:07 +02:00
ed67e41a70 test(17-06): gate requires every layer test by name 2026-10-12 19:50:13 +02:00
b4e2232da3 docs(phase-12): add security threat verification 2026-10-12 19:49:41 +02:00
40b89ad00d test(17-06): gate requires the plugin and host suites
The plugins stage runs the Docker-free Journal, sitemap, menu, FAQ and
host tests by name per package; the postgres stage adds TestMenuItemTypes,
TestImportWinter, TestMenuEntryBeforeSave, TestMenuAPI, TestMenuImport,
TestFaqAPI and TestFaqImport.
2026-10-12 19:44:54 +02:00
f622b686ae docs(phase-14.1): add security threat verification 2026-10-12 19:38:28 +02:00
6312929148 fix(17-06): singleton route retries a lost first-or-create race
Two first requests to GET .../singleton both missed the record; the
loser's insert hit the unique index and the route answered 500. A
unique violation from SingletonRecord now reruns the transaction once,
which finds the winner's record. TestSingleton fires six concurrent
first requests and requires 200 with the same id from each.
2026-10-12 19:31:01 +02:00
91593da1f7 test(17-06): framework and admin SPA unit tests for the blog companions
- signpost: activation refusals, host overrides, D-02 pattern layers
  incl. PatternFrom, ReferenceOptions depths
- seaglass: removal report, bluemonday bypass corpus, Check
- pact Option.Depth omitempty and the menu item type contracts; party
  activates menu item types after Register and before the first Boot
- cabana: repeater compile and decode, dependsOn compile and recheck,
  richeditor keys and notices, reorder and singleton boot checks
  (Docker-free); repeater save, dependent recheck, richeditor save,
  reorder and singleton routes on Postgres; conformance cases for the
  documented 404, 409 and 422 answers of the new routes
- admin: richeditor value contract, link popover, notices and chunk
  failure; repeater bounds, remove and reorder, collapsed rows;
  dependent dropdown states and last request wins; reorder
  announcements, partition switch and tree rules; SingletonForm spec
- gate: required names in the go, admin and postgres stages
2026-10-12 19:29:37 +02:00
490a4e3e6a test(17-06): phase 17 gate with one contract test per layer
- scripts/check-phase17.sh: stages go, plugins, admin, layers, docs and
  postgres across the framework, four plugin repositories, the host and
  both layers; go test -json, vitest JSON and TAP detectors, required
  layer test files, --self-test, --all with NOT RUN postgres and
  PHASE17_REQUIRE_POSTGRES
- TestRegistryDuplicateKey: a duplicate key fails Activate naming both
  plugin IDs, nothing is published
- TestSanitizeByteStable: clean editor HTML comes back byte for byte
2026-10-12 19:03:21 +02:00
374834b307 docs(17-05): link the site cache purge todo to g15office zugdxorb 2026-10-12 18:57:21 +02:00