Add a planning roadmap and a staged implementation plan for the workspace configuration
This commit is contained in:
233
docs/roadmap/workspace.md
Normal file
233
docs/roadmap/workspace.md
Normal file
@@ -0,0 +1,233 @@
|
||||
# Workspace Roadmap
|
||||
|
||||
Notarius should gain a single configurable workspace root for application-owned
|
||||
local state. The workspace exists only to support enabled workspace features;
|
||||
ordinary runs should not write workspace files by default.
|
||||
|
||||
The workspace is distinct from durable output:
|
||||
|
||||
- durable output is the user-requested final product of a run;
|
||||
- the workspace is application-owned local state for diagnostics, resumable
|
||||
checkpoints, and development/debug workflows.
|
||||
|
||||
Within the workspace, diagnostics, checkpoints, and debug artifacts should use
|
||||
separate subdirectories because they have different identity and lifecycle
|
||||
models.
|
||||
|
||||
## Target Configuration
|
||||
|
||||
Workspace behavior should be configured under a dedicated top-level object:
|
||||
|
||||
```yaml
|
||||
workspace:
|
||||
directory: /var/lib/notarius
|
||||
diagnostics:
|
||||
enabled: true
|
||||
retention: auto
|
||||
resume:
|
||||
enabled: false
|
||||
debug:
|
||||
enabled: false
|
||||
```
|
||||
|
||||
Policy:
|
||||
|
||||
- `workspace.diagnostics.enabled` defaults to the current diagnostics behavior
|
||||
during migration.
|
||||
- `workspace.resume.enabled` defaults to `false`.
|
||||
- `workspace.debug.enabled` defaults to `false`.
|
||||
- no checkpoint or debug files are written when those features are disabled.
|
||||
- `/var/lib/notarius` should be the standard production recommendation in docs
|
||||
and examples.
|
||||
- local development docs may recommend a project-local path such as
|
||||
`./.notarius/workspace`.
|
||||
|
||||
`workspace.directory` should become the single configured root for Notarius local
|
||||
state. Existing `diagnostics.work_dir` behavior should be migrated carefully for
|
||||
backward compatibility, but the long-term configuration model should avoid two
|
||||
separate roots for application-owned local state.
|
||||
|
||||
## Workspace Layout
|
||||
|
||||
The workspace root should contain separate subtrees:
|
||||
|
||||
```text
|
||||
<workspace.directory>/
|
||||
diagnostics/
|
||||
checkpoints/
|
||||
debug/
|
||||
```
|
||||
|
||||
Diagnostics remain run-id based. They are invocation history and should preserve
|
||||
the existing diagnostics retention model:
|
||||
|
||||
```text
|
||||
<workspace.directory>/
|
||||
diagnostics/
|
||||
<run-id>/
|
||||
invocation.json
|
||||
effective-config.json
|
||||
resolved-pipeline.json
|
||||
resolved-references.json
|
||||
run-manifest.json
|
||||
warnings.json
|
||||
run-report.json
|
||||
error.log
|
||||
```
|
||||
|
||||
Checkpoints should be deterministic and should include enough identity material
|
||||
to prevent unsafe reuse across incompatible runs:
|
||||
|
||||
```text
|
||||
<workspace.directory>/
|
||||
checkpoints/
|
||||
<pipeline-id>/
|
||||
<input-key>-<source-digest-prefix>/
|
||||
<pipeline-digest-prefix>/
|
||||
source/
|
||||
chunk/
|
||||
extract/<lane-id>/
|
||||
merge/<lane-id>/
|
||||
normalize/<lane-id>/
|
||||
```
|
||||
|
||||
Checkpoint identity should account for:
|
||||
|
||||
- resolved pipeline ID;
|
||||
- resolved pipeline digest;
|
||||
- input adapter key;
|
||||
- source/input digest;
|
||||
- selected lanes and runtime overrides that affect execution;
|
||||
- reference digests;
|
||||
- prompt, schema, and profile provenance when not already captured by the
|
||||
resolved pipeline digest.
|
||||
|
||||
Debug output should be run-id based like diagnostics, because debug traces are
|
||||
development artifacts from a specific invocation rather than resumable state:
|
||||
|
||||
```text
|
||||
<workspace.directory>/
|
||||
debug/
|
||||
<run-id>/
|
||||
```
|
||||
|
||||
Human-readable path segments are useful, but content hashes should be
|
||||
authoritative for correctness. The exact path shape may change during
|
||||
implementation, but checkpoint identity must be stable, deterministic, and safe
|
||||
to compare across runs. Diagnostics and debug output do not need deterministic
|
||||
resume identity because they are per-invocation artifacts.
|
||||
|
||||
## Stage Ownership
|
||||
|
||||
Stage manifests should be stage-owned. There should not be a root-level manifest
|
||||
that summarizes all stages.
|
||||
|
||||
Rationale:
|
||||
|
||||
- stage manifests are the authoritative state for the stage that wrote them;
|
||||
- avoiding a root summary prevents duplicate state from drifting;
|
||||
- stage-local manifests make partial writes, failure recovery, and future stage
|
||||
invalidation easier to reason about.
|
||||
|
||||
Each stage manifest should record enough information to determine whether its
|
||||
outputs can be trusted for resume:
|
||||
|
||||
- workspace schema/version;
|
||||
- stage name and lane ID when applicable;
|
||||
- module key and relevant module provenance;
|
||||
- dependency fingerprints and input digests;
|
||||
- status such as pending, running, succeeded, succeeded with rejections, failed,
|
||||
or invalidated;
|
||||
- output content digests;
|
||||
- validation status and rejection summaries where relevant;
|
||||
- timing metadata when useful and non-sensitive.
|
||||
|
||||
## Checkpoint Output
|
||||
|
||||
When `workspace.resume.enabled` is enabled, Notarius should write under the
|
||||
`checkpoints/` subtree. Checkpoints should contain only artifacts required to
|
||||
resume safely.
|
||||
|
||||
Checkpoint artifacts may include:
|
||||
|
||||
- source document checkpoint;
|
||||
- chunk collection checkpoint;
|
||||
- accepted extract outputs;
|
||||
- rejected extract records;
|
||||
- merge output;
|
||||
- normalize output;
|
||||
- stage manifests with dependency fingerprints and output digests.
|
||||
|
||||
Checkpoint output should avoid raw prompts, raw references, raw LLM request
|
||||
payloads, and other sensitive development artifacts unless they are strictly
|
||||
required for safe resume. Prefer digests and provenance over copying sensitive
|
||||
inputs.
|
||||
|
||||
Checkpoint writes should be atomic at the file level. Partial or interrupted
|
||||
writes must not be mistaken for successful stage completion.
|
||||
|
||||
## Debug Output
|
||||
|
||||
When `workspace.debug.enabled` is enabled, Notarius should write under the
|
||||
`debug/<run-id>/` subtree. Debug artifacts are useful for inspection but not
|
||||
required for resume.
|
||||
|
||||
Debug artifacts may include:
|
||||
|
||||
- rendered prompt inputs;
|
||||
- structured LLM request and response traces;
|
||||
- raw model responses;
|
||||
- copied reference content;
|
||||
- copied source snippets;
|
||||
- intermediate raw payloads;
|
||||
- validator request/response details.
|
||||
|
||||
Debug output is explicitly sensitive. Documentation should warn that debug
|
||||
workspace data may contain source material, references, prompts, and model
|
||||
outputs. Debug output should remain disabled by default.
|
||||
|
||||
`workspace.debug.enabled` and `workspace.resume.enabled` should be independent.
|
||||
Enabling debug should not imply resume, and enabling resume should not imply
|
||||
debug.
|
||||
|
||||
## Resume Semantics
|
||||
|
||||
Resume should be explicit at first, for example through a future `resume` command
|
||||
or a `run --resume` flag. Plain `run` should not silently skip completed stages
|
||||
in the initial workspace feature.
|
||||
|
||||
Before reusing a checkpoint, Notarius should verify that:
|
||||
|
||||
- the workspace schema/version is supported;
|
||||
- the checkpoint stage manifest is complete and successful;
|
||||
- dependency fingerprints match the current invocation;
|
||||
- referenced checkpoint files exist and match recorded digests;
|
||||
- selected lanes and runtime overrides are compatible with the checkpoint.
|
||||
|
||||
Rejected extract outputs should be treated as recorded stage outcomes, not
|
||||
framework failures. Under current pipeline policy, rejected outputs do not pass
|
||||
to downstream stages.
|
||||
|
||||
## Boundaries
|
||||
|
||||
Workspace writing should be framework-owned. Concrete modules should not write
|
||||
directly to workspace paths.
|
||||
|
||||
If modules need to expose debug material later, they should return logical
|
||||
artifacts through framework contracts and let framework or CLI code perform path
|
||||
validation, redaction policy, and writes.
|
||||
|
||||
Workspace state should preserve existing Notarius boundaries:
|
||||
|
||||
- provider plumbing remains behind LLM runtime contracts;
|
||||
- prompt ownership remains with modules and prompt asset helpers;
|
||||
- diagnostics remain per-run invocation artifacts under the workspace root;
|
||||
- output modules continue to own final durable output encoding;
|
||||
- secrets and sensitive payloads are not written unless an explicit debug policy
|
||||
enables them.
|
||||
|
||||
## Deferred Work
|
||||
|
||||
Default-idempotent `run` behavior with a `--force` override, remote workspace
|
||||
storage, workspace garbage collection, archival policy, and cross-machine resume
|
||||
are deferred.
|
||||
Reference in New Issue
Block a user