thoth-agents 0.2.11 → 0.3.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.agents/plugins/marketplace.json +20 -0
- package/.claude-plugin/marketplace.json +21 -0
- package/README.md +301 -311
- package/dist/agents/configured-role-prompt.d.ts +9 -0
- package/dist/agents/prompt-sections.d.ts +8 -4
- package/dist/agents/prompt-utils.d.ts +0 -4
- package/dist/{chunk-ASKXWU6E.js → chunk-2MZ5C2RN.js} +1078 -1725
- package/dist/chunk-XO74DXBZ.js +1781 -0
- package/dist/{chunk-6BNAV534.js → chunk-YUCGIJPP.js} +12 -30
- package/dist/cli/claude-code-install.d.ts +24 -26
- package/dist/cli/claude-code-paths.d.ts +0 -28
- package/dist/cli/codex-install.d.ts +2 -2
- package/dist/cli/codex-paths.d.ts +0 -2
- package/dist/cli/index.js +279 -119
- package/dist/cli/install.d.ts +5 -1
- package/dist/cli/model-catalog/cache.d.ts +1 -1
- package/dist/cli/operations/claude-code.d.ts +6 -3
- package/dist/cli/operations/codex.d.ts +2 -1
- package/dist/cli/operations/opencode.d.ts +2 -1
- package/dist/cli/operations/types.d.ts +9 -1
- package/dist/cli/package-root.d.ts +1 -0
- package/dist/cli/providers.d.ts +6 -116
- package/dist/cli/skills.d.ts +19 -32
- package/dist/cli/thoth-mem-install.d.ts +45 -0
- package/dist/cli/tui/components/StatusView.d.ts +12 -1
- package/dist/cli/tui/index.js +256 -142
- package/dist/cli/tui/operations.d.ts +4 -3
- package/dist/cli/types.d.ts +0 -10
- package/dist/config/constants.d.ts +20 -16
- package/dist/config/index.d.ts +0 -1
- package/dist/config/loader.d.ts +1 -1
- package/dist/config/schema.d.ts +2 -38
- package/dist/config/utils.d.ts +1 -2
- package/dist/harness/adapters/codex-surfaces.d.ts +3 -3
- package/dist/harness/core/agent-pack.d.ts +37 -29
- package/dist/harness/core/memory-governance.d.ts +24 -48
- package/dist/harness/core/sdd.d.ts +364 -131
- package/dist/harness/generate-integration-packages.d.ts +20 -0
- package/dist/harness/opencode-init-command.d.ts +11 -0
- package/dist/harness/types.d.ts +14 -1
- package/dist/harness/writers/claude-code-subagent.d.ts +3 -1
- package/dist/hooks/index.d.ts +0 -5
- package/dist/index.js +562 -1314
- package/dist/mcp/index.d.ts +1 -2
- package/package.json +17 -12
- package/plugin/.claude-plugin/.thoth-agents-plugin-assets.json +50 -0
- package/plugin/.claude-plugin/plugin.json +8 -0
- package/plugin/.codex-plugin/.thoth-agents-plugin-assets.json +16 -0
- package/plugin/.codex-plugin/plugin.json +7 -0
- package/plugin/.mcp.json +19 -0
- package/plugin/agents/deep.md +89 -0
- package/plugin/agents/designer.md +89 -0
- package/plugin/agents/explorer.md +90 -0
- package/plugin/agents/librarian.md +90 -0
- package/plugin/agents/oracle.md +92 -0
- package/plugin/agents/orchestrator.md +128 -0
- package/plugin/agents/quick.md +89 -0
- package/plugin/codex.mcp.json +17 -0
- package/plugin/settings.json +3 -0
- package/plugin/skills/thoth-archive/SKILL.md +40 -0
- package/plugin/skills/thoth-archive/scripts/archive.mjs +748 -0
- package/plugin/skills/thoth-constitution/SKILL.md +45 -0
- package/plugin/skills/thoth-constitution/scripts/validate.mjs +167 -0
- package/plugin/skills/thoth-constitution/templates/constitution.md +54 -0
- package/plugin/skills/thoth-init/SKILL.md +30 -0
- package/plugin/skills/thoth-init/scripts/init.mjs +141 -0
- package/plugin/skills/thoth-sdd/SKILL.md +83 -0
- package/plugin/skills/thoth-sdd/references/phases/analyze.md +21 -0
- package/plugin/skills/thoth-sdd/references/phases/checklist.md +20 -0
- package/plugin/skills/thoth-sdd/references/phases/clarify.md +15 -0
- package/plugin/skills/thoth-sdd/references/phases/converge.md +14 -0
- package/plugin/skills/thoth-sdd/references/phases/explore.md +10 -0
- package/plugin/skills/thoth-sdd/references/phases/implement.md +19 -0
- package/plugin/skills/thoth-sdd/references/phases/plan.md +15 -0
- package/plugin/skills/thoth-sdd/references/phases/specify.md +21 -0
- package/plugin/skills/thoth-sdd/references/phases/tasks.md +20 -0
- package/plugin/skills/thoth-sdd/references/phases/verify.md +22 -0
- package/plugin/skills/thoth-sdd/scripts/validate.mjs +1117 -0
- package/plugin/skills/thoth-sdd/templates/archive-report.md +25 -0
- package/plugin/skills/thoth-sdd/templates/checklist.md +27 -0
- package/plugin/skills/thoth-sdd/templates/plan.md +38 -0
- package/plugin/skills/thoth-sdd/templates/spec.md +54 -0
- package/plugin/skills/thoth-sdd/templates/tasks.md +29 -0
- package/plugin/skills/thoth-sdd/templates/verify-report.md +28 -0
- package/skills/README.md +12 -0
- package/skills/thoth-archive/SKILL.md +40 -0
- package/skills/thoth-archive/scripts/archive.mjs +748 -0
- package/skills/thoth-constitution/SKILL.md +45 -0
- package/skills/thoth-constitution/scripts/validate.mjs +167 -0
- package/skills/thoth-constitution/templates/constitution.md +54 -0
- package/skills/thoth-init/SKILL.md +30 -0
- package/skills/thoth-init/scripts/init.mjs +141 -0
- package/skills/thoth-sdd/SKILL.md +83 -0
- package/skills/thoth-sdd/references/phases/analyze.md +21 -0
- package/skills/thoth-sdd/references/phases/checklist.md +20 -0
- package/skills/thoth-sdd/references/phases/clarify.md +15 -0
- package/skills/thoth-sdd/references/phases/converge.md +14 -0
- package/skills/thoth-sdd/references/phases/explore.md +10 -0
- package/skills/thoth-sdd/references/phases/implement.md +19 -0
- package/skills/thoth-sdd/references/phases/plan.md +15 -0
- package/skills/thoth-sdd/references/phases/specify.md +21 -0
- package/skills/thoth-sdd/references/phases/tasks.md +20 -0
- package/skills/thoth-sdd/references/phases/verify.md +22 -0
- package/skills/thoth-sdd/scripts/validate.mjs +1117 -0
- package/skills/thoth-sdd/templates/archive-report.md +25 -0
- package/skills/thoth-sdd/templates/checklist.md +27 -0
- package/skills/thoth-sdd/templates/plan.md +38 -0
- package/skills/thoth-sdd/templates/spec.md +54 -0
- package/skills/thoth-sdd/templates/tasks.md +29 -0
- package/skills/thoth-sdd/templates/verify-report.md +28 -0
- package/thoth-agents.schema.json +0 -39
- package/dist/chunk-OZE7JVGS.js +0 -2344
- package/dist/cli/custom-skills.d.ts +0 -49
- package/dist/cli/skill-manifest.d.ts +0 -32
- package/dist/harness/core/skills.d.ts +0 -211
- package/dist/harness/generate-codex-plugin.d.ts +0 -9
- package/dist/harness/writers/claude-code-skill-layout.d.ts +0 -16
- package/dist/harness/writers/fs-skill-collect.d.ts +0 -7
- package/dist/harness/writers/skill-layout.d.ts +0 -16
- package/dist/hooks/chat-headers.d.ts +0 -16
- package/dist/hooks/phase-reminder/index.d.ts +0 -28
- package/dist/hooks/post-read-nudge/index.d.ts +0 -18
- package/dist/hooks/skill-sync.d.ts +0 -10
- package/dist/hooks/thoth-mem/index.d.ts +0 -46
- package/dist/hooks/thoth-mem/protocol.d.ts +0 -7
- package/dist/mcp/thoth.d.ts +0 -3
- package/dist/sdd/artifact-governance/artifact-loader.d.ts +0 -130
- package/dist/sdd/artifact-governance/index.d.ts +0 -6
- package/dist/sdd/artifact-governance/tasks-validator.d.ts +0 -17
- package/dist/sdd/artifact-governance/types.d.ts +0 -52
- package/dist/thoth/client.d.ts +0 -14
- package/dist/thoth/index.d.ts +0 -2
- package/src/skills/_shared/openspec-convention.md +0 -350
- package/src/skills/_shared/persistence-contract.md +0 -163
- package/src/skills/_shared/thoth-mem-convention.md +0 -123
- package/src/skills/executing-plans/SKILL.md +0 -288
- package/src/skills/plan-reviewer/SKILL.md +0 -219
- package/src/skills/requirements-interview/SKILL.md +0 -233
- package/src/skills/sdd-apply/SKILL.md +0 -89
- package/src/skills/sdd-archive/SKILL.md +0 -92
- package/src/skills/sdd-clarify/SKILL.md +0 -105
- package/src/skills/sdd-constitution/SKILL.md +0 -107
- package/src/skills/sdd-design/SKILL.md +0 -155
- package/src/skills/sdd-init/SKILL.md +0 -233
- package/src/skills/sdd-propose/SKILL.md +0 -101
- package/src/skills/sdd-spec/SKILL.md +0 -136
- package/src/skills/sdd-tasks/SKILL.md +0 -232
- package/src/skills/sdd-verify/SKILL.md +0 -131
- package/src/skills/thoth-mem-agents/SKILL.md +0 -210
|
@@ -1,52 +0,0 @@
|
|
|
1
|
-
export declare const ARTIFACT_GOVERNANCE_SEVERITIES: readonly ["error", "warning", "info"];
|
|
2
|
-
export type ArtifactGovernanceSeverity = (typeof ARTIFACT_GOVERNANCE_SEVERITIES)[number];
|
|
3
|
-
export declare const ARTIFACT_GOVERNANCE_MODES: readonly ["none", "thoth-mem", "openspec", "hybrid"];
|
|
4
|
-
export type ArtifactGovernanceMode = (typeof ARTIFACT_GOVERNANCE_MODES)[number];
|
|
5
|
-
export declare const ARTIFACT_GOVERNANCE_ENFORCEMENT_MODES: readonly ["report-only"];
|
|
6
|
-
export type ArtifactGovernanceEnforcementMode = (typeof ARTIFACT_GOVERNANCE_ENFORCEMENT_MODES)[number];
|
|
7
|
-
export type ArtifactGovernanceMetadataValue = string | number | boolean | null;
|
|
8
|
-
export interface ArtifactGovernanceFinding {
|
|
9
|
-
code: string;
|
|
10
|
-
severity: ArtifactGovernanceSeverity;
|
|
11
|
-
message: string;
|
|
12
|
-
path?: string;
|
|
13
|
-
line?: number;
|
|
14
|
-
column?: number;
|
|
15
|
-
detail?: string;
|
|
16
|
-
source?: string;
|
|
17
|
-
metadata?: Readonly<Record<string, ArtifactGovernanceMetadataValue>>;
|
|
18
|
-
}
|
|
19
|
-
export interface ArtifactGovernanceSummary {
|
|
20
|
-
total: number;
|
|
21
|
-
errorCount: number;
|
|
22
|
-
warningCount: number;
|
|
23
|
-
infoCount: number;
|
|
24
|
-
highestSeverity: ArtifactGovernanceSeverity | null;
|
|
25
|
-
}
|
|
26
|
-
export interface ArtifactGovernanceReport {
|
|
27
|
-
mode: ArtifactGovernanceMode;
|
|
28
|
-
enforcementMode: ArtifactGovernanceEnforcementMode;
|
|
29
|
-
findings: readonly ArtifactGovernanceFinding[];
|
|
30
|
-
summary: ArtifactGovernanceSummary;
|
|
31
|
-
valid: boolean;
|
|
32
|
-
shouldBlock: boolean;
|
|
33
|
-
}
|
|
34
|
-
export interface ArtifactGovernanceResult extends ArtifactGovernanceReport {
|
|
35
|
-
validator: string;
|
|
36
|
-
artifact: string;
|
|
37
|
-
report: ArtifactGovernanceReport;
|
|
38
|
-
}
|
|
39
|
-
export interface CreateArtifactGovernanceReportOptions {
|
|
40
|
-
mode?: ArtifactGovernanceMode;
|
|
41
|
-
enforcementMode?: ArtifactGovernanceEnforcementMode;
|
|
42
|
-
findings?: readonly ArtifactGovernanceFinding[];
|
|
43
|
-
}
|
|
44
|
-
export interface CreateArtifactGovernanceResultOptions extends CreateArtifactGovernanceReportOptions {
|
|
45
|
-
validator: string;
|
|
46
|
-
artifact: string;
|
|
47
|
-
}
|
|
48
|
-
export declare function isArtifactGovernanceSeverity(value: string): value is ArtifactGovernanceSeverity;
|
|
49
|
-
export declare function getHighestArtifactGovernanceSeverity(findings: readonly ArtifactGovernanceFinding[]): ArtifactGovernanceSeverity | null;
|
|
50
|
-
export declare function summarizeArtifactGovernanceFindings(findings: readonly ArtifactGovernanceFinding[]): ArtifactGovernanceSummary;
|
|
51
|
-
export declare function createArtifactGovernanceReport(options?: CreateArtifactGovernanceReportOptions): ArtifactGovernanceReport;
|
|
52
|
-
export declare function createArtifactGovernanceResult(options: CreateArtifactGovernanceResultOptions): ArtifactGovernanceResult;
|
package/dist/thoth/client.d.ts
DELETED
|
@@ -1,14 +0,0 @@
|
|
|
1
|
-
export interface CreateThothClientOptions {
|
|
2
|
-
project: string;
|
|
3
|
-
directory?: string;
|
|
4
|
-
httpPort?: number;
|
|
5
|
-
timeoutMs?: number;
|
|
6
|
-
enabled?: boolean;
|
|
7
|
-
}
|
|
8
|
-
export interface ThothClient {
|
|
9
|
-
readonly enabled: boolean;
|
|
10
|
-
memContext(sessionId?: string, limit?: number): Promise<string | null>;
|
|
11
|
-
memSessionStart(sessionId: string): Promise<boolean>;
|
|
12
|
-
memSavePrompt(sessionId: string, content: string): Promise<boolean>;
|
|
13
|
-
}
|
|
14
|
-
export declare function createThothClient(options: CreateThothClientOptions): ThothClient;
|
package/dist/thoth/index.d.ts
DELETED
|
@@ -1,350 +0,0 @@
|
|
|
1
|
-
# OpenSpec Convention
|
|
2
|
-
|
|
3
|
-
## Harness Scope
|
|
4
|
-
|
|
5
|
-
OpenSpec artifacts are harness-independent filesystem artifacts. The canonical
|
|
6
|
-
`openspec/` paths, filenames, and archive layout do not change across adapter
|
|
7
|
-
bindings.
|
|
8
|
-
|
|
9
|
-
This file defines harness-neutral artifact semantics. Any runtime-specific file
|
|
10
|
-
read/write, delegation, or blocking user input surface is an adapter binding
|
|
11
|
-
and must preserve the canonical behavior described here. If a runtime lacks a
|
|
12
|
-
required primitive, treat it as an unsupported-capability and report the
|
|
13
|
-
limitation instead of changing artifact semantics.
|
|
14
|
-
|
|
15
|
-
## Mode Scope
|
|
16
|
-
|
|
17
|
-
This convention applies only when the artifact store mode includes OpenSpec:
|
|
18
|
-
`openspec` and `hybrid`.
|
|
19
|
-
|
|
20
|
-
- In `thoth-mem` mode, skip canonical `openspec/` file writes.
|
|
21
|
-
- In `thoth-mem` mode, skip filesystem artifact recovery.
|
|
22
|
-
|
|
23
|
-
## Pre-flight Validation
|
|
24
|
-
|
|
25
|
-
When the selected persistence mode includes OpenSpec (`openspec` or `hybrid`),
|
|
26
|
-
every SDD skill must verify this structure before proceeding:
|
|
27
|
-
|
|
28
|
-
1. `openspec/config.yaml` exists
|
|
29
|
-
2. `openspec/specs/` exists
|
|
30
|
-
3. `openspec/changes/` exists
|
|
31
|
-
|
|
32
|
-
If any required item is missing:
|
|
33
|
-
|
|
34
|
-
- STOP and inform the orchestrator that `openspec/` is not initialized.
|
|
35
|
-
- Recommend running the `sdd-init` skill first.
|
|
36
|
-
- Do NOT attempt to create the structure in that skill.
|
|
37
|
-
|
|
38
|
-
If the required items exist but the project is stale (`config.yaml` is missing
|
|
39
|
-
one or more mechanism sections / toggles, or `openspec/memory/constitution.md`
|
|
40
|
-
is absent):
|
|
41
|
-
|
|
42
|
-
- Recommend running the `sdd-init` skill to additively realign the project.
|
|
43
|
-
- Do NOT attempt to backfill the missing pieces in that skill.
|
|
44
|
-
|
|
45
|
-
If all required items exist and no mechanism pieces are missing, continue
|
|
46
|
-
normally.
|
|
47
|
-
|
|
48
|
-
## Directory Structure
|
|
49
|
-
|
|
50
|
-
```text
|
|
51
|
-
openspec/
|
|
52
|
-
├── config.yaml
|
|
53
|
-
├── specs/
|
|
54
|
-
│ └── {domain}/spec.md
|
|
55
|
-
└── changes/
|
|
56
|
-
├── archive/
|
|
57
|
-
└── {change-name}/
|
|
58
|
-
├── proposal.md
|
|
59
|
-
├── specs/
|
|
60
|
-
│ └── {domain}/spec.md # clarified in place by the clarify phase
|
|
61
|
-
├── design.md
|
|
62
|
-
├── research.md # optional sub-artifact (gated)
|
|
63
|
-
├── data-model.md # optional sub-artifact (gated)
|
|
64
|
-
├── contracts/ # optional sub-artifact subdir (gated)
|
|
65
|
-
├── quickstart.md # optional sub-artifact (gated)
|
|
66
|
-
├── tasks.md
|
|
67
|
-
├── plan-review.md
|
|
68
|
-
└── verify-report.md
|
|
69
|
-
```
|
|
70
|
-
|
|
71
|
-
## Canonical Artifacts
|
|
72
|
-
|
|
73
|
-
| Artifact | Canonical path | Notes |
|
|
74
|
-
| --- | --- | --- |
|
|
75
|
-
| Proposal | `openspec/changes/{change-name}/proposal.md` | Intent, scope, approach |
|
|
76
|
-
| Delta specs | `openspec/changes/{change-name}/specs/{domain}/spec.md` | Use one file per domain |
|
|
77
|
-
| Main specs | `openspec/specs/{domain}/spec.md` | Source of truth after archive |
|
|
78
|
-
| Design | `openspec/changes/{change-name}/design.md` | Architecture and file plan; always produced |
|
|
79
|
-
| Sub-artifacts (optional, gated) | `openspec/changes/{change-name}/{research.md,data-model.md,contracts/,quickstart.md}` | Optional design sub-artifacts; gated by `rules.design.sub_artifacts` + `complexity_threshold` |
|
|
80
|
-
| Tasks | `openspec/changes/{change-name}/tasks.md` | Checkbox checklist updated by apply |
|
|
81
|
-
| Plan review | `openspec/changes/{change-name}/plan-review.md` | Oracle plan-review result with status, notes, blockers, override context, and SHA-256 reviewed-artifact freshness data |
|
|
82
|
-
| Verify report | `openspec/changes/{change-name}/verify-report.md` | Compliance matrix and evidence |
|
|
83
|
-
| Requirements checklist | `openspec/changes/{change-name}/checklists/requirements.md` | Domain-typed requirement-quality gate, consumed before tasks |
|
|
84
|
-
| Constitution | `openspec/memory/constitution.md` | Semver-versioned native principles + Sync-Impact Report |
|
|
85
|
-
|
|
86
|
-
`apply-progress` and `archive-report` are durable SDD artifacts, but they are
|
|
87
|
-
primarily persisted through thoth-mem topic keys when the mode includes
|
|
88
|
-
thoth-mem.
|
|
89
|
-
|
|
90
|
-
A saved `plan-review.md` approval is reusable only when it contains `[OKAY]` and every recorded reviewed-artifact SHA-256 digest still matches the current planning artifacts. Missing, stale, rejected, or unparsable plan-review evidence fails closed and requires a fresh Oracle review unless a separate explicit user override is captured through the normal blocking-input surface. A fresh plan-review approval satisfies only the plan-review gate; implementation confirmation remains separate.
|
|
91
|
-
|
|
92
|
-
The canonical OpenSpec copy is the filesystem representation of these artifacts
|
|
93
|
-
for `openspec` and `hybrid` modes. thoth-mem topic keys are the memory
|
|
94
|
-
representation when the mode includes thoth-mem; neither representation changes
|
|
95
|
-
the harness-neutral artifact names or lifecycle.
|
|
96
|
-
|
|
97
|
-
Delegated handoff summaries are not OpenSpec artifacts. They are root-owned
|
|
98
|
-
session summary context when thoth-mem is available, while subagent prompts
|
|
99
|
-
carry recovery instructions and continue to use the canonical OpenSpec paths
|
|
100
|
-
above for filesystem artifact recovery.
|
|
101
|
-
|
|
102
|
-
## Writing Rules
|
|
103
|
-
|
|
104
|
-
- Preserve canonical filenames and locations.
|
|
105
|
-
- Read an existing artifact before rewriting it.
|
|
106
|
-
- Keep change-specific artifacts under
|
|
107
|
-
`openspec/changes/{change-name}/...`.
|
|
108
|
-
- Keep long-lived specs under `openspec/specs/{domain}/spec.md`.
|
|
109
|
-
- Archive completed changes under
|
|
110
|
-
`openspec/changes/archive/YYYY-MM-DD-{change-name}/`.
|
|
111
|
-
|
|
112
|
-
## Artifact Content Rules
|
|
113
|
-
|
|
114
|
-
- `proposal.md` explains why the change exists.
|
|
115
|
-
- `spec.md` uses RFC 2119 keywords and Given/When/Then scenarios (full pipeline only).
|
|
116
|
-
- The `clarify` phase (full pipeline only) resolves residual spec ambiguity in
|
|
117
|
-
place between `spec` and `design`, editing the delta `spec.md` files under the
|
|
118
|
-
same path and re-saving the `sdd/{change-name}/spec` key; it produces no new
|
|
119
|
-
artifact.
|
|
120
|
-
- `design.md` explains how the change will be implemented (full pipeline only).
|
|
121
|
-
It MAY be accompanied by optional, gated sub-artifacts (`research.md`,
|
|
122
|
-
`data-model.md`, `contracts/`, `quickstart.md`).
|
|
123
|
-
- `tasks.md` is phase-based and uses Markdown checkboxes.
|
|
124
|
-
- `verify-report.md` maps acceptance criteria to executed evidence: spec
|
|
125
|
-
scenarios in full pipeline, proposal success criteria in accelerated pipeline.
|
|
126
|
-
|
|
127
|
-
Progress tracking surfaces may mirror task status for user visibility, but
|
|
128
|
-
`tasks.md` remains the canonical OpenSpec task artifact whenever the selected
|
|
129
|
-
persistence mode includes OpenSpec.
|
|
130
|
-
|
|
131
|
-
## `config.yaml` Shape
|
|
132
|
-
|
|
133
|
-
`rules:` carries one section per phase or mechanism. A section is EITHER a
|
|
134
|
-
bare list of guidance strings OR a mapping. When a phase needs both human
|
|
135
|
-
guidance and machine-relevant scalar toggles, the guidance list lives under a
|
|
136
|
-
`guidance:` subkey alongside the scalars (mixing bare `- item` sequence entries
|
|
137
|
-
with `key: value` scalars under the same key is invalid YAML).
|
|
138
|
-
|
|
139
|
-
```yaml
|
|
140
|
-
schema: spec-driven
|
|
141
|
-
|
|
142
|
-
context: |
|
|
143
|
-
Project background, stack, and constraints.
|
|
144
|
-
|
|
145
|
-
rules:
|
|
146
|
-
proposal:
|
|
147
|
-
- Include rollback plan for risky changes
|
|
148
|
-
- Identify affected modules/packages
|
|
149
|
-
spec:
|
|
150
|
-
- Use RFC 2119 keywords (MUST, SHALL, SHOULD, MAY)
|
|
151
|
-
- Use Given/When/Then scenarios
|
|
152
|
-
design:
|
|
153
|
-
guidance:
|
|
154
|
-
- Document architecture decisions with rationale
|
|
155
|
-
- Require a File Changes section
|
|
156
|
-
sub_artifacts: false # optional design sub-artifacts (default off)
|
|
157
|
-
complexity_threshold: # author-evaluated eligibility triggers (OR)
|
|
158
|
-
affected_domains: 3
|
|
159
|
-
affected_files: 12
|
|
160
|
-
external_research: true
|
|
161
|
-
tasks:
|
|
162
|
-
guidance:
|
|
163
|
-
- Group tasks by phase with hierarchical numbering
|
|
164
|
-
- Require a per-task Verification block
|
|
165
|
-
tdd: false # TDD ordering flag (sdd-tasks-format)
|
|
166
|
-
traceability: true # require [USN] + Spec: tag + Independent Test per task
|
|
167
|
-
parallel_markers: false # [P] emission + executing-plans consumption (default off)
|
|
168
|
-
apply:
|
|
169
|
-
guidance:
|
|
170
|
-
- Follow existing code patterns and conventions
|
|
171
|
-
test_command: ''
|
|
172
|
-
verify:
|
|
173
|
-
test_command: ''
|
|
174
|
-
build_command: ''
|
|
175
|
-
coverage_threshold: 0
|
|
176
|
-
archive:
|
|
177
|
-
- Warn before destructive merges
|
|
178
|
-
|
|
179
|
-
# --- mechanism sections (spec-kit-rigor) ---
|
|
180
|
-
constitution:
|
|
181
|
-
path: openspec/memory/constitution.md
|
|
182
|
-
enforce_check: true # Constitution Check gate blocks on violation
|
|
183
|
-
version_policy: semver # MAJOR=remove/redefine, MINOR=add, PATCH=clarify
|
|
184
|
-
consistency:
|
|
185
|
-
enforce_block: true # CRITICAL findings block plan-review
|
|
186
|
-
require_coverage_percentage: true
|
|
187
|
-
requirements_quality:
|
|
188
|
-
enforce_block: true # incomplete checklist blocks tasks phase
|
|
189
|
-
dimensions: [completeness, clarity, measurability, testability]
|
|
190
|
-
clarification:
|
|
191
|
-
max_markers_per_spec: 3 # [NEEDS CLARIFICATION] cap enforced by plan-reviewer
|
|
192
|
-
handoffs:
|
|
193
|
-
surface_hints: true # surface SddPhaseContract.handoffHints at transitions
|
|
194
|
-
```
|
|
195
|
-
|
|
196
|
-
Treat `rules` entries as mandatory phase-specific constraints whenever present.
|
|
197
|
-
Missing `enforce_*` keys default to enforcing; a section that sets its
|
|
198
|
-
`enforce_*` key to `false` downgrades the corresponding block to a report.
|
|
199
|
-
|
|
200
|
-
## Parallel Task Markers
|
|
201
|
-
|
|
202
|
-
`sdd-tasks` MAY annotate a task with an optional `[P]` marker placed AFTER the
|
|
203
|
-
`N.M` number (`- [ ] 2.1 [P] Title`), never before it. Placement after the
|
|
204
|
-
number keeps the `tasks-validator` `TASK_NUMBERING` regex green with no
|
|
205
|
-
validator change. `[P]` declares the task is dependency-free of the other
|
|
206
|
-
`[P]`-marked tasks in the SAME phase and targets the same execution agent;
|
|
207
|
-
`executing-plans` consumes a contiguous `[P]` run as one explicit parallel batch
|
|
208
|
-
(recommending worktree isolation for overlapping writers). Both emission and
|
|
209
|
-
consumption are gated by `rules.tasks.parallel_markers` (default off);
|
|
210
|
-
back-compat: an absent marker or disabled toggle executes exactly as today.
|
|
211
|
-
|
|
212
|
-
## Constitution Governance
|
|
213
|
-
|
|
214
|
-
The project constitution lives at `openspec/memory/constitution.md` and holds
|
|
215
|
-
NATIVE thoth-agents principles (delegate-first coordination, read-only role
|
|
216
|
-
boundaries, governed persistence, multi-harness parity, evidence-led
|
|
217
|
-
verification). It is NOT spec-kit's articles; only the mechanics of versioned
|
|
218
|
-
governance are adopted.
|
|
219
|
-
|
|
220
|
-
- **Version**: a semantic version `MAJOR.MINOR.PATCH` in the header, with
|
|
221
|
-
`Ratified` and `Last-Amended` dates. `sdd-init` bootstraps it at `1.0.0`
|
|
222
|
-
when absent and preserves the existing content and version when present
|
|
223
|
-
(idempotent).
|
|
224
|
-
- **Semver bump policy** (manual, performed by the editor): MAJOR = a principle
|
|
225
|
-
is removed or redefined; MINOR = a principle is added or guidance materially
|
|
226
|
-
expanded; PATCH = clarification or wording. There is no runtime parser, so
|
|
227
|
-
the policy is enforced by prose, not tooling.
|
|
228
|
-
- **Sync-Impact Report**: an in-file `## Sync-Impact Report` section (newest
|
|
229
|
-
entry on top) listing version, change type, principles touched, and the
|
|
230
|
-
downstream gates/artifacts affected.
|
|
231
|
-
- **Constitution Check gate**: a procedural gate owned jointly by `sdd-design`
|
|
232
|
-
(self-review while authoring) and `plan-reviewer` (independent enforcement).
|
|
233
|
-
It reuses the existing `oracle-review` gate plumbing — no new `gate` enum
|
|
234
|
-
value. On a detected violation it BLOCKS advancement; the block is
|
|
235
|
-
overridable only through an explicit user decision delivered via the harness
|
|
236
|
-
blocking-input surface (AskUserQuestion-equivalent), and the override MUST be
|
|
237
|
-
logged with the violated principle. Gated by `rules.constitution`; when
|
|
238
|
-
`enforce_check: false`, the check does not block and the skip is noted.
|
|
239
|
-
|
|
240
|
-
### Constitution Amendment
|
|
241
|
-
|
|
242
|
-
The AMENDMENT side of the lifecycle is performed by the `sdd-constitution`
|
|
243
|
-
skill. It executes a guided, human-confirmed semver bump (reusing the Semver
|
|
244
|
-
bump policy above), updates the `Last-Amended` date, and PREPENDS one
|
|
245
|
-
`## Sync-Impact Report` entry in the format
|
|
246
|
-
`- X.Y.Z | change type | principles touched | downstream gates/artifacts affected`
|
|
247
|
-
(newest entry on top).
|
|
248
|
-
|
|
249
|
-
- The ONLY writable target of the amendment is
|
|
250
|
-
`openspec/memory/constitution.md`.
|
|
251
|
-
- The bump is human-confirmed via the harness blocking-input surface
|
|
252
|
-
(AskUserQuestion-equivalent) BEFORE any version is written. There is no
|
|
253
|
-
runtime parser and no auto-bump; the level is never selected automatically.
|
|
254
|
-
- When no principle change is warranted the skill performs a reported no-op and
|
|
255
|
-
writes nothing.
|
|
256
|
-
- It preserves all existing content and ALL prior Sync-Impact Report entries;
|
|
257
|
-
it only prepends the new entry and updates the version/date fields.
|
|
258
|
-
|
|
259
|
-
### Read-Only Assets and Report-Only Propagation
|
|
260
|
-
|
|
261
|
-
When the plugin is INSTALLED in a harness (OpenCode / Codex), bundled skills are
|
|
262
|
-
READ-ONLY assets. The `sdd-constitution` skill MUST NOT edit, create, or delete
|
|
263
|
-
any other `SKILL.md`, any file under `src/`, or any template — its single
|
|
264
|
-
writable target is the end-user `openspec/memory/constitution.md`.
|
|
265
|
-
|
|
266
|
-
Because the enforcement gates (`sdd-design`, `plan-reviewer`) read the
|
|
267
|
-
constitution LIVE, there are NO static principle copies to realign. Propagation
|
|
268
|
-
is therefore report-only: the Sync-Impact Report entry DOCUMENTS which
|
|
269
|
-
downstream gates consume the changed principles, and the skill FLAGS any
|
|
270
|
-
in-flight change `design.md` / `tasks.md` that reference now-changed principles
|
|
271
|
-
for HUMAN re-review instead of editing them.
|
|
272
|
-
|
|
273
|
-
### Amendment Auto-Suggest (shared snippet)
|
|
274
|
-
|
|
275
|
-
`sdd-verify` and `sdd-archive` REFERENCE this single canonical snippet (they do
|
|
276
|
-
NOT inline it) to surface a report-only amendment suggestion.
|
|
277
|
-
|
|
278
|
-
> **Constitution amendment auto-suggest (report-only).** A completed change is
|
|
279
|
-
> "governance-touching" when ANY holds: its `proposal.md` Impact/Affected
|
|
280
|
-
> Areas, `design.md`, `tasks.md`, or delta `spec.md` reference
|
|
281
|
-
> `openspec/memory/constitution.md`, "the constitution," or a named principle;
|
|
282
|
-
> OR it modifies `src/skills/_shared/openspec-convention.md` (Constitution
|
|
283
|
-
> Governance) or `openspec/memory/constitution.md`; OR any artifact names a
|
|
284
|
-
> constitution principle by title. When governance-touching, surface a
|
|
285
|
-
> NON-BLOCKING suggestion: "This change touched governance/principles —
|
|
286
|
-
> consider running `sdd-constitution` to record a constitution amendment." This
|
|
287
|
-
> suggestion is advisory only; it MUST NOT block verification or archival.
|
|
288
|
-
|
|
289
|
-
### config.yaml mechanism-section backfill
|
|
290
|
-
|
|
291
|
-
`sdd-init` realignment backfills the `config.yaml` mechanism sections
|
|
292
|
-
(`constitution`, `consistency`, `requirements_quality`, `clarification`,
|
|
293
|
-
`handoffs`) and the `rules.tasks.traceability` / `rules.verify` toggles
|
|
294
|
-
additively, mirroring the constitution idempotency above.
|
|
295
|
-
|
|
296
|
-
- It MUST detect per-section absence independently and merge ONLY the absent
|
|
297
|
-
sections / toggles into the existing `config.yaml`.
|
|
298
|
-
- It MUST NOT overwrite any value that is already present; every existing key
|
|
299
|
-
and value is preserved verbatim.
|
|
300
|
-
- It MUST report which sections / toggles were added.
|
|
301
|
-
- It is idempotent: re-running on a project whose `config.yaml` already carries
|
|
302
|
-
every mechanism section / toggle is a reported no-op.
|
|
303
|
-
|
|
304
|
-
## Consistency Severity and Coverage Model
|
|
305
|
-
|
|
306
|
-
`plan-reviewer` performs cross-artifact consistency analysis across
|
|
307
|
-
proposal<->spec<->design<->tasks IN ADDITION to its executability review (it is
|
|
308
|
-
NOT a new phase). Each finding carries a severity of `CRITICAL`, `HIGH`,
|
|
309
|
-
`MEDIUM`, or `LOW`.
|
|
310
|
-
|
|
311
|
-
- **Blocking gate**: any `CRITICAL` finding BLOCKS advancement past plan
|
|
312
|
-
review; non-CRITICAL findings are reported but do not block. The block is
|
|
313
|
-
overridable only through an explicit, logged user decision via the harness
|
|
314
|
-
blocking-input surface. Gated by `rules.consistency.enforce_block`.
|
|
315
|
-
- **Requirement-coverage percentage**: `(distinct spec requirements named by
|
|
316
|
-
>=1 task Spec: tag) / (total ### Requirement: headings across all delta
|
|
317
|
-
specs)`, e.g. 8 of 10 covered -> 80%. The percentage MUST appear in the
|
|
318
|
-
review output (gated by `rules.consistency.require_coverage_percentage`).
|
|
319
|
-
|
|
320
|
-
## Requirements-Quality Checklist
|
|
321
|
-
|
|
322
|
-
`sdd-spec` generates a domain-typed requirements-quality checklist at
|
|
323
|
-
`openspec/changes/{change-name}/checklists/requirements.md` ("unit tests for
|
|
324
|
-
English"). It has one `## Domain: {domain}` section per authored delta domain,
|
|
325
|
-
each with checkbox items across four dimensions: completeness, clarity,
|
|
326
|
-
measurability, testability. Items use the task checkbox states (`- [ ]` /
|
|
327
|
-
`- [x]` / `- [-] waived: reason`). The spec->tasks transition is GATED on every
|
|
328
|
-
item being `- [x]` or explicitly waived; an incomplete checklist blocks
|
|
329
|
-
(overridable + logged) unless `rules.requirements_quality.enforce_block: false`.
|
|
330
|
-
|
|
331
|
-
## Clarification Discipline
|
|
332
|
-
|
|
333
|
-
Spec authoring may use `[NEEDS CLARIFICATION: <question>]` markers for genuine
|
|
334
|
-
unresolved decision forks, capped at `rules.clarification.max_markers_per_spec`
|
|
335
|
-
(default 3) per spec file. Follow an informed-guess-first policy: when an
|
|
336
|
-
ambiguity has a defensible default, apply it and record it in the spec's
|
|
337
|
-
`## Assumptions` section rather than emitting a marker; reserve markers for
|
|
338
|
-
forks with no defensible default. `plan-reviewer` flags any spec file exceeding
|
|
339
|
-
the cap.
|
|
340
|
-
|
|
341
|
-
## Handoff Hints
|
|
342
|
-
|
|
343
|
-
`SddPhaseContract` (in `src/harness/core/sdd.ts`) carries an optional
|
|
344
|
-
`handoffHints?: string[]`; a phase declares what the next phase must preserve
|
|
345
|
-
(accepted scope, recorded assumptions, coverage/architecture decisions). The
|
|
346
|
-
field is OPTIONAL — phases without hints stay valid and existing consumers run
|
|
347
|
-
unchanged. SDD skills SURFACE the upstream phase's `handoffHints` in their prose
|
|
348
|
-
at the transition; when absent, no handoff text is surfaced. Gated by
|
|
349
|
-
`rules.handoffs.surface_hints` (when `false`, hints are not surfaced while the
|
|
350
|
-
contract field stays valid).
|
|
@@ -1,163 +0,0 @@
|
|
|
1
|
-
# Persistence Contract
|
|
2
|
-
|
|
3
|
-
## Supported Persistence Modes
|
|
4
|
-
|
|
5
|
-
| Mode | Read order | Write targets | Use when |
|
|
6
|
-
| --- | --- | --- | --- |
|
|
7
|
-
| `thoth-mem` | thoth-mem only | thoth-mem only | The user wants no repo artifact changes |
|
|
8
|
-
| `openspec` | filesystem only | OpenSpec files only | The user wants visible repo artifacts without memory overhead |
|
|
9
|
-
| `hybrid` | thoth-mem, then filesystem fallback | thoth-mem and OpenSpec files | The change should survive compaction and exist in the repo |
|
|
10
|
-
| `none` | orchestrator prompt context only | nowhere (inline response only) | Ephemeral exploration, privacy-sensitive work, or no persistence backend available |
|
|
11
|
-
|
|
12
|
-
SDD skills must obey the selected artifact store mode.
|
|
13
|
-
|
|
14
|
-
## Mode Rules
|
|
15
|
-
|
|
16
|
-
### `thoth-mem`
|
|
17
|
-
|
|
18
|
-
1. Read SDD artifacts from thoth-mem only.
|
|
19
|
-
2. Write SDD artifacts to thoth-mem only.
|
|
20
|
-
3. Do not create or modify canonical `openspec/` artifacts.
|
|
21
|
-
|
|
22
|
-
### `openspec`
|
|
23
|
-
|
|
24
|
-
1. Read SDD artifacts from canonical OpenSpec paths only.
|
|
25
|
-
2. Write SDD artifacts to canonical OpenSpec paths only.
|
|
26
|
-
3. Do not call thoth-mem save or recovery tools.
|
|
27
|
-
|
|
28
|
-
### `none`
|
|
29
|
-
|
|
30
|
-
1. Read SDD artifacts from orchestrator prompt context only.
|
|
31
|
-
2. Do not persist artifacts to any external store.
|
|
32
|
-
3. Return all artifacts as inline text in the response.
|
|
33
|
-
4. Do not call thoth-mem save tools.
|
|
34
|
-
5. Do not create or modify OpenSpec files.
|
|
35
|
-
6. Recommend enabling `thoth-mem` or `openspec` for persistent work.
|
|
36
|
-
|
|
37
|
-
## Hybrid Rules
|
|
38
|
-
|
|
39
|
-
When running in `hybrid` mode:
|
|
40
|
-
|
|
41
|
-
1. Write the canonical OpenSpec artifact to the filesystem.
|
|
42
|
-
2. Persist the same full artifact to thoth-mem with deterministic `topic_key`.
|
|
43
|
-
3. Treat the operation as complete only when both writes succeed.
|
|
44
|
-
4. If filesystem and memory diverge, repair immediately from the freshest full
|
|
45
|
-
artifact.
|
|
46
|
-
|
|
47
|
-
## Memory Ownership
|
|
48
|
-
|
|
49
|
-
Memory responsibilities are split by semantic role:
|
|
50
|
-
|
|
51
|
-
**Orchestrator owns general/root continuity memory:**
|
|
52
|
-
- decisions, discoveries, bug fixes, and user constraints
|
|
53
|
-
- root progress checkpoints and summaries (`mem_session(action="checkpoint"|"summary")`)
|
|
54
|
-
- prompt persistence (`mem_save(kind="prompt")`)
|
|
55
|
-
|
|
56
|
-
**Sub-agents write deterministic SDD artifacts when delegated:**
|
|
57
|
-
- canonical SDD artifacts using `sdd/{change}/{artifact}`
|
|
58
|
-
- includes proposal, spec, design, tasks, apply-progress, verify-report,
|
|
59
|
-
archive-report, and state
|
|
60
|
-
- sub-agents may also write delegated durable implementation observations only
|
|
61
|
-
when explicitly authorized under parent session/project
|
|
62
|
-
- sub-agents do not own session lifecycle operations and do not save prompts
|
|
63
|
-
|
|
64
|
-
In harnesses without hard enforcement, keep this as instruction-level
|
|
65
|
-
governance and disclose unsupported-capability limitations.
|
|
66
|
-
|
|
67
|
-
## Delegated Handoffs
|
|
68
|
-
|
|
69
|
-
Root/orchestrator handoffs are compaction boundaries. When root-owned summary or
|
|
70
|
-
checkpoint tools are available, root refreshes handoff continuity with
|
|
71
|
-
`mem_session(action="checkpoint"|"summary")` or root-owned
|
|
72
|
-
`mem_save(kind="session_summary")`.
|
|
73
|
-
|
|
74
|
-
Initial subagent prompts include task instructions, parent `session_id`,
|
|
75
|
-
project, persistence mode, memory permissions, and recovery instructions. They
|
|
76
|
-
must not include raw handoff bodies, transcripts, secrets, or generated prompts.
|
|
77
|
-
Subagents recover context through bounded recall before using memory as source
|
|
78
|
-
material.
|
|
79
|
-
|
|
80
|
-
If parent identity or root summary/checkpoint tooling is unavailable, report
|
|
81
|
-
that compaction could not be persisted and continue with explicit local context.
|
|
82
|
-
Subagents must not create fallback sessions.
|
|
83
|
-
|
|
84
|
-
## Retrieval Protocol
|
|
85
|
-
|
|
86
|
-
### Recall funnel for thoth-mem and hybrid modes
|
|
87
|
-
|
|
88
|
-
Always complete the recall funnel before using memory content as source
|
|
89
|
-
material:
|
|
90
|
-
|
|
91
|
-
1. `mem_recall(mode="compact")` — scan candidate IDs/titles with exact topic-key
|
|
92
|
-
or focused query terms.
|
|
93
|
-
2. `mem_recall(mode="context")` — expand the strongest hits into retrieved text.
|
|
94
|
-
3. `mem_get(id=...)` — fetch full content; use
|
|
95
|
-
`mem_get(include_timeline=true)` when chronology matters.
|
|
96
|
-
|
|
97
|
-
Use HyDE/fused hybrid recall (sentence + chunk vectors, FTS, KG enrichment) for
|
|
98
|
-
semantic or ambiguous searches; narrow with `topic_key`, `type`, `time_from`,
|
|
99
|
-
`time_to`, `scope`, `project`, and `session_id` filters; use
|
|
100
|
-
`mem_context(recall_query=...)` or bounded
|
|
101
|
-
`mem_project(action="graph"|"topics"|"topic")` for supplemental project
|
|
102
|
-
context. Supplemental context does not replace the recall funnel.
|
|
103
|
-
|
|
104
|
-
### Mode-specific retrieval
|
|
105
|
-
|
|
106
|
-
1. If mode is `thoth-mem`, use the recall funnel with exact SDD topic key.
|
|
107
|
-
2. If mode is `openspec`, read canonical OpenSpec files only.
|
|
108
|
-
3. If mode is `hybrid`, use the recall funnel first.
|
|
109
|
-
4. In `hybrid`, if nothing is found in thoth-mem, read canonical OpenSpec
|
|
110
|
-
files as fallback.
|
|
111
|
-
5. In `hybrid`, if filesystem fallback succeeds, re-save the artifact to
|
|
112
|
-
thoth-mem to converge both stores.
|
|
113
|
-
6. If mode is `none`, use orchestrator prompt context only.
|
|
114
|
-
|
|
115
|
-
## Artifact Ownership
|
|
116
|
-
|
|
117
|
-
- `sdd-propose` persists `sdd/{change-name}/proposal`
|
|
118
|
-
- `sdd-spec` persists `sdd/{change-name}/spec`
|
|
119
|
-
- `sdd-design` persists `sdd/{change-name}/design`
|
|
120
|
-
- `sdd-tasks` persists `sdd/{change-name}/tasks`
|
|
121
|
-
- `plan-reviewer` returns a read-only result; the orchestrator or `quick` persistence helper persists `sdd/{change-name}/plan-review` and/or `openspec/changes/{change-name}/plan-review.md` according to the selected mode
|
|
122
|
-
- `sdd-apply` persists `sdd/{change-name}/apply-progress` and re-persists
|
|
123
|
-
updated `sdd/{change-name}/tasks`
|
|
124
|
-
- `sdd-verify` persists `sdd/{change-name}/verify-report`
|
|
125
|
-
- `sdd-archive` persists `sdd/{change-name}/archive-report`
|
|
126
|
-
- `state` persists `sdd/{change-name}/state`
|
|
127
|
-
|
|
128
|
-
## Governance Placement
|
|
129
|
-
|
|
130
|
-
- Artifact governance validator is report-only.
|
|
131
|
-
- It runs after `sdd-tasks` and before any `sdd-apply` entrypoint consumes the
|
|
132
|
-
report.
|
|
133
|
-
- It does not replace `plan-reviewer` or `executing-plans`.
|
|
134
|
-
- Root-session memory/progress ownership remains orchestrator-owned.
|
|
135
|
-
|
|
136
|
-
## Pipeline Type Impact on Prerequisites
|
|
137
|
-
|
|
138
|
-
The orchestrator passes `pipeline-type` (`accelerated` or `full`) alongside
|
|
139
|
-
persistence mode, affecting required artifacts:
|
|
140
|
-
|
|
141
|
-
| Artifact | Full pipeline | Accelerated pipeline |
|
|
142
|
-
| --- | --- | --- |
|
|
143
|
-
| Proposal | Required by all phases | Required by all phases (acceptance reference) |
|
|
144
|
-
| Spec | Required by design, tasks, apply, verify, archive | Not produced; not required |
|
|
145
|
-
| Design | Required by tasks, apply, verify, archive | Not produced; not required |
|
|
146
|
-
| Tasks | Required by apply, verify, archive | Required by apply, verify, archive |
|
|
147
|
-
| Verify report | Required by archive | Required by archive |
|
|
148
|
-
|
|
149
|
-
In accelerated mode, proposal is the acceptance reference and must preserve
|
|
150
|
-
original intent, accepted scope, deferred areas, and justified exclusions.
|
|
151
|
-
|
|
152
|
-
## Recovery Notes
|
|
153
|
-
|
|
154
|
-
- For plan-review recovery, accept saved approval only when canonical evidence contains `[OKAY]` and reviewed-artifact SHA-256 digests still match. Missing, stale, rejected, or unparsable evidence fails closed; user implementation confirmation remains a distinct later gate.
|
|
155
|
-
- Prefer exact topic-key queries over broad natural-language recall.
|
|
156
|
-
- Always apply the recall funnel (`mem_recall(mode="compact")` ->
|
|
157
|
-
`mem_recall(mode="context")` -> `mem_get(...)`) before treating memory as
|
|
158
|
-
source material.
|
|
159
|
-
- In `openspec`, repair missing/stale artifacts by rewriting canonical OpenSpec
|
|
160
|
-
files.
|
|
161
|
-
- In `thoth-mem`, repair missing/stale artifacts by re-saving full artifacts via
|
|
162
|
-
`mem_save`.
|
|
163
|
-
- In `hybrid`, use filesystem fallback only for recovery, then converge stores.
|