diff --git a/README.md b/README.md index 6c20c73..733c534 100644 --- a/README.md +++ b/README.md @@ -8,7 +8,7 @@ application state. ## Variables ```yaml -narratio_version: v2.0.0 +narratio_version: v2.1.0 narratio_repository_url: https://gitea.maximumdirect.net/eric/narratio.git narratio_source_dir: /usr/local/src/narratio narratio_binary_path: /usr/local/bin/narratio @@ -108,6 +108,9 @@ narratio_notarius_config_path: null narratio_notarius_pipeline_id: null narratio_notarius_timeout: null narratio_notarius_working_directory: null +narratio_notarius_llm_api_key: null +narratio_notarius_resume: null +narratio_notarius_chunk_cache: null narratio_notarius_references: null narratio_notarius_outputs: null narratio_notification_mode: null @@ -133,7 +136,12 @@ falsey values are preserved. `narratio_publish_outputs`, `narratio_scriptorium_artifacts`, and `narratio_scriptorium_artifact_families` are complete native caller values, so callers may compose them before assigning them and the role does not merge or rewrite them. Credential fields name -environment variables only; credential values remain outside this role. +environment variables only; credential values remain outside this role and are +the caller's responsibility. `narratio_notarius_llm_api_key` names the +environment variable that Narratio forwards to Notarius. The optional +`narratio_notarius_resume` and `narratio_notarius_chunk_cache` settings expose +Narratio's native extraction and chunk-plan choices; this generic role assigns +no D&D-specific credential or cache policy. ConfigKit imports and profile overlays are externally managed, and this role does not install the downstream applications, campaign content, or suite policy. @@ -152,10 +160,11 @@ does not install the downstream applications, campaign content, or suite policy. The repository-local integration suite installs its pinned collection and runs syntax checking and production-profile lint. It validates a baseline managed pipeline through Narratio as its application account and requires immediate -clean repeated convergence. It explicitly selects `v2.0.0` and checks native +clean repeated convergence. It explicitly selects `v2.1.0` and checks native version output, then combines missing-binary recovery with a caller-supplied Go executable while dependency management is disabled. A representative pipeline -checks null omission, falsey values, and caller-composed native collections +checks null omission, falsey values, caller-composed native collections, and +the native Notarius credential-reference, `resume`, and chunk-cache fields before native validation and a clean repeat. The suite restores the baseline deployment during cleanup. diff --git a/defaults/main.yml b/defaults/main.yml index 51ea974..395269e 100644 --- a/defaults/main.yml +++ b/defaults/main.yml @@ -1,5 +1,5 @@ --- -narratio_version: v2.0.0 +narratio_version: v2.1.0 narratio_repository_url: https://gitea.maximumdirect.net/eric/narratio.git narratio_source_dir: /usr/local/src/narratio narratio_binary_path: /usr/local/bin/narratio @@ -93,6 +93,9 @@ narratio_notarius_config_path: null narratio_notarius_pipeline_id: null narratio_notarius_timeout: null narratio_notarius_working_directory: null +narratio_notarius_llm_api_key: null +narratio_notarius_resume: null +narratio_notarius_chunk_cache: null narratio_notarius_references: null narratio_notarius_outputs: null narratio_notification_mode: null diff --git a/meta/argument_specs.yml b/meta/argument_specs.yml index 74060d5..e626c1c 100644 --- a/meta/argument_specs.yml +++ b/meta/argument_specs.yml @@ -98,6 +98,9 @@ argument_specs: narratio_notarius_pipeline_id: {type: str, required: false} narratio_notarius_timeout: {type: str, required: false} narratio_notarius_working_directory: {type: str, required: false} + narratio_notarius_llm_api_key: {type: str, required: false} + narratio_notarius_resume: {type: bool, required: false} + narratio_notarius_chunk_cache: {type: str, required: false} narratio_notarius_references: {type: dict, required: false} narratio_notarius_outputs: {type: dict, required: false} narratio_notification_mode: {type: str, required: false} diff --git a/templates/pipeline.yml.j2 b/templates/pipeline.yml.j2 index 972bd9d..70921d3 100644 --- a/templates/pipeline.yml.j2 +++ b/templates/pipeline.yml.j2 @@ -253,7 +253,7 @@ scriptorium: artifact_families: {{ narratio_scriptorium_artifact_families | to_json }} {% endif %} {% endif %} -{% if narratio_notarius_enabled is not none or narratio_notarius_binary is not none or narratio_notarius_config_path is not none or narratio_notarius_pipeline_id is not none or narratio_notarius_timeout is not none or narratio_notarius_working_directory is not none or narratio_notarius_references is not none or narratio_notarius_outputs is not none %} +{% if narratio_notarius_enabled is not none or narratio_notarius_binary is not none or narratio_notarius_config_path is not none or narratio_notarius_pipeline_id is not none or narratio_notarius_timeout is not none or narratio_notarius_working_directory is not none or narratio_notarius_llm_api_key is not none or narratio_notarius_resume is not none or narratio_notarius_chunk_cache is not none or narratio_notarius_references is not none or narratio_notarius_outputs is not none %} notarius: {% if narratio_notarius_enabled is not none %} enabled: {{ narratio_notarius_enabled | to_json }} @@ -273,6 +273,15 @@ notarius: {% if narratio_notarius_working_directory is not none %} working_directory: {{ narratio_notarius_working_directory | to_json }} {% endif %} +{% if narratio_notarius_llm_api_key is not none %} + llm_api_key: {{ narratio_notarius_llm_api_key | to_json }} +{% endif %} +{% if narratio_notarius_resume is not none %} + resume: {{ narratio_notarius_resume | to_json }} +{% endif %} +{% if narratio_notarius_chunk_cache is not none %} + chunk_cache: {{ narratio_notarius_chunk_cache | to_json }} +{% endif %} {% if narratio_notarius_references is not none %} references: {{ narratio_notarius_references | to_json }} {% endif %} diff --git a/tests/integration b/tests/integration index 0ce93f6..93cba87 100755 --- a/tests/integration +++ b/tests/integration @@ -56,8 +56,8 @@ run_converge "$baseline_repeat_log" "${baseline_args[@]}" require_clean_recap "$baseline_repeat_log" selected_version_log="$test_tmp/selected-version.log" -run_converge "$selected_version_log" "${baseline_args[@]}" -e 'narratio_version=v2.0.0' -/usr/local/bin/narratio version | grep -Fx 'narratio v2.0.0' +run_converge "$selected_version_log" "${baseline_args[@]}" -e 'narratio_version=v2.1.0' +/usr/local/bin/narratio version | grep -Fx 'narratio v2.1.0' custom_go_binary="$test_tmp/go" custom_go_invocations="$test_tmp/go-invocations.log" @@ -73,7 +73,7 @@ run_converge "$recovery_log" "${baseline_args[@]}" \ -e '{"narratio_manage_build_dependencies": false}' \ -e "narratio_go_binary=$custom_go_binary" grep -q . "$custom_go_invocations" -/usr/local/bin/narratio version | grep -Fx 'narratio v2.0.0' +/usr/local/bin/narratio version | grep -Fx 'narratio v2.1.0' "$ansible_playbook" -i "$inventory" "$verify_baseline" recovery_repeat_log="$test_tmp/recovery-repeat.log" run_converge "$recovery_repeat_log" "${baseline_args[@]}" \ @@ -83,7 +83,11 @@ require_clean_recap "$recovery_repeat_log" representative_log="$test_tmp/representative.log" "$ansible_playbook" -i "$inventory" "$representative" | tee "$representative_log" -"$ansible_playbook" -i "$inventory" "$verify_config" +synthetic_notarius_api_key=notarius-representative-synthetic-value +representative_validation_log="$test_tmp/representative-validation.log" +NARRATIO_TEST_NOTARIUS_API_KEY="$synthetic_notarius_api_key" \ + "$ansible_playbook" -i "$inventory" "$verify_config" | tee "$representative_validation_log" +! grep -Fq "$synthetic_notarius_api_key" "$representative_log" "$representative_validation_log" representative_repeat_log="$test_tmp/representative-repeat.log" "$ansible_playbook" -i "$inventory" "$representative" | tee "$representative_repeat_log" require_clean_recap "$representative_repeat_log" diff --git a/tests/representative.yml b/tests/representative.yml index 1b86fa5..986ca6d 100644 --- a/tests/representative.yml +++ b/tests/representative.yml @@ -25,6 +25,9 @@ narratio_seriatim_report: false narratio_audita_modules: [] narratio_audita_report: false + narratio_notarius_llm_api_key: NARRATIO_TEST_NOTARIUS_API_KEY + narratio_notarius_resume: false + narratio_notarius_chunk_cache: auto narratio_normalize_output_path: null narratio_trim_enabled: false narratio_trim_bounds_render_debug: false diff --git a/tests/verify-baseline.yml b/tests/verify-baseline.yml index 6ea8924..9ddc48c 100644 --- a/tests/verify-baseline.yml +++ b/tests/verify-baseline.yml @@ -3,6 +3,19 @@ hosts: localhost gather_facts: false tasks: + - name: Read the baseline pipeline + become: true + ansible.builtin.slurp: + src: /usr/local/etc/narratio/pipeline.yml + register: narratio_baseline_pipeline + + - name: Verify null Notarius fields are omitted + ansible.builtin.assert: + that: + - "'notarius' not in narratio_pipeline" + vars: + narratio_pipeline: "{{ narratio_baseline_pipeline.content | b64decode | from_yaml }}" + - name: Validate the pipeline as the Narratio account become: true become_user: narratio diff --git a/tests/verify-config.yml b/tests/verify-config.yml index a6b78f4..c159e53 100644 --- a/tests/verify-config.yml +++ b/tests/verify-config.yml @@ -25,6 +25,9 @@ - narratio_pipeline.seriatim.report == false - narratio_pipeline.audita.modules == [] - narratio_pipeline.audita.report == false + - narratio_pipeline.notarius.llm_api_key == 'NARRATIO_TEST_NOTARIUS_API_KEY' + - narratio_pipeline.notarius.resume == false + - narratio_pipeline.notarius.chunk_cache == 'auto' - narratio_pipeline.trim.enabled == false - narratio_pipeline.trim.bounds.render_debug == false - narratio_pipeline.render.enabled == false @@ -47,4 +50,6 @@ - validate - --config - /usr/local/etc/narratio/pipeline.yml + environment: + NARRATIO_TEST_NOTARIUS_API_KEY: "{{ lookup('ansible.builtin.env', 'NARRATIO_TEST_NOTARIUS_API_KEY') }}" changed_when: false