Compare commits
27 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| cbcb1b3778 | |||
| 39052bf47e | |||
| 7cd5edd650 | |||
| 2d41748006 | |||
| 1d4be9988e | |||
| ed65aa6474 | |||
| 4c5536ab78 | |||
| b01180ea83 | |||
| 07fab5586b | |||
| 6debe7e641 | |||
| 11c349d9ae | |||
| 36823c91fb | |||
| 17421bc5f3 | |||
| bd62f360a7 | |||
| 5a11b34aad | |||
| f9cf5c3861 | |||
| ea223fcf98 | |||
| 8d416558a3 | |||
| 561a84fcf8 | |||
| 3c405f0524 | |||
| 5ac704c4c4 | |||
| 5af6ba7d89 | |||
| 06dc273896 | |||
| 7e7940db9a | |||
| 721365e59d | |||
| 418da456d7 | |||
| 6de470b53d |
@@ -1,26 +1,50 @@
|
|||||||
|
matrix:
|
||||||
|
include:
|
||||||
|
- GO_IMAGE: golang:1.26.8-bookworm
|
||||||
|
|
||||||
when:
|
when:
|
||||||
- event: tag
|
- event: tag
|
||||||
|
ref: refs/tags/v*
|
||||||
|
|
||||||
steps:
|
steps:
|
||||||
- name: build-release-assets
|
- name: deliver
|
||||||
image: golang:1.25.5
|
image: ${GO_IMAGE}
|
||||||
commands:
|
environment:
|
||||||
- bash scripts/build-release.sh "$CI_COMMIT_TAG" dist
|
RELEASEKIT_GITEA_TOKEN:
|
||||||
|
|
||||||
- name: publish-release
|
|
||||||
image: woodpeckerci/plugin-release
|
|
||||||
depends_on:
|
|
||||||
- build-release-assets
|
|
||||||
settings:
|
|
||||||
api_key:
|
|
||||||
from_secret: GITEA_RELEASE_TOKEN
|
from_secret: GITEA_RELEASE_TOKEN
|
||||||
files:
|
commands:
|
||||||
- dist/audita-*-linux-amd64
|
- |
|
||||||
- dist/audita-*-linux-arm64
|
set -eu
|
||||||
note: docs/releases/${CI_COMMIT_TAG}.md
|
test -n "$${CI_COMMIT_TAG}"
|
||||||
checksum: sha256
|
test -n "$${CI_COMMIT_SHA}"
|
||||||
checksum-file: SHA256SUMS
|
git check-ref-format "refs/tags/$${CI_COMMIT_TAG}"
|
||||||
checksum-flatten: true
|
git fetch origin "refs/tags/$${CI_COMMIT_TAG}:refs/tags/$${CI_COMMIT_TAG}"
|
||||||
file-exists: skip
|
tag_commit=$(git rev-parse "refs/tags/$${CI_COMMIT_TAG}^{commit}")
|
||||||
overwrite: false
|
expected_commit=$(git rev-parse --verify "$${CI_COMMIT_SHA}^{commit}")
|
||||||
prerelease: false
|
test "$(printf '%s' "$${tag_commit}" | tr '[:upper:]' '[:lower:]')" = "$${expected_commit}"
|
||||||
|
git checkout --detach "$${tag_commit}"
|
||||||
|
test "$(git rev-parse HEAD | tr '[:upper:]' '[:lower:]')" = "$${expected_commit}"
|
||||||
|
test -z "$(git status --porcelain --untracked-files=all)"
|
||||||
|
|
||||||
|
bootstrap_dir=$(mktemp -d "$${CI_WORKSPACE%/*}/.releasekit-bootstrap.XXXXXX")
|
||||||
|
trap 'rm -rf "$${bootstrap_dir}"' EXIT
|
||||||
|
cp go.mod "$${bootstrap_dir}/go.mod"
|
||||||
|
if [ -f go.sum ]; then
|
||||||
|
cp go.sum "$${bootstrap_dir}/go.sum"
|
||||||
|
else
|
||||||
|
: > "$${bootstrap_dir}/go.sum"
|
||||||
|
fi
|
||||||
|
cp "$${bootstrap_dir}/go.mod" "$${bootstrap_dir}/releasekit.mod"
|
||||||
|
cp "$${bootstrap_dir}/go.sum" "$${bootstrap_dir}/releasekit.sum"
|
||||||
|
|
||||||
|
export GOWORK=off
|
||||||
|
export GOTOOLCHAIN=local
|
||||||
|
releasekit_module=gitea.maximumdirect.net/eric/ReleaseKit
|
||||||
|
go list -mod=mod -modfile="$${bootstrap_dir}/releasekit.mod" -m "$${releasekit_module}"
|
||||||
|
go build -mod=mod -modfile="$${bootstrap_dir}/releasekit.mod" \
|
||||||
|
-o "$${bootstrap_dir}/releasekit" "$${releasekit_module}/cmd/releasekit"
|
||||||
|
"$${bootstrap_dir}/releasekit" ci-deliver \
|
||||||
|
--repo "$${CI_WORKSPACE}" \
|
||||||
|
--prepared \
|
||||||
|
--commit "$${expected_commit}" \
|
||||||
|
"$${CI_COMMIT_TAG}"
|
||||||
|
|||||||
@@ -6,7 +6,7 @@ reports for review and subprocess integration.
|
|||||||
|
|
||||||
## Quickstart
|
## Quickstart
|
||||||
|
|
||||||
From a checkout, build with Go 1.25.5 or newer:
|
From a checkout, build with Go 1.26.0 or newer:
|
||||||
|
|
||||||
```sh
|
```sh
|
||||||
go build -o ./bin/audita ./cmd/audita
|
go build -o ./bin/audita ./cmd/audita
|
||||||
|
|||||||
@@ -6,7 +6,7 @@ import (
|
|||||||
"os/signal"
|
"os/signal"
|
||||||
"syscall"
|
"syscall"
|
||||||
|
|
||||||
"gitea.maximumdirect.net/eric/audita/internal/cli"
|
"gitea.maximumdirect.net/eric/audita/v3/internal/cli"
|
||||||
)
|
)
|
||||||
|
|
||||||
func main() {
|
func main() {
|
||||||
|
|||||||
@@ -19,9 +19,9 @@ import (
|
|||||||
"testing"
|
"testing"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
"gitea.maximumdirect.net/eric/audita/internal/cli"
|
"gitea.maximumdirect.net/eric/audita/v3/internal/cli"
|
||||||
"gitea.maximumdirect.net/eric/audita/internal/core/reporting"
|
"gitea.maximumdirect.net/eric/audita/v3/internal/core/reporting"
|
||||||
"gitea.maximumdirect.net/eric/audita/internal/core/schema"
|
"gitea.maximumdirect.net/eric/audita/v3/internal/core/schema"
|
||||||
"gopkg.in/yaml.v3"
|
"gopkg.in/yaml.v3"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|||||||
45
docs/adr/0001-releasekit.md
Normal file
45
docs/adr/0001-releasekit.md
Normal file
@@ -0,0 +1,45 @@
|
|||||||
|
# ADR 0001: Adopt ReleaseKit for release management
|
||||||
|
|
||||||
|
## Status
|
||||||
|
|
||||||
|
Accepted.
|
||||||
|
|
||||||
|
## Date
|
||||||
|
|
||||||
|
2026-10-07
|
||||||
|
|
||||||
|
## Context
|
||||||
|
|
||||||
|
Audita maintains custom release scripts, build tooling, delivery configuration,
|
||||||
|
and tests for mechanics shared across applications in the same suite.
|
||||||
|
[ReleaseKit](https://gitea.maximumdirect.net/eric/ReleaseKit) provides a common implementation and standard workflow for
|
||||||
|
those responsibilities.
|
||||||
|
|
||||||
|
## Decision
|
||||||
|
|
||||||
|
Adopt ReleaseKit for shared release validation, source publication, binary
|
||||||
|
builds, version information, and hosted delivery. Audita will follow its standard
|
||||||
|
workflow and supply product identity, delivery targets, release notes, and
|
||||||
|
necessary product-specific checks.
|
||||||
|
|
||||||
|
Better maintainability and less locally owned release-focused code outweigh any
|
||||||
|
small advantage from retaining Audita's custom release procedure. Changes to
|
||||||
|
that procedure are an accepted consequence of standardization.
|
||||||
|
|
||||||
|
## Alternatives considered
|
||||||
|
|
||||||
|
Retaining the custom procedure would preserve its exact behavior and local
|
||||||
|
control. It would also retain responsibility for duplicated mechanics, tests,
|
||||||
|
and maintenance across projects. The shared implementation offers greater
|
||||||
|
long-term value.
|
||||||
|
|
||||||
|
## Consequences
|
||||||
|
|
||||||
|
Audita's release integration becomes smaller, with common mechanics and their
|
||||||
|
tests maintained upstream. Audita benefits from shared fixes and takes on
|
||||||
|
ReleaseKit dependency maintenance.
|
||||||
|
|
||||||
|
Adoption requires updates to release tooling, CI wiring, documentation, and
|
||||||
|
runtime version reporting. The [release policy](../policy/release.md) continues
|
||||||
|
to govern compatibility and release completion; the
|
||||||
|
[release procedure](../release.md) will describe the adopted workflow.
|
||||||
@@ -1,6 +1,11 @@
|
|||||||
# Architectural Decision Records
|
# Architectural Decision Records
|
||||||
|
|
||||||
No ADRs have been recorded here. Use the
|
## Accepted
|
||||||
|
|
||||||
|
- [ADR 0001: Adopt ReleaseKit for release management](0001-releasekit.md) —
|
||||||
|
accepted 2026-10-07.
|
||||||
|
|
||||||
|
Use the
|
||||||
[documentation policy's ADR lifecycle](../policy/documentation.md#architecture-decision-records)
|
[documentation policy's ADR lifecycle](../policy/documentation.md#architecture-decision-records)
|
||||||
for significant decisions. Current architecture belongs in the
|
for significant decisions. Current architecture belongs in the
|
||||||
[architecture policy](../policy/architecture.md); implementation status belongs in
|
[architecture policy](../policy/architecture.md); implementation status belongs in
|
||||||
|
|||||||
11
docs/cli.md
11
docs/cli.md
@@ -11,6 +11,7 @@ the [migration guide](migrations/v2.md) maps retired inputs.
|
|||||||
audita process <transcript.json> --glossary <glossary.yml> [flags]
|
audita process <transcript.json> --glossary <glossary.yml> [flags]
|
||||||
audita config validate --config <config.yml> [flags]
|
audita config validate --config <config.yml> [flags]
|
||||||
audita config print-effective [flags]
|
audita config print-effective [flags]
|
||||||
|
audita version
|
||||||
```
|
```
|
||||||
|
|
||||||
Root invocation, `--help`, `-h`, and command help succeed without loading a config
|
Root invocation, `--help`, `-h`, and command help succeed without loading a config
|
||||||
@@ -26,6 +27,16 @@ Missing system candidates are skipped; inaccessible selected files are errors.
|
|||||||
No file means a configuration error. `AUDITA_CONFIG` is ignored. The selected
|
No file means a configuration error. `AUDITA_CONFIG` is ignored. The selected
|
||||||
overlay is loaded beside the main file, not used to locate profile files.
|
overlay is loaded beside the main file, not used to locate profile files.
|
||||||
|
|
||||||
|
`audita version` prints `audita <version>` and a newline to stdout, with no
|
||||||
|
application configuration or provider setup. It returns `0` on success with
|
||||||
|
empty stderr. `help version`, `version -h`, and `version --help` print command
|
||||||
|
usage to stdout and return `0`. Help follows standard flag parsing and can
|
||||||
|
short-circuit trailing arguments. Other invalid invocations return `2` with a
|
||||||
|
usage error on stderr. The command uses ReleaseKit's public
|
||||||
|
`buildinfo.Version()` accessor. It reports an injected release identifier when
|
||||||
|
present, otherwise the executable's main-module version when available and not
|
||||||
|
`(devel)`, and `dev` when neither source provides a release identifier.
|
||||||
|
|
||||||
## Setting overrides
|
## Setting overrides
|
||||||
|
|
||||||
Only flags actually supplied override file or overlay settings. `--modules ''`
|
Only flags actually supplied override file or overlay settings. `--modules ''`
|
||||||
|
|||||||
@@ -29,8 +29,8 @@ native sibling inheritance before typed decoding. Any input mapping may use
|
|||||||
`extends: <sibling-name>`; the child keeps its key, inherits parent settings, and
|
`extends: <sibling-name>`; the child keeps its key, inherits parent settings, and
|
||||||
overrides them with its own settings. Selected overlay and CLI values therefore
|
overrides them with its own settings. Selected overlay and CLI values therefore
|
||||||
participate in inheritance at their normal precedence. The generic syntax and
|
participate in inheritance at their normal precedence. The generic syntax and
|
||||||
resolution rules are defined by ConfigKit v0.5.0's
|
resolution rules are defined by ConfigKit v0.7.1's
|
||||||
[sibling inheritance contract](https://gitea.maximumdirect.net/eric/ConfigKit/src/tag/v0.5.0/docs/config.md#sibling-inheritance).
|
[sibling inheritance contract](https://gitea.maximumdirect.net/eric/ConfigKit/src/tag/v0.7.1/docs/config.md#sibling-inheritance).
|
||||||
|
|
||||||
`extends` is reserved structural input in base files, imports, overlays, and
|
`extends` is reserved structural input in base files, imports, overlays, and
|
||||||
other application input mappings, including mapping values supplied by explicit
|
other application input mappings, including mapping values supplied by explicit
|
||||||
@@ -107,7 +107,7 @@ Presence matters. Explicit `temperature: 0` is sent as zero; omission leaves it
|
|||||||
unspecified; null suppresses an inherited temperature. Other fields have their
|
unspecified; null suppresses an inherited temperature. Other fields have their
|
||||||
own native null and omission rules. Provider `extra_params` maps merge
|
own native null and omission rules. Provider `extra_params` maps merge
|
||||||
recursively, and a null provider value is sent as JSON null. See the pinned
|
recursively, and a null provider value is sent as JSON null. See the pinned
|
||||||
[PromptKit format reference](https://gitea.maximumdirect.net/eric/promptkit/src/tag/v0.12.0/docs/formats.md)
|
[PromptKit format reference](https://gitea.maximumdirect.net/eric/promptkit/src/tag/v0.14.0/docs/formats.md)
|
||||||
for the complete field semantics.
|
for the complete field semantics.
|
||||||
|
|
||||||
Operator documents can also override an embedded prompt/version, including its
|
Operator documents can also override an embedded prompt/version, including its
|
||||||
@@ -128,7 +128,7 @@ the native presence rules before deploying. Select a root whose final
|
|||||||
definitions have valid backend references; eager validation applies even to
|
definitions have valid backend references; eager validation applies even to
|
||||||
unselected definitions. See the complete maintained [local](../examples/minimal-config.yml)
|
unselected definitions. See the complete maintained [local](../examples/minimal-config.yml)
|
||||||
and [service](../examples/production-config.yml) examples and the pinned
|
and [service](../examples/production-config.yml) examples and the pinned
|
||||||
[consumer migration guide](https://gitea.maximumdirect.net/eric/promptkit/src/tag/v0.12.0/docs/consumers/pkg-promptkit.md#migrate-from-the-previous-configuration-api).
|
[consumer migration guide](https://gitea.maximumdirect.net/eric/promptkit/src/tag/v0.14.0/docs/consumers/pkg-promptkit.md#migrate-from-the-previous-configuration-api).
|
||||||
This incompatible profile-format migration is intended for an Audita major
|
This incompatible profile-format migration is intended for an Audita major
|
||||||
release; no automatic file conversion is provided.
|
release; no automatic file conversion is provided.
|
||||||
|
|
||||||
|
|||||||
@@ -41,7 +41,9 @@ ownership. Commit discipline and agent Git restrictions are in the
|
|||||||
|
|
||||||
## Baseline Validation
|
## Baseline Validation
|
||||||
|
|
||||||
Use Go 1.25.5 or newer. From the repository root:
|
Use Go 1.26.0 or newer for source builds. The selected release toolchain is
|
||||||
|
documented in the [release procedure](release.md#prerequisites). From the
|
||||||
|
repository root:
|
||||||
|
|
||||||
```sh
|
```sh
|
||||||
go build -o ./bin/audita ./cmd/audita
|
go build -o ./bin/audita ./cmd/audita
|
||||||
|
|||||||
@@ -19,7 +19,7 @@ failures; explicit zero makes one attempt. `llm.repair_attempts` counts
|
|||||||
additional generations for schema-invalid model output. The operation timeout
|
additional generations for schema-invalid model output. The operation timeout
|
||||||
covers preparation, capacity waiting, retries, generation, and repair. Caller
|
covers preparation, capacity waiting, retries, generation, and repair. Caller
|
||||||
cancellation or an earlier deadline also applies. See [configuration](../config.md#settings)
|
cancellation or an earlier deadline also applies. See [configuration](../config.md#settings)
|
||||||
for defaults and [PromptKit v0.12.0's consumer contract](https://gitea.maximumdirect.net/eric/promptkit/src/tag/v0.12.0/docs/consumers/pkg-promptkit.md)
|
for defaults and [PromptKit v0.14.0's consumer contract](https://gitea.maximumdirect.net/eric/promptkit/src/tag/v0.14.0/docs/consumers/pkg-promptkit.md)
|
||||||
for the pinned protocol and retry details.
|
for the pinned protocol and retry details.
|
||||||
|
|
||||||
A model operation that exhausts structural repair, a live-parent local operation
|
A model operation that exhausts structural repair, a live-parent local operation
|
||||||
|
|||||||
@@ -27,6 +27,11 @@ CLI wiring, and maintained examples. Definitions of behavior belong to the
|
|||||||
for the changed behavior.
|
for the changed behavior.
|
||||||
4. Update the CLI reference and affected integration guidance.
|
4. Update the CLI reference and affected integration guidance.
|
||||||
|
|
||||||
|
The `version` route uses ReleaseKit's public `buildinfo.Version()` accessor and
|
||||||
|
stays independent of application runtime assembly. Preserve its behavior from
|
||||||
|
the [CLI contract](../cli.md#commands-and-help) when changing the command; the
|
||||||
|
adoption decision is recorded in [ADR 0001](../adr/0001-releasekit.md).
|
||||||
|
|
||||||
## Validating Examples
|
## Validating Examples
|
||||||
|
|
||||||
Keep complete copyable files in [examples](../../examples/) and link to them from
|
Keep complete copyable files in [examples](../../examples/) and link to them from
|
||||||
|
|||||||
@@ -2,7 +2,11 @@
|
|||||||
|
|
||||||
## Standard Repository Policies
|
## Standard Repository Policies
|
||||||
|
|
||||||
Material: All documents under `docs/policy/`, root `AGENTS.md`, and the Policy Reading Guide in `docs/development.md`, adapted for this repository.
|
Material: All documents under `docs/policy/`, root `AGENTS.md`, and the Policy
|
||||||
|
Reading Guide in `docs/development.md`, adapted for this repository.
|
||||||
|
`docs/policy/release.md` incorporates revision
|
||||||
|
`e833faddf120c789a9b45348edaf75720de16348`; the remaining listed material
|
||||||
|
incorporates revision `d84a38ebab26f048cafbe59a2246700c35d29843`.
|
||||||
|
|
||||||
Copyright (C) 2026 Eric Rakestraw
|
Copyright (C) 2026 Eric Rakestraw
|
||||||
|
|
||||||
@@ -10,13 +14,17 @@ SPDX-License-Identifier: CC-BY-SA-4.0
|
|||||||
|
|
||||||
License and notices: [CC BY-SA 4.0](licenses/CC-BY-SA-4.0.txt) |
|
License and notices: [CC BY-SA 4.0](licenses/CC-BY-SA-4.0.txt) |
|
||||||
[COPYRIGHT](https://gitea.maximumdirect.net/eric/policy/src/commit/d84a38ebab26f048cafbe59a2246700c35d29843/COPYRIGHT) |
|
[COPYRIGHT](https://gitea.maximumdirect.net/eric/policy/src/commit/d84a38ebab26f048cafbe59a2246700c35d29843/COPYRIGHT) |
|
||||||
[LICENSE](https://gitea.maximumdirect.net/eric/policy/src/commit/d84a38ebab26f048cafbe59a2246700c35d29843/LICENSE).
|
[LICENSE](https://gitea.maximumdirect.net/eric/policy/src/commit/d84a38ebab26f048cafbe59a2246700c35d29843/LICENSE) |
|
||||||
|
[COPYRIGHT](https://gitea.maximumdirect.net/eric/policy/src/commit/e833faddf120c789a9b45348edaf75720de16348/COPYRIGHT) |
|
||||||
|
[LICENSE](https://gitea.maximumdirect.net/eric/policy/src/commit/e833faddf120c789a9b45348edaf75720de16348/LICENSE).
|
||||||
|
|
||||||
[Source](https://gitea.maximumdirect.net/eric/policy/src/commit/d84a38ebab26f048cafbe59a2246700c35d29843).
|
[Source](https://gitea.maximumdirect.net/eric/policy/src/commit/d84a38ebab26f048cafbe59a2246700c35d29843).
|
||||||
|
|
||||||
|
[Source](https://gitea.maximumdirect.net/eric/policy/src/commit/e833faddf120c789a9b45348edaf75720de16348).
|
||||||
|
|
||||||
## ConfigKit
|
## ConfigKit
|
||||||
|
|
||||||
Selected module: `gitea.maximumdirect.net/eric/ConfigKit` at `v0.5.0`.
|
Selected module: `gitea.maximumdirect.net/eric/ConfigKit` at `v0.7.1`.
|
||||||
|
|
||||||
Copyright (C) 2026 Eric Rakestraw
|
Copyright (C) 2026 Eric Rakestraw
|
||||||
|
|
||||||
@@ -24,79 +32,93 @@ SPDX-License-Identifier: LGPL-3.0-or-later
|
|||||||
|
|
||||||
License and notices: [LGPL v3](licenses/LGPL-3.0.txt) |
|
License and notices: [LGPL v3](licenses/LGPL-3.0.txt) |
|
||||||
[GPL v3](licenses/GPL-3.0.txt) |
|
[GPL v3](licenses/GPL-3.0.txt) |
|
||||||
[COPYRIGHT](https://gitea.maximumdirect.net/eric/ConfigKit/src/commit/dc09959cca4e105f49ec316c6d4ba585bd2340bd/COPYRIGHT).
|
[COPYRIGHT](https://gitea.maximumdirect.net/eric/ConfigKit/src/commit/6fffde4af8f31f99d3ee295c426eb3234cb0fb77/COPYRIGHT).
|
||||||
|
|
||||||
[Source](https://gitea.maximumdirect.net/eric/ConfigKit/src/commit/dc09959cca4e105f49ec316c6d4ba585bd2340bd).
|
[Source](https://gitea.maximumdirect.net/eric/ConfigKit/src/commit/6fffde4af8f31f99d3ee295c426eb3234cb0fb77).
|
||||||
|
|
||||||
|
## ReleaseKit
|
||||||
|
|
||||||
|
Selected module: `gitea.maximumdirect.net/eric/ReleaseKit` at `v0.4.1`.
|
||||||
|
|
||||||
|
Copyright (C) 2026 Eric Rakestraw
|
||||||
|
|
||||||
|
SPDX-License-Identifier: LGPL-3.0-or-later
|
||||||
|
|
||||||
|
License and notices: [LGPL v3](licenses/LGPL-3.0.txt) |
|
||||||
|
[GPL v3](licenses/GPL-3.0.txt) |
|
||||||
|
[COPYRIGHT](https://gitea.maximumdirect.net/eric/ReleaseKit/src/commit/2d5a8110c61e31daf8698766114ae305d0e0e469/COPYRIGHT).
|
||||||
|
|
||||||
|
[Source](https://gitea.maximumdirect.net/eric/ReleaseKit/src/commit/2d5a8110c61e31daf8698766114ae305d0e0e469).
|
||||||
|
|
||||||
## Go runtime and standard library
|
## Go runtime and standard library
|
||||||
|
|
||||||
Selected toolchain: Go 1.25.5 for the distributed Linux binaries.
|
Selected toolchain: Go 1.26.8 for the distributed Linux binaries.
|
||||||
|
|
||||||
Copyright 2009 The Go Authors.
|
Copyright 2009 The Go Authors.
|
||||||
|
|
||||||
SPDX-License-Identifier: BSD-3-Clause
|
SPDX-License-Identifier: BSD-3-Clause
|
||||||
|
|
||||||
License and notices: [BSD 3-Clause](licenses/BSD-3-Clause-Go.txt) |
|
License and notices: [BSD 3-Clause](licenses/BSD-3-Clause-Go.txt) |
|
||||||
[LICENSE](https://github.com/golang/go/blob/fefb02adf45c4bcc879bd406a8d61f2a292c26a9/LICENSE) |
|
[LICENSE](https://github.com/golang/go/blob/c293dd49cbe25e1fe8d97d94a5cb618e7b6d831e/LICENSE) |
|
||||||
[PATENTS](https://github.com/golang/go/blob/fefb02adf45c4bcc879bd406a8d61f2a292c26a9/PATENTS).
|
[PATENTS](https://github.com/golang/go/blob/c293dd49cbe25e1fe8d97d94a5cb618e7b6d831e/PATENTS).
|
||||||
|
|
||||||
[Source](https://github.com/golang/go/commit/fefb02adf45c4bcc879bd406a8d61f2a292c26a9).
|
[Source](https://github.com/golang/go/commit/c293dd49cbe25e1fe8d97d94a5cb618e7b6d831e).
|
||||||
|
|
||||||
## Go vendored golang.org/x/crypto
|
## Go vendored golang.org/x/crypto
|
||||||
|
|
||||||
Material: `golang.org/x/crypto` at `v0.39.0` in the Go 1.25.5 standard library.
|
Material: `golang.org/x/crypto` at `v0.46.1-0.20251210140736-7dacc380ba00` in the Go 1.26.8 standard library.
|
||||||
|
|
||||||
Copyright 2009 The Go Authors.
|
Copyright 2009 The Go Authors.
|
||||||
|
|
||||||
SPDX-License-Identifier: BSD-3-Clause
|
SPDX-License-Identifier: BSD-3-Clause
|
||||||
|
|
||||||
License and notices: [BSD 3-Clause](licenses/BSD-3-Clause-Go.txt) |
|
License and notices: [BSD 3-Clause](licenses/BSD-3-Clause-Go.txt) |
|
||||||
[LICENSE](https://github.com/golang/go/blob/fefb02adf45c4bcc879bd406a8d61f2a292c26a9/src/vendor/golang.org/x/crypto/LICENSE) |
|
[LICENSE](https://github.com/golang/go/blob/c293dd49cbe25e1fe8d97d94a5cb618e7b6d831e/src/vendor/golang.org/x/crypto/LICENSE) |
|
||||||
[PATENTS](https://github.com/golang/go/blob/fefb02adf45c4bcc879bd406a8d61f2a292c26a9/src/vendor/golang.org/x/crypto/PATENTS).
|
[PATENTS](https://github.com/golang/go/blob/c293dd49cbe25e1fe8d97d94a5cb618e7b6d831e/src/vendor/golang.org/x/crypto/PATENTS).
|
||||||
|
|
||||||
[Source](https://github.com/golang/go/commit/fefb02adf45c4bcc879bd406a8d61f2a292c26a9).
|
[Source](https://github.com/golang/go/commit/c293dd49cbe25e1fe8d97d94a5cb618e7b6d831e).
|
||||||
|
|
||||||
## Go vendored golang.org/x/net
|
## Go vendored golang.org/x/net
|
||||||
|
|
||||||
Material: `golang.org/x/net` at `v0.41.0` in the Go 1.25.5 standard library.
|
Material: `golang.org/x/net` at `v0.47.1-0.20260731170545-cb1d721f7fb3` in the Go 1.26.8 standard library.
|
||||||
|
|
||||||
Copyright 2009 The Go Authors.
|
Copyright 2009 The Go Authors.
|
||||||
|
|
||||||
SPDX-License-Identifier: BSD-3-Clause
|
SPDX-License-Identifier: BSD-3-Clause
|
||||||
|
|
||||||
License and notices: [BSD 3-Clause](licenses/BSD-3-Clause-Go.txt) |
|
License and notices: [BSD 3-Clause](licenses/BSD-3-Clause-Go.txt) |
|
||||||
[LICENSE](https://github.com/golang/go/blob/fefb02adf45c4bcc879bd406a8d61f2a292c26a9/src/vendor/golang.org/x/net/LICENSE) |
|
[LICENSE](https://github.com/golang/go/blob/c293dd49cbe25e1fe8d97d94a5cb618e7b6d831e/src/vendor/golang.org/x/net/LICENSE) |
|
||||||
[PATENTS](https://github.com/golang/go/blob/fefb02adf45c4bcc879bd406a8d61f2a292c26a9/src/vendor/golang.org/x/net/PATENTS).
|
[PATENTS](https://github.com/golang/go/blob/c293dd49cbe25e1fe8d97d94a5cb618e7b6d831e/src/vendor/golang.org/x/net/PATENTS).
|
||||||
|
|
||||||
[Source](https://github.com/golang/go/commit/fefb02adf45c4bcc879bd406a8d61f2a292c26a9).
|
[Source](https://github.com/golang/go/commit/c293dd49cbe25e1fe8d97d94a5cb618e7b6d831e).
|
||||||
|
|
||||||
## Go vendored golang.org/x/sys
|
## Go vendored golang.org/x/sys
|
||||||
|
|
||||||
Material: `golang.org/x/sys` at `v0.33.0` in the Go 1.25.5 standard library.
|
Material: `golang.org/x/sys` at `v0.39.0` in the Go 1.26.8 standard library.
|
||||||
|
|
||||||
Copyright 2009 The Go Authors.
|
Copyright 2009 The Go Authors.
|
||||||
|
|
||||||
SPDX-License-Identifier: BSD-3-Clause
|
SPDX-License-Identifier: BSD-3-Clause
|
||||||
|
|
||||||
License and notices: [BSD 3-Clause](licenses/BSD-3-Clause-Go.txt) |
|
License and notices: [BSD 3-Clause](licenses/BSD-3-Clause-Go.txt) |
|
||||||
[LICENSE](https://github.com/golang/go/blob/fefb02adf45c4bcc879bd406a8d61f2a292c26a9/src/vendor/golang.org/x/sys/LICENSE) |
|
[LICENSE](https://github.com/golang/go/blob/c293dd49cbe25e1fe8d97d94a5cb618e7b6d831e/src/vendor/golang.org/x/sys/LICENSE) |
|
||||||
[PATENTS](https://github.com/golang/go/blob/fefb02adf45c4bcc879bd406a8d61f2a292c26a9/src/vendor/golang.org/x/sys/PATENTS).
|
[PATENTS](https://github.com/golang/go/blob/c293dd49cbe25e1fe8d97d94a5cb618e7b6d831e/src/vendor/golang.org/x/sys/PATENTS).
|
||||||
|
|
||||||
[Source](https://github.com/golang/go/commit/fefb02adf45c4bcc879bd406a8d61f2a292c26a9).
|
[Source](https://github.com/golang/go/commit/c293dd49cbe25e1fe8d97d94a5cb618e7b6d831e).
|
||||||
|
|
||||||
## Go vendored golang.org/x/text
|
## Go vendored golang.org/x/text
|
||||||
|
|
||||||
Material: `golang.org/x/text` at `v0.26.0` in the Go 1.25.5 standard library.
|
Material: `golang.org/x/text` at `v0.32.0` in the Go 1.26.8 standard library.
|
||||||
|
|
||||||
Copyright 2009 The Go Authors.
|
Copyright 2009 The Go Authors.
|
||||||
|
|
||||||
SPDX-License-Identifier: BSD-3-Clause
|
SPDX-License-Identifier: BSD-3-Clause
|
||||||
|
|
||||||
License and notices: [BSD 3-Clause](licenses/BSD-3-Clause-Go.txt) |
|
License and notices: [BSD 3-Clause](licenses/BSD-3-Clause-Go.txt) |
|
||||||
[LICENSE](https://github.com/golang/go/blob/fefb02adf45c4bcc879bd406a8d61f2a292c26a9/src/vendor/golang.org/x/text/LICENSE) |
|
[LICENSE](https://github.com/golang/go/blob/c293dd49cbe25e1fe8d97d94a5cb618e7b6d831e/src/vendor/golang.org/x/text/LICENSE) |
|
||||||
[PATENTS](https://github.com/golang/go/blob/fefb02adf45c4bcc879bd406a8d61f2a292c26a9/src/vendor/golang.org/x/text/PATENTS).
|
[PATENTS](https://github.com/golang/go/blob/c293dd49cbe25e1fe8d97d94a5cb618e7b6d831e/src/vendor/golang.org/x/text/PATENTS).
|
||||||
|
|
||||||
[Source](https://github.com/golang/go/commit/fefb02adf45c4bcc879bd406a8d61f2a292c26a9).
|
[Source](https://github.com/golang/go/commit/c293dd49cbe25e1fe8d97d94a5cb618e7b6d831e).
|
||||||
|
|
||||||
## go-yaml v4
|
## go-yaml v4
|
||||||
|
|
||||||
@@ -142,7 +164,7 @@ License and notices: [Apache 2.0](licenses/Apache-2.0.txt).
|
|||||||
|
|
||||||
## PromptKit
|
## PromptKit
|
||||||
|
|
||||||
Selected module: `gitea.maximumdirect.net/eric/promptkit` at `v0.12.0`.
|
Selected module: `gitea.maximumdirect.net/eric/promptkit` at `v0.14.0`.
|
||||||
|
|
||||||
Copyright (C) 2026 Eric Rakestraw
|
Copyright (C) 2026 Eric Rakestraw
|
||||||
|
|
||||||
@@ -150,9 +172,9 @@ SPDX-License-Identifier: LGPL-3.0-or-later
|
|||||||
|
|
||||||
License and notices: [LGPL v3](licenses/LGPL-3.0.txt) |
|
License and notices: [LGPL v3](licenses/LGPL-3.0.txt) |
|
||||||
[GPL v3](licenses/GPL-3.0.txt) |
|
[GPL v3](licenses/GPL-3.0.txt) |
|
||||||
[COPYRIGHT](https://gitea.maximumdirect.net/eric/promptkit/src/commit/4b8169da286917fde7875425bb32b799b12c6af3/COPYRIGHT).
|
[COPYRIGHT](https://gitea.maximumdirect.net/eric/promptkit/src/commit/143c6e9b3a675872117b0471e2ff8bcb25055a54/COPYRIGHT).
|
||||||
|
|
||||||
[Source](https://gitea.maximumdirect.net/eric/promptkit/src/commit/4b8169da286917fde7875425bb32b799b12c6af3).
|
[Source](https://gitea.maximumdirect.net/eric/promptkit/src/commit/143c6e9b3a675872117b0471e2ff8bcb25055a54).
|
||||||
|
|
||||||
## Promptkit OpenRouter Catalog
|
## Promptkit OpenRouter Catalog
|
||||||
|
|
||||||
|
|||||||
@@ -1,9 +1,9 @@
|
|||||||
# Release Policy
|
# Release Policy
|
||||||
|
|
||||||
**Base Policy Version:** 1.4
|
**Base Policy Version:** 1.6
|
||||||
|
|
||||||
**Last Updated**: 2026-09-28
|
**Last Updated**: 2026-10-08
|
||||||
**Upstream Source:** [Standard Repository Policies release](https://gitea.maximumdirect.net/eric/policy/src/commit/d84a38ebab26f048cafbe59a2246700c35d29843/docs/policy/release.md)
|
**Upstream Source:** [Standard Repository Policies release](https://gitea.maximumdirect.net/eric/policy/src/commit/e833faddf120c789a9b45348edaf75720de16348/docs/policy/release.md)
|
||||||
|
|
||||||
## Purpose
|
## Purpose
|
||||||
|
|
||||||
@@ -11,6 +11,9 @@ This policy defines a proportionate workflow for validating and publishing an
|
|||||||
intended source revision under a fresh version. Releases should require little
|
intended source revision under a fresh version. Releases should require little
|
||||||
routine intervention, avoid repeated work, and preserve published contents.
|
routine intervention, avoid repeated work, and preserve published contents.
|
||||||
|
|
||||||
|
Adopt stronger verification or reproducibility requirements through an explicit
|
||||||
|
project-specific decision justified by the intended audience and support needs.
|
||||||
|
|
||||||
The repository-specific commands belong in `docs/release.md`. Historical release
|
The repository-specific commands belong in `docs/release.md`. Historical release
|
||||||
summaries belong in `docs/releases/`. The procedure must agree with the adopted
|
summaries belong in `docs/releases/`. The procedure must agree with the adopted
|
||||||
policy and link to it rather than introduce additional release requirements.
|
policy and link to it rather than introduce additional release requirements.
|
||||||
@@ -49,12 +52,17 @@ failures and optional investigations under artifact-delivery status.
|
|||||||
| --- | --- |
|
| --- | --- |
|
||||||
| Linux amd64 | Required production target |
|
| Linux amd64 | Required production target |
|
||||||
| Linux arm64 | Required production target |
|
| Linux arm64 | Required production target |
|
||||||
| macOS arm64 | Best effort for local development; failures do not block a release or Linux artifact publication |
|
| macOS arm64 | Best effort for local development; development failures do not block a release or Linux artifact publication |
|
||||||
|
|
||||||
Windows and macOS amd64 are unsupported. Neither their builds nor tests are
|
Windows and macOS amd64 are unsupported. Neither their builds nor tests are
|
||||||
release requirements. Native macOS testing and access to a Mac are not release
|
release requirements. Native macOS testing and access to a Mac are not release
|
||||||
prerequisites.
|
prerequisites.
|
||||||
|
|
||||||
|
Linux amd64 and arm64 remain the required production targets. Publication from
|
||||||
|
a host outside the selected target set must pass ReleaseKit's temporary native
|
||||||
|
version check. This check does not require access to a Mac or native tests on
|
||||||
|
every delivery target.
|
||||||
|
|
||||||
## Versioning And Compatibility
|
## Versioning And Compatibility
|
||||||
|
|
||||||
Stable releases use Semantic Versioning in the form `vMAJOR.MINOR.PATCH`, with
|
Stable releases use Semantic Versioning in the form `vMAJOR.MINOR.PATCH`, with
|
||||||
@@ -70,7 +78,8 @@ requires a deliberate update to the policy and procedure where needed.
|
|||||||
For releases at or after `v1.0.0`:
|
For releases at or after `v1.0.0`:
|
||||||
|
|
||||||
- a major release may make intentional incompatible changes;
|
- a major release may make intentional incompatible changes;
|
||||||
- a minor release may add backward-compatible behavior; and
|
- a minor release may add backward-compatible behavior or raise the Go consumer
|
||||||
|
minimum as described below; and
|
||||||
- a patch release may make backward-compatible fixes.
|
- a patch release may make backward-compatible fixes.
|
||||||
|
|
||||||
Before `v1.0.0`, a minor release may change a documented public, operational,
|
Before `v1.0.0`, a minor release may change a documented public, operational,
|
||||||
@@ -82,6 +91,36 @@ Additional compatibility promises and deliberate exceptions belong in the
|
|||||||
adopted policy or canonical contract documentation. Release notes explain
|
adopted policy or canonical contract documentation. Release notes explain
|
||||||
changes; they do not redefine current compatibility contracts.
|
changes; they do not redefine current compatibility contracts.
|
||||||
|
|
||||||
|
## Consumer Minimum And Release Toolchain
|
||||||
|
|
||||||
|
Distinguish the minimum toolchain supported for consumers from the toolchain
|
||||||
|
maintainers use to build and validate a release. Record the consumer minimum in
|
||||||
|
the language's standard metadata and explain its support meaning in canonical
|
||||||
|
documentation. Define the selected release toolchain and its setup commands in
|
||||||
|
`docs/release.md`. Toolchain selection and upgrade cadence are repository-specific
|
||||||
|
choices.
|
||||||
|
|
||||||
|
For Go repositories, normally declare the initial stable release of the selected
|
||||||
|
series as the consumer minimum, such as `go 1.26.0`. Use a higher patch minimum
|
||||||
|
when a dependency or an identified correctness fix requires it, and document
|
||||||
|
the reason.
|
||||||
|
|
||||||
|
For release-policy purposes, successful build and release validation on the
|
||||||
|
selected Go patch release are sufficient to presume support across that Go
|
||||||
|
series, subject to the declared consumer minimum and concrete evidence of
|
||||||
|
incompatibility. Investigate specific compatibility concerns as they arise.
|
||||||
|
|
||||||
|
Use the selected release toolchain for candidate validation and release builds,
|
||||||
|
including CI jobs performing those tasks. A newer validation patch version alone
|
||||||
|
leaves the consumer minimum unchanged.
|
||||||
|
|
||||||
|
A minor release may raise the Go consumer minimum, including from one Go series
|
||||||
|
to the next, both before and after `v1.0.0`. This is an explicit exception to the
|
||||||
|
backward-compatibility requirement for minor releases. Patch releases preserve
|
||||||
|
the consumer minimum. Explain an increase's impact and required consumer action
|
||||||
|
in the release note. Other incompatible changes remain subject to the versioning
|
||||||
|
rules above.
|
||||||
|
|
||||||
## Release Documentation And Preparation
|
## Release Documentation And Preparation
|
||||||
|
|
||||||
Every new release must include `docs/releases/<version>.md` in the tagged
|
Every new release must include `docs/releases/<version>.md` in the tagged
|
||||||
@@ -140,9 +179,10 @@ caches are not required. If the candidate changes, validate the new candidate.
|
|||||||
Cheap publication-state checks may be repeated immediately before pushing
|
Cheap publication-state checks may be repeated immediately before pushing
|
||||||
because local or remote state may have changed during validation.
|
because local or remote state may have changed during validation.
|
||||||
|
|
||||||
Automate mechanical guards. Do not require manual approvals, sign-offs, or
|
Automate mechanical guards. Human review gates are strongly disfavored: add one
|
||||||
routine confirmations as release gates. Version selection and
|
only through an explicit project-specific policy decision explaining the
|
||||||
a concise release summary remain preparation inputs, not separate approval rounds.
|
concrete risk and why ordinary change review or automation is insufficient.
|
||||||
|
Do not add routine confirmations for checks the command can perform itself.
|
||||||
|
|
||||||
## Publication Guards
|
## Publication Guards
|
||||||
|
|
||||||
@@ -196,7 +236,8 @@ release without replacing its contents or reusing its version.
|
|||||||
Maintain `docs/release.md` as a short, executable maintainer runbook. It must
|
Maintain `docs/release.md` as a short, executable maintainer runbook. It must
|
||||||
identify:
|
identify:
|
||||||
|
|
||||||
1. prerequisites, primary branch, and authoritative remote;
|
1. prerequisites, selected release toolchain, primary branch, and authoritative
|
||||||
|
remote;
|
||||||
2. version and release-note preparation;
|
2. version and release-note preparation;
|
||||||
3. one publication command with its selected local checks and automated guards;
|
3. one publication command with its selected local checks and automated guards;
|
||||||
4. declared deliverables, required build targets, and automation responsibilities;
|
4. declared deliverables, required build targets, and automation responsibilities;
|
||||||
|
|||||||
221
docs/release.md
221
docs/release.md
@@ -1,144 +1,157 @@
|
|||||||
# Releasing Audita
|
# Releasing Audita
|
||||||
|
|
||||||
The [release policy](policy/release.md) defines versioning, supported platforms,
|
The [release policy](policy/release.md) owns release requirements. This runbook
|
||||||
immutability, and success. This runbook implements it with
|
uses the native commands in [scripts/release.sh](../scripts/release.sh), which
|
||||||
[scripts/release.sh](../scripts/release.sh). Publication ends after a successful
|
invokes the module-selected ReleaseKit tool. A confirmed source tag completes
|
||||||
source/tag push; binary delivery runs asynchronously.
|
the release; Woodpecker reports binary delivery separately.
|
||||||
|
|
||||||
## Prerequisites
|
## Prerequisites
|
||||||
|
|
||||||
Use Bash, Git, and Go 1.25.5 or newer (CI uses Go 1.25.5), with dependencies
|
Use Bash and Git. The authoritative remote is `origin`,
|
||||||
available locally or downloadable. Tests themselves are offline. Work from a
|
which must point to `https://gitea.maximumdirect.net/eric/audita.git`; the
|
||||||
checkout of `main` with permission to push that branch and tags to `origin`.
|
primary branch is `main`. Source publication needs no delivery credential.
|
||||||
For this repository, `origin` is `https://gitea.maximumdirect.net/eric/audita.git`.
|
Woodpecker uses the existing `GITEA_RELEASE_TOKEN` secret for delivery.
|
||||||
The script uses the checkout's configured `origin`; set it correctly before use.
|
|
||||||
The remote must support atomic pushes. No CI credentials or Mac are needed locally.
|
|
||||||
|
|
||||||
CI uses the existing `GITEA_RELEASE_TOKEN` secret for asynchronous asset delivery.
|
The source-build minimum is Go 1.26.0, declared in [go.mod](../go.mod).
|
||||||
macOS arm64 is a best-effort development environment; no macOS binary is published.
|
This minimum is required by the selected ReleaseKit dependency.
|
||||||
|
Distributed executables do not require a Go installation. The selected release
|
||||||
|
toolchain is Go 1.26.8, matching the current Woodpecker image and distributed
|
||||||
|
runtime notices. Use that local installation for tool bootstrap, candidate
|
||||||
|
validation, and release builds. Replace the installation path below with its
|
||||||
|
actual directory:
|
||||||
|
|
||||||
## Prepare the Candidate
|
```sh
|
||||||
|
export PATH="/path/to/go1.26.8/bin:$PATH"
|
||||||
|
export GOTOOLCHAIN=local
|
||||||
|
go version
|
||||||
|
```
|
||||||
|
|
||||||
Choose an unused version following the policy. Write
|
Record the reported toolchain with the validation results. The
|
||||||
`docs/releases/<version>.md`, beginning with `# Audita <version>`, followed by a
|
[release policy](policy/release.md#consumer-minimum-and-release-toolchain)
|
||||||
short summary and any compatibility or upgrade instructions relevant to the
|
governs the distinction between the consumer minimum and release toolchain,
|
||||||
release. There are no mandatory boilerplate sections. Update affected canonical
|
support across a Go series, and versioning of minimum increases. When selecting
|
||||||
documentation with behavior changes.
|
a different release toolchain, update the CI image and applicable runtime
|
||||||
|
attribution together; a newer build patch alone need not raise the minimum.
|
||||||
|
|
||||||
End each new note with these links, substituting the selected release version for
|
Prepare dependencies before offline candidate validation:
|
||||||
`<version>`:
|
|
||||||
|
```sh
|
||||||
|
GOWORK=off GOTOOLCHAIN=local go mod download
|
||||||
|
```
|
||||||
|
|
||||||
|
If dependency preparation changes `go.mod` or `go.sum`, include those changes in
|
||||||
|
the committed candidate. ReleaseKit's CLI is registered as a Go tool dependency;
|
||||||
|
`go mod tidy` retains its dependencies and checksums. The release wrapper changes
|
||||||
|
to the repository root and invokes `go tool releasekit` with workspace discovery
|
||||||
|
and automatic toolchain downloads disabled. Go builds or reuses the selected
|
||||||
|
tool from its normal build cache. Tool preparation precedes offline candidate
|
||||||
|
validation.
|
||||||
|
|
||||||
|
## Prepare and publish the candidate
|
||||||
|
|
||||||
|
Choose an unused version under the [release policy](policy/release.md), write
|
||||||
|
`docs/releases/<version>.md`, and begin it with `# Audita <version>`. Include a
|
||||||
|
short summary, relevant compatibility or upgrade instructions, and the required
|
||||||
|
`COPYRIGHT | LICENSE | ATTRIBUTION` footer with links for the selected version.
|
||||||
|
Update affected canonical documentation with behavior changes.
|
||||||
|
|
||||||
|
End each note with this footer, substituting its complete tag for `<version>`:
|
||||||
|
|
||||||
```markdown
|
```markdown
|
||||||
[COPYRIGHT](https://gitea.maximumdirect.net/eric/audita/src/tag/<version>/COPYRIGHT) | [LICENSE](https://gitea.maximumdirect.net/eric/audita/src/tag/<version>/LICENSE) | [ATTRIBUTION](https://gitea.maximumdirect.net/eric/audita/src/tag/<version>/docs/oss/attribution.md)
|
[COPYRIGHT](https://gitea.maximumdirect.net/eric/audita/src/tag/<version>/COPYRIGHT) | [LICENSE](https://gitea.maximumdirect.net/eric/audita/src/tag/<version>/LICENSE) | [ATTRIBUTION](https://gitea.maximumdirect.net/eric/audita/src/tag/<version>/docs/oss/attribution.md)
|
||||||
```
|
```
|
||||||
|
|
||||||
Check that all three paths exist in the candidate source. Retire completed
|
Commit the complete candidate on `main`, including the release note, then push
|
||||||
roadmaps when useful during preparation, preserving planned and deferred work
|
the branch first:
|
||||||
and repairing affected links. This is ordinary preparation, not a script gate.
|
|
||||||
|
|
||||||
Commit the intended changes, including the note, on `main`. The release script
|
|
||||||
requires a clean index and worktree and does not create commits. There is no
|
|
||||||
separate approval round. Published notes describe their tagged release; existing
|
|
||||||
release history does not need to be reconstructed.
|
|
||||||
|
|
||||||
## Validate and Publish
|
|
||||||
|
|
||||||
From the repository root, substitute the chosen version:
|
|
||||||
|
|
||||||
```sh
|
```sh
|
||||||
bash scripts/release.sh --publish v0.2.0
|
git push origin main
|
||||||
```
|
```
|
||||||
|
|
||||||
This single invocation:
|
Record the candidate commit. Before publication, remote `main` must identify
|
||||||
|
that exact commit. ReleaseKit checks this along with the clean candidate, note,
|
||||||
|
version, and remote tag state.
|
||||||
|
|
||||||
1. Checks the version, branch, clean candidate, matching note title, and tag absence.
|
Publish from the repository root, substituting the selected version:
|
||||||
2. Runs the default offline test suite once, then builds both required Linux targets
|
|
||||||
in a temporary directory using the same build script as CI.
|
|
||||||
3. Checks that the candidate and worktree are unchanged and that it includes the
|
|
||||||
current `origin/main` history.
|
|
||||||
4. Creates the version tag at that commit and atomically pushes the exact source
|
|
||||||
commit to `main` and the exact tag to `origin`.
|
|
||||||
5. Reports release success and exits without polling CI or checking asset availability.
|
|
||||||
|
|
||||||
To validate a prepared candidate without remote access, creating a tag, or pushing:
|
|
||||||
|
|
||||||
```sh
|
```sh
|
||||||
bash scripts/release.sh --check v0.2.0
|
bash scripts/release.sh publish VERSION
|
||||||
```
|
```
|
||||||
|
|
||||||
This is an optional diagnostic command, not a required step before `--publish`.
|
The command runs `go test -mod=readonly -count=1 ./...` once with module and
|
||||||
Publication validates within its own invocation; it does not use persistent cached
|
toolchain network access disabled, builds the profile's Linux amd64 and arm64
|
||||||
results. Both modes require the candidate note and a clean `main` checkout.
|
targets, and checks the native version output. It creates an annotated tag whose
|
||||||
|
message comes from the committed note, then pushes the exact tag object. A
|
||||||
|
successful publication completes the source release without waiting for CI or
|
||||||
|
checking artifact availability.
|
||||||
|
|
||||||
## Artifact Delivery
|
`bash scripts/release.sh check VERSION` is an optional local diagnostic. It
|
||||||
|
does not inspect remote availability or publish a tag, and it is not a required
|
||||||
|
step before `publish`, which performs its own candidate validation.
|
||||||
|
|
||||||
[Woodpecker](../.woodpecker/release.yml) runs on tag events. It invokes
|
The wrapper preserves ReleaseKit's exit status: `0` means confirmed publication;
|
||||||
[scripts/build-release.sh](../scripts/build-release.sh), then publishes:
|
`1` means a known validation or publication failure/conflict; `2` means usage,
|
||||||
|
profile, or version input error; and `3` means the push outcome remains unknown.
|
||||||
|
|
||||||
|
## Binary delivery
|
||||||
|
|
||||||
|
Woodpecker runs ReleaseKit's `ci-deliver` command for tags under
|
||||||
|
`refs/tags/v*`. The tagged `go.mod` selects the ReleaseKit version, and
|
||||||
|
`releasekit.json` supplies Audita's build and delivery settings:
|
||||||
|
|
||||||
- `audita-<version>-linux-amd64`
|
- `audita-<version>-linux-amd64`
|
||||||
- `audita-<version>-linux-arm64`
|
- `audita-<version>-linux-arm64`
|
||||||
- `SHA256SUMS`
|
- `SHA256SUMS`
|
||||||
|
|
||||||
Builds disable CGO and use the shared script's release flags. The version is in the
|
Before running Go, the workflow fetches and verifies the event tag, checks it
|
||||||
asset name and source tag; Audita has no CLI version command. Cross-compilation
|
out detached, and confirms the source tree is clean. It peels the event object
|
||||||
checks compilation, not native execution on each architecture.
|
ID to its commit before comparing it with the tag's commit, accepting both
|
||||||
|
annotated tag objects and commit IDs from Woodpecker. It copies the tagged
|
||||||
|
`go.mod` and `go.sum` into temporary module metadata outside the checkout. Go
|
||||||
|
confirms that this configuration selects ReleaseKit, then builds its CLI using
|
||||||
|
an alternate `-modfile`. The bootstrap executable and temporary files remain
|
||||||
|
outside the tagged source. The workflow runs with the selected Go 1.26.8 image,
|
||||||
|
`GOWORK=off`, and `GOTOOLCHAIN=local`.
|
||||||
|
|
||||||
The CI job status and logs show delivery progress or failure. Assets appear on
|
Delivery uses prepared-checkout mode to verify the existing tag, HEAD, and clean
|
||||||
the matching Gitea release page when delivery succeeds. A successful tag push
|
worktree without repeating the bootstrap's fetch and checkout.
|
||||||
must not be reported as confirmation that these files are available.
|
|
||||||
For a new hosted release, the release plugin uses the checked-in note at the
|
|
||||||
tag as its body, including the footer. On delivery retries it preserves
|
|
||||||
existing release information and skips files that already exist.
|
|
||||||
|
|
||||||
Consumers can download the binary for their Linux architecture and `SHA256SUMS`
|
The resulting executable receives:
|
||||||
from that page, check its listed SHA-256 digest with `sha256sum`, and make it
|
|
||||||
executable. Optional consumer checks are not maintainer release gates. Digests
|
|
||||||
detect file mismatches; they are not an independent signature of authenticity.
|
|
||||||
|
|
||||||
## Failure and Retry
|
|
||||||
|
|
||||||
**Local validation fails:** correct the issue, commit any changes, and rerun the
|
|
||||||
publication command. A failure before tag creation publishes nothing. Temporary
|
|
||||||
local build files are removed on exit.
|
|
||||||
|
|
||||||
**Push fails or the connection is interrupted:** the script retains the local tag
|
|
||||||
and reports failure rather than guessing whether publication succeeded. Inspect
|
|
||||||
remote state with the actual version:
|
|
||||||
|
|
||||||
```sh
|
```sh
|
||||||
git rev-parse 'v0.2.0^{commit}'
|
"$${bootstrap_dir}/releasekit" ci-deliver \
|
||||||
git ls-remote origin refs/heads/main refs/tags/v0.2.0
|
--repo "$${CI_WORKSPACE}" \
|
||||||
|
--prepared \
|
||||||
|
--commit "$${expected_commit}" \
|
||||||
|
"$${CI_COMMIT_TAG}"
|
||||||
```
|
```
|
||||||
|
|
||||||
If the remote tag identifies the intended candidate and its source is on remote
|
The workflow maps the existing `GITEA_RELEASE_TOKEN` secret to
|
||||||
`main`, the release succeeded; no CI waiting is needed. An atomic push normally
|
`RELEASEKIT_GITEA_TOKEN`. The complete checked-in release note, including its
|
||||||
updates both refs or neither. If `main` has advanced since publication, fetch it
|
licensing footer, supplies the hosted release body. Delivery runs independently
|
||||||
and check candidate ancestry rather than requiring tip equality.
|
after source publication; its status and logs report delivery progress or
|
||||||
|
failure.
|
||||||
|
|
||||||
If the tag is absent remotely and was never published or used by a release
|
ReleaseKit handles content-aware retries and retained-artifact recovery. See
|
||||||
channel, remove only that unpublished local tag (`git tag -d v0.2.0`), resolve
|
the pinned [publication recovery guide](https://gitea.maximumdirect.net/eric/ReleaseKit/src/tag/v0.4.1/docs/consumers/publish.md)
|
||||||
any rejected branch update, and rerun the command. If the remote tag has a
|
and [delivery guide](https://gitea.maximumdirect.net/eric/ReleaseKit/src/tag/v0.4.1/docs/consumers/delivery.md)
|
||||||
different target, do not overwrite it; choose a fresh version. Never force a
|
for those mechanics. A delivery failure does not undo a confirmed source
|
||||||
branch or tag update to bypass the guards.
|
release. Retry the same immutable tag after resolving the reported state; do not
|
||||||
|
replace published files or a checksum manifest.
|
||||||
|
|
||||||
**CI delivery fails:** the release remains successful. Inspect the failed tag
|
## Failure and recovery
|
||||||
job's logs and retry that same tagged job for a transient failure. Publication is
|
|
||||||
configured to skip existing filenames and not overwrite assets. Keep the same
|
|
||||||
source and build environment when retrying; inspect any existing assets/checksum
|
|
||||||
manifest before filling gaps. Do not regenerate and replace a published manifest
|
|
||||||
or binary. If an existing manifest cannot describe the missing rebuilt assets,
|
|
||||||
use a new version instead. A pipeline or source defect also requires a corrected
|
|
||||||
commit and new version. An outage does not require moving the tag.
|
|
||||||
|
|
||||||
**A released source defect is discovered:** fix it on `main` and publish a new
|
Fix validation failures in a new committed candidate, then rerun `publish`.
|
||||||
appropriate version with a note explaining the correction. Leave the old tag and
|
After a failed push, ReleaseKit retains the local annotated tag and reports the
|
||||||
published files intact.
|
captured authoritative endpoint and publication state. Resolve the result
|
||||||
|
against that endpoint before retrying. An exact remote tag-object match, with
|
||||||
|
its source available on remote `main`, can confirm publication. If the remote
|
||||||
|
state cannot be read, the result remains unknown; do not remove or replace the
|
||||||
|
tag while uncertain. Follow the pinned [publication recovery guide](https://gitea.maximumdirect.net/eric/ReleaseKit/src/tag/v0.4.1/docs/consumers/publish.md)
|
||||||
|
for object-level recovery details.
|
||||||
|
|
||||||
## Maintaining the Release Workflow
|
A source-release success and artifact-delivery status are separate. For a
|
||||||
|
partial or uncertain delivery, inspect the job output and follow the pinned
|
||||||
The shared build script keeps local and CI build settings aligned. Tests in
|
[delivery recovery guidance](https://gitea.maximumdirect.net/eric/ReleaseKit/src/tag/v0.4.1/docs/consumers/delivery.md).
|
||||||
[scripts/release_test.go](../scripts/release_test.go) exercise publication against
|
A source or published-content correction requires a new appropriate version;
|
||||||
temporary local Git remotes, including guard failures and rejected pushes, with
|
leave the original tag and its contents intact.
|
||||||
Go execution stubbed to avoid recursive builds/tests. They run in `go test ./...`.
|
|
||||||
Changes to CI delivery should preserve explicit asset names, checksums, and
|
|
||||||
non-overwriting publication. CI delivery is separate from the local success path.
|
|
||||||
|
|||||||
@@ -1,5 +1,8 @@
|
|||||||
# Release Notes
|
# Release Notes
|
||||||
|
|
||||||
|
- [Audita v3.1.1](v3.1.1.md)
|
||||||
|
- [Audita v3.1.0](v3.1.0.md)
|
||||||
|
- [Audita v3.0.1](v3.0.1.md)
|
||||||
- [Audita v3.0.0](v3.0.0.md)
|
- [Audita v3.0.0](v3.0.0.md)
|
||||||
- [Audita v2.0.1](v2.0.1.md)
|
- [Audita v2.0.1](v2.0.1.md)
|
||||||
- [Audita v2.0.0](v2.0.0.md)
|
- [Audita v2.0.0](v2.0.0.md)
|
||||||
|
|||||||
14
docs/releases/v3.0.1.md
Normal file
14
docs/releases/v3.0.1.md
Normal file
@@ -0,0 +1,14 @@
|
|||||||
|
# Audita v3.0.1
|
||||||
|
|
||||||
|
This patch release adds a configuration-free version command and adopts
|
||||||
|
ReleaseKit for source publication and Linux binary delivery. Transcript
|
||||||
|
processing, configuration, and LLM behavior are unchanged.
|
||||||
|
|
||||||
|
## Changes
|
||||||
|
|
||||||
|
- `audita version` prints the application version without loading application
|
||||||
|
configuration or contacting an LLM provider.
|
||||||
|
- Release publication and Linux artifact delivery now use ReleaseKit v0.1.0.
|
||||||
|
The release runbook describes the maintainer workflow and delivery recovery.
|
||||||
|
|
||||||
|
[COPYRIGHT](https://gitea.maximumdirect.net/eric/audita/src/tag/v3.0.1/COPYRIGHT) | [LICENSE](https://gitea.maximumdirect.net/eric/audita/src/tag/v3.0.1/LICENSE) | [ATTRIBUTION](https://gitea.maximumdirect.net/eric/audita/src/tag/v3.0.1/docs/oss/attribution.md)
|
||||||
42
docs/releases/v3.1.0.md
Normal file
42
docs/releases/v3.1.0.md
Normal file
@@ -0,0 +1,42 @@
|
|||||||
|
# Audita v3.1.0
|
||||||
|
|
||||||
|
This minor release updates Audita's configuration, LLM, and release libraries
|
||||||
|
and raises the minimum Go version for source builds to 1.26.0. Existing Audita
|
||||||
|
configuration files, PromptKit profiles, and command behavior require no
|
||||||
|
migration.
|
||||||
|
|
||||||
|
## Changes
|
||||||
|
|
||||||
|
- ConfigKit is updated from v0.5.0 to v0.7.1, with improvements to configuration
|
||||||
|
loading, resolution, provenance, and inspection efficiency.
|
||||||
|
- PromptKit is updated from v0.12.0 to v0.14.0, reducing avoidable allocations in
|
||||||
|
preparation, rendering, and execution. Audita retains its existing schemas,
|
||||||
|
validation, retry and repair budgets, and resilient processing behavior.
|
||||||
|
The libraries' new discovery and configuration-comparison APIs remain unused
|
||||||
|
by Audita.
|
||||||
|
- ReleaseKit is updated from v0.1.0 to v0.4.1. The local release launcher now
|
||||||
|
invokes the module-selected Go tool, and CI selects the tool from the tagged
|
||||||
|
module metadata. Prepared-checkout delivery reuses the tag checkout already
|
||||||
|
verified during CI bootstrap. Source publication still completes at a
|
||||||
|
successful tag push; Linux binary delivery remains asynchronous.
|
||||||
|
- Release builds and CI use Go 1.26.8, with corresponding runtime attribution
|
||||||
|
updated. The source-build minimum is tracked separately from that build
|
||||||
|
toolchain patch version.
|
||||||
|
|
||||||
|
## Upgrading from v3.0.1
|
||||||
|
|
||||||
|
Source builders must upgrade from the previous Go 1.25.5 minimum to **Go 1.26.0
|
||||||
|
or newer**, including any build environments still using Go 1.25. Maintainers
|
||||||
|
should follow the updated [release procedure](../release.md) for toolchain setup,
|
||||||
|
publication, and delivery recovery.
|
||||||
|
|
||||||
|
Go module consumers must use the v3 module path. For example:
|
||||||
|
`go install gitea.maximumdirect.net/eric/audita/v3/cmd/audita@v3.1.0`. This
|
||||||
|
aligns the module path with the v3 release line. Downloaded binaries and
|
||||||
|
commands run from a source checkout are unaffected.
|
||||||
|
|
||||||
|
Users of distributed Linux binaries need no Go installation. No configuration,
|
||||||
|
profile, transcript-format, or command-behavior migration is required for this
|
||||||
|
release.
|
||||||
|
|
||||||
|
[COPYRIGHT](https://gitea.maximumdirect.net/eric/audita/src/tag/v3.1.0/COPYRIGHT) | [LICENSE](https://gitea.maximumdirect.net/eric/audita/src/tag/v3.1.0/LICENSE) | [ATTRIBUTION](https://gitea.maximumdirect.net/eric/audita/src/tag/v3.1.0/docs/oss/attribution.md)
|
||||||
20
docs/releases/v3.1.1.md
Normal file
20
docs/releases/v3.1.1.md
Normal file
@@ -0,0 +1,20 @@
|
|||||||
|
# Audita v3.1.1
|
||||||
|
|
||||||
|
This patch fixes the Woodpecker bootstrap failure that prevented Linux binary
|
||||||
|
delivery for v3.1.0. Audita's transcript processing and configuration are unchanged.
|
||||||
|
|
||||||
|
## Changes
|
||||||
|
|
||||||
|
- Resolve Woodpecker's tag-event object ID to its source commit before checking
|
||||||
|
the tagged checkout and invoking ReleaseKit. Annotated tag events previously
|
||||||
|
failed a comparison between the tag object and commit, stopping the workflow
|
||||||
|
before binary builds began.
|
||||||
|
- Add offline regression coverage for annotated and lightweight tag events,
|
||||||
|
including rejection of an unrelated source commit.
|
||||||
|
|
||||||
|
No configuration, profile, transcript-format, or command-behavior migration is
|
||||||
|
required from v3.1.0. The Go source-build minimum remains 1.26.0. Linux amd64 and
|
||||||
|
arm64 binary delivery follows the existing asynchronous
|
||||||
|
[release procedure](../release.md#binary-delivery).
|
||||||
|
|
||||||
|
[COPYRIGHT](https://gitea.maximumdirect.net/eric/audita/src/tag/v3.1.1/COPYRIGHT) | [LICENSE](https://gitea.maximumdirect.net/eric/audita/src/tag/v3.1.1/LICENSE) | [ATTRIBUTION](https://gitea.maximumdirect.net/eric/audita/src/tag/v3.1.1/docs/oss/attribution.md)
|
||||||
@@ -1,133 +0,0 @@
|
|||||||
# ConfigKit v0.5.0 Adoption Roadmap
|
|
||||||
|
|
||||||
**Last updated:** 2026-10-03
|
|
||||||
|
|
||||||
**Status:** Complete. The implementation and tests are committed through
|
|
||||||
`8175ed8`. Final documentation and example changes were included in the full
|
|
||||||
build, test, example-validation, and local-link checks before the documentation
|
|
||||||
completion commit. The [implementation plan](implementation.md) records the
|
|
||||||
ordered work and verification.
|
|
||||||
|
|
||||||
## Purpose and Baseline
|
|
||||||
|
|
||||||
Adopt ConfigKit v0.5.0 as an independently reviewable step before PromptKit
|
|
||||||
v0.12.0. Use the library's configuration and inheritance conventions while
|
|
||||||
preserving Audita's domain ownership and existing operator workflows.
|
|
||||||
|
|
||||||
At the reviewed Audita revision `6ae1d7cd5f548b26de5787372d3f2249eaa4757d`,
|
|
||||||
[go.mod](../../go.mod) selects ConfigKit v0.4.2, PromptKit v0.11.2, and Go
|
|
||||||
1.25.5. ConfigKit already owns loading, presence, secret resolution, and
|
|
||||||
configuration inspection. Audita's `internal/core/config` supplies typed
|
|
||||||
settings, defaults, derived values, and domain validation; `internal/cli`
|
|
||||||
selects files, overlays, and explicit overrides. The
|
|
||||||
[configuration contract](../config.md) and [CLI contract](../cli.md) own the
|
|
||||||
implemented behavior.
|
|
||||||
|
|
||||||
The reviewed upstream release is
|
|
||||||
[ConfigKit v0.5.0](https://gitea.maximumdirect.net/eric/ConfigKit/src/tag/v0.5.0/docs/releases/v0.5.0.md),
|
|
||||||
commit `dc09959cca4e105f49ec316c6d4ba585bd2340bd`. It adds layered underlays,
|
|
||||||
caller-owned filesystem sources, mapping sources, source resource contexts, and
|
|
||||||
built-in sibling inheritance. The Go minimum and YAML dependency do not change.
|
|
||||||
Ordinary `Load` remains available; adopting `LoadLayered` is optional.
|
|
||||||
|
|
||||||
This roadmap supersedes the completed original adoption plan at this path.
|
|
||||||
The [historical roadmap](https://gitea.maximumdirect.net/eric/audita/src/commit/6ae1d7cd5f548b26de5787372d3f2249eaa4757d/docs/roadmap/configkit.md)
|
|
||||||
records that earlier migration. Its coordinated breaking-refactor instructions
|
|
||||||
and release target do not govern this incremental upgrade.
|
|
||||||
|
|
||||||
## Target End State
|
|
||||||
|
|
||||||
- Audita uses the released ConfigKit v0.5.0 module, with no local replacement.
|
|
||||||
PromptKit stays at v0.11.2 throughout this adoption unit.
|
|
||||||
- Configuration retains the current file-selection, overlay, explicit-override,
|
|
||||||
resolution, and validation flow, subject to the reserved-key compatibility
|
|
||||||
impact described below. Retain the application schema version, CLI interface,
|
|
||||||
and main-file-relative resource rules defined in the current contracts.
|
|
||||||
- Application configuration can use ConfigKit's native sibling `extends`
|
|
||||||
relationships. Audita does not implement a second inheritance resolver,
|
|
||||||
special backend-only syntax, or an opt-in switch around the library feature.
|
|
||||||
- Inherited values participate in presence-aware defaults, domain validation,
|
|
||||||
secret resolution, and safe inspection just like other effective input.
|
|
||||||
In particular, inherited backend settings must not be overwritten merely
|
|
||||||
because they were not written directly on the child.
|
|
||||||
- Effective settings and explanations remain useful and secret-safe when
|
|
||||||
values are inherited. Preserve existing inspection fields and add compact,
|
|
||||||
value-free inheritance evidence from ConfigKit's metadata rather than
|
|
||||||
reconstructing provenance from YAML.
|
|
||||||
- Canonical documentation and a maintained example explain the adopted
|
|
||||||
inheritance behavior. Attribution identifies the exact new upstream source.
|
|
||||||
|
|
||||||
The upstream [configuration contract](https://gitea.maximumdirect.net/eric/ConfigKit/src/tag/v0.5.0/docs/config.md#sibling-inheritance)
|
|
||||||
owns generic inheritance mechanics. The integration must account for three
|
|
||||||
consequences: `extends` is reserved automatically throughout input mappings;
|
|
||||||
relationships resolve after source precedence and before typed decoding; and
|
|
||||||
inherited zero, false, empty, or null values count as explicit input. An inherited
|
|
||||||
value still has to satisfy Audita's field-specific rules. Parent definitions
|
|
||||||
also undergo ordinary application validation; inheritance does not introduce
|
|
||||||
abstract, validation-exempt backend entries.
|
|
||||||
|
|
||||||
## Scope and Adoption Boundary
|
|
||||||
|
|
||||||
Keep the existing `Load` integration unless implementation reveals a concrete
|
|
||||||
need to change it. Source-backed defaults, additional operator underlay tiers,
|
|
||||||
imports, and source-relative reinterpretation of application paths are outside
|
|
||||||
this feature. Their availability upstream does not require expanding Audita's
|
|
||||||
configuration surface. Imports and secret-directory bootstrap retain their
|
|
||||||
current disabled state.
|
|
||||||
|
|
||||||
ConfigKit inheritance applies to Audita configuration in this step. PromptKit
|
|
||||||
profile formats, profile inheritance, engine construction, embedded prompts,
|
|
||||||
and backend catalogs remain governed by the existing PromptKit integration.
|
|
||||||
There is no application-owned translation of profile documents in this work.
|
|
||||||
|
|
||||||
This is an independent ConfigKit adoption ahead of the planned PromptKit
|
|
||||||
migration. A separate public release between the two units is optional.
|
|
||||||
|
|
||||||
## Acceptance Criteria
|
|
||||||
|
|
||||||
- The released ConfigKit v0.5.0 dependency and exact source attribution are
|
|
||||||
adopted; PromptKit remains at v0.11.2 with its existing catalogs.
|
|
||||||
- Native inheritance preserves effective endpoints, capacity, explicit zero
|
|
||||||
queue capacity, child overrides, and surviving credential references through
|
|
||||||
Audita's loading, resolution, and validation boundary.
|
|
||||||
- Selected overlays and explicit overrides retain their precedence; omitted
|
|
||||||
validation-role selection still derives from the final proposal selection.
|
|
||||||
- Null can remove a child's credential while surviving references on parents
|
|
||||||
and other unselected backends still follow the existing credential contract.
|
|
||||||
- Selected roles use inherited backend settings and share its configured
|
|
||||||
capacity under the existing PromptKit runtime contract.
|
|
||||||
- Effective settings remain redacted, and both CLI explanations and debug
|
|
||||||
configuration origins expose compact, value-free inheritance evidence while
|
|
||||||
retaining existing fields and application-derived explanations.
|
|
||||||
- A maintained complete example and canonical documentation describe native
|
|
||||||
inheritance, its field-validation implications, and the reserved-key
|
|
||||||
compatibility impact. Existing workflows and applicable offline checks pass.
|
|
||||||
|
|
||||||
## Completion and Release Treatment
|
|
||||||
|
|
||||||
Adoption is complete when the released dependency is pinned, existing workflows
|
|
||||||
pass, representative inheritance works through loading and runtime wiring,
|
|
||||||
inspection includes value-free inheritance evidence and remains secret-safe,
|
|
||||||
and the example, canonical docs, and attribution match the implementation. No
|
|
||||||
PromptKit migration or provider behavior change is required to close this unit.
|
|
||||||
|
|
||||||
Release classification remains provisional. A minor release would be appropriate
|
|
||||||
for a backward-compatible addition, but the newly reserved `extends` key can
|
|
||||||
invalidate currently valid application configuration. For example, Audita
|
|
||||||
currently permits a backend literally named `extends`; ConfigKit v0.5.0 treats
|
|
||||||
that mapping key as an inheritance directive rather than a backend ID. Do not
|
|
||||||
promise blanket compatibility or settle on a minor release until the final
|
|
||||||
compatibility review resolves this impact under the
|
|
||||||
[release policy](../policy/release.md). Describe any required migration in the
|
|
||||||
canonical documentation and release notes when the upgrade ships. Do not select
|
|
||||||
or publish a release as part of roadmap preparation. A later PromptKit
|
|
||||||
migration's profile-format compatibility decision belongs to that separate
|
|
||||||
feature.
|
|
||||||
|
|
||||||
## Selected Overlays for Testing
|
|
||||||
|
|
||||||
This heading preserves links from historical adoption documents. The original
|
|
||||||
[overlay plan](https://gitea.maximumdirect.net/eric/audita/src/commit/6ae1d7cd5f548b26de5787372d3f2249eaa4757d/docs/roadmap/configkit.md#selected-overlays-for-testing)
|
|
||||||
is historical; current overlay behavior belongs to [configuration](../config.md).
|
|
||||||
This upgrade preserves that workflow and adds native ConfigKit inheritance
|
|
||||||
without reviving the earlier combined migration plan.
|
|
||||||
@@ -1,10 +1,10 @@
|
|||||||
# Deferred Feature Work
|
# Deferred Feature Work
|
||||||
|
|
||||||
**Last updated:** 2026-10-03
|
**Last updated:** 2026-10-11
|
||||||
|
|
||||||
**Status:** Deferred or exploratory work; not implemented or scheduled. These
|
**Status:** Deferred or exploratory work; not implemented or scheduled. These
|
||||||
entries preserve work beyond the completed resilience and span-deletion
|
entries preserve work beyond completed feature and library upgrades.
|
||||||
features. Each entry states its intent; inclusion does not commit us to
|
Each entry states its intent; inclusion does not commit us to
|
||||||
implementing every capability.
|
implementing every capability.
|
||||||
|
|
||||||
## Domain-Aware Response Recovery
|
## Domain-Aware Response Recovery
|
||||||
@@ -78,3 +78,19 @@ semantics. It must address meaning preservation and the effects on segment
|
|||||||
identity, timestamps, fixed chunks, subsequent stages, recombination, and output
|
identity, timestamps, fixed chunks, subsequent stages, recombination, and output
|
||||||
consumers. Do not infer authorization to remove a segment from an empty string
|
consumers. Do not infer authorization to remove a segment from an empty string
|
||||||
or introduce segment-removal machinery as part of span-deletion consistency.
|
or introduce segment-removal machinery as part of span-deletion consistency.
|
||||||
|
|
||||||
|
## Library Inspection and Configuration Comparison
|
||||||
|
|
||||||
|
ConfigKit and PromptKit provide effective-configuration comparison; PromptKit
|
||||||
|
also provides prompt/profile listings and contextual prompt requirement
|
||||||
|
inspection. Exposing these capabilities in Audita is deferred until a concrete
|
||||||
|
operator or development need arises. The dependency upgrade did not select new
|
||||||
|
inspection commands.
|
||||||
|
|
||||||
|
If a need emerges, define command ownership, selection syntax, report scope, and
|
||||||
|
disclosure before implementation. Reuse the libraries' public APIs and consider
|
||||||
|
shared CLI conventions alongside any separately selected CommandKit adoption.
|
||||||
|
Requirement discovery is advisory evidence rather than proof of execution
|
||||||
|
readiness; an empty configuration diff does not prove equivalent execution.
|
||||||
|
The library-upgrade review remains available in
|
||||||
|
[Git history](https://gitea.maximumdirect.net/eric/audita/src/commit/4c5536ab78c72dea58d03b3c51834138d429a59a/docs/roadmap/imports.md).
|
||||||
|
|||||||
@@ -1,523 +0,0 @@
|
|||||||
# Implementation Plan: PromptKit v0.12.0 Adoption
|
|
||||||
|
|
||||||
**Last updated:** 2026-10-04
|
|
||||||
**Status:** Complete; Stages 1–9 completed.
|
|
||||||
**Audience:** Luna coding agent.
|
|
||||||
|
|
||||||
## Scope and Execution
|
|
||||||
|
|
||||||
Implement the accepted target in the [PromptKit roadmap](promptkit.md). That
|
|
||||||
document owns feature intent and policy choices; this plan owns the ordered
|
|
||||||
implementation work. The planning baseline is Audita commit
|
|
||||||
`b31955fc97adec707b4e5f9a1b0c43c4cbc66750`: ConfigKit v0.5.0 is adopted,
|
|
||||||
PromptKit is v0.11.2, and the finalized roadmap includes the selected-profile,
|
|
||||||
operator-override, example-layout, and major-release clarifications.
|
|
||||||
|
|
||||||
This replaces the completed ConfigKit plan at this path. Its
|
|
||||||
[completed implementation record](https://gitea.maximumdirect.net/eric/audita/src/commit/b31955fc97adec707b4e5f9a1b0c43c4cbc66750/docs/roadmap/implementation.md)
|
|
||||||
remains available for readers following the ConfigKit completion roadmap.
|
|
||||||
|
|
||||||
Execute Stage 1 through Stage 9 in order. Each is sized as one bounded Luna
|
|
||||||
implementation prompt. Commit completed units with short, plain English messages
|
|
||||||
under the [agent policy](../policy/agents.md); no approval round is needed between
|
|
||||||
stages. Record actual checks and any remaining expected migration failures.
|
|
||||||
Stages 1 and 2 change formats before Stage 3 changes their consumer. Intermediate
|
|
||||||
commits need not be runnable or release-ready. Do not add temporary readers,
|
|
||||||
compatibility shims, fallback engines for execution, or scaffolding to make them
|
|
||||||
so. Later stages complete the same migration rather than separate product modes.
|
|
||||||
|
|
||||||
Start with [development guidance](../development.md) and the applicable agent,
|
|
||||||
[architecture](../policy/architecture.md), [testing](../policy/testing.md),
|
|
||||||
[documentation](../policy/documentation.md), and [OSS](../policy/oss.md)
|
|
||||||
policies. Use graph-first discovery. Read the current
|
|
||||||
[configuration](../config.md), [LLM runtime](../internal/llm-runtime.md),
|
|
||||||
[prompt registry](../internal/prompts.md), and
|
|
||||||
[LLM integration](../integrations/openai-compatible-llm.md) contracts for the
|
|
||||||
established behavior this migration preserves.
|
|
||||||
|
|
||||||
Target the released PromptKit v0.12.0 at commit
|
|
||||||
`4b8169da286917fde7875425bb32b799b12c6af3`, ConfigKit v0.5.0, and both
|
|
||||||
maintained `/v3` catalogs at `v3.20260930.0`. Read the pinned
|
|
||||||
[format reference](https://gitea.maximumdirect.net/eric/promptkit/src/tag/v0.12.0/docs/formats.md)
|
|
||||||
and [migration guide](https://gitea.maximumdirect.net/eric/promptkit/src/tag/v0.12.0/docs/consumers/pkg-promptkit.md#migrate-from-the-previous-configuration-api).
|
|
||||||
The sibling checkout is reference material, not a dependency replacement.
|
|
||||||
|
|
||||||
### Selected Implementation Decisions
|
|
||||||
|
|
||||||
- Keep Go 1.25.5, application `version: 2`, current flags, role selection,
|
|
||||||
application overlays, and main-file-relative path rules. Retain the
|
|
||||||
`profiles_dir` name and default; broaden its accepted documents as agreed.
|
|
||||||
- Use PromptKit's catalog and owned defaults, then caller underlays for embedded
|
|
||||||
Audita prompts and operator directory inputs, then `Sources.Main` for
|
|
||||||
application backend settings. Directory inputs compose strictly within their
|
|
||||||
group; discovery order supplies no field precedence. Keep imports disabled.
|
|
||||||
- Use one ConfigKit mapping for the final application source. For each
|
|
||||||
application backend, supply its endpoint, `concurrency_limit`,
|
|
||||||
`queue_capacity`, and explicit `api_key_env: null`. The null suppresses
|
|
||||||
lower-tier credential lookup. Leave other supported provider fields available
|
|
||||||
to native layering. Do not put resolved credential values in this mapping.
|
|
||||||
- Keep selected-role registration, endpoint-match, competing-credential, and
|
|
||||||
required-key checks. Add explicit nonblank effective model and endpoint checks
|
|
||||||
for both selected roles. Valid unselected partial profiles remain permitted.
|
|
||||||
- Preserve the adapter's complete per-call schemas, configured repairs/retries,
|
|
||||||
operation context, shared variables, observation, and prepare/check/run flow.
|
|
||||||
Operator messages can omit shared-variable references; do not append the
|
|
||||||
shared text unconditionally or require particular message counts or roles
|
|
||||||
beyond PromptKit's own format rules.
|
|
||||||
- Use captured source inspection for consumed host configuration and message
|
|
||||||
paths. Keep source-relative resource resolution with PromptKit and ConfigKit;
|
|
||||||
Audita projects paths for its existing output collision checks.
|
|
||||||
- Replace the old profile-reload test expectation with snapshot behavior.
|
|
||||||
Successful construction uses only final effective definitions. A failed
|
|
||||||
construction may make an embedded-only diagnostic construction to distinguish
|
|
||||||
asset defects from operator errors; it never executes or substitutes for the
|
|
||||||
requested configuration.
|
|
||||||
- Maintained example roots are `examples/profiles/local/` and
|
|
||||||
`examples/profiles/service/`. Service testing profiles stay in the service
|
|
||||||
root. Keep the literal `temperature: 0` in examples as an explicit outbound
|
|
||||||
setting, and use native presence semantics without a compatibility translator.
|
|
||||||
|
|
||||||
This unit is an intentional major-release migration. Exact version selection,
|
|
||||||
release notes, tag/push, and publication timing remain release preparation under
|
|
||||||
the [release policy](../policy/release.md). Guided recovery, new report formats,
|
|
||||||
hot reload, extra configuration commands, and scheduling changes remain outside
|
|
||||||
this plan. Tests should protect changed integration behavior and established
|
|
||||||
contracts, not reproduce the libraries' entire validation matrices.
|
|
||||||
|
|
||||||
## Stage 1 — Convert Embedded Prompt Definitions
|
|
||||||
|
|
||||||
**Primary files:** The seven YAML files under
|
|
||||||
`internal/prompts/assets/prompts/`.
|
|
||||||
|
|
||||||
1. Wrap each existing definition beneath `prompts`, its exact current ID, and
|
|
||||||
the string version `v1`. Remove the old inner `id` and `version` fields.
|
|
||||||
Keep filenames and Audita registry identifiers unchanged; filenames are
|
|
||||||
asset locations rather than PromptKit identities.
|
|
||||||
2. Preserve messages, block-scalar text, variable references, task examples,
|
|
||||||
output settings, and schema paths. Preserve the applicable references to
|
|
||||||
`HardeningPolicy`, `ProposalContract`, and `ValidationContract`. Do not edit
|
|
||||||
shared fragments, response schemas, or domain policies to accommodate the
|
|
||||||
new container format.
|
|
||||||
3. Review each before/after definition structurally, including YAML indentation
|
|
||||||
inside block scalars. Do not introduce default profile selections or new
|
|
||||||
repair counts. The adapter continues to own the runtime output contract.
|
|
||||||
|
|
||||||
**Verification and completion:** Check all seven migrated identities and
|
|
||||||
version keys against `RegisteredMetadata`, and run `git diff --check`. Registry
|
|
||||||
preparation tests become runnable with the new constructor in Stage 3. Commit
|
|
||||||
the asset conversion; do not introduce an old-format reader to test it here.
|
|
||||||
|
|
||||||
**Completion marker:** Stage 1 complete. All seven registered prompt assets
|
|
||||||
use keyed prompt/version mappings; parsed definitions were structurally checked
|
|
||||||
against their prior content, and `git diff --check` passed.
|
|
||||||
|
|
||||||
## Stage 2 — Migrate Operator Profiles, Example Roots, and YAML Fixtures
|
|
||||||
|
|
||||||
**Primary files:** `examples/profiles/`, the three maintained configuration
|
|
||||||
examples, and profile-producing test fixtures in
|
|
||||||
`internal/framework/llm/{runtime_inspection,adapter,adapter_capacity}_test.go`,
|
|
||||||
`internal/framework/proposal_generation/adapter_integration_test.go`,
|
|
||||||
`internal/framework/validators/llm_integration_test.go`,
|
|
||||||
`internal/framework/runner/cancellation_test.go`, and
|
|
||||||
`cmd/audita/main_integration_test.go`.
|
|
||||||
|
|
||||||
1. Move local proposal/validation examples beneath `profiles/local/`; move the
|
|
||||||
four service proposal/validation and testing files beneath
|
|
||||||
`profiles/service/`. Convert each to `profiles: {<ID>: <fields>}` in readable
|
|
||||||
YAML. Keep IDs, models, positive timeouts, and controls, including explicit
|
|
||||||
zero temperature. No example needs a real credential or live model.
|
|
||||||
2. Set `profiles_dir: profiles/local` in `examples/minimal-config.yml` and
|
|
||||||
`examples/configkit-inheritance.yml`; set `profiles_dir: profiles/service`
|
|
||||||
in `examples/production-config.yml`. Preserve the testing overlay's role IDs
|
|
||||||
and the existing ConfigKit inheritance example. Select the leaf root, since
|
|
||||||
recursive discovery at their common parent would still load both groups.
|
|
||||||
3. Convert profile YAML emitted by the listed fixtures to keyed definitions.
|
|
||||||
Search for remaining old profile construction strings and removed
|
|
||||||
`base_profile` syntax, and migrate any genuine profile fixture found.
|
|
||||||
Do not rewrite transcript/proposal `id` fields or domain schema fixtures.
|
|
||||||
Keep test source names independent of profile IDs where already exercised.
|
|
||||||
4. Keep negative tests negative for their selected behavioral reason. Give
|
|
||||||
cases clean temporary layouts or replace their contribution completely
|
|
||||||
rather than leaving an unrelated invalid definition behind for later cases.
|
|
||||||
Eager validation now reads unselected final definitions too. Do not remove
|
|
||||||
such definitions merely to simulate the old lazy loader where the test is
|
|
||||||
intended to exercise eager validation.
|
|
||||||
|
|
||||||
**Verification and completion:** Review the six profiles, explicit root
|
|
||||||
selections, and changed fixture text; run `git diff --check` and format touched
|
|
||||||
Go test files. These formats become consumable in Stage 3. Commit this unit.
|
|
||||||
Current documentation links and recipes are updated together in Stage 8.
|
|
||||||
|
|
||||||
**Completion marker:** Stage 2 complete. Six maintained profile documents are
|
|
||||||
keyed and split into separately selected local/service roots; the listed Go
|
|
||||||
fixtures use keyed definitions. Touched Go files were formatted and
|
|
||||||
`git diff --check` passed. Runtime tests are deferred until Stage 3 replaces
|
|
||||||
the current consumer, as the plan allows intermediate commits not to run.
|
|
||||||
|
|
||||||
## Stage 3 — Adopt the Released Source API and Selected-Role Checks
|
|
||||||
|
|
||||||
**Primary files:** `go.mod`, `go.sum`,
|
|
||||||
`internal/framework/llm/runtime.go`, and `internal/prompts/registry_test.go`.
|
|
||||||
|
|
||||||
1. Upgrade with `go get gitea.maximumdirect.net/eric/promptkit@v0.12.0` and
|
|
||||||
reconcile the module files. Verify ConfigKit stays v0.5.0, the catalog
|
|
||||||
dependencies become `/v3` at `v3.20260930.0`, and obsolete `/v2` requirements
|
|
||||||
are removed when unused. Retain the Go minimum and unrelated selections;
|
|
||||||
introduce no local replacements.
|
|
||||||
2. Resolve `profiles_dir` exactly as the current runtime does. Obtain embedded
|
|
||||||
inputs with `pk.FilesystemInputs` and operator inputs with `pk.DirectoryInputs`.
|
|
||||||
An unavailable selected root is an operator error; an empty directory can
|
|
||||||
contribute no definitions. Do not require one profile per file, IDs matching
|
|
||||||
filenames, or profile-only top-level content.
|
|
||||||
3. Construct the agreed `pk.ConfigurationSources`: two ordered caller underlays
|
|
||||||
for embedded and operator groups, and one highest-priority application
|
|
||||||
`ck.Input` whose source is the mapping specified above. Retain
|
|
||||||
`pk.WithSchemaFS`, the supplied HTTP client, and configured transient retries.
|
|
||||||
Remove old prompt/profile/backend registration options.
|
|
||||||
4. Inspect registered prompt ID/version selections, then both selected roles.
|
|
||||||
Reject a selected role whose effective model or endpoint is empty or
|
|
||||||
whitespace-only. Retain backend registration, normalized endpoint equality,
|
|
||||||
nonblank effective `APIKeyEnv` rejection, and required-credential checks.
|
|
||||||
Preserve literal IDs; do not trim/re-key identities or require all profiles
|
|
||||||
to be complete. Populate the same role inspection map for both clients.
|
|
||||||
5. Migrate the registry test engine to `FilesystemInputs` and a programmatic
|
|
||||||
`ProfileSource` fixture in its own tier, retaining its schema filesystem.
|
|
||||||
A complete endpoint/model fixture without an application backend is valid
|
|
||||||
for this direct library test; Audita's selected-role guard belongs in its
|
|
||||||
runtime tests. Keep the embedded prompt preparation assertions scoped to
|
|
||||||
embedded prompts.
|
|
||||||
6. Remove the old `profileSourceFS` wrapper once unused. Source accounting is
|
|
||||||
completed in Stage 5. Preserve the adapter boundary; change other production
|
|
||||||
callers only to resolve actual API incompatibilities. Search for remaining
|
|
||||||
uses of removed source options and old `pk.Profile`/`pk.Backend` values.
|
|
||||||
Run `go mod tidy` after migrating construction callers and review its diff.
|
|
||||||
|
|
||||||
**Verification and completion:** Run `go test ./internal/prompts` and the
|
|
||||||
existing offline profile assembly, unsafe-selection, and absolute-directory
|
|
||||||
tests in `internal/framework/llm`. Run `git diff --check` and review the module
|
|
||||||
diff. The obsolete file-reload assertion is intentionally replaced in Stage 6;
|
|
||||||
do not restore reload behavior to make that assertion pass. Commit the runtime
|
|
||||||
API migration.
|
|
||||||
|
|
||||||
**Completion marker:** Stage 3 complete. Runtime construction now uses the
|
|
||||||
released PromptKit source API with the selected application mapping; module
|
|
||||||
selections match PromptKit v0.12.0 and both `/v3` catalogs at
|
|
||||||
`v3.20260930.0`. `go mod tidy`, prompt registry tests, offline profile
|
|
||||||
assembly, unsafe-selection, absolute-directory tests, and `git diff --check`
|
|
||||||
passed. Captured source accounting remains in Stage 5.
|
|
||||||
|
|
||||||
## Stage 4 — Preserve Startup Failure Classification and Validate Assembly
|
|
||||||
|
|
||||||
**Primary files:** `internal/framework/llm/runtime.go`,
|
|
||||||
`internal/framework/llm/runtime_inspection_test.go`, and configuration-command
|
|
||||||
tests in `internal/cli`. Update `internal/cli/run.go` only where the changed
|
|
||||||
startup path needs existing exit behavior preserved.
|
|
||||||
|
|
||||||
1. Treat embedded discovery failures as `AssetError`; treat operator-directory
|
|
||||||
discovery failures as configuration input errors. Preserve wrapped causes
|
|
||||||
for `errors.Is`/`errors.As` and retain configured-secret redaction at CLI
|
|
||||||
boundaries. Caller cancellation remains a runtime exit, not an operator
|
|
||||||
mistake, and should not trigger further diagnostic loading.
|
|
||||||
2. PromptKit wraps both definition-loading and template/content failures in
|
|
||||||
`ErrInvalidConfig`; some materialization errors have no public source/path
|
|
||||||
type. Do not classify by parsing error strings or by that sentinel alone.
|
|
||||||
On final engine-construction failure, perform an embedded-only diagnostic
|
|
||||||
construction with the same embedded prompt/schema sources and library
|
|
||||||
defaults, excluding operator inputs and application backend mappings. If
|
|
||||||
that also fails, surface an `AssetError` with the asset cause; otherwise
|
|
||||||
return the original final-construction error as an operator/configuration
|
|
||||||
error. The diagnostic engine does no provider work and is never retained
|
|
||||||
for execution. Keep a small unexported assembly seam accepting an embedded
|
|
||||||
filesystem so tests can exercise asset failures without modifying shipped
|
|
||||||
files or creating a global test hook.
|
|
||||||
3. Do not run this diagnostic construction as a successful-path preflight.
|
|
||||||
A valid final snapshot remains accepted even if an operator contribution
|
|
||||||
repairs an otherwise invalid lower-tier prompt. Verify that property with
|
|
||||||
the same small assembly test seam. This avoids strengthening upstream
|
|
||||||
final-value validation into mandatory validation of displaced definitions.
|
|
||||||
4. Cover incomplete selected profiles using omitted, empty, and null model
|
|
||||||
contributions and a cleared selected endpoint. Exercise proposal and
|
|
||||||
validation selection, including omission-derived validation selection, with
|
|
||||||
a rejecting HTTP transport. Confirm valid unselected partial profiles are
|
|
||||||
accepted; malformed unselected definitions, undefined backend references,
|
|
||||||
and conflicting directory contributions still fail under native rules.
|
|
||||||
5. Add focused boundary coverage that invalid operator YAML/template/resource
|
|
||||||
input produces configuration exit `2`, and test the asset classification
|
|
||||||
directly at the runtime seam. Reuse existing CLI handling of `AssetError`
|
|
||||||
for exit `1`; no damaged-binary subprocess fixture is needed. Cover the
|
|
||||||
shared `NewRuntime` validation route and preserve cancellation exit `1` in
|
|
||||||
configuration commands if the new error path would otherwise classify it
|
|
||||||
as `2`. Avoid exact complete diagnostic wording assertions.
|
|
||||||
|
|
||||||
**Verification and completion:** Run targeted startup/inspection tests and
|
|
||||||
`go test ./internal/cli`; check whitespace and commit. Preserve the original
|
|
||||||
failure cause where available rather than flattening it to a generic error.
|
|
||||||
|
|
||||||
**Completion marker:** Stage 4 complete. Embedded discovery and construction
|
|
||||||
failures are distinguished from operator inputs through an embedded-only
|
|
||||||
diagnostic construction; cancellation skips that diagnostic. Selected-profile
|
|
||||||
completeness and native directory validation are covered, and both config
|
|
||||||
commands preserve exit 1 for cancellation/assets and exit 2 for invalid
|
|
||||||
operator YAML, templates, and resources. Targeted runtime tests,
|
|
||||||
`go test ./internal/cli`, and `git diff --check` passed.
|
|
||||||
|
|
||||||
## Stage 5 — Protect Consumed Configuration and Message Files
|
|
||||||
|
|
||||||
**Primary files:** `internal/framework/llm/runtime.go` or a focused source-path
|
|
||||||
helper in that package, `internal/cli/process.go`, runtime source-accounting
|
|
||||||
tests, and `cmd/audita/main_integration_test.go`.
|
|
||||||
|
|
||||||
1. Rename the internal `Runtime.ProfilePaths` field to `SourcePaths` and update
|
|
||||||
its process caller. It now covers consumed host YAML and message resources,
|
|
||||||
rather than profiles alone. Populate it from the successfully captured final
|
|
||||||
engine; do not expose source metadata as a new public output.
|
|
||||||
2. Call `InspectConfiguration`. Index `Sources()` by source ID, and collect
|
|
||||||
paths with `Kind == ck.SourceKindFile`; embedded filesystem and synthetic
|
|
||||||
sources are not host paths. All loaded host YAML counts, including unused
|
|
||||||
definitions and files whose contributions were later overlaid. Deduplicate
|
|
||||||
paths and sort for a stable internal projection.
|
|
||||||
3. For message resources, enumerate `Metadata().HistoricalPaths()` and retain
|
|
||||||
effective, nonnull paths shaped as
|
|
||||||
`/prompts/<id>/<version>/messages/<index>/content_file`. Use `Lookup` and the
|
|
||||||
effective field's origin, not an inherited destination's guessed source.
|
|
||||||
PromptKit successfully captures these fields only with a unique usable
|
|
||||||
source context. Obtain the effective scalar from `Explain(path).Effective`
|
|
||||||
and decode that scalar YAML into a string with the existing YAML dependency.
|
|
||||||
This decodes captured inspection data; it is not a second configuration
|
|
||||||
loader. When the contributing source is a host file, join the untrimmed
|
|
||||||
resource name against that source file's directory and add it to the ledger.
|
|
||||||
Ignore displaced references and non-host resources. Do not reread operator
|
|
||||||
YAML, infer IDs from filenames, or reimplement resource-root validation.
|
|
||||||
4. Pass `SourcePaths` through existing `diagnostics.PrepareOutput` protection.
|
|
||||||
Leave canonicalization, symlink/hardlink checks, permitted in-place transcript
|
|
||||||
handling, and output initialization with their current owner. Do not protect
|
|
||||||
every unrelated file in the selected directory or add filesystem mutation
|
|
||||||
guarantees beyond the existing collision contract.
|
|
||||||
5. Extend `TestSubprocessProfileSources` and a focused runtime case to cover an
|
|
||||||
arbitrarily named YAML contribution, a consumed source-relative message
|
|
||||||
file, and conflicting transcript/report destinations. Use a non-YAML message
|
|
||||||
filename, such as `instruction.md`, so directory discovery does not mistake
|
|
||||||
plain prompt text for a configuration document. Include an inherited message
|
|
||||||
reference from a different directory and a prompt ID/version with a JSON
|
|
||||||
Pointer escape character so source provenance and literal keys determine
|
|
||||||
the path. Check rejection before provider dispatch and unchanged input bytes.
|
|
||||||
Preserve acceptance of an unused alternate output filename; do not turn the
|
|
||||||
whole directory into a forbidden output location.
|
|
||||||
|
|
||||||
**Verification and completion:** Run focused source-ledger tests and subprocess
|
|
||||||
collision cases, plus `git diff --check`, then commit. Check that resource
|
|
||||||
accounting uses the frozen snapshot and never changes the engine's source or
|
|
||||||
resource-resolution behavior to facilitate tracking.
|
|
||||||
|
|
||||||
**Completion marker:** Stage 5 complete. `Runtime.SourcePaths` now projects
|
|
||||||
host YAML and effective source-relative message files from PromptKit's captured
|
|
||||||
configuration inspection, using field provenance for inherited references.
|
|
||||||
Process output protection consumes that ledger. Focused source-accounting and
|
|
||||||
subprocess collision tests passed, including unchanged input bytes, no provider
|
|
||||||
dispatch, JSON Pointer-escaped keys, and acceptance of an unused alternate
|
|
||||||
output; `git diff --check` passed.
|
|
||||||
|
|
||||||
## Stage 6 — Verify Operator Prompt Overrides and Captured Execution
|
|
||||||
|
|
||||||
**Primary files:** `internal/framework/llm/adapter_test.go` and focused runtime
|
|
||||||
tests. Change `adapter.go` only for an actual integration defect.
|
|
||||||
|
|
||||||
1. Add a native keyed operator contribution overriding messages for an active
|
|
||||||
prompt/version. Use the real runtime and controlled HTTP responses to prove
|
|
||||||
the operator text reaches both the prepared snapshot and dispatched request.
|
|
||||||
One case deliberately omits shared-variable references and still succeeds;
|
|
||||||
do not require Audita to inject their text. A reference-bearing case renders
|
|
||||||
the adapter-supplied value and retains existing protection against caller
|
|
||||||
variables replacing the reserved shared variables.
|
|
||||||
2. Override the prompt's definition-level output contract with another valid
|
|
||||||
upstream contract. Prove that Audita's per-call JSON schema and configured
|
|
||||||
repair budget still govern execution: a structurally invalid response is
|
|
||||||
repaired or exhausted as the controlled budget dictates. Domain validators
|
|
||||||
remain downstream. Reuse existing validator/proposal integration coverage
|
|
||||||
for their rules rather than weakening them to fit an operator prompt.
|
|
||||||
3. Replace the reload portion of
|
|
||||||
`TestPreparedAdapterRejectsTargetDriftAndPreparationErrors`. After successful
|
|
||||||
construction, change a profile or message file and verify the existing
|
|
||||||
runtime still uses its captured settings/text. Construct a new runtime to
|
|
||||||
observe a valid edit or reject a newly mismatched endpoint. Keep the missing
|
|
||||||
prompt preparation failure case.
|
|
||||||
4. Retain a focused test of the prepared-target check independently of reload:
|
|
||||||
deliberately change the test runtime's application backend endpoint after
|
|
||||||
construction and verify the inconsistency is blocked before dispatch. This
|
|
||||||
tests the existing guard, not a supported live mutation/reload feature.
|
|
||||||
Continue executing the same prepared handle whose details were inspected;
|
|
||||||
do not add another preparation or an application-side retry loop.
|
|
||||||
|
|
||||||
**Verification and completion:** Run the prompt override, snapshot, and
|
|
||||||
prepared-adapter tests. Compare semantic messages and selected targets, not old
|
|
||||||
hash values or exact YAML formatting. Check whitespace and commit.
|
|
||||||
|
|
||||||
**Completion marker:** Stage 6 complete. Native operator messages reach both
|
|
||||||
the prepared snapshot and provider request, with and without shared-variable
|
|
||||||
references. The adapter's per-call schema and repair budget remain effective
|
|
||||||
under a valid operator output-contract override. Existing runtimes retain
|
|
||||||
captured prompt/profile values after source edits, and a new runtime observes
|
|
||||||
valid edits; the target guard and preparation failure remain covered. The
|
|
||||||
`internal/framework/llm` tests and `git diff --check` passed.
|
|
||||||
|
|
||||||
## Stage 7 — Verify Native Profiles, Backend Authority, and Resilience
|
|
||||||
|
|
||||||
**Primary files:** Runtime inspection and adapter tests,
|
|
||||||
`internal/framework/llm/adapter_capacity_test.go`, and existing framework/CLI
|
|
||||||
integration tests where their established behavior is affected.
|
|
||||||
|
|
||||||
1. Add a compact native profile inheritance fixture with literal keyed IDs
|
|
||||||
unrelated to filenames, multiple definitions in one file, a partial parent,
|
|
||||||
and a complete selected child. Verify inherited controls survive a child
|
|
||||||
model change and child overrides win. Reuse the metadata-facing literal-key
|
|
||||||
coverage from Stage 5 rather than repeating it in profile tests.
|
|
||||||
2. Use controlled HTTP request bodies to distinguish explicit zero temperature
|
|
||||||
from omission and inherited-control suppression by null. Check a
|
|
||||||
representative recursively overlaid provider parameter and null clearing;
|
|
||||||
do not promise that all providers accept every valid configured zero.
|
|
||||||
Reuse existing deadline/cancellation coverage for unchanged outer deadlines;
|
|
||||||
explicit zero profile timeout must not disable the operation context.
|
|
||||||
3. Verify an operator backend contribution can add supported provider fields,
|
|
||||||
while a conflicting endpoint/concurrency/queue/environment contribution
|
|
||||||
cannot displace the final application fields. Preserve an explicit profile
|
|
||||||
environment lookup as a selected-role error rather than hiding it with an
|
|
||||||
adapter override. Include an application backend using a catalog ID to show
|
|
||||||
it is allowed and its catalog credential lookup is suppressed. Use synthetic
|
|
||||||
environment values and local HTTP fixtures, not provider catalog endpoints.
|
|
||||||
4. Reuse `TestRolesShareBackendCapacityAndReleaseAfterCancellation` and
|
|
||||||
`TestDistinctBackendsHaveIndependentCapacity`; verify the final mapped
|
|
||||||
limits, including zero queue capacity, still coordinate both roles and
|
|
||||||
remain backend-local. Strengthen a fixture with conflicting lower-tier
|
|
||||||
capacity only where needed to prove the new mapping wins. Keep existing
|
|
||||||
synchronization; do not infer admission with sleeps or add another limiter.
|
|
||||||
5. Preserve offline selected-profile inspection and value-free application
|
|
||||||
explanations. Check configured secrets, endpoint strings, arbitrary provider
|
|
||||||
fields, and prompt text remain outside the current safe profile summary.
|
|
||||||
Do not replace it with a full upstream dump. Its numeric projection is not
|
|
||||||
proof that an omitted provider setting is sent; wire presence belongs to
|
|
||||||
the HTTP coverage above.
|
|
||||||
6. Run the existing transient retry, structural repair, attempt-count,
|
|
||||||
observation, partial-validation, and all-model-failure subprocess cases
|
|
||||||
after fixture migration. Preserve their error/recovery/debug classifications,
|
|
||||||
cancellation, and continued output. Fix proven integration regressions;
|
|
||||||
do not rewrite domain outcomes or reduce budgets to obtain a passing suite.
|
|
||||||
|
|
||||||
**Verification and completion:** Run
|
|
||||||
`go test ./internal/framework/llm ./internal/framework/proposal_generation ./internal/framework/validators ./internal/framework/runner ./internal/cli ./cmd/audita`
|
|
||||||
and `git diff --check`. Review whether each new test addresses a distinct changed
|
|
||||||
boundary. Commit the native-profile and runtime verification unit.
|
|
||||||
|
|
||||||
**Completion marker:** Stage 7 complete. Native profile inheritance, control
|
|
||||||
presence, provider-map overlays, application backend authority, selected
|
|
||||||
credential rejection, catalog-ID handling, shared backend capacity, and safe
|
|
||||||
inspection behavior are covered. The six targeted packages passed, along with
|
|
||||||
focused wire, timeout, capacity, credential, and safe-view tests; `git diff
|
|
||||||
--check` passed.
|
|
||||||
|
|
||||||
## Stage 8 — Document the Migration and Update Attribution
|
|
||||||
|
|
||||||
**Primary files:** `docs/config.md`, `docs/internal/llm-runtime.md`,
|
|
||||||
`docs/internal/prompts.md`, `docs/integrations/openai-compatible-llm.md`,
|
|
||||||
`docs/operations.md`, `docs/internal/cli-config.md`, `README.md`, and
|
|
||||||
`docs/oss/attribution.md`.
|
|
||||||
|
|
||||||
1. Update the configuration contract for unified `profiles_dir` content, exact
|
|
||||||
keyed identities, directory composition, agreed tier precedence, profile
|
|
||||||
inheritance/presence, selected-role completeness, eager validation of all
|
|
||||||
final definitions, selected-root failures, and construction-time capture.
|
|
||||||
Replace the obsolete statement that PromptKit profiles do not gain ConfigKit
|
|
||||||
inheritance. Retain application overlays, defaults, and credential ownership.
|
|
||||||
2. Include concise migration instructions in the profile section: wrap old
|
|
||||||
profile fields beneath `profiles/<id>`, remove inner `id`, change
|
|
||||||
`base_profile` to `extends`, review explicit values/nulls, and select roots
|
|
||||||
whose final definitions have valid backend references. Show a small keyed
|
|
||||||
inheritance/override snippet and link complete maintained examples. Explain
|
|
||||||
explicit zero temperature versus omitted or null controls and link upstream
|
|
||||||
for the full field table. State that this ships as an Audita major migration;
|
|
||||||
do not invent an exact release version or automatic file conversion.
|
|
||||||
3. Document intentional prompt overrides and optional shared-variable references.
|
|
||||||
Supplying shared variables does not inject omitted text, while per-call
|
|
||||||
schemas and domain validators remain enforced. Internal prompt documentation
|
|
||||||
distinguishes shipped asset instructions from operator-effective messages;
|
|
||||||
no prompt-quality rewrite or new global prompt-policy requirement is added.
|
|
||||||
4. Describe layered runtime assembly, source accounting, snapshot use, and
|
|
||||||
startup classification in their internal owner. Update the pinned PromptKit
|
|
||||||
consumer link in the LLM integration contract. Expand operations' loaded
|
|
||||||
source description to include consumed operator message files; keep physical
|
|
||||||
output/collision rules with operations and diagnostics.
|
|
||||||
5. Repair example navigation for separate local/service roots, especially the
|
|
||||||
README's local-profile link. Update validation recipes to use the maintained
|
|
||||||
config files' explicit roots and keep the service testing overlay workflow.
|
|
||||||
Review other affected links without rewriting historical release notes.
|
|
||||||
6. Update the PromptKit and both catalog attribution entries to selected versions
|
|
||||||
and exact commit-pinned source/notice URLs. Resolve catalog tag commits from
|
|
||||||
the selected module origins or authoritative upstream refs, not annotated
|
|
||||||
tag object IDs. Check the releases' COPYRIGHT/LICENSE files and retain the
|
|
||||||
applicable unchanged local LGPL/GPL and MIT texts. Keep the existing House
|
|
||||||
Format; no new license selection, policy rewrite, or attribution inventory
|
|
||||||
is needed. Review `go.mod`/`go.sum` against those entries.
|
|
||||||
|
|
||||||
**Verification and completion:** Check affected local links/anchors, format
|
|
||||||
examples against the implemented loader, verify source revisions/notices, and
|
|
||||||
run `git diff --check`. Commit the documentation and attribution unit.
|
|
||||||
|
|
||||||
**Completion marker:** Stage 8 complete. Configuration, runtime, prompt,
|
|
||||||
integration, operations, contributor, and README guidance now reflects native
|
|
||||||
PromptKit layering, migration, presence, snapshot, and separate example-root
|
|
||||||
behavior. Attribution matches PromptKit v0.12.0 and both v3 catalog module
|
|
||||||
origins and notices. Local links/anchors and `git diff --check` passed.
|
|
||||||
|
|
||||||
## Stage 9 — Validate the Integrated End State and Close the Plan
|
|
||||||
|
|
||||||
**Primary files:** This plan and the feature roadmap; correct an implementation
|
|
||||||
file only if the final checks reveal an actual gap.
|
|
||||||
|
|
||||||
1. Verify the full roadmap acceptance criteria against the landed code and the
|
|
||||||
distinct tests from these stages. Review for unintended requirements:
|
|
||||||
profile-only filtering, mandatory shared text in operator messages,
|
|
||||||
filename-derived IDs, complete unselected profiles, catalog ID bans,
|
|
||||||
successful-path asset preflights, compatibility readers, and new output
|
|
||||||
guarantees are not part of the accepted target.
|
|
||||||
2. Run `go build -o ./bin/audita ./cmd/audita` and `go test ./...`. Keep the
|
|
||||||
generated binary out of commits. Reuse successful checks on unchanged
|
|
||||||
content; rerun checks affected by any corrective code changes.
|
|
||||||
3. Validate the maintained examples offline using the built binary:
|
|
||||||
|
|
||||||
```sh
|
|
||||||
./bin/audita config validate --config examples/minimal-config.yml
|
|
||||||
./bin/audita config validate --config examples/configkit-inheritance.yml
|
|
||||||
AUDITA_SERVICE_KEY=synthetic-example ./bin/audita config validate --config examples/production-config.yml
|
|
||||||
AUDITA_SERVICE_KEY=synthetic-example ./bin/audita config validate --config examples/production-config.yml --overlay testing
|
|
||||||
./bin/audita config print-effective --config examples/minimal-config.yml --view profiles
|
|
||||||
./bin/audita config print-effective --config examples/configkit-inheritance.yml --view explain
|
|
||||||
```
|
|
||||||
|
|
||||||
Confirm local/service roots and testing selections work without provider
|
|
||||||
dispatch. Check safe views exclude resolved secrets and preserve the
|
|
||||||
established explanation fields. Do not call a model to validate examples.
|
|
||||||
4. Check the selected dependency graph, attribution, affected links, and final
|
|
||||||
diff. Run `git diff --check`. Confirm only the released modules are used and
|
|
||||||
no obsolete `/v2` catalog or removed construction API remains in active code.
|
|
||||||
Historical release documents and historical roadmap links may retain old
|
|
||||||
versions as accurate records.
|
|
||||||
5. Mark this plan and the feature roadmap complete only after the full target
|
|
||||||
passes. Record the tested implementation revision and checks accurately;
|
|
||||||
distinguish a subsequent documentation-only completion commit. Commit the
|
|
||||||
completion documentation and report remaining work, if any. Do not select
|
|
||||||
a release number, publish, tag, push, poll CI, or add permanent release gates.
|
|
||||||
|
|
||||||
**Completion marker:** Stage 9 complete. The tested implementation revision is
|
|
||||||
`5525fe8`; the preceding documentation migration commit is `9bcf183`, and this
|
|
||||||
roadmap closure is documentation-only. At `9bcf183`, the application built,
|
|
||||||
`go test ./...` passed, all six maintained example commands passed offline,
|
|
||||||
`go mod verify` passed, the selected module graph contained PromptKit v0.12.0
|
|
||||||
and both `/v3` catalogs at `v3.20260930.0` with no `/v2` catalogs, and
|
|
||||||
`git diff --check` passed. The active Go/module scan found no removed PromptKit
|
|
||||||
construction options.
|
|
||||||
|
|
||||||
**End state:** Native PromptKit configuration and catalogs are adopted,
|
|
||||||
operator overrides and captured resources work through the real runtime,
|
|
||||||
application backend/domain ownership and resilience remain effective, and
|
|
||||||
maintained examples and migration documentation match the implementation.
|
|
||||||
No implementation-blocking decisions remain; exact major-release numbering
|
|
||||||
and publication timing remain outside this implementation unit.
|
|
||||||
@@ -1,276 +0,0 @@
|
|||||||
# PromptKit v0.12.0 Adoption Roadmap
|
|
||||||
|
|
||||||
**Last updated:** 2026-10-04
|
|
||||||
|
|
||||||
**Status:** Complete. The implementation plan records the ordered work and
|
|
||||||
verification details.
|
|
||||||
|
|
||||||
## Purpose and Baseline
|
|
||||||
|
|
||||||
Adopt PromptKit v0.12.0 now that the independent
|
|
||||||
[ConfigKit v0.5.0 upgrade](configkit.md) is complete. Align Audita with the
|
|
||||||
libraries' native configuration model while retaining Audita's domain rules,
|
|
||||||
application-owned backend settings, and resilient processing workflow.
|
|
||||||
|
|
||||||
At reviewed Audita revision `8cba751835ba9faad340e933a3cfbb59c03924fd`,
|
|
||||||
[go.mod](../../go.mod) selects ConfigKit v0.5.0 and PromptKit v0.11.2, with
|
|
||||||
OpenRouter and Rakestrawhome `/v2` catalogs at `v2.20260926.0`. Go 1.25.5
|
|
||||||
remains the application minimum. The implemented contracts belong to
|
|
||||||
[configuration](../config.md), the
|
|
||||||
[LLM integration](../integrations/openai-compatible-llm.md), and the
|
|
||||||
[LLM runtime](../internal/llm-runtime.md).
|
|
||||||
|
|
||||||
`internal/framework/llm.NewRuntime` currently assembles one engine using the
|
|
||||||
old prompt/profile filesystem options and programmatic backend registration.
|
|
||||||
Audita embeds seven prompt definitions and separate response schemas. Operators
|
|
||||||
select proposal and validation profiles from `profiles_dir`; the effective
|
|
||||||
backend must be registered in application configuration, its endpoint must
|
|
||||||
match, and its credential comes from Audita's ConfigKit-resolved settings.
|
|
||||||
Successful profile reads are recorded to protect those sources from output
|
|
||||||
collisions. Both roles share the same engine's backend admission controls.
|
|
||||||
|
|
||||||
The reviewed upstream release is
|
|
||||||
[PromptKit v0.12.0](https://gitea.maximumdirect.net/eric/promptkit/src/tag/v0.12.0/docs/releases/v0.12.0.md),
|
|
||||||
commit `4b8169da286917fde7875425bb32b799b12c6af3`. It depends on ConfigKit
|
|
||||||
v0.5.0 and both maintained `/v3` catalog modules at `v3.20260930.0`. This is an
|
|
||||||
intentional incompatible pre-1.0 minor release: it replaces construction and
|
|
||||||
configuration APIs, rather than simply updating provider data. PromptKit's
|
|
||||||
[format reference](https://gitea.maximumdirect.net/eric/promptkit/src/tag/v0.12.0/docs/formats.md)
|
|
||||||
and [consumer migration guide](https://gitea.maximumdirect.net/eric/promptkit/src/tag/v0.12.0/docs/consumers/pkg-promptkit.md#migrate-from-the-previous-configuration-api)
|
|
||||||
own the upstream details.
|
|
||||||
|
|
||||||
## Target End State
|
|
||||||
|
|
||||||
- Audita imports released PromptKit v0.12.0 and its `/v3` catalogs, retaining
|
|
||||||
ConfigKit v0.5.0 and using no local dependency replacement.
|
|
||||||
- The runtime uses `Config.Sources` and native ConfigKit source groups.
|
|
||||||
PromptKit owns composition, inheritance, presence, final-definition
|
|
||||||
validation, prompt capture, and execution. Audita does not translate old
|
|
||||||
profiles or implement a second YAML loader or inheritance resolver.
|
|
||||||
- Embedded prompts and maintained operator profiles use keyed `prompts` and
|
|
||||||
`profiles` mappings. Existing prompt IDs, versions, role selections,
|
|
||||||
instructions, and response-schema associations remain the adoption baseline.
|
|
||||||
The application configuration schema, overlay selection, CLI interface, and
|
|
||||||
main-file-relative `profiles_dir` resolution remain in place.
|
|
||||||
- Native profile `extends`, field-presence semantics, and source-relative
|
|
||||||
resource rules apply. Documents can contain multiple definitions, and IDs
|
|
||||||
come from mapping keys rather than filenames. The existing `profiles_dir`
|
|
||||||
accepts native unified PromptKit documents containing profiles, backends,
|
|
||||||
and prompts, including intentional operator prompt overrides.
|
|
||||||
- Application backend endpoints, configured concurrency and queue capacity,
|
|
||||||
and credential ownership remain authoritative for selected roles. Preserve
|
|
||||||
the existing profile-selection and prepared-target checks; do not introduce
|
|
||||||
a second admission controller or implicit provider credential lookup.
|
|
||||||
- A runtime uses one captured configuration snapshot for both roles. Each CLI
|
|
||||||
invocation constructs a new engine; hot reload is not part of this feature.
|
|
||||||
Existing inspection remains offline and safe, and consumed host sources
|
|
||||||
remain protected from output collisions.
|
|
||||||
- PromptKit retains responsibility for transport retries, schema repair,
|
|
||||||
observation, and prepared execution. Preserve Audita's configured retry and
|
|
||||||
repair budgets, operation deadlines, cancellation, partial-success behavior,
|
|
||||||
error/recovery reporting, and debug selection.
|
|
||||||
|
|
||||||
## Configuration Assembly and Ownership
|
|
||||||
|
|
||||||
Replace removed `WithPromptFS`, `WithProfileFS`, and `WithBackend` usage with
|
|
||||||
the released source API. Discover embedded YAML through `FilesystemInputs` and
|
|
||||||
operator YAML through `DirectoryInputs`, with explicit caller tiers. Keep the
|
|
||||||
retained schema filesystem integration and HTTP client configuration.
|
|
||||||
Use the helpers' default-disabled imports; this adoption does not require new
|
|
||||||
application source-selection flags or operator underlay tiers.
|
|
||||||
|
|
||||||
PromptKit supplies catalog definitions first and its own defaults next. Caller
|
|
||||||
tiers then overlay in their supplied order, followed by an optional highest
|
|
||||||
priority main input. Files within one directory group compose strictly;
|
|
||||||
alphabetical filenames do not establish override precedence. Use separate
|
|
||||||
tiers for genuine priority differences rather than manufacturing file-order
|
|
||||||
semantics.
|
|
||||||
|
|
||||||
Represent application backend settings as a final programmatic source, using
|
|
||||||
`BackendSource` or ConfigKit mappings where explicit null is needed. Preserve
|
|
||||||
configured zero queue capacity as an explicit value. Suppress backend-derived
|
|
||||||
credential environment lookup explicitly where catalog layering would otherwise
|
|
||||||
introduce it; omission alone can retain a lower-tier value. Continue detecting
|
|
||||||
competing effective profile credential lookups rather than silently clearing
|
|
||||||
operator profile fields. A missing backend credential remains valid for an
|
|
||||||
unauthenticated local service unless the selected profile requires a key.
|
|
||||||
|
|
||||||
Catalog backend IDs are no longer reserved upstream. Audita should not invent a
|
|
||||||
new reservation rule. Catalog selection alone must not bypass application
|
|
||||||
registration, endpoint, capacity, or credential requirements. Catalog profile
|
|
||||||
contents may evolve; this upgrade does not promise fixed model choices or live
|
|
||||||
provider availability.
|
|
||||||
|
|
||||||
The accepted caller order is embedded Audita prompts, operator definitions,
|
|
||||||
then application backend settings. The existing `profiles_dir` accepts native
|
|
||||||
unified PromptKit documents containing profiles, backends, and prompts. Keep
|
|
||||||
the name and path setting for continuity, and document its broader accepted
|
|
||||||
content. This follows the upstream source API without a parallel parser or
|
|
||||||
top-level filtering. Profiles, provider defaults, and intentional prompt
|
|
||||||
overrides use the same native composition model.
|
|
||||||
|
|
||||||
Audita continues to ship its domain prompts, enforce its selected-backend
|
|
||||||
requirements, and supply its per-call schemas. Operator prompt overrides are
|
|
||||||
an accepted capability of this adoption; documentation, source accounting,
|
|
||||||
and focused behavioral coverage should reflect them.
|
|
||||||
|
|
||||||
## Work Required
|
|
||||||
|
|
||||||
### Runtime Construction and Source Accounting
|
|
||||||
|
|
||||||
Migrate `internal/framework/llm/runtime.go` to layered construction and retain
|
|
||||||
the role-bound adapter boundary. Review startup inspection and failure
|
|
||||||
classification because upstream now validates all final definitions, including
|
|
||||||
unused ones, during engine construction. Distinguish invalid operator inputs
|
|
||||||
from broken embedded assets under the existing
|
|
||||||
[CLI exit contract](../cli.md); do not treat every construction failure as an
|
|
||||||
operator error merely because validation moved earlier.
|
|
||||||
|
|
||||||
Upstream permits partial profiles and defers endpoint/model completeness until
|
|
||||||
request overrides are applied. Audita supplies no model override, so explicitly
|
|
||||||
validate that both selected role profiles have a nonblank model and a complete
|
|
||||||
effective endpoint during offline configuration validation and runtime setup.
|
|
||||||
Retain the application-backend, endpoint-match, and credential checks. Do not
|
|
||||||
rely on engine construction or profile inspection alone to establish selected
|
|
||||||
profile completeness. Unselected partial profiles remain permitted if they
|
|
||||||
satisfy upstream definition validation; they need not be runnable.
|
|
||||||
|
|
||||||
Adapt source accounting to the new discovery/capture boundary. The existing
|
|
||||||
recording filesystem wrapper may be replaceable with discovered inputs or
|
|
||||||
upstream source metadata. Protect the host sources actually consumed by the
|
|
||||||
runtime, including inherited and differently named definitions, without
|
|
||||||
guessing filenames from selected profile IDs. Account for consumed operator
|
|
||||||
message files as well. Keep this proportionate to the existing collision
|
|
||||||
contract; do not add filesystem concurrency or power-loss guarantees.
|
|
||||||
|
|
||||||
Keep the existing safe effective-profile summaries and application explanations.
|
|
||||||
Use upstream metadata where useful, but do not expose the full
|
|
||||||
`InspectConfiguration` snapshot as ordinary CLI or report output: prompt text
|
|
||||||
and arbitrary provider fields are outside those summaries' current scope.
|
|
||||||
|
|
||||||
### Prompt Assets, Profiles, and Presence Semantics
|
|
||||||
|
|
||||||
Move each of the seven files in `internal/prompts/assets/prompts` to the keyed
|
|
||||||
prompt/version format. Keep the shared instruction fragments and the complete
|
|
||||||
per-call output contracts owned by Audita. This migration does not authorize
|
|
||||||
another prompt-quality rewrite or changes to domain validators.
|
|
||||||
|
|
||||||
The adapter supplies `HardeningPolicy`, `ProposalContract`, and
|
|
||||||
`ValidationContract` as template variables. Embedded prompts retain their
|
|
||||||
references to the applicable variables. Operator message overrides control
|
|
||||||
whether those variables are rendered; supplying a variable does not inject its
|
|
||||||
text into a template that omits it. Preserve this native override behavior and
|
|
||||||
document the distinction. Per-call schemas and domain validation remain enforced
|
|
||||||
regardless of those references. Unconditional shared-instruction injection is
|
|
||||||
outside this adoption.
|
|
||||||
|
|
||||||
Convert the six maintained profiles in `examples/profiles` and test-generated
|
|
||||||
profile/prompt fixtures to the new format. Convert any old `base_profile`
|
|
||||||
usage to `extends`, and remove embedded identities. Migrate tests that construct
|
|
||||||
engines using removed options or old `Profile`/`Backend` values.
|
|
||||||
|
|
||||||
Reorganize the maintained profiles into separately selected local and service
|
|
||||||
directory roots. The current shared directory includes profiles referring to
|
|
||||||
backends absent from each example's application configuration; eager validation
|
|
||||||
would reject those unselected definitions after a format-only conversion.
|
|
||||||
Update `profiles_dir` in `examples/minimal-config.yml`,
|
|
||||||
`examples/production-config.yml`, and `examples/configkit-inheritance.yml` to
|
|
||||||
select the appropriate root. Keep the service testing profiles in the service
|
|
||||||
root so the testing overlay remains usable. Discovery is recursive: placing
|
|
||||||
both groups beneath a common selected root does not isolate them. Update example
|
|
||||||
links and validation recipes to match the final layout.
|
|
||||||
|
|
||||||
Review presence deliberately rather than mechanically preserving old serialized
|
|
||||||
values. In particular, explicit zero temperature, top-p, or max-tokens now means
|
|
||||||
an outbound zero; zero timeout disables PromptKit's generation deadline while
|
|
||||||
Audita's outer operation deadline still applies. Omission, blank values, and
|
|
||||||
null have field-specific meanings. Empty provider maps do not erase inherited
|
|
||||||
entries, and changing model/backend does not erase unrelated explicit settings.
|
|
||||||
|
|
||||||
Use the native meanings without a compatibility shim. Retaining the examples'
|
|
||||||
literal `temperature: 0` as an explicit provider setting is recommended; explain
|
|
||||||
that omitting the field requests an unspecified value, and null suppresses an
|
|
||||||
inherited control. Do not automatically turn every existing zero into omission
|
|
||||||
or every omission into a zero. Demonstrate representative profile inheritance
|
|
||||||
without requiring every maintained example to use it.
|
|
||||||
|
|
||||||
### Documentation, Migration, and Attribution
|
|
||||||
|
|
||||||
Update the profile section of `docs/config.md` and maintained examples when the
|
|
||||||
implementation lands. Explain the broader accepted content of `profiles_dir`,
|
|
||||||
operator prompt overrides, their precedence and optional use of shared instruction
|
|
||||||
variables, keyed identities, composition versus precedence, profile inheritance,
|
|
||||||
presence, eager final-definition validation, selected-root errors, and captured
|
|
||||||
configuration. Link to the pinned
|
|
||||||
upstream reference for generic field semantics rather than reproducing its
|
|
||||||
entire contract.
|
|
||||||
|
|
||||||
Include operator migration guidance for old profile documents and behaviorally
|
|
||||||
significant zeros/nulls. This is a deliberate format migration, not an automatic
|
|
||||||
upgrade of existing installation files. Preserve supported application overlays,
|
|
||||||
including the cheaper/faster testing-profile workflow.
|
|
||||||
|
|
||||||
Update the pinned consumer link in `docs/integrations/openai-compatible-llm.md`,
|
|
||||||
construction/source-accounting descriptions in `docs/internal/llm-runtime.md`,
|
|
||||||
and asset-format guidance in `docs/internal/prompts.md`. Update other affected
|
|
||||||
references only where implemented behavior changes.
|
|
||||||
|
|
||||||
Update `go.mod`, `go.sum`, and `docs/oss/attribution.md` for PromptKit and the two
|
|
||||||
catalog modules. Verify exact selected source revisions and upstream notices
|
|
||||||
under the [OSS policy](../policy/oss.md); retain the applicable LGPL/GPL and MIT
|
|
||||||
texts rather than duplicating unchanged license documents. Dependency adoption
|
|
||||||
does not change Audita's application license.
|
|
||||||
|
|
||||||
Plan this adoption for an Audita major release under the
|
|
||||||
[release policy](../policy/release.md#versioning-and-compatibility). The public
|
|
||||||
profile format changes incompatibly and no compatibility loader is planned;
|
|
||||||
PromptKit's own pre-1.0 minor version does not change Audita's classification.
|
|
||||||
The exact version and publication timing remain deferred to release preparation.
|
|
||||||
|
|
||||||
## Verification and Completion
|
|
||||||
|
|
||||||
Use existing offline tests as the starting point. Update fixtures intentionally,
|
|
||||||
and add focused behavioral coverage where the source migration creates a
|
|
||||||
distinct risk. Completion means:
|
|
||||||
|
|
||||||
- The released dependency set builds and the complete Audita test suite passes.
|
|
||||||
- All registered embedded prompts load and render from keyed assets, retaining
|
|
||||||
their applicable shared-instruction references and established per-call schemas.
|
|
||||||
- Offline configuration validation rejects incomplete selected profiles, including
|
|
||||||
a missing or blank model, while accepting valid unselected partial profiles.
|
|
||||||
- Selected roles use final application backend settings and direct resolved
|
|
||||||
credentials; both roles still share configured capacity, including explicit
|
|
||||||
zero queue capacity. Catalog layering does not introduce a competing lookup.
|
|
||||||
- Representative keyed profiles, native inheritance, and explicit presence work
|
|
||||||
through the real runtime. Directory conflicts and invalid final definitions
|
|
||||||
produce useful startup errors without filename-derived identity assumptions.
|
|
||||||
- Operator prompt and backend contributions follow the accepted source order;
|
|
||||||
prompt overrides render, including when their messages omit shared-instruction
|
|
||||||
variables, while Audita retains its per-call schemas, domain validation, and
|
|
||||||
authoritative application backend settings.
|
|
||||||
- Source collision protection, safe inspection, and operator-versus-asset error
|
|
||||||
classification remain effective at the changed construction boundary.
|
|
||||||
- Representative prepared execution, schema repair, transient retry, and
|
|
||||||
partial-success tests retain their existing behavior. Reuse adequate coverage
|
|
||||||
rather than duplicating PromptKit's complete upstream test matrix.
|
|
||||||
- Local, service, testing-overlay, and ConfigKit inheritance examples validate
|
|
||||||
offline using their separately selected profile roots. Canonical documentation
|
|
||||||
describes the migrated format, shared-instruction behavior, and major-release
|
|
||||||
migration; attribution identifies the selected library sources accurately.
|
|
||||||
|
|
||||||
No live provider calls, new release gates, or CI-success dependency are needed
|
|
||||||
to establish adoption. Guided domain recovery and the other work recorded in
|
|
||||||
[future.md](future.md) remain separate features. Do not expand this upgrade into
|
|
||||||
new report formats, pipeline scheduling, or general configuration-inspection
|
|
||||||
commands. The [implementation plan](implementation.md) owns execution steps
|
|
||||||
and their verification.
|
|
||||||
|
|
||||||
## Completion Record
|
|
||||||
|
|
||||||
Implementation code is recorded through revision `5525fe8`; documentation was
|
|
||||||
updated in `9bcf183`, and the final roadmap closure is documentation-only. At
|
|
||||||
`9bcf183`, `go build -o ./bin/audita ./cmd/audita`, `go test ./...`, all six
|
|
||||||
offline maintained-example commands in the implementation plan, `go mod
|
|
||||||
verify`, and `git diff --check` passed. The selected dependency graph and
|
|
||||||
commit-pinned attribution match PromptKit v0.12.0 and both `/v3` catalogs at
|
|
||||||
`v3.20260930.0`.
|
|
||||||
13
go.mod
13
go.mod
@@ -1,10 +1,12 @@
|
|||||||
module gitea.maximumdirect.net/eric/audita
|
module gitea.maximumdirect.net/eric/audita/v3
|
||||||
|
|
||||||
go 1.25.5
|
go 1.26.0
|
||||||
|
|
||||||
require (
|
require (
|
||||||
gitea.maximumdirect.net/eric/ConfigKit v0.5.0
|
gitea.maximumdirect.net/eric/ConfigKit v0.7.1
|
||||||
gitea.maximumdirect.net/eric/promptkit v0.12.0
|
gitea.maximumdirect.net/eric/ReleaseKit v0.4.1
|
||||||
|
gitea.maximumdirect.net/eric/promptkit v0.14.0
|
||||||
|
golang.org/x/mod v0.40.0
|
||||||
gopkg.in/yaml.v3 v3.0.1
|
gopkg.in/yaml.v3 v3.0.1
|
||||||
)
|
)
|
||||||
|
|
||||||
@@ -14,7 +16,10 @@ require (
|
|||||||
github.com/kr/pretty v0.3.1 // indirect
|
github.com/kr/pretty v0.3.1 // indirect
|
||||||
github.com/rogpeppe/go-internal v1.14.1 // indirect
|
github.com/rogpeppe/go-internal v1.14.1 // indirect
|
||||||
github.com/santhosh-tekuri/jsonschema/v6 v6.0.2 // indirect
|
github.com/santhosh-tekuri/jsonschema/v6 v6.0.2 // indirect
|
||||||
|
github.com/yuin/goldmark/v2 v2.1.6 // indirect
|
||||||
go.yaml.in/yaml/v4 v4.0.0-rc.6 // indirect
|
go.yaml.in/yaml/v4 v4.0.0-rc.6 // indirect
|
||||||
golang.org/x/text v0.14.0 // indirect
|
golang.org/x/text v0.14.0 // indirect
|
||||||
gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c // indirect
|
gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c // indirect
|
||||||
)
|
)
|
||||||
|
|
||||||
|
tool gitea.maximumdirect.net/eric/ReleaseKit/cmd/releasekit
|
||||||
|
|||||||
14
go.sum
14
go.sum
@@ -1,7 +1,9 @@
|
|||||||
gitea.maximumdirect.net/eric/ConfigKit v0.5.0 h1:2KwG10+kApWM3avOoYA+p768xcbHUp7tQ2rqizBNpyg=
|
gitea.maximumdirect.net/eric/ConfigKit v0.7.1 h1:q3HrX4WWCPt1WfMydqFEaAmCf9s6Dq+vknJj0C/mdcI=
|
||||||
gitea.maximumdirect.net/eric/ConfigKit v0.5.0/go.mod h1:tYWpsrbLyu05r8+1MapWp5fN6ZrX9I8hU2xEPedYmYk=
|
gitea.maximumdirect.net/eric/ConfigKit v0.7.1/go.mod h1:C82sbyKHYMV1OwaD2GJanFrwTfcZfjlW2JsGze5b0kA=
|
||||||
gitea.maximumdirect.net/eric/promptkit v0.12.0 h1:oIFWEg6GPxtmX3Plqv0euP+FnK1LCk/t4xDy6oKCpP4=
|
gitea.maximumdirect.net/eric/ReleaseKit v0.4.1 h1:Qn+mdebYOzCVCEXgCbuGSO/WHmJtItwaQ8e3XwY3qtI=
|
||||||
gitea.maximumdirect.net/eric/promptkit v0.12.0/go.mod h1:pFOOy5v1zH17stEi9rmHYmfbuLjnfVMcUhfmk+4VtJY=
|
gitea.maximumdirect.net/eric/ReleaseKit v0.4.1/go.mod h1:LVodqNQ3OIKv9NBq+fFeyMByd1lHY25YOmmpah/NaNI=
|
||||||
|
gitea.maximumdirect.net/eric/promptkit v0.14.0 h1:HUzlcrFk18dNGPBgnHqjAw87O0c9Wl/IC1xc/VmzL10=
|
||||||
|
gitea.maximumdirect.net/eric/promptkit v0.14.0/go.mod h1:2YGvNca3bNXZP+e+pJeGzsNUcxwkHvzvuoc+LNNiT3E=
|
||||||
gitea.maximumdirect.net/eric/promptkit-backend-openrouter/v3 v3.20260930.0 h1:lzfCDbzJQRGzIlRPRprnAV9hVVL5zUQy80VMQ0kbYa0=
|
gitea.maximumdirect.net/eric/promptkit-backend-openrouter/v3 v3.20260930.0 h1:lzfCDbzJQRGzIlRPRprnAV9hVVL5zUQy80VMQ0kbYa0=
|
||||||
gitea.maximumdirect.net/eric/promptkit-backend-openrouter/v3 v3.20260930.0/go.mod h1:HjS0f+3q0IdHCTEz+VVAEgIwIWJFAZUjuKdAtvtqKdg=
|
gitea.maximumdirect.net/eric/promptkit-backend-openrouter/v3 v3.20260930.0/go.mod h1:HjS0f+3q0IdHCTEz+VVAEgIwIWJFAZUjuKdAtvtqKdg=
|
||||||
gitea.maximumdirect.net/eric/promptkit-backend-rakestrawhome/v3 v3.20260930.0 h1:h12ZTRldAmpLAomj0oQRGteFxHLN1LPE6XDl9zJNbm8=
|
gitea.maximumdirect.net/eric/promptkit-backend-rakestrawhome/v3 v3.20260930.0 h1:h12ZTRldAmpLAomj0oQRGteFxHLN1LPE6XDl9zJNbm8=
|
||||||
@@ -22,8 +24,12 @@ github.com/rogpeppe/go-internal v1.14.1 h1:UQB4HGPB6osV0SQTLymcB4TgvyWu6ZyliaW0t
|
|||||||
github.com/rogpeppe/go-internal v1.14.1/go.mod h1:MaRKkUm5W0goXpeCfT7UZI6fk/L7L7so1lCWt35ZSgc=
|
github.com/rogpeppe/go-internal v1.14.1/go.mod h1:MaRKkUm5W0goXpeCfT7UZI6fk/L7L7so1lCWt35ZSgc=
|
||||||
github.com/santhosh-tekuri/jsonschema/v6 v6.0.2 h1:KRzFb2m7YtdldCEkzs6KqmJw4nqEVZGK7IN2kJkjTuQ=
|
github.com/santhosh-tekuri/jsonschema/v6 v6.0.2 h1:KRzFb2m7YtdldCEkzs6KqmJw4nqEVZGK7IN2kJkjTuQ=
|
||||||
github.com/santhosh-tekuri/jsonschema/v6 v6.0.2/go.mod h1:JXeL+ps8p7/KNMjDQk3TCwPpBy0wYklyWTfbkIzdIFU=
|
github.com/santhosh-tekuri/jsonschema/v6 v6.0.2/go.mod h1:JXeL+ps8p7/KNMjDQk3TCwPpBy0wYklyWTfbkIzdIFU=
|
||||||
|
github.com/yuin/goldmark/v2 v2.1.6 h1:igy0q9JcqovoFXFx/XjtU8sHVhcUHavPj2sA3EoKJUE=
|
||||||
|
github.com/yuin/goldmark/v2 v2.1.6/go.mod h1:G6M4/qOFtfn01/o14BU1UR2Lo5N3S9Qo7xCuz/sHjGQ=
|
||||||
go.yaml.in/yaml/v4 v4.0.0-rc.6 h1:1h7H1ohdUh93/FyE4YaDa1Zh64K6VVbjF4K6WUxMtH4=
|
go.yaml.in/yaml/v4 v4.0.0-rc.6 h1:1h7H1ohdUh93/FyE4YaDa1Zh64K6VVbjF4K6WUxMtH4=
|
||||||
go.yaml.in/yaml/v4 v4.0.0-rc.6/go.mod h1:aZqd9kCMsGL7AuUv/m/PvWLdg5sjJsZ4oHDEnfPPfY0=
|
go.yaml.in/yaml/v4 v4.0.0-rc.6/go.mod h1:aZqd9kCMsGL7AuUv/m/PvWLdg5sjJsZ4oHDEnfPPfY0=
|
||||||
|
golang.org/x/mod v0.40.0 h1:hUv+3cXcdRHz08UmSiOob7sadHig73uo5bkXxQ/tvUs=
|
||||||
|
golang.org/x/mod v0.40.0/go.mod h1:0/weTWkPWGBikyTWAX3dkjVztMmBA5hM0DH6BElSupE=
|
||||||
golang.org/x/text v0.14.0 h1:ScX5w1eTa3QqT8oi6+ziP7dTV1S2+ALU0bI+0zXKWiQ=
|
golang.org/x/text v0.14.0 h1:ScX5w1eTa3QqT8oi6+ziP7dTV1S2+ALU0bI+0zXKWiQ=
|
||||||
golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU=
|
golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU=
|
||||||
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
|
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
|
||||||
|
|||||||
@@ -11,7 +11,7 @@ import (
|
|||||||
"strings"
|
"strings"
|
||||||
|
|
||||||
ck "gitea.maximumdirect.net/eric/ConfigKit"
|
ck "gitea.maximumdirect.net/eric/ConfigKit"
|
||||||
"gitea.maximumdirect.net/eric/audita/internal/core/config"
|
"gitea.maximumdirect.net/eric/audita/v3/internal/core/config"
|
||||||
)
|
)
|
||||||
|
|
||||||
var systemConfigPaths = []string{"/usr/local/etc/audita/config.yml", "/etc/audita/config.yml"}
|
var systemConfigPaths = []string{"/usr/local/etc/audita/config.yml", "/etc/audita/config.yml"}
|
||||||
|
|||||||
@@ -9,7 +9,7 @@ import (
|
|||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
ck "gitea.maximumdirect.net/eric/ConfigKit"
|
ck "gitea.maximumdirect.net/eric/ConfigKit"
|
||||||
"gitea.maximumdirect.net/eric/audita/internal/core/config"
|
"gitea.maximumdirect.net/eric/audita/v3/internal/core/config"
|
||||||
)
|
)
|
||||||
|
|
||||||
func TestSharedConfigInput(t *testing.T) {
|
func TestSharedConfigInput(t *testing.T) {
|
||||||
|
|||||||
@@ -12,22 +12,22 @@ import (
|
|||||||
"sync"
|
"sync"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
"gitea.maximumdirect.net/eric/audita/internal/core/chunking"
|
"gitea.maximumdirect.net/eric/audita/v3/internal/core/chunking"
|
||||||
"gitea.maximumdirect.net/eric/audita/internal/core/config"
|
"gitea.maximumdirect.net/eric/audita/v3/internal/core/config"
|
||||||
"gitea.maximumdirect.net/eric/audita/internal/core/diagnostics"
|
"gitea.maximumdirect.net/eric/audita/v3/internal/core/diagnostics"
|
||||||
coreio "gitea.maximumdirect.net/eric/audita/internal/core/io"
|
coreio "gitea.maximumdirect.net/eric/audita/v3/internal/core/io"
|
||||||
"gitea.maximumdirect.net/eric/audita/internal/core/normalization"
|
"gitea.maximumdirect.net/eric/audita/v3/internal/core/normalization"
|
||||||
"gitea.maximumdirect.net/eric/audita/internal/core/outputschema"
|
"gitea.maximumdirect.net/eric/audita/v3/internal/core/outputschema"
|
||||||
"gitea.maximumdirect.net/eric/audita/internal/core/redaction"
|
"gitea.maximumdirect.net/eric/audita/v3/internal/core/redaction"
|
||||||
"gitea.maximumdirect.net/eric/audita/internal/core/reporting"
|
"gitea.maximumdirect.net/eric/audita/v3/internal/core/reporting"
|
||||||
"gitea.maximumdirect.net/eric/audita/internal/core/schema"
|
"gitea.maximumdirect.net/eric/audita/v3/internal/core/schema"
|
||||||
"gitea.maximumdirect.net/eric/audita/internal/framework/contracts"
|
"gitea.maximumdirect.net/eric/audita/v3/internal/framework/contracts"
|
||||||
"gitea.maximumdirect.net/eric/audita/internal/framework/llm"
|
"gitea.maximumdirect.net/eric/audita/v3/internal/framework/llm"
|
||||||
"gitea.maximumdirect.net/eric/audita/internal/framework/modules"
|
"gitea.maximumdirect.net/eric/audita/v3/internal/framework/modules"
|
||||||
"gitea.maximumdirect.net/eric/audita/internal/framework/outcomes"
|
"gitea.maximumdirect.net/eric/audita/v3/internal/framework/outcomes"
|
||||||
"gitea.maximumdirect.net/eric/audita/internal/framework/processreport"
|
"gitea.maximumdirect.net/eric/audita/v3/internal/framework/processreport"
|
||||||
"gitea.maximumdirect.net/eric/audita/internal/framework/runner"
|
"gitea.maximumdirect.net/eric/audita/v3/internal/framework/runner"
|
||||||
"gitea.maximumdirect.net/eric/audita/internal/framework/structuredoutput"
|
"gitea.maximumdirect.net/eric/audita/v3/internal/framework/structuredoutput"
|
||||||
)
|
)
|
||||||
|
|
||||||
func runProcess(ctx context.Context, args []string, stdout, stderr io.Writer) int {
|
func runProcess(ctx context.Context, args []string, stdout, stderr io.Writer) int {
|
||||||
|
|||||||
@@ -2,11 +2,13 @@ package cli
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"context"
|
"context"
|
||||||
|
"flag"
|
||||||
"fmt"
|
"fmt"
|
||||||
"io"
|
"io"
|
||||||
|
|
||||||
"gitea.maximumdirect.net/eric/audita/internal/core/schema"
|
"gitea.maximumdirect.net/eric/ReleaseKit/buildinfo"
|
||||||
"gitea.maximumdirect.net/eric/audita/internal/framework/llm"
|
"gitea.maximumdirect.net/eric/audita/v3/internal/core/schema"
|
||||||
|
"gitea.maximumdirect.net/eric/audita/v3/internal/framework/llm"
|
||||||
)
|
)
|
||||||
|
|
||||||
func sourceToCanonicalTranscript(source *schema.SourceTranscript) *schema.Transcript {
|
func sourceToCanonicalTranscript(source *schema.SourceTranscript) *schema.Transcript {
|
||||||
@@ -42,6 +44,9 @@ func Run(ctx context.Context, args []string, stdout, stderr io.Writer) int {
|
|||||||
case "config":
|
case "config":
|
||||||
writeConfigUsage(stdout)
|
writeConfigUsage(stdout)
|
||||||
return 0
|
return 0
|
||||||
|
case "version":
|
||||||
|
writeVersionUsage(stdout)
|
||||||
|
return 0
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -56,12 +61,36 @@ func Run(ctx context.Context, args []string, stdout, stderr io.Writer) int {
|
|||||||
if args[0] == "config" {
|
if args[0] == "config" {
|
||||||
return runConfig(ctx, args[1:], stdout, stderr)
|
return runConfig(ctx, args[1:], stdout, stderr)
|
||||||
}
|
}
|
||||||
|
if args[0] == "version" {
|
||||||
|
return runVersion(args[1:], stdout, stderr)
|
||||||
|
}
|
||||||
|
|
||||||
fmt.Fprintf(stderr, "audita: unknown command %q\n\n", args[0])
|
fmt.Fprintf(stderr, "audita: unknown command %q\n\n", args[0])
|
||||||
writeRootUsage(stderr)
|
writeRootUsage(stderr)
|
||||||
return 2
|
return 2
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func runVersion(args []string, stdout, stderr io.Writer) int {
|
||||||
|
flags := flag.NewFlagSet("version", flag.ContinueOnError)
|
||||||
|
flags.SetOutput(stderr)
|
||||||
|
flags.Usage = func() {} // Route usage after parsing so help stays on stdout.
|
||||||
|
if err := flags.Parse(args); err != nil {
|
||||||
|
if err == flag.ErrHelp {
|
||||||
|
writeVersionUsage(stdout)
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
writeVersionUsage(stderr)
|
||||||
|
return 2
|
||||||
|
}
|
||||||
|
if positional := flags.Args(); len(positional) > 0 {
|
||||||
|
fmt.Fprintf(stderr, "audita version: unexpected argument %q\n\n", positional[0])
|
||||||
|
writeVersionUsage(stderr)
|
||||||
|
return 2
|
||||||
|
}
|
||||||
|
fmt.Fprintf(stdout, "audita %s\n", buildinfo.Version())
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
|
||||||
func runConfig(ctx context.Context, args []string, stdout, stderr io.Writer) int {
|
func runConfig(ctx context.Context, args []string, stdout, stderr io.Writer) int {
|
||||||
if len(args) == 0 || isHelpCommand(args) || args[0] == "--help" || args[0] == "-h" {
|
if len(args) == 0 || isHelpCommand(args) || args[0] == "--help" || args[0] == "-h" {
|
||||||
writeConfigUsage(stdout)
|
writeConfigUsage(stdout)
|
||||||
@@ -177,11 +206,19 @@ func writeRootUsage(w io.Writer) {
|
|||||||
fmt.Fprintln(w, "Commands:")
|
fmt.Fprintln(w, "Commands:")
|
||||||
fmt.Fprintln(w, " process Process a transcript JSON file")
|
fmt.Fprintln(w, " process Process a transcript JSON file")
|
||||||
fmt.Fprintln(w, " config Validate and inspect config")
|
fmt.Fprintln(w, " config Validate and inspect config")
|
||||||
|
fmt.Fprintln(w, " version Print the Audita version")
|
||||||
fmt.Fprintln(w)
|
fmt.Fprintln(w)
|
||||||
fmt.Fprintln(w, "Example:")
|
fmt.Fprintln(w, "Example:")
|
||||||
fmt.Fprintln(w, " audita process transcript.json --glossary glossary.yaml --output corrected.json")
|
fmt.Fprintln(w, " audita process transcript.json --glossary glossary.yaml --output corrected.json")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func writeVersionUsage(w io.Writer) {
|
||||||
|
fmt.Fprintln(w, "Print the Audita version.")
|
||||||
|
fmt.Fprintln(w)
|
||||||
|
fmt.Fprintln(w, "Usage:")
|
||||||
|
fmt.Fprintln(w, " audita version")
|
||||||
|
}
|
||||||
|
|
||||||
func writeConfigUsage(w io.Writer) {
|
func writeConfigUsage(w io.Writer) {
|
||||||
fmt.Fprintln(w, "Validate and inspect Audita config.")
|
fmt.Fprintln(w, "Validate and inspect Audita config.")
|
||||||
fmt.Fprintln(w)
|
fmt.Fprintln(w)
|
||||||
|
|||||||
73
internal/cli/version_test.go
Normal file
73
internal/cli/version_test.go
Normal file
@@ -0,0 +1,73 @@
|
|||||||
|
package cli
|
||||||
|
|
||||||
|
import (
|
||||||
|
"bytes"
|
||||||
|
"context"
|
||||||
|
"fmt"
|
||||||
|
"strings"
|
||||||
|
"testing"
|
||||||
|
|
||||||
|
"gitea.maximumdirect.net/eric/ReleaseKit/buildinfo"
|
||||||
|
)
|
||||||
|
|
||||||
|
func TestVersionCommandRunsWithoutApplicationSetup(t *testing.T) {
|
||||||
|
t.Chdir(t.TempDir())
|
||||||
|
var stdout, stderr bytes.Buffer
|
||||||
|
if code := Run(context.Background(), []string{"version"}, &stdout, &stderr); code != 0 {
|
||||||
|
t.Fatalf("exit=%d, stdout=%q, stderr=%q", code, stdout.String(), stderr.String())
|
||||||
|
}
|
||||||
|
if got, want := stdout.String(), fmt.Sprintf("audita %s\n", buildinfo.Version()); got != want {
|
||||||
|
t.Fatalf("stdout=%q, want %q", got, want)
|
||||||
|
}
|
||||||
|
if got := stderr.String(); got != "" {
|
||||||
|
t.Fatalf("stderr=%q, want empty", got)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestVersionCommandHelp(t *testing.T) {
|
||||||
|
for _, test := range []struct {
|
||||||
|
name string
|
||||||
|
args []string
|
||||||
|
want string
|
||||||
|
}{
|
||||||
|
{name: "root help", args: []string{"--help"}, want: "version Print the Audita version"},
|
||||||
|
{name: "help version", args: []string{"help", "version"}, want: "audita version"},
|
||||||
|
{name: "short flag", args: []string{"version", "-h"}, want: "audita version"},
|
||||||
|
{name: "long flag", args: []string{"version", "--help"}, want: "audita version"},
|
||||||
|
{name: "parser help", args: []string{"version", "--h"}, want: "audita version"},
|
||||||
|
{name: "help short circuits", args: []string{"version", "-h", "--help", "extra"}, want: "audita version"},
|
||||||
|
} {
|
||||||
|
t.Run(test.name, func(t *testing.T) {
|
||||||
|
var stdout, stderr bytes.Buffer
|
||||||
|
if code := Run(context.Background(), test.args, &stdout, &stderr); code != 0 {
|
||||||
|
t.Fatalf("exit=%d, stdout=%q, stderr=%q", code, stdout.String(), stderr.String())
|
||||||
|
}
|
||||||
|
if !strings.Contains(stdout.String(), test.want) {
|
||||||
|
t.Fatalf("stdout=%q, want %q", stdout.String(), test.want)
|
||||||
|
}
|
||||||
|
if got := stderr.String(); got != "" {
|
||||||
|
t.Fatalf("stderr=%q, want empty", got)
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestVersionCommandRejectsUnexpectedArguments(t *testing.T) {
|
||||||
|
for _, args := range [][]string{
|
||||||
|
{"version", "extra"},
|
||||||
|
{"version", "--unknown"},
|
||||||
|
} {
|
||||||
|
t.Run(strings.Join(args, " "), func(t *testing.T) {
|
||||||
|
var stdout, stderr bytes.Buffer
|
||||||
|
if code := Run(context.Background(), args, &stdout, &stderr); code != 2 {
|
||||||
|
t.Fatalf("exit=%d, stdout=%q, stderr=%q", code, stdout.String(), stderr.String())
|
||||||
|
}
|
||||||
|
if got := stdout.String(); got != "" {
|
||||||
|
t.Fatalf("stdout=%q, want empty", got)
|
||||||
|
}
|
||||||
|
if got := stderr.String(); got == "" {
|
||||||
|
t.Fatal("expected usage error on stderr")
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -3,7 +3,7 @@ package chunking
|
|||||||
import (
|
import (
|
||||||
"fmt"
|
"fmt"
|
||||||
|
|
||||||
"gitea.maximumdirect.net/eric/audita/internal/core/schema"
|
"gitea.maximumdirect.net/eric/audita/v3/internal/core/schema"
|
||||||
)
|
)
|
||||||
|
|
||||||
// Section represents a contiguous chunk of transcript segments with metadata.
|
// Section represents a contiguous chunk of transcript segments with metadata.
|
||||||
|
|||||||
@@ -4,7 +4,7 @@ import (
|
|||||||
"strings"
|
"strings"
|
||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
"gitea.maximumdirect.net/eric/audita/internal/core/schema"
|
"gitea.maximumdirect.net/eric/audita/v3/internal/core/schema"
|
||||||
)
|
)
|
||||||
|
|
||||||
// mapTokenEstimator provides deterministic per-segment token counts for tests.
|
// mapTokenEstimator provides deterministic per-segment token counts for tests.
|
||||||
|
|||||||
@@ -3,7 +3,7 @@ package chunking
|
|||||||
import (
|
import (
|
||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
"gitea.maximumdirect.net/eric/audita/internal/core/schema"
|
"gitea.maximumdirect.net/eric/audita/v3/internal/core/schema"
|
||||||
)
|
)
|
||||||
|
|
||||||
func TestComputeSummary(t *testing.T) {
|
func TestComputeSummary(t *testing.T) {
|
||||||
|
|||||||
@@ -6,8 +6,8 @@ import (
|
|||||||
"time"
|
"time"
|
||||||
|
|
||||||
ck "gitea.maximumdirect.net/eric/ConfigKit"
|
ck "gitea.maximumdirect.net/eric/ConfigKit"
|
||||||
"gitea.maximumdirect.net/eric/audita/internal/core/modulecatalog"
|
"gitea.maximumdirect.net/eric/audita/v3/internal/core/modulecatalog"
|
||||||
"gitea.maximumdirect.net/eric/audita/internal/core/outputschema"
|
"gitea.maximumdirect.net/eric/audita/v3/internal/core/outputschema"
|
||||||
)
|
)
|
||||||
|
|
||||||
const (
|
const (
|
||||||
|
|||||||
@@ -8,10 +8,10 @@ import (
|
|||||||
"strings"
|
"strings"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
"gitea.maximumdirect.net/eric/audita/internal/core/chunking"
|
"gitea.maximumdirect.net/eric/audita/v3/internal/core/chunking"
|
||||||
"gitea.maximumdirect.net/eric/audita/internal/core/normalization"
|
"gitea.maximumdirect.net/eric/audita/v3/internal/core/normalization"
|
||||||
"gitea.maximumdirect.net/eric/audita/internal/core/redaction"
|
"gitea.maximumdirect.net/eric/audita/v3/internal/core/redaction"
|
||||||
"gitea.maximumdirect.net/eric/audita/internal/core/schema"
|
"gitea.maximumdirect.net/eric/audita/v3/internal/core/schema"
|
||||||
)
|
)
|
||||||
|
|
||||||
// RunDirectory represents a per-run diagnostics directory
|
// RunDirectory represents a per-run diagnostics directory
|
||||||
|
|||||||
@@ -3,7 +3,7 @@ package normalization
|
|||||||
import (
|
import (
|
||||||
"sort"
|
"sort"
|
||||||
|
|
||||||
"gitea.maximumdirect.net/eric/audita/internal/core/schema"
|
"gitea.maximumdirect.net/eric/audita/v3/internal/core/schema"
|
||||||
)
|
)
|
||||||
|
|
||||||
// NormalizationConfig holds configuration parameters for transcript normalization
|
// NormalizationConfig holds configuration parameters for transcript normalization
|
||||||
|
|||||||
@@ -5,7 +5,7 @@ import (
|
|||||||
"strings"
|
"strings"
|
||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
"gitea.maximumdirect.net/eric/audita/internal/core/schema"
|
"gitea.maximumdirect.net/eric/audita/v3/internal/core/schema"
|
||||||
)
|
)
|
||||||
|
|
||||||
func TestNormalizationNoOp(t *testing.T) {
|
func TestNormalizationNoOp(t *testing.T) {
|
||||||
|
|||||||
@@ -5,7 +5,7 @@ import (
|
|||||||
"fmt"
|
"fmt"
|
||||||
"strings"
|
"strings"
|
||||||
|
|
||||||
"gitea.maximumdirect.net/eric/audita/internal/core/schema"
|
"gitea.maximumdirect.net/eric/audita/v3/internal/core/schema"
|
||||||
)
|
)
|
||||||
|
|
||||||
const (
|
const (
|
||||||
|
|||||||
@@ -6,7 +6,7 @@ import (
|
|||||||
"strings"
|
"strings"
|
||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
"gitea.maximumdirect.net/eric/audita/internal/core/schema"
|
"gitea.maximumdirect.net/eric/audita/v3/internal/core/schema"
|
||||||
)
|
)
|
||||||
|
|
||||||
func tinyTranscript() *schema.Transcript {
|
func tinyTranscript() *schema.Transcript {
|
||||||
|
|||||||
@@ -8,9 +8,9 @@ import (
|
|||||||
"strings"
|
"strings"
|
||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
"gitea.maximumdirect.net/eric/audita/internal/core/diagnostics"
|
"gitea.maximumdirect.net/eric/audita/v3/internal/core/diagnostics"
|
||||||
"gitea.maximumdirect.net/eric/audita/internal/core/redaction"
|
"gitea.maximumdirect.net/eric/audita/v3/internal/core/redaction"
|
||||||
"gitea.maximumdirect.net/eric/audita/internal/core/schema"
|
"gitea.maximumdirect.net/eric/audita/v3/internal/core/schema"
|
||||||
)
|
)
|
||||||
|
|
||||||
func TestStringRedactionPreservesSerializationAndDomainData(t *testing.T) {
|
func TestStringRedactionPreservesSerializationAndDomainData(t *testing.T) {
|
||||||
|
|||||||
@@ -5,7 +5,7 @@ import (
|
|||||||
"sort"
|
"sort"
|
||||||
"strings"
|
"strings"
|
||||||
|
|
||||||
"gitea.maximumdirect.net/eric/audita/internal/core/redaction"
|
"gitea.maximumdirect.net/eric/audita/v3/internal/core/redaction"
|
||||||
)
|
)
|
||||||
|
|
||||||
// CompletionLine is the brief successful CLI summary. It uses the same counts
|
// CompletionLine is the brief successful CLI summary. It uses the same counts
|
||||||
|
|||||||
@@ -5,7 +5,7 @@ import (
|
|||||||
"fmt"
|
"fmt"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
"gitea.maximumdirect.net/eric/audita/internal/core/redaction"
|
"gitea.maximumdirect.net/eric/audita/v3/internal/core/redaction"
|
||||||
"gopkg.in/yaml.v3"
|
"gopkg.in/yaml.v3"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|||||||
@@ -6,9 +6,9 @@ import (
|
|||||||
"strings"
|
"strings"
|
||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
"gitea.maximumdirect.net/eric/audita/internal/core/chunking"
|
"gitea.maximumdirect.net/eric/audita/v3/internal/core/chunking"
|
||||||
"gitea.maximumdirect.net/eric/audita/internal/core/schema"
|
"gitea.maximumdirect.net/eric/audita/v3/internal/core/schema"
|
||||||
"gitea.maximumdirect.net/eric/audita/internal/framework/proposals"
|
"gitea.maximumdirect.net/eric/audita/v3/internal/framework/proposals"
|
||||||
)
|
)
|
||||||
|
|
||||||
// testChunkProposalHarness is a test-only helper that composes existing
|
// testChunkProposalHarness is a test-only helper that composes existing
|
||||||
|
|||||||
@@ -4,13 +4,13 @@ import (
|
|||||||
"context"
|
"context"
|
||||||
"fmt"
|
"fmt"
|
||||||
|
|
||||||
"gitea.maximumdirect.net/eric/audita/internal/core/chunking"
|
"gitea.maximumdirect.net/eric/audita/v3/internal/core/chunking"
|
||||||
"gitea.maximumdirect.net/eric/audita/internal/core/config"
|
"gitea.maximumdirect.net/eric/audita/v3/internal/core/config"
|
||||||
"gitea.maximumdirect.net/eric/audita/internal/core/schema"
|
"gitea.maximumdirect.net/eric/audita/v3/internal/core/schema"
|
||||||
"gitea.maximumdirect.net/eric/audita/internal/framework/outcomes"
|
"gitea.maximumdirect.net/eric/audita/v3/internal/framework/outcomes"
|
||||||
"gitea.maximumdirect.net/eric/audita/internal/framework/proposals"
|
"gitea.maximumdirect.net/eric/audita/v3/internal/framework/proposals"
|
||||||
"gitea.maximumdirect.net/eric/audita/internal/framework/structuredoutput"
|
"gitea.maximumdirect.net/eric/audita/v3/internal/framework/structuredoutput"
|
||||||
"gitea.maximumdirect.net/eric/audita/internal/framework/validators"
|
"gitea.maximumdirect.net/eric/audita/v3/internal/framework/validators"
|
||||||
)
|
)
|
||||||
|
|
||||||
type StructuredLLMClient = structuredoutput.Client
|
type StructuredLLMClient = structuredoutput.Client
|
||||||
|
|||||||
@@ -6,9 +6,9 @@ import (
|
|||||||
"reflect"
|
"reflect"
|
||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
"gitea.maximumdirect.net/eric/audita/internal/core/chunking"
|
"gitea.maximumdirect.net/eric/audita/v3/internal/core/chunking"
|
||||||
"gitea.maximumdirect.net/eric/audita/internal/framework/proposals"
|
"gitea.maximumdirect.net/eric/audita/v3/internal/framework/proposals"
|
||||||
"gitea.maximumdirect.net/eric/audita/internal/framework/validators"
|
"gitea.maximumdirect.net/eric/audita/v3/internal/framework/validators"
|
||||||
)
|
)
|
||||||
|
|
||||||
type fakeLLMClient struct{}
|
type fakeLLMClient struct{}
|
||||||
|
|||||||
@@ -9,10 +9,10 @@ import (
|
|||||||
"sync"
|
"sync"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
"gitea.maximumdirect.net/eric/audita/internal/framework/outcomes"
|
"gitea.maximumdirect.net/eric/audita/v3/internal/framework/outcomes"
|
||||||
"gitea.maximumdirect.net/eric/audita/internal/framework/responseschema"
|
"gitea.maximumdirect.net/eric/audita/v3/internal/framework/responseschema"
|
||||||
"gitea.maximumdirect.net/eric/audita/internal/framework/structuredoutput"
|
"gitea.maximumdirect.net/eric/audita/v3/internal/framework/structuredoutput"
|
||||||
"gitea.maximumdirect.net/eric/audita/internal/prompts"
|
"gitea.maximumdirect.net/eric/audita/v3/internal/prompts"
|
||||||
pk "gitea.maximumdirect.net/eric/promptkit"
|
pk "gitea.maximumdirect.net/eric/promptkit"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|||||||
@@ -14,11 +14,11 @@ import (
|
|||||||
"time"
|
"time"
|
||||||
|
|
||||||
ck "gitea.maximumdirect.net/eric/ConfigKit"
|
ck "gitea.maximumdirect.net/eric/ConfigKit"
|
||||||
"gitea.maximumdirect.net/eric/audita/internal/core/config"
|
"gitea.maximumdirect.net/eric/audita/v3/internal/core/config"
|
||||||
"gitea.maximumdirect.net/eric/audita/internal/framework/outcomes"
|
"gitea.maximumdirect.net/eric/audita/v3/internal/framework/outcomes"
|
||||||
"gitea.maximumdirect.net/eric/audita/internal/framework/responseschema"
|
"gitea.maximumdirect.net/eric/audita/v3/internal/framework/responseschema"
|
||||||
"gitea.maximumdirect.net/eric/audita/internal/framework/structuredoutput"
|
"gitea.maximumdirect.net/eric/audita/v3/internal/framework/structuredoutput"
|
||||||
"gitea.maximumdirect.net/eric/audita/internal/prompts"
|
"gitea.maximumdirect.net/eric/audita/v3/internal/prompts"
|
||||||
pk "gitea.maximumdirect.net/eric/promptkit"
|
pk "gitea.maximumdirect.net/eric/promptkit"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|||||||
@@ -16,11 +16,11 @@ import (
|
|||||||
"time"
|
"time"
|
||||||
|
|
||||||
ck "gitea.maximumdirect.net/eric/ConfigKit"
|
ck "gitea.maximumdirect.net/eric/ConfigKit"
|
||||||
"gitea.maximumdirect.net/eric/audita/internal/core/config"
|
"gitea.maximumdirect.net/eric/audita/v3/internal/core/config"
|
||||||
"gitea.maximumdirect.net/eric/audita/internal/framework/outcomes"
|
"gitea.maximumdirect.net/eric/audita/v3/internal/framework/outcomes"
|
||||||
"gitea.maximumdirect.net/eric/audita/internal/framework/responseschema"
|
"gitea.maximumdirect.net/eric/audita/v3/internal/framework/responseschema"
|
||||||
"gitea.maximumdirect.net/eric/audita/internal/framework/structuredoutput"
|
"gitea.maximumdirect.net/eric/audita/v3/internal/framework/structuredoutput"
|
||||||
"gitea.maximumdirect.net/eric/audita/internal/prompts"
|
"gitea.maximumdirect.net/eric/audita/v3/internal/prompts"
|
||||||
pk "gitea.maximumdirect.net/eric/promptkit"
|
pk "gitea.maximumdirect.net/eric/promptkit"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|||||||
@@ -7,7 +7,7 @@ import (
|
|||||||
"regexp"
|
"regexp"
|
||||||
"strings"
|
"strings"
|
||||||
|
|
||||||
"gitea.maximumdirect.net/eric/audita/internal/core/redaction"
|
"gitea.maximumdirect.net/eric/audita/v3/internal/core/redaction"
|
||||||
)
|
)
|
||||||
|
|
||||||
var stageSanitizer = regexp.MustCompile(`[^a-zA-Z0-9_.-]+`)
|
var stageSanitizer = regexp.MustCompile(`[^a-zA-Z0-9_.-]+`)
|
||||||
|
|||||||
@@ -5,7 +5,7 @@ import (
|
|||||||
"sync"
|
"sync"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
"gitea.maximumdirect.net/eric/audita/internal/framework/structuredoutput"
|
"gitea.maximumdirect.net/eric/audita/v3/internal/framework/structuredoutput"
|
||||||
pk "gitea.maximumdirect.net/eric/promptkit"
|
pk "gitea.maximumdirect.net/eric/promptkit"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|||||||
@@ -8,8 +8,8 @@ import (
|
|||||||
"testing"
|
"testing"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
"gitea.maximumdirect.net/eric/audita/internal/framework/responseschema"
|
"gitea.maximumdirect.net/eric/audita/v3/internal/framework/responseschema"
|
||||||
"gitea.maximumdirect.net/eric/audita/internal/framework/structuredoutput"
|
"gitea.maximumdirect.net/eric/audita/v3/internal/framework/structuredoutput"
|
||||||
pk "gitea.maximumdirect.net/eric/promptkit"
|
pk "gitea.maximumdirect.net/eric/promptkit"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|||||||
@@ -11,10 +11,10 @@ import (
|
|||||||
"sync/atomic"
|
"sync/atomic"
|
||||||
|
|
||||||
ck "gitea.maximumdirect.net/eric/ConfigKit"
|
ck "gitea.maximumdirect.net/eric/ConfigKit"
|
||||||
"gitea.maximumdirect.net/eric/audita/internal/core/config"
|
"gitea.maximumdirect.net/eric/audita/v3/internal/core/config"
|
||||||
"gitea.maximumdirect.net/eric/audita/internal/core/redaction"
|
"gitea.maximumdirect.net/eric/audita/v3/internal/core/redaction"
|
||||||
"gitea.maximumdirect.net/eric/audita/internal/framework/responseschema"
|
"gitea.maximumdirect.net/eric/audita/v3/internal/framework/responseschema"
|
||||||
"gitea.maximumdirect.net/eric/audita/internal/prompts"
|
"gitea.maximumdirect.net/eric/audita/v3/internal/prompts"
|
||||||
pk "gitea.maximumdirect.net/eric/promptkit"
|
pk "gitea.maximumdirect.net/eric/promptkit"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|||||||
@@ -13,8 +13,8 @@ import (
|
|||||||
"testing/fstest"
|
"testing/fstest"
|
||||||
|
|
||||||
ck "gitea.maximumdirect.net/eric/ConfigKit"
|
ck "gitea.maximumdirect.net/eric/ConfigKit"
|
||||||
"gitea.maximumdirect.net/eric/audita/internal/core/config"
|
"gitea.maximumdirect.net/eric/audita/v3/internal/core/config"
|
||||||
"gitea.maximumdirect.net/eric/audita/internal/prompts"
|
"gitea.maximumdirect.net/eric/audita/v3/internal/prompts"
|
||||||
)
|
)
|
||||||
|
|
||||||
func runtimeAssemblyFixture(t *testing.T, selections string, documents map[string]string) (config.Config, string) {
|
func runtimeAssemblyFixture(t *testing.T, selections string, documents map[string]string) (config.Config, string) {
|
||||||
|
|||||||
@@ -10,7 +10,7 @@ import (
|
|||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
ck "gitea.maximumdirect.net/eric/ConfigKit"
|
ck "gitea.maximumdirect.net/eric/ConfigKit"
|
||||||
"gitea.maximumdirect.net/eric/audita/internal/core/config"
|
"gitea.maximumdirect.net/eric/audita/v3/internal/core/config"
|
||||||
"gopkg.in/yaml.v3"
|
"gopkg.in/yaml.v3"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|||||||
@@ -5,8 +5,8 @@ import (
|
|||||||
"strings"
|
"strings"
|
||||||
|
|
||||||
ck "gitea.maximumdirect.net/eric/ConfigKit"
|
ck "gitea.maximumdirect.net/eric/ConfigKit"
|
||||||
"gitea.maximumdirect.net/eric/audita/internal/core/config"
|
"gitea.maximumdirect.net/eric/audita/v3/internal/core/config"
|
||||||
"gitea.maximumdirect.net/eric/audita/internal/core/redaction"
|
"gitea.maximumdirect.net/eric/audita/v3/internal/core/redaction"
|
||||||
"gopkg.in/yaml.v3"
|
"gopkg.in/yaml.v3"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
package llm
|
package llm
|
||||||
|
|
||||||
import "gitea.maximumdirect.net/eric/audita/internal/core/config"
|
import "gitea.maximumdirect.net/eric/audita/v3/internal/core/config"
|
||||||
|
|
||||||
// ConfiguredSecrets returns all configured LLM API-key values that should be
|
// ConfiguredSecrets returns all configured LLM API-key values that should be
|
||||||
// redacted from diagnostics and surfaced error payloads.
|
// redacted from diagnostics and surfaced error payloads.
|
||||||
|
|||||||
@@ -4,7 +4,7 @@ import (
|
|||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
ck "gitea.maximumdirect.net/eric/ConfigKit"
|
ck "gitea.maximumdirect.net/eric/ConfigKit"
|
||||||
"gitea.maximumdirect.net/eric/audita/internal/core/config"
|
"gitea.maximumdirect.net/eric/audita/v3/internal/core/config"
|
||||||
)
|
)
|
||||||
|
|
||||||
func TestConfiguredSecretsIncludesUnselectedBackends(t *testing.T) {
|
func TestConfiguredSecretsIncludesUnselectedBackends(t *testing.T) {
|
||||||
|
|||||||
@@ -5,14 +5,14 @@ import (
|
|||||||
"fmt"
|
"fmt"
|
||||||
"strings"
|
"strings"
|
||||||
|
|
||||||
"gitea.maximumdirect.net/eric/audita/internal/core/config"
|
"gitea.maximumdirect.net/eric/audita/v3/internal/core/config"
|
||||||
"gitea.maximumdirect.net/eric/audita/internal/core/modulecatalog"
|
"gitea.maximumdirect.net/eric/audita/v3/internal/core/modulecatalog"
|
||||||
"gitea.maximumdirect.net/eric/audita/internal/core/schema"
|
"gitea.maximumdirect.net/eric/audita/v3/internal/core/schema"
|
||||||
"gitea.maximumdirect.net/eric/audita/internal/framework/contracts"
|
"gitea.maximumdirect.net/eric/audita/v3/internal/framework/contracts"
|
||||||
glossarymodule "gitea.maximumdirect.net/eric/audita/internal/modules/glossary"
|
glossarymodule "gitea.maximumdirect.net/eric/audita/v3/internal/modules/glossary"
|
||||||
grammarmodule "gitea.maximumdirect.net/eric/audita/internal/modules/grammar"
|
grammarmodule "gitea.maximumdirect.net/eric/audita/v3/internal/modules/grammar"
|
||||||
homophonesmodule "gitea.maximumdirect.net/eric/audita/internal/modules/homophones"
|
homophonesmodule "gitea.maximumdirect.net/eric/audita/v3/internal/modules/homophones"
|
||||||
spokenwordmodule "gitea.maximumdirect.net/eric/audita/internal/modules/spoken_word"
|
spokenwordmodule "gitea.maximumdirect.net/eric/audita/v3/internal/modules/spoken_word"
|
||||||
)
|
)
|
||||||
|
|
||||||
const (
|
const (
|
||||||
|
|||||||
@@ -6,9 +6,9 @@ import (
|
|||||||
"strings"
|
"strings"
|
||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
"gitea.maximumdirect.net/eric/audita/internal/core/modulecatalog"
|
"gitea.maximumdirect.net/eric/audita/v3/internal/core/modulecatalog"
|
||||||
"gitea.maximumdirect.net/eric/audita/internal/framework/contracts"
|
"gitea.maximumdirect.net/eric/audita/v3/internal/framework/contracts"
|
||||||
"gitea.maximumdirect.net/eric/audita/internal/framework/proposals"
|
"gitea.maximumdirect.net/eric/audita/v3/internal/framework/proposals"
|
||||||
)
|
)
|
||||||
|
|
||||||
type noopModule struct {
|
type noopModule struct {
|
||||||
|
|||||||
@@ -5,9 +5,9 @@ import (
|
|||||||
"path/filepath"
|
"path/filepath"
|
||||||
"sort"
|
"sort"
|
||||||
|
|
||||||
"gitea.maximumdirect.net/eric/audita/internal/framework/runner"
|
"gitea.maximumdirect.net/eric/audita/v3/internal/framework/runner"
|
||||||
"gitea.maximumdirect.net/eric/audita/internal/framework/validators"
|
"gitea.maximumdirect.net/eric/audita/v3/internal/framework/validators"
|
||||||
validatormetadata "gitea.maximumdirect.net/eric/audita/internal/validators/metadata"
|
validatormetadata "gitea.maximumdirect.net/eric/audita/v3/internal/validators/metadata"
|
||||||
)
|
)
|
||||||
|
|
||||||
const (
|
const (
|
||||||
|
|||||||
@@ -4,9 +4,9 @@ import (
|
|||||||
"encoding/json"
|
"encoding/json"
|
||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
"gitea.maximumdirect.net/eric/audita/internal/framework/proposals"
|
"gitea.maximumdirect.net/eric/audita/v3/internal/framework/proposals"
|
||||||
"gitea.maximumdirect.net/eric/audita/internal/framework/runner"
|
"gitea.maximumdirect.net/eric/audita/v3/internal/framework/runner"
|
||||||
"gitea.maximumdirect.net/eric/audita/internal/framework/validators"
|
"gitea.maximumdirect.net/eric/audita/v3/internal/framework/validators"
|
||||||
)
|
)
|
||||||
|
|
||||||
func TestBuildCorrectionLedgerClassifiesValidatorDecisionsFromCanonicalMetadata(t *testing.T) {
|
func TestBuildCorrectionLedgerClassifiesValidatorDecisionsFromCanonicalMetadata(t *testing.T) {
|
||||||
|
|||||||
@@ -3,11 +3,11 @@ package processreport
|
|||||||
import (
|
import (
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
"gitea.maximumdirect.net/eric/audita/internal/core/config"
|
"gitea.maximumdirect.net/eric/audita/v3/internal/core/config"
|
||||||
"gitea.maximumdirect.net/eric/audita/internal/core/reporting"
|
"gitea.maximumdirect.net/eric/audita/v3/internal/core/reporting"
|
||||||
"gitea.maximumdirect.net/eric/audita/internal/framework/llm"
|
"gitea.maximumdirect.net/eric/audita/v3/internal/framework/llm"
|
||||||
"gitea.maximumdirect.net/eric/audita/internal/framework/runner"
|
"gitea.maximumdirect.net/eric/audita/v3/internal/framework/runner"
|
||||||
"gitea.maximumdirect.net/eric/audita/internal/framework/structuredoutput"
|
"gitea.maximumdirect.net/eric/audita/v3/internal/framework/structuredoutput"
|
||||||
pk "gitea.maximumdirect.net/eric/promptkit"
|
pk "gitea.maximumdirect.net/eric/promptkit"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|||||||
@@ -7,10 +7,10 @@ import (
|
|||||||
"testing"
|
"testing"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
"gitea.maximumdirect.net/eric/audita/internal/core/config"
|
"gitea.maximumdirect.net/eric/audita/v3/internal/core/config"
|
||||||
"gitea.maximumdirect.net/eric/audita/internal/framework/llm"
|
"gitea.maximumdirect.net/eric/audita/v3/internal/framework/llm"
|
||||||
"gitea.maximumdirect.net/eric/audita/internal/framework/runner"
|
"gitea.maximumdirect.net/eric/audita/v3/internal/framework/runner"
|
||||||
"gitea.maximumdirect.net/eric/audita/internal/framework/structuredoutput"
|
"gitea.maximumdirect.net/eric/audita/v3/internal/framework/structuredoutput"
|
||||||
pk "gitea.maximumdirect.net/eric/promptkit"
|
pk "gitea.maximumdirect.net/eric/promptkit"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|||||||
@@ -6,14 +6,14 @@ import (
|
|||||||
"strings"
|
"strings"
|
||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
"gitea.maximumdirect.net/eric/audita/internal/core/config"
|
"gitea.maximumdirect.net/eric/audita/v3/internal/core/config"
|
||||||
"gitea.maximumdirect.net/eric/audita/internal/core/schema"
|
"gitea.maximumdirect.net/eric/audita/v3/internal/core/schema"
|
||||||
"gitea.maximumdirect.net/eric/audita/internal/framework/contracts"
|
"gitea.maximumdirect.net/eric/audita/v3/internal/framework/contracts"
|
||||||
"gitea.maximumdirect.net/eric/audita/internal/framework/outcomes"
|
"gitea.maximumdirect.net/eric/audita/v3/internal/framework/outcomes"
|
||||||
"gitea.maximumdirect.net/eric/audita/internal/framework/proposals"
|
"gitea.maximumdirect.net/eric/audita/v3/internal/framework/proposals"
|
||||||
"gitea.maximumdirect.net/eric/audita/internal/framework/runner"
|
"gitea.maximumdirect.net/eric/audita/v3/internal/framework/runner"
|
||||||
"gitea.maximumdirect.net/eric/audita/internal/framework/structuredoutput"
|
"gitea.maximumdirect.net/eric/audita/v3/internal/framework/structuredoutput"
|
||||||
"gitea.maximumdirect.net/eric/audita/internal/framework/validators"
|
"gitea.maximumdirect.net/eric/audita/v3/internal/framework/validators"
|
||||||
)
|
)
|
||||||
|
|
||||||
type partialModule struct{ validator contracts.Validator }
|
type partialModule struct{ validator contracts.Validator }
|
||||||
|
|||||||
@@ -4,10 +4,10 @@ import (
|
|||||||
"sort"
|
"sort"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
"gitea.maximumdirect.net/eric/audita/internal/core/reporting"
|
"gitea.maximumdirect.net/eric/audita/v3/internal/core/reporting"
|
||||||
"gitea.maximumdirect.net/eric/audita/internal/framework/contracts"
|
"gitea.maximumdirect.net/eric/audita/v3/internal/framework/contracts"
|
||||||
"gitea.maximumdirect.net/eric/audita/internal/framework/outcomes"
|
"gitea.maximumdirect.net/eric/audita/v3/internal/framework/outcomes"
|
||||||
"gitea.maximumdirect.net/eric/audita/internal/framework/runner"
|
"gitea.maximumdirect.net/eric/audita/v3/internal/framework/runner"
|
||||||
)
|
)
|
||||||
|
|
||||||
// RunFailure describes a fatal or output failure without carrying its raw cause.
|
// RunFailure describes a fatal or output failure without carrying its raw cause.
|
||||||
|
|||||||
@@ -6,10 +6,10 @@ import (
|
|||||||
"testing"
|
"testing"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
"gitea.maximumdirect.net/eric/audita/internal/core/reporting"
|
"gitea.maximumdirect.net/eric/audita/v3/internal/core/reporting"
|
||||||
"gitea.maximumdirect.net/eric/audita/internal/framework/contracts"
|
"gitea.maximumdirect.net/eric/audita/v3/internal/framework/contracts"
|
||||||
"gitea.maximumdirect.net/eric/audita/internal/framework/outcomes"
|
"gitea.maximumdirect.net/eric/audita/v3/internal/framework/outcomes"
|
||||||
"gitea.maximumdirect.net/eric/audita/internal/framework/runner"
|
"gitea.maximumdirect.net/eric/audita/v3/internal/framework/runner"
|
||||||
"gopkg.in/yaml.v3"
|
"gopkg.in/yaml.v3"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|||||||
@@ -3,7 +3,7 @@ package promptcontext
|
|||||||
import (
|
import (
|
||||||
"encoding/json"
|
"encoding/json"
|
||||||
|
|
||||||
"gitea.maximumdirect.net/eric/audita/internal/core/schema"
|
"gitea.maximumdirect.net/eric/audita/v3/internal/core/schema"
|
||||||
)
|
)
|
||||||
|
|
||||||
type transcriptSectionSegment struct {
|
type transcriptSectionSegment struct {
|
||||||
|
|||||||
@@ -5,7 +5,7 @@ import (
|
|||||||
"reflect"
|
"reflect"
|
||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
"gitea.maximumdirect.net/eric/audita/internal/core/schema"
|
"gitea.maximumdirect.net/eric/audita/v3/internal/core/schema"
|
||||||
)
|
)
|
||||||
|
|
||||||
func TestMarshalTranscriptSectionJSONShape(t *testing.T) {
|
func TestMarshalTranscriptSectionJSONShape(t *testing.T) {
|
||||||
|
|||||||
@@ -11,12 +11,12 @@ import (
|
|||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
ck "gitea.maximumdirect.net/eric/ConfigKit"
|
ck "gitea.maximumdirect.net/eric/ConfigKit"
|
||||||
"gitea.maximumdirect.net/eric/audita/internal/core/config"
|
"gitea.maximumdirect.net/eric/audita/v3/internal/core/config"
|
||||||
"gitea.maximumdirect.net/eric/audita/internal/core/schema"
|
"gitea.maximumdirect.net/eric/audita/v3/internal/core/schema"
|
||||||
"gitea.maximumdirect.net/eric/audita/internal/framework/llm"
|
"gitea.maximumdirect.net/eric/audita/v3/internal/framework/llm"
|
||||||
"gitea.maximumdirect.net/eric/audita/internal/framework/proposals"
|
"gitea.maximumdirect.net/eric/audita/v3/internal/framework/proposals"
|
||||||
"gitea.maximumdirect.net/eric/audita/internal/framework/validators"
|
"gitea.maximumdirect.net/eric/audita/v3/internal/framework/validators"
|
||||||
"gitea.maximumdirect.net/eric/audita/internal/prompts"
|
"gitea.maximumdirect.net/eric/audita/v3/internal/prompts"
|
||||||
)
|
)
|
||||||
|
|
||||||
func TestRepairedProposalStillFacesDomainChecks(t *testing.T) {
|
func TestRepairedProposalStillFacesDomainChecks(t *testing.T) {
|
||||||
|
|||||||
@@ -10,15 +10,15 @@ import (
|
|||||||
"path/filepath"
|
"path/filepath"
|
||||||
"strings"
|
"strings"
|
||||||
|
|
||||||
"gitea.maximumdirect.net/eric/audita/internal/core/config"
|
"gitea.maximumdirect.net/eric/audita/v3/internal/core/config"
|
||||||
"gitea.maximumdirect.net/eric/audita/internal/core/schema"
|
"gitea.maximumdirect.net/eric/audita/v3/internal/core/schema"
|
||||||
"gitea.maximumdirect.net/eric/audita/internal/framework/contracts"
|
"gitea.maximumdirect.net/eric/audita/v3/internal/framework/contracts"
|
||||||
"gitea.maximumdirect.net/eric/audita/internal/framework/llm"
|
"gitea.maximumdirect.net/eric/audita/v3/internal/framework/llm"
|
||||||
"gitea.maximumdirect.net/eric/audita/internal/framework/outcomes"
|
"gitea.maximumdirect.net/eric/audita/v3/internal/framework/outcomes"
|
||||||
"gitea.maximumdirect.net/eric/audita/internal/framework/proposals"
|
"gitea.maximumdirect.net/eric/audita/v3/internal/framework/proposals"
|
||||||
"gitea.maximumdirect.net/eric/audita/internal/framework/responseschema"
|
"gitea.maximumdirect.net/eric/audita/v3/internal/framework/responseschema"
|
||||||
"gitea.maximumdirect.net/eric/audita/internal/framework/stagename"
|
"gitea.maximumdirect.net/eric/audita/v3/internal/framework/stagename"
|
||||||
"gitea.maximumdirect.net/eric/audita/internal/framework/structuredoutput"
|
"gitea.maximumdirect.net/eric/audita/v3/internal/framework/structuredoutput"
|
||||||
)
|
)
|
||||||
|
|
||||||
// InteractionDiagnosticsWriter writes machine-readable prompt/response artifacts.
|
// InteractionDiagnosticsWriter writes machine-readable prompt/response artifacts.
|
||||||
|
|||||||
@@ -11,13 +11,13 @@ import (
|
|||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
ck "gitea.maximumdirect.net/eric/ConfigKit"
|
ck "gitea.maximumdirect.net/eric/ConfigKit"
|
||||||
"gitea.maximumdirect.net/eric/audita/internal/core/config"
|
"gitea.maximumdirect.net/eric/audita/v3/internal/core/config"
|
||||||
"gitea.maximumdirect.net/eric/audita/internal/core/schema"
|
"gitea.maximumdirect.net/eric/audita/v3/internal/core/schema"
|
||||||
"gitea.maximumdirect.net/eric/audita/internal/framework/contracts"
|
"gitea.maximumdirect.net/eric/audita/v3/internal/framework/contracts"
|
||||||
"gitea.maximumdirect.net/eric/audita/internal/framework/outcomes"
|
"gitea.maximumdirect.net/eric/audita/v3/internal/framework/outcomes"
|
||||||
"gitea.maximumdirect.net/eric/audita/internal/framework/proposals"
|
"gitea.maximumdirect.net/eric/audita/v3/internal/framework/proposals"
|
||||||
"gitea.maximumdirect.net/eric/audita/internal/framework/responseschema"
|
"gitea.maximumdirect.net/eric/audita/v3/internal/framework/responseschema"
|
||||||
"gitea.maximumdirect.net/eric/audita/internal/framework/structuredoutput"
|
"gitea.maximumdirect.net/eric/audita/v3/internal/framework/structuredoutput"
|
||||||
)
|
)
|
||||||
|
|
||||||
type fakeStructuredClient struct {
|
type fakeStructuredClient struct {
|
||||||
|
|||||||
@@ -5,10 +5,10 @@ import (
|
|||||||
"fmt"
|
"fmt"
|
||||||
"strings"
|
"strings"
|
||||||
|
|
||||||
"gitea.maximumdirect.net/eric/audita/internal/core/schema"
|
"gitea.maximumdirect.net/eric/audita/v3/internal/core/schema"
|
||||||
"gitea.maximumdirect.net/eric/audita/internal/framework/contracts"
|
"gitea.maximumdirect.net/eric/audita/v3/internal/framework/contracts"
|
||||||
"gitea.maximumdirect.net/eric/audita/internal/framework/stagename"
|
"gitea.maximumdirect.net/eric/audita/v3/internal/framework/stagename"
|
||||||
"gitea.maximumdirect.net/eric/audita/internal/prompts"
|
"gitea.maximumdirect.net/eric/audita/v3/internal/prompts"
|
||||||
)
|
)
|
||||||
|
|
||||||
type ProposalVariableBuilder func(transcript *schema.Transcript, glossary *schema.Glossary, sectionIndex int, transcriptDescription string) (map[string]string, error)
|
type ProposalVariableBuilder func(transcript *schema.Transcript, glossary *schema.Glossary, sectionIndex int, transcriptDescription string) (map[string]string, error)
|
||||||
|
|||||||
@@ -6,13 +6,13 @@ import (
|
|||||||
"errors"
|
"errors"
|
||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
"gitea.maximumdirect.net/eric/audita/internal/core/config"
|
"gitea.maximumdirect.net/eric/audita/v3/internal/core/config"
|
||||||
"gitea.maximumdirect.net/eric/audita/internal/core/schema"
|
"gitea.maximumdirect.net/eric/audita/v3/internal/core/schema"
|
||||||
"gitea.maximumdirect.net/eric/audita/internal/framework/contracts"
|
"gitea.maximumdirect.net/eric/audita/v3/internal/framework/contracts"
|
||||||
"gitea.maximumdirect.net/eric/audita/internal/framework/outcomes"
|
"gitea.maximumdirect.net/eric/audita/v3/internal/framework/outcomes"
|
||||||
"gitea.maximumdirect.net/eric/audita/internal/framework/proposals"
|
"gitea.maximumdirect.net/eric/audita/v3/internal/framework/proposals"
|
||||||
"gitea.maximumdirect.net/eric/audita/internal/framework/structuredoutput"
|
"gitea.maximumdirect.net/eric/audita/v3/internal/framework/structuredoutput"
|
||||||
"gitea.maximumdirect.net/eric/audita/internal/prompts"
|
"gitea.maximumdirect.net/eric/audita/v3/internal/prompts"
|
||||||
)
|
)
|
||||||
|
|
||||||
func TestExecuteModuleProposalBuildsMessagesFromSectionAndDescription(t *testing.T) {
|
func TestExecuteModuleProposalBuildsMessagesFromSectionAndDescription(t *testing.T) {
|
||||||
|
|||||||
@@ -4,8 +4,8 @@ import (
|
|||||||
"encoding/json"
|
"encoding/json"
|
||||||
"fmt"
|
"fmt"
|
||||||
|
|
||||||
"gitea.maximumdirect.net/eric/audita/internal/core/schema"
|
"gitea.maximumdirect.net/eric/audita/v3/internal/core/schema"
|
||||||
"gitea.maximumdirect.net/eric/audita/internal/framework/promptcontext"
|
"gitea.maximumdirect.net/eric/audita/v3/internal/framework/promptcontext"
|
||||||
)
|
)
|
||||||
|
|
||||||
// BuildProposalVariables preserves the domain inputs while PromptKit renders
|
// BuildProposalVariables preserves the domain inputs while PromptKit renders
|
||||||
|
|||||||
@@ -4,7 +4,7 @@ import (
|
|||||||
"strings"
|
"strings"
|
||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
"gitea.maximumdirect.net/eric/audita/internal/core/schema"
|
"gitea.maximumdirect.net/eric/audita/v3/internal/core/schema"
|
||||||
)
|
)
|
||||||
|
|
||||||
func TestBuildProposalVariablesPreservesSectionGlossaryAndDescription(t *testing.T) {
|
func TestBuildProposalVariablesPreservesSectionGlossaryAndDescription(t *testing.T) {
|
||||||
|
|||||||
@@ -3,7 +3,7 @@ package proposals
|
|||||||
import (
|
import (
|
||||||
"sort"
|
"sort"
|
||||||
|
|
||||||
"gitea.maximumdirect.net/eric/audita/internal/core/schema"
|
"gitea.maximumdirect.net/eric/audita/v3/internal/core/schema"
|
||||||
)
|
)
|
||||||
|
|
||||||
// AppliedChange records a proposal that was successfully applied.
|
// AppliedChange records a proposal that was successfully applied.
|
||||||
|
|||||||
@@ -7,7 +7,7 @@ import (
|
|||||||
"reflect"
|
"reflect"
|
||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
"gitea.maximumdirect.net/eric/audita/internal/core/schema"
|
"gitea.maximumdirect.net/eric/audita/v3/internal/core/schema"
|
||||||
)
|
)
|
||||||
|
|
||||||
type applyFixture struct {
|
type applyFixture struct {
|
||||||
|
|||||||
@@ -4,7 +4,7 @@ import (
|
|||||||
"reflect"
|
"reflect"
|
||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
"gitea.maximumdirect.net/eric/audita/internal/core/schema"
|
"gitea.maximumdirect.net/eric/audita/v3/internal/core/schema"
|
||||||
)
|
)
|
||||||
|
|
||||||
func TestApplyProposalsApplyingOneProposal(t *testing.T) {
|
func TestApplyProposalsApplyingOneProposal(t *testing.T) {
|
||||||
|
|||||||
@@ -3,7 +3,7 @@ package proposals
|
|||||||
import (
|
import (
|
||||||
"strings"
|
"strings"
|
||||||
|
|
||||||
"gitea.maximumdirect.net/eric/audita/internal/core/schema"
|
"gitea.maximumdirect.net/eric/audita/v3/internal/core/schema"
|
||||||
)
|
)
|
||||||
|
|
||||||
// ProposalSkipReason is a stable, report-friendly reason code for
|
// ProposalSkipReason is a stable, report-friendly reason code for
|
||||||
|
|||||||
@@ -4,7 +4,7 @@ import (
|
|||||||
"reflect"
|
"reflect"
|
||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
"gitea.maximumdirect.net/eric/audita/internal/core/schema"
|
"gitea.maximumdirect.net/eric/audita/v3/internal/core/schema"
|
||||||
)
|
)
|
||||||
|
|
||||||
func TestPreviewProposalForSegmentRequireUniqueSuccess(t *testing.T) {
|
func TestPreviewProposalForSegmentRequireUniqueSuccess(t *testing.T) {
|
||||||
|
|||||||
@@ -11,16 +11,16 @@ import (
|
|||||||
"time"
|
"time"
|
||||||
|
|
||||||
ck "gitea.maximumdirect.net/eric/ConfigKit"
|
ck "gitea.maximumdirect.net/eric/ConfigKit"
|
||||||
"gitea.maximumdirect.net/eric/audita/internal/core/chunking"
|
"gitea.maximumdirect.net/eric/audita/v3/internal/core/chunking"
|
||||||
"gitea.maximumdirect.net/eric/audita/internal/core/config"
|
"gitea.maximumdirect.net/eric/audita/v3/internal/core/config"
|
||||||
"gitea.maximumdirect.net/eric/audita/internal/core/schema"
|
"gitea.maximumdirect.net/eric/audita/v3/internal/core/schema"
|
||||||
"gitea.maximumdirect.net/eric/audita/internal/framework/contracts"
|
"gitea.maximumdirect.net/eric/audita/v3/internal/framework/contracts"
|
||||||
"gitea.maximumdirect.net/eric/audita/internal/framework/llm"
|
"gitea.maximumdirect.net/eric/audita/v3/internal/framework/llm"
|
||||||
"gitea.maximumdirect.net/eric/audita/internal/framework/proposals"
|
"gitea.maximumdirect.net/eric/audita/v3/internal/framework/proposals"
|
||||||
"gitea.maximumdirect.net/eric/audita/internal/framework/responseschema"
|
"gitea.maximumdirect.net/eric/audita/v3/internal/framework/responseschema"
|
||||||
"gitea.maximumdirect.net/eric/audita/internal/framework/structuredoutput"
|
"gitea.maximumdirect.net/eric/audita/v3/internal/framework/structuredoutput"
|
||||||
"gitea.maximumdirect.net/eric/audita/internal/framework/validators"
|
"gitea.maximumdirect.net/eric/audita/v3/internal/framework/validators"
|
||||||
"gitea.maximumdirect.net/eric/audita/internal/prompts"
|
"gitea.maximumdirect.net/eric/audita/v3/internal/prompts"
|
||||||
pk "gitea.maximumdirect.net/eric/promptkit"
|
pk "gitea.maximumdirect.net/eric/promptkit"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|||||||
@@ -9,15 +9,15 @@ import (
|
|||||||
"sync"
|
"sync"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
"gitea.maximumdirect.net/eric/audita/internal/core/chunking"
|
"gitea.maximumdirect.net/eric/audita/v3/internal/core/chunking"
|
||||||
"gitea.maximumdirect.net/eric/audita/internal/core/config"
|
"gitea.maximumdirect.net/eric/audita/v3/internal/core/config"
|
||||||
"gitea.maximumdirect.net/eric/audita/internal/core/schema"
|
"gitea.maximumdirect.net/eric/audita/v3/internal/core/schema"
|
||||||
"gitea.maximumdirect.net/eric/audita/internal/framework/contracts"
|
"gitea.maximumdirect.net/eric/audita/v3/internal/framework/contracts"
|
||||||
"gitea.maximumdirect.net/eric/audita/internal/framework/llm"
|
"gitea.maximumdirect.net/eric/audita/v3/internal/framework/llm"
|
||||||
"gitea.maximumdirect.net/eric/audita/internal/framework/outcomes"
|
"gitea.maximumdirect.net/eric/audita/v3/internal/framework/outcomes"
|
||||||
"gitea.maximumdirect.net/eric/audita/internal/framework/proposals"
|
"gitea.maximumdirect.net/eric/audita/v3/internal/framework/proposals"
|
||||||
"gitea.maximumdirect.net/eric/audita/internal/framework/validators"
|
"gitea.maximumdirect.net/eric/audita/v3/internal/framework/validators"
|
||||||
validatormetadata "gitea.maximumdirect.net/eric/audita/internal/validators/metadata"
|
validatormetadata "gitea.maximumdirect.net/eric/audita/v3/internal/validators/metadata"
|
||||||
)
|
)
|
||||||
|
|
||||||
const (
|
const (
|
||||||
|
|||||||
@@ -12,15 +12,15 @@ import (
|
|||||||
"time"
|
"time"
|
||||||
|
|
||||||
ck "gitea.maximumdirect.net/eric/ConfigKit"
|
ck "gitea.maximumdirect.net/eric/ConfigKit"
|
||||||
"gitea.maximumdirect.net/eric/audita/internal/core/config"
|
"gitea.maximumdirect.net/eric/audita/v3/internal/core/config"
|
||||||
"gitea.maximumdirect.net/eric/audita/internal/core/schema"
|
"gitea.maximumdirect.net/eric/audita/v3/internal/core/schema"
|
||||||
"gitea.maximumdirect.net/eric/audita/internal/framework/contracts"
|
"gitea.maximumdirect.net/eric/audita/v3/internal/framework/contracts"
|
||||||
"gitea.maximumdirect.net/eric/audita/internal/framework/modules"
|
"gitea.maximumdirect.net/eric/audita/v3/internal/framework/modules"
|
||||||
"gitea.maximumdirect.net/eric/audita/internal/framework/outcomes"
|
"gitea.maximumdirect.net/eric/audita/v3/internal/framework/outcomes"
|
||||||
"gitea.maximumdirect.net/eric/audita/internal/framework/proposal_generation"
|
"gitea.maximumdirect.net/eric/audita/v3/internal/framework/proposal_generation"
|
||||||
"gitea.maximumdirect.net/eric/audita/internal/framework/proposals"
|
"gitea.maximumdirect.net/eric/audita/v3/internal/framework/proposals"
|
||||||
"gitea.maximumdirect.net/eric/audita/internal/framework/validators"
|
"gitea.maximumdirect.net/eric/audita/v3/internal/framework/validators"
|
||||||
validatormetadata "gitea.maximumdirect.net/eric/audita/internal/validators/metadata"
|
validatormetadata "gitea.maximumdirect.net/eric/audita/v3/internal/validators/metadata"
|
||||||
)
|
)
|
||||||
|
|
||||||
func runnerTestConfig() config.Config {
|
func runnerTestConfig() config.Config {
|
||||||
|
|||||||
@@ -5,8 +5,8 @@ import (
|
|||||||
"encoding/json"
|
"encoding/json"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
"gitea.maximumdirect.net/eric/audita/internal/framework/outcomes"
|
"gitea.maximumdirect.net/eric/audita/v3/internal/framework/outcomes"
|
||||||
"gitea.maximumdirect.net/eric/audita/internal/framework/responseschema"
|
"gitea.maximumdirect.net/eric/audita/v3/internal/framework/responseschema"
|
||||||
)
|
)
|
||||||
|
|
||||||
// DiagnosticContext identifies the logical call without examining rendered text.
|
// DiagnosticContext identifies the logical call without examining rendered text.
|
||||||
|
|||||||
@@ -3,7 +3,7 @@ package structuredoutput
|
|||||||
import (
|
import (
|
||||||
"errors"
|
"errors"
|
||||||
|
|
||||||
"gitea.maximumdirect.net/eric/audita/internal/framework/outcomes"
|
"gitea.maximumdirect.net/eric/audita/v3/internal/framework/outcomes"
|
||||||
)
|
)
|
||||||
|
|
||||||
// FailureKind separates invalid generated content from operational failures.
|
// FailureKind separates invalid generated content from operational failures.
|
||||||
|
|||||||
@@ -4,7 +4,7 @@ import (
|
|||||||
"errors"
|
"errors"
|
||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
"gitea.maximumdirect.net/eric/audita/internal/framework/outcomes"
|
"gitea.maximumdirect.net/eric/audita/v3/internal/framework/outcomes"
|
||||||
)
|
)
|
||||||
|
|
||||||
func TestFailureClassificationKeepsCauseAndSafeMessage(t *testing.T) {
|
func TestFailureClassificationKeepsCauseAndSafeMessage(t *testing.T) {
|
||||||
|
|||||||
@@ -5,9 +5,9 @@ import (
|
|||||||
"fmt"
|
"fmt"
|
||||||
"strings"
|
"strings"
|
||||||
|
|
||||||
"gitea.maximumdirect.net/eric/audita/internal/core/modulecatalog"
|
"gitea.maximumdirect.net/eric/audita/v3/internal/core/modulecatalog"
|
||||||
"gitea.maximumdirect.net/eric/audita/internal/core/schema"
|
"gitea.maximumdirect.net/eric/audita/v3/internal/core/schema"
|
||||||
"gitea.maximumdirect.net/eric/audita/internal/framework/proposals"
|
"gitea.maximumdirect.net/eric/audita/v3/internal/framework/proposals"
|
||||||
)
|
)
|
||||||
|
|
||||||
type ProposalShapeValidator struct{}
|
type ProposalShapeValidator struct{}
|
||||||
|
|||||||
@@ -1,8 +1,8 @@
|
|||||||
package validators
|
package validators
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"gitea.maximumdirect.net/eric/audita/internal/framework/outcomes"
|
"gitea.maximumdirect.net/eric/audita/v3/internal/framework/outcomes"
|
||||||
"gitea.maximumdirect.net/eric/audita/internal/framework/proposals"
|
"gitea.maximumdirect.net/eric/audita/v3/internal/framework/proposals"
|
||||||
)
|
)
|
||||||
|
|
||||||
// DefectiveProposalReason recognizes a safely rejected defect in a proposal
|
// DefectiveProposalReason recognizes a safely rejected defect in a proposal
|
||||||
|
|||||||
@@ -4,7 +4,7 @@ import (
|
|||||||
"encoding/json"
|
"encoding/json"
|
||||||
"fmt"
|
"fmt"
|
||||||
|
|
||||||
"gitea.maximumdirect.net/eric/audita/internal/core/chunking"
|
"gitea.maximumdirect.net/eric/audita/v3/internal/core/chunking"
|
||||||
)
|
)
|
||||||
|
|
||||||
type LLMValidationBatch struct {
|
type LLMValidationBatch struct {
|
||||||
|
|||||||
@@ -1,8 +1,8 @@
|
|||||||
package validators
|
package validators
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"gitea.maximumdirect.net/eric/audita/internal/core/chunking"
|
"gitea.maximumdirect.net/eric/audita/v3/internal/core/chunking"
|
||||||
"gitea.maximumdirect.net/eric/audita/internal/core/schema"
|
"gitea.maximumdirect.net/eric/audita/v3/internal/core/schema"
|
||||||
)
|
)
|
||||||
|
|
||||||
// validationContext supplies adjacent source segments within the current chunk
|
// validationContext supplies adjacent source segments within the current chunk
|
||||||
|
|||||||
@@ -5,9 +5,9 @@ import (
|
|||||||
"strings"
|
"strings"
|
||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
"gitea.maximumdirect.net/eric/audita/internal/core/chunking"
|
"gitea.maximumdirect.net/eric/audita/v3/internal/core/chunking"
|
||||||
"gitea.maximumdirect.net/eric/audita/internal/core/schema"
|
"gitea.maximumdirect.net/eric/audita/v3/internal/core/schema"
|
||||||
"gitea.maximumdirect.net/eric/audita/internal/framework/proposals"
|
"gitea.maximumdirect.net/eric/audita/v3/internal/framework/proposals"
|
||||||
)
|
)
|
||||||
|
|
||||||
func TestValidationContextCarriesAdjacentEvidenceAndRelevantDefinitions(t *testing.T) {
|
func TestValidationContextCarriesAdjacentEvidenceAndRelevantDefinitions(t *testing.T) {
|
||||||
|
|||||||
@@ -11,10 +11,10 @@ import (
|
|||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
ck "gitea.maximumdirect.net/eric/ConfigKit"
|
ck "gitea.maximumdirect.net/eric/ConfigKit"
|
||||||
"gitea.maximumdirect.net/eric/audita/internal/core/config"
|
"gitea.maximumdirect.net/eric/audita/v3/internal/core/config"
|
||||||
"gitea.maximumdirect.net/eric/audita/internal/framework/llm"
|
"gitea.maximumdirect.net/eric/audita/v3/internal/framework/llm"
|
||||||
"gitea.maximumdirect.net/eric/audita/internal/framework/outcomes"
|
"gitea.maximumdirect.net/eric/audita/v3/internal/framework/outcomes"
|
||||||
"gitea.maximumdirect.net/eric/audita/internal/framework/proposals"
|
"gitea.maximumdirect.net/eric/audita/v3/internal/framework/proposals"
|
||||||
)
|
)
|
||||||
|
|
||||||
func TestValidationRepairAndRuntimeFailuresThroughDomainBoundary(t *testing.T) {
|
func TestValidationRepairAndRuntimeFailuresThroughDomainBoundary(t *testing.T) {
|
||||||
|
|||||||
@@ -1,8 +1,8 @@
|
|||||||
package validators
|
package validators
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"gitea.maximumdirect.net/eric/audita/internal/core/schema"
|
"gitea.maximumdirect.net/eric/audita/v3/internal/core/schema"
|
||||||
"gitea.maximumdirect.net/eric/audita/internal/framework/structuredoutput"
|
"gitea.maximumdirect.net/eric/audita/v3/internal/framework/structuredoutput"
|
||||||
)
|
)
|
||||||
|
|
||||||
type LLMValidatorType string
|
type LLMValidatorType string
|
||||||
|
|||||||
@@ -7,9 +7,9 @@ import (
|
|||||||
"strings"
|
"strings"
|
||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
"gitea.maximumdirect.net/eric/audita/internal/framework/outcomes"
|
"gitea.maximumdirect.net/eric/audita/v3/internal/framework/outcomes"
|
||||||
"gitea.maximumdirect.net/eric/audita/internal/framework/proposals"
|
"gitea.maximumdirect.net/eric/audita/v3/internal/framework/proposals"
|
||||||
"gitea.maximumdirect.net/eric/audita/internal/framework/structuredoutput"
|
"gitea.maximumdirect.net/eric/audita/v3/internal/framework/structuredoutput"
|
||||||
)
|
)
|
||||||
|
|
||||||
type perItemEstimator struct{}
|
type perItemEstimator struct{}
|
||||||
|
|||||||
@@ -4,7 +4,7 @@ import (
|
|||||||
"encoding/json"
|
"encoding/json"
|
||||||
"fmt"
|
"fmt"
|
||||||
|
|
||||||
"gitea.maximumdirect.net/eric/audita/internal/framework/promptcontext"
|
"gitea.maximumdirect.net/eric/audita/v3/internal/framework/promptcontext"
|
||||||
)
|
)
|
||||||
|
|
||||||
func BuildValidationVariables(validationPayload []LLMValidationItem, transcriptDescription string) (map[string]string, error) {
|
func BuildValidationVariables(validationPayload []LLMValidationItem, transcriptDescription string) (map[string]string, error) {
|
||||||
|
|||||||
@@ -7,15 +7,15 @@ import (
|
|||||||
"sort"
|
"sort"
|
||||||
"strings"
|
"strings"
|
||||||
|
|
||||||
"gitea.maximumdirect.net/eric/audita/internal/core/chunking"
|
"gitea.maximumdirect.net/eric/audita/v3/internal/core/chunking"
|
||||||
"gitea.maximumdirect.net/eric/audita/internal/core/config"
|
"gitea.maximumdirect.net/eric/audita/v3/internal/core/config"
|
||||||
"gitea.maximumdirect.net/eric/audita/internal/core/schema"
|
"gitea.maximumdirect.net/eric/audita/v3/internal/core/schema"
|
||||||
"gitea.maximumdirect.net/eric/audita/internal/framework/outcomes"
|
"gitea.maximumdirect.net/eric/audita/v3/internal/framework/outcomes"
|
||||||
"gitea.maximumdirect.net/eric/audita/internal/framework/proposals"
|
"gitea.maximumdirect.net/eric/audita/v3/internal/framework/proposals"
|
||||||
"gitea.maximumdirect.net/eric/audita/internal/framework/responseschema"
|
"gitea.maximumdirect.net/eric/audita/v3/internal/framework/responseschema"
|
||||||
"gitea.maximumdirect.net/eric/audita/internal/framework/stagename"
|
"gitea.maximumdirect.net/eric/audita/v3/internal/framework/stagename"
|
||||||
"gitea.maximumdirect.net/eric/audita/internal/framework/structuredoutput"
|
"gitea.maximumdirect.net/eric/audita/v3/internal/framework/structuredoutput"
|
||||||
"gitea.maximumdirect.net/eric/audita/internal/prompts"
|
"gitea.maximumdirect.net/eric/audita/v3/internal/prompts"
|
||||||
)
|
)
|
||||||
|
|
||||||
type LLMBackedValidator struct {
|
type LLMBackedValidator struct {
|
||||||
|
|||||||
@@ -7,14 +7,14 @@ import (
|
|||||||
"strings"
|
"strings"
|
||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
"gitea.maximumdirect.net/eric/audita/internal/core/chunking"
|
"gitea.maximumdirect.net/eric/audita/v3/internal/core/chunking"
|
||||||
"gitea.maximumdirect.net/eric/audita/internal/core/config"
|
"gitea.maximumdirect.net/eric/audita/v3/internal/core/config"
|
||||||
"gitea.maximumdirect.net/eric/audita/internal/core/schema"
|
"gitea.maximumdirect.net/eric/audita/v3/internal/core/schema"
|
||||||
"gitea.maximumdirect.net/eric/audita/internal/framework/outcomes"
|
"gitea.maximumdirect.net/eric/audita/v3/internal/framework/outcomes"
|
||||||
"gitea.maximumdirect.net/eric/audita/internal/framework/proposals"
|
"gitea.maximumdirect.net/eric/audita/v3/internal/framework/proposals"
|
||||||
"gitea.maximumdirect.net/eric/audita/internal/framework/responseschema"
|
"gitea.maximumdirect.net/eric/audita/v3/internal/framework/responseschema"
|
||||||
"gitea.maximumdirect.net/eric/audita/internal/framework/structuredoutput"
|
"gitea.maximumdirect.net/eric/audita/v3/internal/framework/structuredoutput"
|
||||||
"gitea.maximumdirect.net/eric/audita/internal/prompts"
|
"gitea.maximumdirect.net/eric/audita/v3/internal/prompts"
|
||||||
)
|
)
|
||||||
|
|
||||||
type fakeStructuredLLMClient struct {
|
type fakeStructuredLLMClient struct {
|
||||||
|
|||||||
@@ -5,11 +5,11 @@ import (
|
|||||||
"fmt"
|
"fmt"
|
||||||
"strings"
|
"strings"
|
||||||
|
|
||||||
"gitea.maximumdirect.net/eric/audita/internal/core/config"
|
"gitea.maximumdirect.net/eric/audita/v3/internal/core/config"
|
||||||
"gitea.maximumdirect.net/eric/audita/internal/core/modulecatalog"
|
"gitea.maximumdirect.net/eric/audita/v3/internal/core/modulecatalog"
|
||||||
"gitea.maximumdirect.net/eric/audita/internal/core/schema"
|
"gitea.maximumdirect.net/eric/audita/v3/internal/core/schema"
|
||||||
"gitea.maximumdirect.net/eric/audita/internal/framework/outcomes"
|
"gitea.maximumdirect.net/eric/audita/v3/internal/framework/outcomes"
|
||||||
"gitea.maximumdirect.net/eric/audita/internal/framework/proposals"
|
"gitea.maximumdirect.net/eric/audita/v3/internal/framework/proposals"
|
||||||
)
|
)
|
||||||
|
|
||||||
const (
|
const (
|
||||||
|
|||||||
@@ -5,7 +5,7 @@ import (
|
|||||||
"sort"
|
"sort"
|
||||||
"strings"
|
"strings"
|
||||||
|
|
||||||
"gitea.maximumdirect.net/eric/audita/internal/core/schema"
|
"gitea.maximumdirect.net/eric/audita/v3/internal/core/schema"
|
||||||
)
|
)
|
||||||
|
|
||||||
type protectedTermDef struct {
|
type protectedTermDef struct {
|
||||||
|
|||||||
@@ -4,8 +4,8 @@ import (
|
|||||||
"reflect"
|
"reflect"
|
||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
"gitea.maximumdirect.net/eric/audita/internal/core/schema"
|
"gitea.maximumdirect.net/eric/audita/v3/internal/core/schema"
|
||||||
"gitea.maximumdirect.net/eric/audita/internal/framework/proposals"
|
"gitea.maximumdirect.net/eric/audita/v3/internal/framework/proposals"
|
||||||
)
|
)
|
||||||
|
|
||||||
func TestExtractProtectedTermsStableDeduplicatedWithPlurals(t *testing.T) {
|
func TestExtractProtectedTermsStableDeduplicatedWithPlurals(t *testing.T) {
|
||||||
|
|||||||
@@ -5,9 +5,9 @@ import (
|
|||||||
"strings"
|
"strings"
|
||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
"gitea.maximumdirect.net/eric/audita/internal/core/config"
|
"gitea.maximumdirect.net/eric/audita/v3/internal/core/config"
|
||||||
"gitea.maximumdirect.net/eric/audita/internal/core/schema"
|
"gitea.maximumdirect.net/eric/audita/v3/internal/core/schema"
|
||||||
"gitea.maximumdirect.net/eric/audita/internal/framework/proposals"
|
"gitea.maximumdirect.net/eric/audita/v3/internal/framework/proposals"
|
||||||
)
|
)
|
||||||
|
|
||||||
func mkCandidate(index int, segID int, orig, corr string, conf float64) proposals.EnrichedCorrectionProposal {
|
func mkCandidate(index int, segID int, orig, corr string, conf float64) proposals.EnrichedCorrectionProposal {
|
||||||
|
|||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user