Schema: - default_tool: string (tool name served at this dir's no-slash URL) - auto_own: *bool (mkdir post-hook auto-grants the creator) - virtual: *bool (never materialise on disk; aggregator routes) defaults.zddc.yaml: populated with the full canonical convention via paths:. Top-level "*" matches any project; nested archive/working/ staging/reviewing declare the project-stage tools; archive's "*" / mdl|incoming|received|issued tree declares the per-party surfaces. All four party folders and all four project-root folders get their default_tool; working / staging / archive/<party>/incoming get auto_own; reviewing / archive/<party>/mdl get virtual. None of these need on-disk dirs to exist. Lookups (zddc/internal/zddc/lookups.go): DefaultToolAt(root, dir) → cascade-resolved default tool name AutoOwnAt(root, dir) → does mkdir auto-own here? VirtualAt(root, dir) → never materialise on disk? IsDeclaredPath(root, dir) → does the cascade say anything about this dir? ChildrenDeclaredAt(root, dir)→ literal child names declared by Paths Each looks up via EffectivePolicy → leaf level → Embedded fallback, so operators' on-disk overrides win and the embedded baseline carries the convention. Tests cover the embedded convention, operator overrides, and inherit:false blocking the embedded layer. No consumer migration yet — that's Phase 3b. Behaviour is bit-identical for current callers since none of them consult the new lookups. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> |
||
|---|---|---|
| .. | ||
| apps | ||
| archive | ||
| auth | ||
| cache | ||
| config | ||
| fs | ||
| handler | ||
| jsonschema | ||
| listing | ||
| policy | ||
| tlsutil | ||
| zddc | ||