17 KiB
PromptKit Dependency Migration Implementation Plan
Status
In progress. The dependency, framework adapter, version 4 PromptKit configuration migration, provider-neutral module prompt-asset support, provenance alignment, and canonical documentation are implemented; final repository verification is still planned.
Objective
Replace Notarius's dependency on
gitea.maximumdirect.net/eric/scriptorium v0.11.1 with
gitea.maximumdirect.net/eric/promptkit v0.1.0, and consistently adopt the
PromptKit name at the adapter, configuration, provenance, documentation, and
module-support boundaries.
The migration is a clean break. Notarius has no production compatibility requirement for the existing Scriptorium-named configuration or development artifacts, so the implementation must not add legacy configuration aliases, deprecated Go APIs, schema migrations, or compatibility shims.
PromptKit's public engine contract is source-compatible with the subset Notarius currently consumes. Preserve current prompt content, prompt and schema identities, structured-completion behavior, LLM scheduling, retry behavior, debug capture, redaction, and durable output shapes except for the intentional configuration-version and LLM-provider provenance changes described below.
Governing Decisions
- Pin PromptKit at
v0.1.0and remove Scriptorium fromgo.modandgo.sum. - Rename the top-level configuration section from
scriptoriumtopromptkit. - Bump the strict file-configuration version from 3 to 4. Version 4 accepts
only the new
promptkitkey; it does not recognizescriptorium. - Rename the internal adapter and its exported-within-
internalGo API to PromptKit terminology without transitional aliases. - Use provider-neutral names for module-owned prompt asset helpers. Those helpers describe Notarius assets rather than the library that loads them.
- Record
promptkit, notscriptorium, as the LLM adapter/provider value in completion responses and run manifest profile provenance. - Do not add the PromptKit package version to checkpoint identity. A library implementation version is not itself a semantic pipeline input. Existing prompt, schema, module, reference, profile, runtime-override, and prepared component fingerprints remain responsible for semantic invalidation.
- Do not adopt PromptKit's optional
ArtifactReaderextension in this work. Notarius retains ownership of materializing and supplying prompt inputs. - Do not add native session propagation in this work. PromptKit
v0.1.0does not expose the desired request-level session identifier; retain the existing prompt-variable behavior and update the future roadmap terminology only. - Accept PromptKit's documented timeout layering: caller context cancellation is the outer authority, a positive generation timeout supplies an inner request deadline, zero disables only that generation deadline, and the HTTP client timeout remains a transport-wide cap.
- PromptKit and Notarius are both GPL-3.0 licensed, so the dependency change requires no Notarius licensing change.
Non-Goals
- Changing prompt text, message ordering, prompt IDs, schema IDs, or embedded asset paths.
- Changing public artifact schemas, output bundle contents, run-result receipts, checkpoint formats, or filesystem layouts.
- Adding new LLM profiles, changing profile precedence, or changing credential handling.
- Refactoring the transport-neutral
StructuredLLMClientcontract. - Adding PromptKit features that Notarius does not currently need.
- Preserving version 3 configuration compatibility.
Stage 1: Replace the Dependency and Adapter
Update the Go dependency and the framework adapter as one compilable change.
Implementation
- Replace the Scriptorium requirement with
gitea.maximumdirect.net/eric/promptkit v0.1.0, then rungo mod tidysogo.modandgo.sumcontain no obsolete Scriptorium module entries. - In
internal/framework/llm, replace imports ofgitea.maximumdirect.net/eric/scriptoriumwith PromptKit and rename:scriptorium_client.gotopromptkit_client.go;ScriptoriumClientConfigtoPromptKitClientConfig;ScriptoriumClienttoPromptKitClient;NewScriptoriumClienttoNewPromptKitClient;AssetRegistry.ScriptoriumOptionstoAssetRegistry.PromptKitOptions; and- Scriptorium-named private input, variable, metadata, debug, response, validation, and error-redaction helpers to PromptKit terminology.
- Do not retain aliases for the old types, constructor, method, filenames, or private helpers.
- Preserve the existing adapter sequence:
- validate the transport-neutral request and output target;
- map inputs, variables, metadata, prompt identity, profile identity, and
session prompt variable into a PromptKit
RunRequest; - call
Prepareto capture rendered debug material; - call
Run; - translate PromptKit validation failure into
contracts.ErrInvalidStructuredOutput; - decode the structured artifact into the caller's target; and
- return transport-neutral response, usage, profile, and debug data.
- Continue wrapping and redacting upstream errors at the same trust boundary. Update safe wrapper text from Scriptorium to PromptKit without exposing prompt content, credentials, artifact content, filesystem paths, or raw upstream payloads.
- Rename the adapter provenance constant and change its value from
scriptoriumtopromptkit. - Preserve PromptKit's cancellation and timeout semantics. Do not introduce another timeout wrapper in Notarius.
- Update the production composition root in
internal/cli/catalog.goto constructPromptKitClientConfigandNewPromptKitClient.
Tests
- Rename and adapt the existing adapter and asset-registry tests; do not add tests whose only purpose is to enforce private symbol or filename choices.
- Through the adapter's stable behavior, retain coverage for:
- engine and asset construction failures;
- prompt, schema, input, variable, metadata, and profile forwarding;
- structured-output success and validation failure;
- malformed or empty generated output;
- caller cancellation and configured timeout behavior;
- credential and content redaction;
- raw response and prepared-prompt debug capture;
- token usage, including cached and cache-write token fields; and
- profile manifest recording.
- Use injected PromptKit clients or local deterministic HTTP test servers. Default tests must remain offline and must not require credentials or paid model calls.
Completion Criteria
- The framework and production CLI compile against PromptKit only.
- No Go import of the Scriptorium module remains.
- Existing adapter behavior is preserved except that response and manifest
provenance now identify
promptkit.
Stage 2: Introduce Version 4 PromptKit Configuration
Make the user-visible configuration terminology agree with the dependency and adapter.
Implementation
-
Change
SupportedFileConfigVersionfrom 3 to 4. -
In
internal/core/config, rename:ScriptoriumConfigtoPromptKitConfig;FileScriptoriumConfigtoFilePromptKitConfig;Config.ScriptoriumtoConfig.PromptKit;FileConfig.ScriptoriumtoFileConfig.PromptKit; and- Scriptorium-named validation and application helpers to PromptKit terminology.
-
Change the runtime JSON and file YAML section name from
scriptoriumtopromptkit. -
Preserve the two optional fields and their meaning:
version: 4 promptkit: profile_dir: /path/to/profiles # profile_file: /path/to/profiles.yml -
Preserve trimming, clone, apply, effective-configuration, and redaction behavior for
profile_dirandprofile_file. -
Preserve the rule that
profile_dirandprofile_fileare mutually exclusive and that an explicitly supplied value must not be empty. -
Update production client construction and explicit-profile validation to read
cfg.PromptKit. -
Rename
internal/cli/scriptorium_profiles.goand its functions to PromptKit terminology. Preserve the existing profile validation timing anderrors.Is-based handling of PromptKit'sErrProfileNotFound. -
Keep YAML decoding strict. A version 4 file containing
scriptoriummust fail as an unknown field. -
Add a targeted version 3 migration diagnostic that instructs users to:
- change
version: 3toversion: 4; and - rename
scriptorium:topromptkit:. Do not attempt to decode or automatically rewrite version 3 files.
- change
-
Update maintained configuration examples to version 4 and use
promptkitwherever profile sources are demonstrated.
Tests
- Update configuration contract tests to establish:
- a minimal version 4 file applies over defaults;
- explicit PromptKit profile directory and profile file values decode and survive apply, clone, and effective configuration;
- the two profile sources remain mutually exclusive;
- explicit empty values remain invalid;
- unknown fields remain rejected by strict decoding;
- version 4 rejects the removed
scriptoriumkey; and - version 3 produces the actionable migration classification.
- Update CLI contract tests to demonstrate that configured and explicitly selected PromptKit profiles are validated before pipeline preparation and that invalid profiles retain the existing process-failure behavior.
- Test configuration behavior at the parser/configuration and CLI composition boundaries. Do not reproduce PromptKit's own profile parser test matrix.
Completion Criteria
- All runtime and file configuration code uses PromptKit terminology.
- Maintained examples are valid version 4 files.
- The obsolete section is rejected rather than silently accepted or ignored.
Stage 3: Make Module Prompt-Asset Support Provider-Neutral
Remove dependency-brand terminology from module-owned prompt asset registration without changing the assets themselves.
Implementation
- Across the D&D scene chunker, extractors, NPC normalizer, and registration
support, rename each
scriptorium_assets.goand corresponding test file toprompt_assets.goandprompt_assets_test.go. - Rename private helpers and values such as
scriptoriumPromptRoot,scriptoriumPromptMetadata, and equivalent schema registration names to provider-neutral forms such aspromptAssetRootandpromptAssetMetadata. - Retain PromptKit terminology only where code directly calls a PromptKit API,
such as producing
promptkit.Optionvalues at the framework asset registry boundary. - Do not change:
- prompt or schema contents;
- prompt, schema, or asset IDs and versions;
- embedded filesystem paths;
- message ordering or cache-control placement;
- module keys or declared prompt inputs;
- metadata values or content fingerprint algorithms; or
- extraction, normalization, or validation behavior.
Tests
- Update existing module prompt-preparation and registration tests to compile through the renamed support code.
- Retain the centralized behavioral coverage that all registered production prompts and schemas can be mounted and prepared with their declared inputs.
- Retain prompt ordering and cache-prefix contract coverage where ordering is semantically significant.
- Do not add word-presence tests, rename detectors, or private-helper tests.
Completion Criteria
- Module-owned code no longer describes its prompt assets as Scriptorium assets.
- Prompt and schema fingerprints remain unchanged from the pre-migration source content.
Stage 4: Align Provenance and Checkpoint Behavior
Make the intentional public provenance change explicit while leaving cache identity tied to semantic inputs.
Implementation
- Record
Provider: "promptkit"in every newly observedLLMProfileManifestandStructuredCompletionResponseproduced by the production adapter. - Update manifest, debug, artifact, and assembled-run expectations that currently identify Scriptorium.
- Do not change checkpoint schemas, layouts, or the
CheckpointFingerprintProvidercontract. - Do not introduce a fingerprint containing the PromptKit package name or version. Dependency implementation identity is not a stable semantic identity.
- Verify that no accidental prompt, schema, component, reference, profile, or runtime-override fingerprint changes result from the provider-neutral file and helper renames.
- If an existing test fixture contains recorded LLM provenance, update only the adapter/provider value and preserve the profile ID, model, usage, and remaining run data.
Tests
- At the adapter boundary, assert that a successful completion and recorded
profile manifest report
promptkit. - At one assembled run boundary, confirm that the finalized manifest carries the PromptKit profile provenance observed by the client.
- Retain existing checkpoint identity tests for semantic prompt, module, profile, reference, and runtime changes. Do not add a test coupled only to the absence of a dependency-version fingerprint.
Completion Criteria
- New durable and debug provenance consistently identifies PromptKit.
- No checkpoint wire-format or layout change has been introduced.
Stage 5: Update Canonical Documentation
Update documentation in the same change that implements the behavior, following the repository's canonical ownership rules.
Implementation
- Update
docs/config.mdto own:- configuration version 4;
- the
promptkitsection and its fields; - mutual exclusion and validation rules; and
- the version 3-to-4 migration instruction.
- Update
docs/operations.mdto describe provider retries and timeouts as PromptKit profile behavior and accurately summarize the timeout layers. - Update
docs/internal/llm.mdto describe:- the PromptKit-backed adapter;
- transport-neutral request and response mapping;
- asset mounting;
- preparation, execution, validation, redaction, and debug behavior;
- profile provenance; and
- caller, generation, and transport timeout ownership.
- Update
docs/internal/cli.mdto describe PromptKit profile validation and production client composition. - Update
docs/development.mdso its task-reading guide refers to the PromptKit integration. - Update any maintained examples and nearby navigation links. Configuration
definitions and defaults remain canonical in
docs/config.md; other documents should summarize and link rather than repeat them. - Replace the copied
docs/integrations/pkg-promptkit.mdguide with a concise Notarius-owned upstream boundary document. It must:- identify the pinned PromptKit package and supported public boundary used by Notarius;
- link to PromptKit's canonical upstream package and format documentation;
- describe only integration facts that Notarius relies upon;
- point to
docs/internal/llm.mdfor Notarius implementation behavior; and - contain no copied relative links that resolve only inside the PromptKit source repository.
- Update
docs/roadmap/future.mdto replace Scriptorium terminology in the native-session item with PromptKit. Keep the work deferred and state accurately that PromptKitv0.1.0does not yet provide the desired direct request-level session field. Do not imply that existing prompt-variable propagation is native provider session support. - Search all maintained Go, Markdown, YAML, JSON, and module files for
remaining
Scriptoriumorscriptoriumoccurrences. Retain the old name only where necessary to explain the one-time version 3 migration or historical context. - Validate affected relative documentation links.
Completion Criteria
- Current-behavior documentation outside
docs/roadmapdescribes the implemented PromptKit integration only. - Configuration and operational facts have one canonical owner.
- The integration document is Notarius-specific and does not duplicate or impersonate upstream package documentation.
Stage 6: Repository-Wide Verification
Complete the migration with focused and repository-wide validation.
Required Checks
Run:
git diff --check
go mod tidy
go test ./...
go vet ./...
go build ./cmd/notarius
go test -race ./internal/framework/llm ./internal/cli ./internal/modules/dnd/...
Also verify:
go.modandgo.sumcontain PromptKit and no Scriptorium dependency;- the repository contains no obsolete Scriptorium Go identifiers or imports;
- any remaining textual use of Scriptorium is limited to intentional migration or historical explanation;
- maintained configuration examples parse successfully as version 4;
- tests remain deterministic, offline, and independent of real credentials;
- no prompt, schema, artifact, or checkpoint format changed unintentionally; and
- no secrets, prompt payloads, source content, or private infrastructure paths were introduced into code, errors, tests, or documentation.
Open Questions
None. The dependency version, compatibility policy, configuration migration, internal naming, provenance value, checkpoint treatment, session scope, documentation ownership, and verification boundaries are decided above.