Document and test the D&D Notarius integration

This commit is contained in:
2026-09-15 21:00:37 +00:00
parent 90893ae63c
commit 7fd7b240c5
2 changed files with 88 additions and 17 deletions

View File

@@ -41,7 +41,7 @@ The compatible application versions are selected through these variables:
| --- | --- | | --- | --- |
| `dnd_pipeline_audita_version` | `v0.9.1` | | `dnd_pipeline_audita_version` | `v0.9.1` |
| `dnd_pipeline_narratio_version` | `v2.0.0` | | `dnd_pipeline_narratio_version` | `v2.0.0` |
| `dnd_pipeline_notarius_version` | `v0.6.0` | | `dnd_pipeline_notarius_version` | `v0.7.0` |
| `dnd_pipeline_seriatim_version` | `v1.5.0` | | `dnd_pipeline_seriatim_version` | `v1.5.0` |
| `dnd_pipeline_scriptorium_version` | `v0.13.0` | | `dnd_pipeline_scriptorium_version` | `v0.13.0` |
| `dnd_pipeline_manage_build_dependencies` | `true` | | `dnd_pipeline_manage_build_dependencies` | `true` |
@@ -78,8 +78,7 @@ not an operator-editable configuration surface.
Narratio receives the standard Seriatim, Audita, Notarius, and Scriptorium Narratio receives the standard Seriatim, Audita, Notarius, and Scriptorium
binary and configuration paths managed by the composed roles. Notarius is binary and configuration paths managed by the composed roles. Notarius is
installed but remains disabled in Narratio until a later feature supplies a enabled with the suite-owned `dnd-session` extraction pipeline.
Notarius pipeline.
The role deploys the campaign repository directly at the campaign root and The role deploys the campaign repository directly at the campaign root and
the prompt library directly at the prompt-library root. By default both follow the prompt library directly at the prompt-library root. By default both follow
@@ -176,6 +175,41 @@ different testing profile is appropriate:
dnd_pipeline_narratio_testing_scriptorium_profile: endpoint-profile dnd_pipeline_narratio_testing_scriptorium_profile: endpoint-profile
``` ```
### Notarius extraction policy
The Notarius root configuration imports the fixed
`pipelines/dnd-session.yml` fragment. The suite owns that fragment at
`/usr/local/etc/notarius/pipelines/dnd-session.yml`; callers do not edit it.
| Variable | Default policy |
| --- | --- |
| `dnd_pipeline_notarius_pipelines` | Complete native map containing `dnd-session` |
| `dnd_pipeline_notarius_cache_root` | `/var/cache/notarius` |
| `dnd_pipeline_notarius_cache_chunk_plans_mode` | `auto` |
| `dnd_pipeline_notarius_cache_checkpoints_enabled` | `true` |
| `dnd_pipeline_narratio_notarius_pipeline_id` | `dnd-session` |
| `dnd_pipeline_narratio_notarius_references` | `party`, `players`, and `glossary` prepared sources |
| `dnd_pipeline_narratio_notarius_outputs` | Complete native map of ten accepted D&D lanes |
The pipeline, reference, and output values are complete native mappings.
Inventory can replace them or compose additions with Jinja's `combine` filter;
a replacement pipeline map requires a matching selected pipeline ID.
Narratio materializes the `party`, `players`, and `glossary` references for each
invocation. No campaign filesystem path appears in Notarius configuration. The
optional `spell_catalog` reference remains absent until a campaign supplies
that input. The accepted sources are
`narratio.extraction.item_registry`, `npc_registry`, `location_registry`,
`scene_descriptions`, `item_occurrences`, `spells`, `combat_turns`,
`npc_occurrences`, `location_occurrences`, and `enemy_events`.
Chunk plans use `auto` caching and checkpoints are recorded but not resumed.
The `chunk-plans` and `checkpoints` paths derive from the cache root and are
created by Notarius during use. Base and `testing` configurations select the
same `dnd-extraction` profile and Notarius pipeline; the testing overlay changes
only Scriptorium profiles, so a real testing run may invoke Notarius. The
integration suite performs offline configuration inspection only.
### Inspecting configuration ### Inspecting configuration
The following native Narratio commands resolve configuration without running The following native Narratio commands resolve configuration without running
@@ -198,13 +232,14 @@ inspection shows enabled sources, inferred dependencies, and generated family
members; the diff shows the overlay's profile selections without modifying members; the diff shows the overlay's profile selections without modifying
managed files. managed files.
API keys, Notarius enablement, storage and publishing, operator selection and API keys, storage and publishing, operator selection and
group-membership management, scheduling, and end-to-end external execution group-membership management, scheduling, and end-to-end external execution
remain deferred. remain deferred.
### Shared execution filesystem ### Shared execution filesystem
`/var/lib/narratio`, `/var/spool/narratio`, and `/var/cache/narratio` are `/var/lib/narratio`, `/var/spool/narratio`, `/var/cache/narratio`, and
`/var/cache/notarius` are
`narratio:narratio` mode `2775` **setgid** directories. Their access and `narratio:narratio` mode `2775` **setgid** directories. Their access and
default ACLs retain owner and group write access plus world read/traverse access default ACLs retain owner and group write access plus world read/traverse access
for newly created content. The pipeline may run as `narratio` or as a human for newly created content. The pipeline may run as `narratio` or as a human
@@ -233,13 +268,14 @@ create or populate that subtree.
private temporary paths, runs syntax and production-profile lint checks, then private temporary paths, runs syntax and production-profile lint checks, then
applies the suite with a local syntactically valid WhisperX URL and explicit applies the suite with a local syntactically valid WhisperX URL and explicit
immutable `file://` asset inputs. It uses native application immutable `file://` asset inputs. It uses native application
smoke/configuration commands, validates Narratio's assembled configuration and smoke/configuration commands, validates Notarius's imported pipeline and
campaign discovery as the Narratio account, and inspects deployed Scriptorium effective cache policy, and validates Narratio for both deployed campaigns and
prompts and a schema path. It also validates the same Narratio configuration as the testing overlay. It inspects enabled Notarius wiring through Narratio's
a temporary existing-group-member fixture, exercises representative shared-root native effective configuration, validates the same imported Notarius pipeline
access across the service and fixture identities, and confirms that `nobody` as a temporary existing-group-member fixture, exercises representative shared
can read ordinary configuration. It requires immediate clean repeats, then cache access across the service and fixture identities, and confirms that
selects Seriatim `v1.4.0` through the suite interface and requires a clean `nobody` can read ordinary configuration. It also composes an alternate pair of
repeat of that selection. Cleanup reapplies the asset-enabled baseline suite and version-5 pipeline maps through the public interface and requires clean repeats
removes only the fixture account, its named test content, and the driver's for the baseline and override cases. Cleanup reapplies the asset-enabled
private temporary directory. baseline suite and removes only the fixture account, its named test content,
and the driver's private temporary directory.

