docs: three-app site (browse hero) + classify; document TBD status
All checks were successful
Deploy content to live site / deploy (push) Successful in 2s

Reshape the landing page around three tools with Browse as the hero —
it needs nothing to run; .zddc files only add labels, per-folder tools,
permissions, and transmittal actions. Surface Classify (assign tracking
numbers, build transmittals) as its own tool; keep Archive as the
read-only access UI. Condense the zddc-server section and reword it as
an optional web-server app.

reference.html: list all three tools (Section 11) and document the TBD
status code (in shared/zddc.js, used for forecast/planned folders) in
the ABNF grammar and the status table.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
ZDDC 2026-06-11 11:39:30 -05:00
parent 617351f11d
commit 079763f5ae
2 changed files with 71 additions and 55 deletions

View file

@ -4,11 +4,11 @@
<meta charset="UTF-8"> <meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>ZDDC — Zero Day Document Control</title> <title>ZDDC — Zero Day Document Control</title>
<meta name="description" content="A file-naming convention and two single-file HTML tools — archive and browse — for managing project deliverables. Self-contained, offline-capable, dependency-free."> <meta name="description" content="A file-naming convention and a few single-file HTML tools — browse any folder, classify files into deliverables, search the archive — for managing project deliverables. Self-contained, offline-capable, dependency-free.">
<meta property="og:type" content="website"> <meta property="og:type" content="website">
<meta property="og:url" content="https://zddc.varasys.io/"> <meta property="og:url" content="https://zddc.varasys.io/">
<meta property="og:title" content="ZDDC — Zero Day Document Control"> <meta property="og:title" content="ZDDC — Zero Day Document Control">
<meta property="og:description" content="A file-naming convention and two single-file HTML tools — archive and browse — for managing project deliverables. Self-contained, offline-capable, dependency-free."> <meta property="og:description" content="A file-naming convention and a few single-file HTML tools — browse any folder, classify files into deliverables, search the archive — for managing project deliverables. Self-contained, offline-capable, dependency-free.">
<meta name="theme-color" content="#2a5a8a"> <meta name="theme-color" content="#2a5a8a">
<link rel="preconnect" href="https://fonts.googleapis.com"> <link rel="preconnect" href="https://fonts.googleapis.com">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin> <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
@ -30,6 +30,8 @@
code.inline { background: var(--color-bg-subtle); padding: 0.1rem 0.35rem; border-radius: 4px; font-size: 0.9em; } code.inline { background: var(--color-bg-subtle); padding: 0.1rem 0.35rem; border-radius: 4px; font-size: 0.9em; }
.feature-list { line-height: 1.8; padding-left: 1.5rem; color: var(--color-text); } .feature-list { line-height: 1.8; padding-left: 1.5rem; color: var(--color-text); }
.feature-list li { margin-bottom: 0.4rem; } .feature-list li { margin-bottom: 0.4rem; }
.tool-card--featured { border-color: var(--color-accent); box-shadow: 0 0 0 1px var(--color-accent) inset; }
.tool-card__tag { display: inline-block; font-size: 0.72em; font-weight: 700; letter-spacing: 0.04em; text-transform: uppercase; color: #fff; background: var(--color-accent); border-radius: 4px; padding: 0.1rem 0.45rem; margin-bottom: 0.5rem; }
</style> </style>
</head> </head>
<body> <body>
@ -57,14 +59,18 @@
</button> </button>
<div class="dropdown-menu"> <div class="dropdown-menu">
<div class="dropdown-menu__inner"> <div class="dropdown-menu__inner">
<a href="releases/archive.html">
<svg class="dropdown-menu-icon" viewBox="0 0 24 24"><path d="M20 6H4a2 2 0 00-2 2v10a2 2 0 002 2h16a2 2 0 002-2V8a2 2 0 00-2-2zm0 12H4V8h16v10zM4 2h16v2H4z"/></svg>
Archive Browser
</a>
<a href="releases/browse.html"> <a href="releases/browse.html">
<svg class="dropdown-menu-icon" viewBox="0 0 24 24"><path d="M10 4H4c-1.1 0-2 .9-2 2v12c0 1.1.9 2 2 2h16c1.1 0 2-.9 2-2V8c0-1.1-.9-2-2-2h-8l-2-2z"/></svg> <svg class="dropdown-menu-icon" viewBox="0 0 24 24"><path d="M10 4H4c-1.1 0-2 .9-2 2v12c0 1.1.9 2 2 2h16c1.1 0 2-.9 2-2V8c0-1.1-.9-2-2-2h-8l-2-2z"/></svg>
Browse Browse
</a> </a>
<a href="releases/classifier.html">
<svg class="dropdown-menu-icon" viewBox="0 0 24 24"><path d="M3 5h18v2H3V5zm0 6h18v2H3v-2zm0 6h12v2H3v-2z"/></svg>
Classify
</a>
<a href="releases/archive.html">
<svg class="dropdown-menu-icon" viewBox="0 0 24 24"><path d="M20 6H4a2 2 0 00-2 2v10a2 2 0 002 2h16a2 2 0 002-2V8a2 2 0 00-2-2zm0 12H4V8h16v10zM4 2h16v2H4z"/></svg>
Archive
</a>
</div> </div>
</div> </div>
</div> </div>
@ -78,7 +84,7 @@
<section class="hero"> <section class="hero">
<div class="container"> <div class="container">
<h1>Zero Day Document Control</h1> <h1>Zero Day Document Control</h1>
<p class="hero-subtitle">A file-naming convention and two single-file HTML tools — archive and browse — for managing project deliverables. Self-contained, offline-capable, dependency-free.</p> <p class="hero-subtitle">A file-naming convention plus a few single-file HTML tools for managing project deliverables. Start with <strong>Browse</strong> — open any folder, no setup. Self-contained, offline-capable, dependency-free.</p>
</div> </div>
</section> </section>
@ -87,7 +93,7 @@
<section style="margin-top: var(--spacing-xl);"> <section style="margin-top: var(--spacing-xl);">
<h2>What is it?</h2> <h2>What is it?</h2>
<p>ZDDC is a convention, not a platform. Every deliverable's filename encodes its tracking number, revision, status, and title; every transmittal folder is date-prefixed and self-describing. A plain shared folder becomes a fully searchable, auditable information-management system — no server, no database, no software required to read the archive.</p> <p>ZDDC is a convention, not a platform. Every deliverable's filename encodes its tracking number, revision, status, and title; every transmittal folder is date-prefixed and self-describing. A plain shared folder becomes a fully searchable, auditable information-management system — no server, no database, no software required to read the archive.</p>
<p>The two tools below are <em>optional</em> interfaces around this structure. Each is a single self-contained HTML file that works two ways: open it locally and point it at a folder on your disk, or put it behind any web server (including the optional <code class="inline">zddc-server</code> described below) and use it over the network. Same on-disk layout either way.</p> <p>The tools below are <em>optional</em> interfaces around this structure, and each needs nothing to run. Every one is a single self-contained HTML file: open it and point it at a folder on your disk, or put it behind any web server (including the optional <code class="inline">zddc-server</code> described below) and use it over the network. Same on-disk layout either way. The extra niceties — friendly labels, per-folder tools, permissions — come from optional <code class="inline">.zddc</code> files you can add later, or never.</p>
<p style="margin-top: var(--spacing-md);"><a href="reference.html">Read the full specification →</a></p> <p style="margin-top: var(--spacing-md);"><a href="reference.html">Read the full specification →</a></p>
</section> </section>
@ -97,16 +103,23 @@
<div style="display: grid; grid-template-columns: repeat(auto-fit, minmax(300px, 1fr)); gap: var(--spacing-lg); margin-top: var(--spacing-lg);"> <div style="display: grid; grid-template-columns: repeat(auto-fit, minmax(300px, 1fr)); gap: var(--spacing-lg); margin-top: var(--spacing-lg);">
<a href="releases/archive.html" class="tool-card" style="text-decoration: none; display: block;"> <a href="releases/browse.html" class="tool-card tool-card--featured" style="text-decoration: none; display: block;">
<div class="tool-card__title">Archive Browser</div> <span class="tool-card__tag">Start here</span>
<div class="tool-card__desc">Search the formal record. Filter by tracking number, discipline, revision, status, or free text; group rows by transmittal to see each deliverable's lifecycle; export the current selection as a ZIP. Read-only — the archive is preserved as-issued.</div> <div class="tool-card__title">Browse</div>
<div class="tool-card__link">Open Archive Browser →</div> <div class="tool-card__desc">Open any folder on your disk — that's the whole setup. A file-tree navigator with live preview for the things you actually have: PDFs, Office docs, images, markdown. Edit markdown in place and download it as DOCX, HTML, or PDF on demand. Add optional <code class="inline">.zddc</code> files and the same tool gains friendly folder labels, per-folder tools, permissions, and transmittal actions — leave them out and it's still a complete browser.</div>
<div class="tool-card__link">Open Browse →</div>
</a> </a>
<a href="releases/browse.html" class="tool-card" style="text-decoration: none; display: block;"> <a href="releases/classifier.html" class="tool-card" style="text-decoration: none; display: block;">
<div class="tool-card__title">Browse</div> <div class="tool-card__title">Classify</div>
<div class="tool-card__desc">File-tree navigator for the whole project. Edit markdown in place with live preview, YAML front matter, and a table of contents pane; download any markdown source as DOCX, HTML, or PDF on demand; classify inbound files to ZDDC names, draft transmittals, and manage the project tree end-to-end.</div> <div class="tool-card__desc">Turn a pile of incoming files into properly named ZDDC deliverables. Drop files onto a tree to assign each one a tracking number, revision, and status, then organize them into dated transmittal folders ready to issue. Spreadsheet-style editing; writes the renamed, sorted copies straight back to disk. No server needed.</div>
<div class="tool-card__link">Open Browse →</div> <div class="tool-card__link">Open Classify →</div>
</a>
<a href="releases/archive.html" class="tool-card" style="text-decoration: none; display: block;">
<div class="tool-card__title">Archive</div>
<div class="tool-card__desc">The read-only window into the formal record. Filter by tracking number, discipline, revision, status, or free text; group rows by transmittal to see each deliverable's lifecycle; export the current selection as a ZIP. The archive is preserved exactly as-issued.</div>
<div class="tool-card__link">Open Archive →</div>
</a> </a>
</div> </div>
@ -127,36 +140,21 @@
</div> </div>
<div class="mode-card"> <div class="mode-card">
<h3>Online mode</h3> <h3>Online mode</h3>
<p>Take the same local directory and put it behind any web server (nginx, Caddy, Apache, or <code class="inline">zddc-server</code>). The Archive Browser tool talks to the server's directory listings instead of the local filesystem — read-only, works in any browser.</p> <p>Take the same local directory and put it behind any web server (nginx, Caddy, Apache, or <code class="inline">zddc-server</code>). The Archive tool talks to the server's directory listings instead of the local filesystem — read-only, works in any browser.</p>
</div> </div>
</div> </div>
<p style="margin-top: var(--spacing-md);"><strong><code class="inline">zddc-server</code></strong> is a small Go binary purpose-built to serve ZDDC archives. <em>Any</em> web server gives you online mode; <code class="inline">zddc-server</code> adds things a generic web server can't:</p> <p style="margin-top: var(--spacing-md);"><strong><code class="inline">zddc-server</code></strong> is an optional web-server app, purpose-built to serve a ZDDC archive over the network. <em>Any</em> web server gives you read-only online mode; <code class="inline">zddc-server</code> adds the things a generic one can't:</p>
<ul class="feature-list"> <ul class="feature-list">
<li><strong>Lazy folder creation, case-fold matching.</strong> Drop a <code class="inline">.zddc</code> file into an empty directory and the canonical project layout (<code class="inline">archive/&lt;party&gt;/{mdl,rsk,incoming,received,issued,working,staging,reviewing}/</code>) materialises on the first write into each path — never on bare reads. <code class="inline">archive/</code> is the only physical project-root child; <code class="inline">ssr</code>, <code class="inline">mdl</code>, <code class="inline">rsk</code>, <code class="inline">working</code>, <code class="inline">staging</code>, <code class="inline">reviewing</code> sit beside it as virtual aggregators that synthesise listings across parties. Folder names are matched case-insensitively, so an existing <code class="inline">Working/</code> is reused rather than shadowed by a new <code class="inline">working/</code> sibling. Each authenticated viewer sees a virtual <code class="inline">archive/&lt;party&gt;/working/&lt;your-email&gt;/</code> entry; first write makes it real.</li> <li><strong>Access control, no database.</strong> Drop optional <code class="inline">.zddc</code> files along the tree to say who can read, write, create, or delete each folder — by email, wildcard, or named role. Write-once (WORM) archive folders keep the issued record immutable. <a href="https://codeberg.org/VARASYS/ZDDC/src/branch/main/zddc/README.md#access-control-the-zddc-cascade">How the cascade works →</a></li>
<li><strong>Virtual <code class="inline">.archive</code> URL space.</strong> <code class="inline">GET /Project/.archive/123-XYZ.html</code> resolves to the canonical revision file at request time. Computed from filenames; no cache, no separate index file.</li> <li><strong>Less to set up.</strong> The canonical project layout appears on first use, the tools are baked in and served at the right paths automatically, and a virtual <code class="inline">.archive</code> URL always resolves to the current revision of any document.</li>
<li><strong>Access control via <code class="inline">.zddc</code> files.</strong> Behind a reverse proxy that authenticates users and sets an <code class="inline">X-Auth-Request-Email</code> request header, <code class="inline">zddc-server</code> consults YAML <code class="inline">.zddc</code> files at every directory along the path. The cascade walks root→leaf; the closest match wins. Five verbs (<code class="inline">r</code> read, <code class="inline">w</code> overwrite, <code class="inline">c</code> create, <code class="inline">d</code> delete, <code class="inline">a</code> admin / edit ACL) gate every operation. An empty grant (e.g. <code class="inline">"*@vendor.com": ""</code>) is an explicit deny. A subtree that wants to start fresh — vendor folder, regulated workspace — can declare <code class="inline">inherit: false</code> to fence off ancestor grants and roles, then list the principals it does want. Common shapes (paired open/closed projects, third-party-restricted vendor folders) are documented with worked examples in the <a href="https://codeberg.org/VARASYS/ZDDC/src/branch/main/zddc/README.md#access-control-the-zddc-cascade">access-control reference</a>. No database, no admin UI.</li> <li><strong>Built for regulated environments.</strong> Hardened TLS, per-request audit logging, and a pluggable policy engine (swap in <a href="https://www.openpolicyagent.org/" rel="noopener">Open Policy Agent</a> with your own Rego). See the <a href="federal.html">federal compliance page</a> for the supported deployment shape.</li>
<li><strong>Roles for human-readable grants.</strong> A <code class="inline">.zddc</code> may declare named roles whose members are email patterns; permissions then reference the role name instead of pasting the same wildcard everywhere:
<pre style="margin: 0.4rem 0;"><code>roles:
qc-reviewers:
members: ["*@quality.org", "alice@example.com"]
acl:
permissions:
qc-reviewers: rwd
"*@example.com": r</code></pre>
Role definitions cascade like everything else; a child <code class="inline">.zddc</code> redefining the same role name shadows the ancestor for that subtree.</li>
<li><strong>WORM archive folders.</strong> Anything under <code class="inline">archive/&lt;party&gt;/issued/</code> or <code class="inline">archive/&lt;party&gt;/received/</code> enforces write-once via a verb mask: ancestor grants are reduced to <code class="inline">r</code> only, while a <code class="inline">.zddc</code> placed at the WORM folder itself can still grant <code class="inline">rc</code> (create-but-not-overwrite) to specific principals — that's how a doc controller drops a fresh transmittal into the immutable record. Root admins (the <code class="inline">admins:</code> list in the root <code class="inline">.zddc</code>) bypass the mask as the deliberate escape hatch for mis-filed documents.</li>
<li><strong>Cascade tracer for operators.</strong> Admins can hit <code class="inline">/.profile/effective-policy?path=&lt;url&gt;</code> to see the resolved ACL chain at any path — every level's grants, the role evaluation, the final verb-set. Useful when a permission isn't behaving the way the operator expected.</li>
<li><strong>Per-request access logging</strong> keyed to the authenticated user; conservative HTTP timeouts; optional file-tee for offline audit (production deployments typically leave logs on stdout for the orchestrator's pipeline to handle).</li>
<li><strong>TLS, ETags, conditional GET, CORS, autoindex.</strong> The mundane glue.</li>
<li><strong>OPA-compatible policy decider.</strong> Federal and other regulated customers can swap the built-in evaluator for an external <a href="https://www.openpolicyagent.org/" rel="noopener">Open Policy Agent</a> server with their own audited Rego policies — set <code class="inline">ZDDC_OPA_URL</code> and the server POSTs the request's user, path, action, and the full <code class="inline">.zddc</code> cascade chain to <code class="inline">/v1/data/zddc/access/allow</code>. Decisions are cached per (user, path, action) with a configurable TTL (<code class="inline">ZDDC_OPA_CACHE_TTL</code>); failures fail closed by default (<code class="inline">ZDDC_OPA_FAIL_OPEN=1</code> flips it). The bundled NIST AC-6 strict-cascade preset is dumpable via <code class="inline">--print-rego=federal</code>. Default mode adds zero new dependencies; external mode is a configuration flip.</li>
<li><strong>Designed for regulated environments.</strong> Hardened TLS (NIST SP 800-52 Rev. 2 cipher allowlist + HSTS), pluggable policy engine, federal-mode strict-least-privilege Rego shipping out of the box, structured audit logging, documented vulnerability-disclosure process. Specific federal-track work (FIPS-validated build, signed-token proxy↔server channel, code-signed tool fetches) is on a clear roadmap — see the <a href="federal.html">federal compliance page</a> for the supported deployment shape and what an integrator adds during ATO.</li>
</ul> </ul>
<p style="margin-top: var(--spacing-md);">The on-disk layout is the same in both modes. Stop the server and the directory is still a perfectly valid ZDDC archive that opens in local-directory mode. <strong>The server is convenience, not lock-in.</strong></p> <p style="margin-top: var(--spacing-md);">The on-disk layout is the same in both modes. Stop the server and the directory is still a perfectly valid ZDDC archive that opens in local-directory mode. <strong>The server is convenience, not lock-in.</strong></p>
<p style="margin-top: var(--spacing-md);">Source, environment-variable contract, and ACL syntax: <a href="https://codeberg.org/VARASYS/ZDDC/src/branch/main/zddc">codeberg.org/VARASYS/ZDDC <code class="inline">zddc/</code></a>. Pre-built binaries are published as Codeberg release assets; example Helm charts (production + dev) live under <code class="inline">helm/</code> in the repo and compile from source at deploy time.</p> <p style="margin-top: var(--spacing-md);">Source, configuration, and the full ACL reference: <a href="https://codeberg.org/VARASYS/ZDDC/src/branch/main/zddc">codeberg.org/VARASYS/ZDDC <code class="inline">zddc/</code></a>.</p>
</section> </section>
<section style="margin-top: var(--spacing-2xl);"> <section style="margin-top: var(--spacing-2xl);">
@ -166,10 +164,11 @@ Role definitions cascade like everything else; a child <code class="inline">.zdd
<div class="install-grid"> <div class="install-grid">
<div class="install-card"> <div class="install-card">
<h3>Server: just run zddc-server</h3> <h3>Server: just run zddc-server</h3>
<p class="when">The binary has the current-stable build of both tools baked in at compile time. They appear automatically at the right paths in the served tree:</p> <p class="when">The app has the current-stable build of the tools baked in. They appear automatically at the right paths in the served tree:</p>
<ul class="install-points"> <ul class="install-points">
<li><strong>archive.html</strong> at every <code class="inline">archive/</code> path — the read-only search-and-export view of the formal record</li>
<li><strong>browse.html</strong> at every directory (the slash form of any path) — the file-tree navigator, in-place markdown editor, and inbound-file handling surface</li> <li><strong>browse.html</strong> at every directory (the slash form of any path) — the file-tree navigator, in-place markdown editor, and inbound-file handling surface</li>
<li><strong>archive.html</strong> at every <code class="inline">archive/</code> path — the read-only search-and-export view of the formal record</li>
<li><strong>classifier.html</strong> wherever a folder opts into it — assign tracking numbers and build transmittals</li>
<li><strong>index.html</strong> (the project picker) at the deployment root</li> <li><strong>index.html</strong> (the project picker) at the deployment root</li>
</ul> </ul>
<p class="when" style="margin-top: 0.6rem;">Which tool serves at a given URL is decided by the <code class="inline">.zddc</code> cascade — the embedded defaults map <code class="inline">archive/</code> subtrees to the archive tool and everything else to browse, but operators can override per folder via <code class="inline">default_tool:</code>. Folder names are case-insensitive — <code class="inline">Working/</code>, <code class="inline">working/</code>, and <code class="inline">WORKING/</code> all match the same rule.</p> <p class="when" style="margin-top: 0.6rem;">Which tool serves at a given URL is decided by the <code class="inline">.zddc</code> cascade — the embedded defaults map <code class="inline">archive/</code> subtrees to the archive tool and everything else to browse, but operators can override per folder via <code class="inline">default_tool:</code>. Folder names are case-insensitive — <code class="inline">Working/</code>, <code class="inline">working/</code>, and <code class="inline">WORKING/</code> all match the same rule.</p>
@ -187,8 +186,9 @@ apps:
<h3>Local: just download the .html file</h3> <h3>Local: just download the .html file</h3>
<p class="when">No server, no install — open in any modern browser.</p> <p class="when">No server, no install — open in any modern browser.</p>
<ul class="install-points"> <ul class="install-points">
<li><a href="releases/archive.html">archive.html</a></li>
<li><a href="releases/browse.html">browse.html</a></li> <li><a href="releases/browse.html">browse.html</a></li>
<li><a href="releases/classifier.html">classifier.html</a></li>
<li><a href="releases/archive.html">archive.html</a></li>
</ul> </ul>
<p class="when" style="margin-top: 0.6rem;">Right-click → Save As. Each tool is a self-contained HTML file with everything inlined; works from <code class="inline">file://</code> or any static host.</p> <p class="when" style="margin-top: 0.6rem;">Right-click → Save As. Each tool is a self-contained HTML file with everything inlined; works from <code class="inline">file://</code> or any static host.</p>
</div> </div>

View file

@ -40,14 +40,18 @@
</button> </button>
<div class="dropdown-menu"> <div class="dropdown-menu">
<div class="dropdown-menu__inner"> <div class="dropdown-menu__inner">
<a href="releases/archive.html">
<svg class="dropdown-menu-icon" viewBox="0 0 24 24"><path d="M20 6H4a2 2 0 00-2 2v10a2 2 0 002 2h16a2 2 0 002-2V8a2 2 0 00-2-2zm0 12H4V8h16v10zM4 2h16v2H4z"/></svg>
Archive Browser
</a>
<a href="releases/browse.html"> <a href="releases/browse.html">
<svg class="dropdown-menu-icon" viewBox="0 0 24 24"><path d="M10 4H4c-1.1 0-2 .9-2 2v12c0 1.1.9 2 2 2h16c1.1 0 2-.9 2-2V8c0-1.1-.9-2-2-2h-8l-2-2z"/></svg> <svg class="dropdown-menu-icon" viewBox="0 0 24 24"><path d="M10 4H4c-1.1 0-2 .9-2 2v12c0 1.1.9 2 2 2h16c1.1 0 2-.9 2-2V8c0-1.1-.9-2-2-2h-8l-2-2z"/></svg>
Browse Browse
</a> </a>
<a href="releases/classifier.html">
<svg class="dropdown-menu-icon" viewBox="0 0 24 24"><path d="M3 5h18v2H3V5zm0 6h18v2H3v-2zm0 6h12v2H3v-2z"/></svg>
Classify
</a>
<a href="releases/archive.html">
<svg class="dropdown-menu-icon" viewBox="0 0 24 24"><path d="M20 6H4a2 2 0 00-2 2v10a2 2 0 002 2h16a2 2 0 002-2V8a2 2 0 00-2-2zm0 12H4V8h16v10zM4 2h16v2H4z"/></svg>
Archive
</a>
</div> </div>
</div> </div>
</div> </div>
@ -97,7 +101,7 @@
</ul> </ul>
<p>Together, these two rules mean a plain folder on any shared drive becomes a fully searchable, auditable information management system. No server, no database, no software required to read the archive.</p> <p>Together, these two rules mean a plain folder on any shared drive becomes a fully searchable, auditable information management system. No server, no database, no software required to read the archive.</p>
<p>Because every deliverable is self-describing — its identity, revision, and status encoded in the filename itself — the convention works across organisational boundaries without requiring a shared platform. A project adopting ZDDC can extend the same convention to its clients, subcontractors, vendors, and any other party in the project ecosystem. Each party maintains their own archive; the shared naming convention makes every archive mutually intelligible. Adoption can be voluntary or contractually required. The result is a globally scalable, distributed information management system built on nothing more than agreed file naming and standard directory structures.</p> <p>Because every deliverable is self-describing — its identity, revision, and status encoded in the filename itself — the convention works across organisational boundaries without requiring a shared platform. A project adopting ZDDC can extend the same convention to its clients, subcontractors, vendors, and any other party in the project ecosystem. Each party maintains their own archive; the shared naming convention makes every archive mutually intelligible. Adoption can be voluntary or contractually required. The result is a globally scalable, distributed information management system built on nothing more than agreed file naming and standard directory structures.</p>
<p>The two tools below implement interfaces around this structure — but they're optional. The structure works without them, and any party can participate using only their file browser.</p> <p>The tools below implement interfaces around this structure — but they're optional. The structure works without them, and any party can participate using only their file browser.</p>
<div class="highlight-box" style="margin-top: var(--spacing-lg);"> <div class="highlight-box" style="margin-top: var(--spacing-lg);">
<p><strong>Convention harmonization.</strong> The convention is designed to be applied at multiple organisational scopes simultaneously — corporate, client, project, department — and the code registries at each scope should be harmonized so they do not conflict. A corporate discipline code such as <code>HR</code> (Human Resources) does not exist at the project level, so there is no clash. But a code that means one thing corporately and something different on a project would create ambiguity in a unified archive. The ideal is that conventions flow down: corporate establishes the master code registry, projects inherit it and extend it only where gaps exist, and no code is reused with a different meaning at a lower scope.</p> <p><strong>Convention harmonization.</strong> The convention is designed to be applied at multiple organisational scopes simultaneously — corporate, client, project, department — and the code registries at each scope should be harmonized so they do not conflict. A corporate discipline code such as <code>HR</code> (Human Resources) does not exist at the project level, so there is no clash. But a code that means one thing corporately and something different on a project would create ambiguity in a unified archive. The ideal is that conventions flow down: corporate establishes the master code registry, projects inherit it and extend it only where gaps exist, and no code is reused with a different meaning at a lower scope.</p>
</div> </div>
@ -123,9 +127,10 @@ modifier = modLetter 1*%x30-39 ; e.g. C1, N2, Q1, B1
modLetter = "C" / "N" / "Q" / "B" modLetter = "C" / "N" / "Q" / "B"
status = "IFA" / "IFB" / "IFC" / "IFD" / "IFI" / "IFP" / "IFR" / "IFU" / "REC" status = "IFA" / "IFB" / "IFC" / "IFD" / "IFI" / "IFP" / "IFR" / "IFU" / "REC"
/ "RSA" / "RSB" / "RSC" / "RSD" / "RSI" / "RSA" / "RSB" / "RSC" / "RSD" / "RSI"
/ "---" / "TBD" / "---"
; Constraint: RSA / RSB / RSC / RSD / RSI (review status codes) are only valid ; Constraint: RSA / RSB / RSC / RSD / RSI (review status codes) are only valid
; when modifier is present (i.e. on +C and +Q files). ; when modifier is present (i.e. on +C and +Q files).
; "TBD" marks a planned deliverable whose issue status is not yet decided.
; "---" indicates no status assigned; used on working drafts. ; "---" indicates no status assigned; used on working drafts.
</div> </div>
<p>Rules:</p> <p>Rules:</p>
@ -860,6 +865,11 @@ ACME-123456-PM-LST-0001_2506-02 (IFI) - Critical Milestones List.pdf</div>
<td>Issued For Record</td> <td>Issued For Record</td>
<td>Final as-built or archived version</td> <td>Final as-built or archived version</td>
</tr> </tr>
<tr>
<td><span class="status-badge">TBD</span></td>
<td>To Be Determined</td>
<td>Planned or forecast deliverable — issue status not yet decided. Used as a placeholder when a transmittal folder is set up ahead of the document; assign a real status before issuing.</td>
</tr>
<tr> <tr>
<td><span class="status-badge">---</span></td> <td><span class="status-badge">---</span></td>
<td>No status</td> <td>No status</td>
@ -1270,23 +1280,29 @@ request until you populate it..."</div>
<!-- Section 11: Tools --> <!-- Section 11: Tools -->
<section id="tools"> <section id="tools">
<h2>11. Tools</h2> <h2>11. Tools</h2>
<p>Two single-file HTML applications — each is complete and self-contained. Save them locally and they work forever, without internet, without updates, without a subscription. Together they cover the full ZDDC workflow: <strong>archive</strong> for searching and exporting the formal record; <strong>browse</strong> for navigating, editing, and managing the project tree.</p> <p>Single-file HTML applications — each is complete and self-contained. Save one locally and it works forever, without internet, without updates, without a subscription. None of them require any configuration to run; <code>.zddc</code> files and <code>zddc-server</code> only add to them. Together they cover the full ZDDC workflow: <strong>browse</strong> to look at anything; <strong>classify</strong> to name incoming files and build transmittals; <strong>archive</strong> to search and export the formal record.</p>
<div style="display: grid; grid-template-columns: repeat(auto-fit, minmax(280px, 1fr)); gap: var(--spacing-lg); margin-top: var(--spacing-lg);"> <div style="display: grid; grid-template-columns: repeat(auto-fit, minmax(280px, 1fr)); gap: var(--spacing-lg); margin-top: var(--spacing-lg);">
<a href="releases/archive.html" class="tool-card" style="text-decoration: none; display: block;">
<div class="tool-card__title">Archive Browser</div>
<div class="tool-card__desc">Search and filter the formal record. Filter by tracking number, discipline, revision, status, or free text. Group rows by transmittal to see the lifecycle of any deliverable. Download the current selection as a ZIP. Read-only — the archive is preserved as-issued.</div>
<div class="tool-card__link">Open Archive Browser</div>
</a>
<a href="releases/browse.html" class="tool-card" style="text-decoration: none; display: block;"> <a href="releases/browse.html" class="tool-card" style="text-decoration: none; display: block;">
<div class="tool-card__title">Browse</div> <div class="tool-card__title">Browse</div>
<div class="tool-card__desc">File-tree navigator for the project. Edit markdown in place (live preview, YAML front matter pane, table of contents). Download any markdown source as DOCX, HTML, or PDF on demand. Drop in files, classify them to ZDDC names, draft transmittals, and prepare deliverables — every workflow happens here.</div> <div class="tool-card__desc">Open any folder on your disk — no setup. A file-tree navigator with live preview, plus in-place markdown editing (YAML front matter pane, table of contents) and export to DOCX, HTML, or PDF. Optional <code>.zddc</code> files add friendly labels, per-folder tools, permissions, and transmittal actions; without them it is still a complete browser.</div>
<div class="tool-card__link">Open Browse</div> <div class="tool-card__link">Open Browse</div>
</a> </a>
<a href="releases/classifier.html" class="tool-card" style="text-decoration: none; display: block;">
<div class="tool-card__title">Classify</div>
<div class="tool-card__desc">Turn incoming files into properly named ZDDC deliverables. Drop files onto a tree to assign each a tracking number, revision, and status, then organize them into dated transmittal folders ready to issue. Spreadsheet-style editing; writes renamed, sorted copies back to disk. No server required.</div>
<div class="tool-card__link">Open Classify</div>
</a>
<a href="releases/archive.html" class="tool-card" style="text-decoration: none; display: block;">
<div class="tool-card__title">Archive</div>
<div class="tool-card__desc">The read-only window into the formal record. Filter by tracking number, discipline, revision, status, or free text. Group rows by transmittal to see the lifecycle of any deliverable. Download the current selection as a ZIP. The archive is preserved as-issued.</div>
<div class="tool-card__link">Open Archive</div>
</a>
</div> </div>
<p style="margin-top: var(--spacing-xl); color: var(--color-text-muted);">Local directory access relies on the <a href="https://www.chromium.org/Home/">Chromium</a>-based browser File System Access API. It does not work in Firefox or Safari. Run both tools through <code>zddc-server</code> for any browser, network access, and ACL enforcement.</p> <p style="margin-top: var(--spacing-xl); color: var(--color-text-muted);">Local directory access relies on the <a href="https://www.chromium.org/Home/">Chromium</a>-based browser File System Access API. It does not work in Firefox or Safari. Run the tools through <code>zddc-server</code> for any browser, network access, and ACL enforcement.</p>
</section> </section>
</main> </main>
</div> </div>