ZDDC/zddc/internal/zddc
ZDDC bb5e059477 feat(zddc): dir_tool key — make the slash/no-slash routing convention configurable
The trailing-slash directory form was hardcoded to serve `browse`. Add a
`dir_tool` .zddc key (cascades leaf→root, floors at `browse`) so an
operator can point a subtree's slash form at another directory-oriented
tool — the symmetric counterpart to `default_tool` (the no-slash
"specialized app"). handler.ServeDirectory now resolves it via
zddc.DirToolAt; JSON listing requests are unaffected (raw listing
always served, so browse can still enumerate).

Also collapse the no-slash dispatch: the on-disk-directory and the
virtual-declared-path branches in main.go each carried their own copy
of "default_tool → tables-carveout-or-apps.Serve → 302", with
inconsistent ACL checks. Extract one chokepoint, serveSpecializedNoSlash,
that enforces ACL uniformly for every default_tool route.

Updates ARCHITECTURE.md and AGENTS.md: the stale "Special folders" /
hardcoded-availability sections now describe the .zddc-cascade model
(defaults.zddc.yaml, the schema-key table, the slash/no-slash
convention, WORM, standard roles).

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-12 11:46:55 -05:00
..
acl.go docs(zddc): tighten inherit/strict-mode docstrings + AllowedAtLevel deprecation 2026-05-07 11:10:31 -05:00
acl_test.go feat(zddc-server): delegated subtree admins + built-in .zddc editor 2026-04-29 12:52:06 -05:00
admin.go feat(zddc): standard roles (document_controller, project_team) + role union/reset 2026-05-12 10:17:46 -05:00
admin_test.go feat(zddc-server): user profile page replaces /.admin/ 2026-04-29 16:32:02 -05:00
cascade.go feat(zddc): Phase 2 — paths: walker, recursive cascade 2026-05-11 14:55:12 -05:00
cascade_mode.go feat(server): authenticated CRUD + verb-based RBAC with WORM archive folders 2026-05-05 15:58:04 -05:00
cascade_mode_test.go feat(server): authenticated CRUD + verb-based RBAC with WORM archive folders 2026-05-05 15:58:04 -05:00
cascade_test.go Initial commit 2026-04-27 11:05:47 -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): dir_tool key — make the slash/no-slash routing convention configurable 2026-05-12 11:46:55 -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
file.go feat(zddc): dir_tool key — make the slash/no-slash routing convention configurable 2026-05-12 11:46:55 -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): add ParseTransmittalFolder + IsTrnOrSubTracking helpers 2026-05-07 09:14:19 -05:00
folder_test.go feat(zddc): add ParseTransmittalFolder + IsTrnOrSubTracking helpers 2026-05-07 09:14:19 -05:00
inherit_test.go feat(zddc): inherit:false fence + strict-mode refusal 2026-05-07 10:59:20 -05:00
lookups.go feat(zddc): dir_tool key — make the slash/no-slash routing convention configurable 2026-05-12 11:46:55 -05:00
lookups_test.go feat(zddc): dir_tool key — make the slash/no-slash routing convention configurable 2026-05-12 11:46:55 -05:00
roles.go feat(zddc): standard roles (document_controller, project_team) + role union/reset 2026-05-12 10:17:46 -05:00
roles_test.go feat(zddc): standard roles (document_controller, project_team) + role union/reset 2026-05-12 10:17:46 -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 chore(zddc): migrate mkdir auto-own hook to the cascade, drop dead predicates 2026-05-12 10:42:49 -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 feat(zddc): incoming/ is a controlled drop zone — project_team read-only, doc controller QCs 2026-05-12 10:29:44 -05:00
validate.go refactor(zddc): worm: is a list of principals, not a {principal: verbs} map 2026-05-12 09:40:15 -05:00
validate_test.go feat(zddc-server): apps fetch+cache subsystem with cascade overrides 2026-05-01 15:25:25 -05:00
walker.go feat(zddc): dir_tool key — make the slash/no-slash routing convention configurable 2026-05-12 11:46:55 -05:00
walker_test.go feat(zddc): Phase 2 — paths: walker, recursive cascade 2026-05-11 14:55:12 -05:00
worm.go refactor(zddc): worm: is a list of principals, not a {principal: verbs} map 2026-05-12 09:40:15 -05:00
worm_test.go refactor(zddc): worm: is a list of principals, not a {principal: verbs} map 2026-05-12 09:40:15 -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 feat(zddc-server): delegated subtree admins + built-in .zddc editor 2026-04-29 12:52:06 -05:00