View File

@@ -19,7 +19,7 @@ prompt_library_root=/usr/local/share/narratio/prompt-library
campaigns_revision=$(git -C "$campaigns_repository" rev-parse HEAD) campaigns_revision=$(git -C "$campaigns_repository" rev-parse HEAD)
prompt_library_revision=$(git -C "$prompt_library_repository" rev-parse HEAD) prompt_library_revision=$(git -C "$prompt_library_repository" rev-parse HEAD)
operator_user="dnd_f0009_${$}" operator_user="dnd_f0009_${$}"
shared_fixture_root="/var/lib/narratio/${operator_user}" shared_fixture_root="/var/cache/notarius/${operator_user}"
service_fixture_file="$shared_fixture_root/service.txt" service_fixture_file="$shared_fixture_root/service.txt"
operator_fixture_file="$shared_fixture_root/operator.txt" operator_fixture_file="$shared_fixture_root/operator.txt"
baseline_args=( baseline_args=(
@@ -71,13 +71,29 @@ baseline_log="$test_tmp/baseline.log"
run_converge "$baseline_log" "${baseline_args[@]}" run_converge "$baseline_log" "${baseline_args[@]}"
/usr/local/bin/seriatim --version /usr/local/bin/seriatim --version
/usr/local/bin/audita config validate --config /usr/local/etc/audita/config.yml /usr/local/bin/audita config validate --config /usr/local/etc/audita/config.yml
/usr/local/bin/notarius config validate --config /usr/local/etc/notarius/config.yml /usr/local/bin/notarius config validate --config /usr/local/etc/notarius/config.yml \
--pipeline dnd-session
notarius_effective_config="$test_tmp/notarius-effective.yml"
/usr/local/bin/notarius config effective --config /usr/local/etc/notarius/config.yml \
> "$notarius_effective_config"
grep -Fq 'mode: auto' "$notarius_effective_config"
grep -Fq 'step: describe-session' "$notarius_effective_config"
/usr/local/bin/scriptorium inspect profile --config /usr/local/etc/scriptorium/config.yml \ /usr/local/bin/scriptorium inspect profile --config /usr/local/etc/scriptorium/config.yml \
--profile-dir "$profile_dir" --profile endpoint-profile --profile-dir "$profile_dir" --profile endpoint-profile
/usr/bin/sudo -u narratio /usr/local/bin/narratio config validate \ /usr/bin/sudo -u narratio /usr/local/bin/narratio config validate \
--config /usr/local/etc/narratio/pipeline.yml --campaign centaurs --config /usr/local/etc/narratio/pipeline.yml --campaign centaurs
/usr/bin/sudo -u narratio /usr/local/bin/narratio config validate \
--config /usr/local/etc/narratio/pipeline.yml --campaign dilfs
/usr/bin/sudo -u narratio /usr/local/bin/narratio config validate \ /usr/bin/sudo -u narratio /usr/local/bin/narratio config validate \
--config /usr/local/etc/narratio/pipeline.yml --campaign centaurs --profile testing --config /usr/local/etc/narratio/pipeline.yml --campaign centaurs --profile testing
narratio_effective_config="$test_tmp/narratio-effective.yml"
/usr/bin/sudo -u narratio /usr/local/bin/narratio config show \
--config /usr/local/etc/narratio/pipeline.yml --campaign centaurs \
> "$narratio_effective_config"
grep -Fq 'enabled: true' "$narratio_effective_config"
grep -Fq 'pipeline_id: dnd-session' "$narratio_effective_config"
grep -Fq 'party: narratio.input.party' "$narratio_effective_config"
grep -Fq 'lane_id: item-registry' "$narratio_effective_config"
/usr/bin/sudo -u narratio /usr/local/bin/narratio config artifacts \ /usr/bin/sudo -u narratio /usr/local/bin/narratio config artifacts \
--config /usr/local/etc/narratio/pipeline.yml --campaign centaurs | \ --config /usr/local/etc/narratio/pipeline.yml --campaign centaurs | \
awk -F '\t' '$1 == "session_recap" && $4 == "true" { found = 1 } END { exit !found }' awk -F '\t' '$1 == "session_recap" && $4 == "true" { found = 1 } END { exit !found }'
@@ -94,6 +110,8 @@ run_converge "$baseline_log" "${baseline_args[@]}"
--shell /usr/sbin/nologin "$operator_user" --shell /usr/sbin/nologin "$operator_user"
/usr/bin/sudo -u "$operator_user" /usr/local/bin/narratio config validate \ /usr/bin/sudo -u "$operator_user" /usr/local/bin/narratio config validate \
--config /usr/local/etc/narratio/pipeline.yml --campaign centaurs --config /usr/local/etc/narratio/pipeline.yml --campaign centaurs
/usr/bin/sudo -u "$operator_user" /usr/local/bin/notarius config validate \
--config /usr/local/etc/notarius/config.yml --pipeline dnd-session
/usr/bin/sudo -u nobody /bin/cat /usr/local/etc/narratio/pipeline.yml >/dev/null /usr/bin/sudo -u nobody /bin/cat /usr/local/etc/narratio/pipeline.yml >/dev/null
/usr/bin/sudo -u narratio /bin/sh -c \ /usr/bin/sudo -u narratio /bin/sh -c \
"umask 077; mkdir '$shared_fixture_root'; printf '%s\\n' service-created > '$service_fixture_file'" "umask 077; mkdir '$shared_fixture_root'; printf '%s\\n' service-created > '$service_fixture_file'"
@@ -150,3 +168,20 @@ selected_version_repeat_log="$test_tmp/selected-version-repeat.log"
run_converge "$selected_version_repeat_log" "${baseline_args[@]}" \ run_converge "$selected_version_repeat_log" "${baseline_args[@]}" \
-e 'dnd_pipeline_seriatim_version=v1.4.0' -e 'dnd_pipeline_seriatim_version=v1.4.0'
require_clean_recap "$selected_version_repeat_log" require_clean_recap "$selected_version_repeat_log"
pipeline_group_one='{"archive-session":{"llm_profile":"dnd-extraction","input":{"module":"seriatim"},"artifacts":{"spells":{"extract":{"module":"dnd/spells"},"normalize":{"module":"dnd/spells"}}}}}'
pipeline_group_two='{"research-session":{"llm_profile":"dnd-extraction","input":{"module":"seriatim"},"artifacts":{"spells":{"extract":{"module":"dnd/spells"},"normalize":{"module":"dnd/spells"}}}}}'
alternate_config="{\"notarius_pipeline_group_one\":$pipeline_group_one,\"notarius_pipeline_group_two\":$pipeline_group_two,\"dnd_pipeline_notarius_pipelines\":\"{{ notarius_pipeline_group_one | combine(notarius_pipeline_group_two) }}\",\"dnd_pipeline_narratio_notarius_pipeline_id\":\"archive-session\",\"dnd_pipeline_notarius_cache_chunk_plans_mode\":\"bypass\"}"
alternate_log="$test_tmp/alternate.log"
run_converge "$alternate_log" "${baseline_args[@]}" -e "$alternate_config"
/usr/local/bin/notarius config validate --config /usr/local/etc/notarius/config.yml \
--pipeline archive-session
alternate_effective_config="$test_tmp/alternate-effective.yml"
/usr/local/bin/notarius config effective --config /usr/local/etc/notarius/config.yml \
> "$alternate_effective_config"
grep -Fq 'archive-session:' "$alternate_effective_config"
grep -Fq 'research-session:' "$alternate_effective_config"
grep -Fq 'mode: bypass' "$alternate_effective_config"
alternate_repeat_log="$test_tmp/alternate-repeat.log"
run_converge "$alternate_repeat_log" "${baseline_args[@]}" -e "$alternate_config"
require_clean_recap "$alternate_repeat_log"