ZDDC/zddc/internal/zddc
ZDDC 882d5e4c86 feat(zddc-server): server-stamped audit + history for record YAMLs
Adds cascade-driven schema + immutable audit history for the three table-style
record stores (mdl, rsk, ssr). Two new .zddc top-level keys carry the rules:

- field_codes: discriminated-union vocabulary (kind: enum|pattern|free) for
  the components used to compose tracking-number filenames and constrain
  record bodies. Map-merge across the cascade, mirror of apps: semantics.
- records: per-pattern rules (filename_format, field_defaults, locked,
  row_field, row_scope_fields). Filename-pattern scoping lets the SSR rule
  live at the party-folder level without bleeding onto mdl/rsk siblings.

PUTs to record YAML files route through a new WriteWithHistory orchestrator
(internal/handler/history.go) which:
- strips six client-supplied audit fields (created_at/by, updated_at/by,
  revision, previous_sha) so the client can't forge them
- validates body values against the cascade-resolved field_codes
- enforces filename_format composition (URL basename must match body fields)
- checks locked: defaults (422 mismatch)
- archives prior bytes to <dir>/.history/<base>/<RFC3339Nano>-<sha8>.<ext>
- stamps server-managed audit fields and writes the live file

History-before-live ordering preserves the prior version even on mid-write
crash. previous_sha forms a hash chain across revisions for tamper evidence.

The embedded defaults.zddc.yaml now declares records: entries for mdl, rsk,
and ssr.yaml. RSK rows carry the table-tracking components + row sequence
(filename = <table-tracking>-<row>); MDL rows compose to their own
tracking number; SSR records' identity is the party folder name.

GET <record>.yaml?history=1 returns a JSON list of prior revisions, ACL
gated identically to the live record. dot-segment rejection in
resolveTargetPath protects .history/ from direct client writes.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-19 09:48:58 -05:00
..
acl.go refactor(audit): pre-release cleanup pass 2026-05-18 16:28:07 -05:00
acl_test.go refactor(audit): pre-release cleanup pass 2026-05-18 16:28:07 -05:00
admin.go refactor(audit): pre-release cleanup pass 2026-05-18 16:28:07 -05:00
admin_test.go refactor(audit): pre-release cleanup pass 2026-05-18 16:28:07 -05:00
cascade.go feat(zddc-server): server-stamped audit + history for record YAMLs 2026-05-19 09:48:58 -05:00
cascade_test.go refactor(audit): pre-release cleanup pass 2026-05-18 16:28:07 -05:00
defaults.go feat(zddc): Phase 1 — embedded defaults.zddc + inherit + show-defaults 2026-05-11 14:46:51 -05:00
defaults.zddc.yaml feat(zddc-server): server-stamped audit + history for record YAMLs 2026-05-19 09:48:58 -05:00
defaults_test.go feat(zddc): Phase 1 — embedded defaults.zddc + inherit + show-defaults 2026-05-11 14:46:51 -05:00
ensure.go feat(zddc): Phase 3 completion — all canonical-folder behaviour now cascade-driven 2026-05-11 15:36:33 -05:00
ensure_test.go feat(zddc): standard roles (document_controller, project_team) + role union/reset 2026-05-12 10:17:46 -05:00
field_codes.go feat(zddc-server): server-stamped audit + history for record YAMLs 2026-05-19 09:48:58 -05:00
file.go feat(zddc-server): server-stamped audit + history for record YAMLs 2026-05-19 09:48:58 -05:00
file_test.go feat(zddc): inherit:false fence + strict-mode refusal 2026-05-07 10:59:20 -05:00
folder.go feat(zddc): MD→{docx,html,pdf} server-side conversion via stock pandoc + chromium containers 2026-05-13 10:33:56 -05:00
folder_test.go feat(zddc): add ParseTransmittalFolder + IsTrnOrSubTracking helpers 2026-05-07 09:14:19 -05:00
inherit_test.go refactor(audit): pre-release cleanup pass 2026-05-18 16:28:07 -05:00
lookups.go refactor(audit): pre-release cleanup pass 2026-05-18 16:28:07 -05:00
lookups_test.go feat: per-party RSK + project-level SSR/MDL/RSK rollup tables 2026-05-18 21:47:56 -05:00
roles.go refactor(audit): pre-release cleanup pass 2026-05-18 16:28:07 -05:00
roles_test.go refactor(audit): pre-release cleanup pass 2026-05-18 16:28:07 -05:00
scan.go feat: lockstep release infra + cascade/.archive fixes + profile perf + page redesign 2026-05-01 20:11:38 -05:00
scan_test.go feat: lockstep release infra + cascade/.archive fixes + profile perf + page redesign 2026-05-01 20:11:38 -05:00
special.go refactor(audit): pre-release cleanup pass 2026-05-18 16:28:07 -05:00
special_test.go chore(zddc): migrate mkdir auto-own hook to the cascade, drop dead predicates 2026-05-12 10:42:49 -05:00
standardroles_test.go refactor(audit): pre-release cleanup pass 2026-05-18 16:28:07 -05:00
validate.go refactor(audit): pre-release cleanup pass 2026-05-18 16:28:07 -05:00
validate_test.go refactor(audit): pre-release cleanup pass 2026-05-18 16:28:07 -05:00
virtualreceived.go feat: reviewing/ lifecycle — Plan Review endpoint, virtual received window, browse context-menu workflows 2026-05-15 16:08:04 -05:00
virtualviews.go feat(tables): rollup Add Row routes via the party column 2026-05-19 08:14:37 -05:00
virtualviews_test.go feat(zddc): ResolveVirtualView resolver for project-level table aggregations 2026-05-18 21:47:28 -05:00
walker.go feat(zddc-server): server-stamped audit + history for record YAMLs 2026-05-19 09:48:58 -05:00
walker_test.go feat(zddc): Phase 2 — paths: walker, recursive cascade 2026-05-11 14:55:12 -05:00
worm.go refactor(audit): pre-release cleanup pass 2026-05-18 16:28:07 -05:00
worm_test.go refactor(audit): pre-release cleanup pass 2026-05-18 16:28:07 -05:00
writer.go feat: form-data system v0 (sixth tool + zddc-server endpoints) 2026-05-02 20:12:16 -05:00
writer_test.go refactor(audit): pre-release cleanup pass 2026-05-18 16:28:07 -05:00