diff --git a/CHANGELOG.md b/CHANGELOG.md index 930de68..c6d4da2 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,12 @@ All notable changes to this project are documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/). +## [Unreleased] + +### Changed + +- **Untrusted-output boundary is now on by default**: Norma frames tool results for the worker, planner, chat and main agent unless `ARTEX_UNTRUSTED_BOUNDARY` is set to `0`, `false`, `off` or `no`. It was opt-in via `ARTEX_UNTRUSTED_BOUNDARY=1` in 0.6.0 (#166). + ## [0.6.0] - 2026-11-12 Machine-checked finding verification (S1), intercept decisions traced to their actor, configurable notification limits, prompt hardening and goal guards from the #124 agentic audit, the target gate (S3b phase 1 and step 2.1, off by default and API-only), intent claim leases, and checksum-verified tool downloads in the Docker image. diff --git a/Dockerfile b/Dockerfile index d32ce8f..a13227c 100644 --- a/Dockerfile +++ b/Dockerfile @@ -178,7 +178,7 @@ COPY --from=build /out/artex /app/artex COPY start.sh /app/start.sh RUN chmod +x /app/artex /app/start.sh && mkdir -p /app/keys COPY skills/ /app/skills/ -# persistence points: data/ (SQLite, task files) and keys/ (jwt.key, via ARTEX_JWT_KEY_DIR) +# persistence points: data/ (traffic index, task files, transcripts) and keys/ (jwt.key, secret.key, via ARTEX_JWT_KEY_DIR) VOLUME ["/app/data", "/app/keys"] EXPOSE 8787 8788 ENTRYPOINT ["/app/start.sh"] diff --git a/README.md b/README.md index ad6a18b..4aa5538 100644 --- a/README.md +++ b/README.md @@ -161,7 +161,7 @@ CGO_ENABLED=0 go build -tags embedui -o artex ./cmd/artex ```bash ./build.sh --release -# output: dist/artex-0.3.3-*.zip +# output: dist/artex--*.zip ``` UPX self-extracting binaries may be incompatible with some Linux kernels, virtualization environments, or security policies, so they are disabled by default. Use `ARTEX_TARGETS` to customize the targets; when you have confirmed the target runtime is compatible, explicitly pass `--upx` to further shrink the binary: @@ -207,7 +207,7 @@ Daily cron example (03:20, operator crontab): ## Updating and upgrading -> Upgrading only swaps the program and never touches data: the Postgres volume `pgdata`, `./data` (SQLite, task files, etc.), `./keys` (jwt.key), and `./skills` are all preserved. **No manual database migration is needed**: `artex` idempotently re-runs `schema.sql` on every start (with `ADD COLUMN` / `CREATE INDEX IF NOT EXISTS`), i.e. "restart equals migrate". It is still recommended to back up `./data` and the database before upgrading. +> Upgrading only swaps the program and never touches data: the Postgres volume `pgdata`, `./data` (traffic index, task files, transcripts, etc.), `./keys` (jwt.key, secret.key), and `./skills` are all preserved. **No manual database migration is needed**: `artex` idempotently re-runs `schema.sql` on every start (with `ADD COLUMN` / `CREATE INDEX IF NOT EXISTS`), i.e. "restart equals migrate". It is still recommended to back up `./data` and the database before upgrading. **Update banner (opt-in, off by default)**: start ARTEX with `ARTEX_UPDATE_CHECK=1` to have the backend ask the public GitHub releases API for the latest ARTEX tag, at most once per 24 hours (cached in memory; a failed check is not retried within that window). When the release is newer than the running version, the web UI shows a small dismissible strip linking to the Releases page. The request sends only the `User-Agent: artex-update-check` header. Unset, ARTEX makes no update request and shows no banner. diff --git a/agent/provider.go b/agent/provider.go index 98bd645..14cee59 100644 --- a/agent/provider.go +++ b/agent/provider.go @@ -1,5 +1,5 @@ // Package agent wires real LLM-driven planner and work agents (on top of the -// agent-core SDK) to the dual SQLite graph. See the ARTEX architecture design doc +// agent-core SDK) to the dual PostgreSQL graph. See the ARTEX architecture design doc // §4.3 (planner) and §4.4 (work agent). // // Provider configuration is read from the environment so the system runs with diff --git a/build.sh b/build.sh index 92deeb6..d830b38 100755 --- a/build.sh +++ b/build.sh @@ -8,7 +8,7 @@ # ARTEX_TARGET_OS=linux One target OS in single-target mode. # ARTEX_TARGET_ARCH=amd64 One target arch in single-target mode. # ARTEX_TARGETS=linux/amd64,... Comma-separated targets for multi-target mode. -# ARTEX_BUILD_VERSION=v0.3.3 Version embedded in the binary and archive name. +# ARTEX_BUILD_VERSION=vX.Y.Z Version embedded in the binary and archive name. # ARTEX_OUTPUT=/path/to/artex Explicit binary path in single-target mode. # ARTEX_OUTPUT_DIR=dist Directory for default binary paths. # ARTEX_PACKAGE=1 Create a zip archive for each target. @@ -97,7 +97,7 @@ if [ -z "${ARTEX_BUILD_VERSION:-}" ]; then ARTEX_BUILD_VERSION="dev" fi fi -# Release tags are commonly passed as v0.3.3; keep the binary version consistent. +# Release tags are commonly passed with a v prefix; keep the binary version consistent. ARTEX_BUILD_VERSION="${ARTEX_BUILD_VERSION#v}" ARTEX_OUTPUT_DIR="${ARTEX_OUTPUT_DIR:-dist}" ARTEX_PACKAGE_DIR="${ARTEX_PACKAGE_DIR:-$ARTEX_OUTPUT_DIR}" diff --git a/cmd/artex/main.go b/cmd/artex/main.go index ba2a84a..99e1180 100644 --- a/cmd/artex/main.go +++ b/cmd/artex/main.go @@ -1,4 +1,4 @@ -// Command artex runs the ARTEX backend: the dual SQLite graph stores, +// Command artex runs the ARTEX backend: the dual PostgreSQL graph stores, // the event-driven exploration engine, and the JSON HTTP API consumed by the // shadcn/ui frontend. package main @@ -50,7 +50,7 @@ func main() { func run() int { var ( addr = flag.String("addr", "127.0.0.1:8787", "HTTP listen address") - dataDir = flag.String("data", filepath.Join(config.BaseDir(), "data"), "data directory for SQLite stores (default: data/ next to the executable)") + dataDir = flag.String("data", filepath.Join(config.BaseDir(), "data"), "runtime data directory: traffic index, task files, transcripts (default: data/ next to the executable)") proxy = flag.String("proxy", "127.0.0.1:8788", "traffic recording proxy address (empty to disable)") ) flag.Parse() diff --git a/docker-compose.yml b/docker-compose.yml index d87ee11..ecfb72b 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -54,10 +54,10 @@ services: - "${ARTEX_BIND_ADDR:-127.0.0.1}:8787:8787" - "127.0.0.1:8788:8788" volumes: - # Bind the data directory (SQLite, task files, etc.) to data/ in the project root, + # Bind the runtime data directory (traffic index, task files, transcripts, etc.) to data/ in the project root, # so it is easy to inspect/back up on the host and survives container rebuilds. - ./data:/app/data - # JWT signing key (jwt.key), kept out of data/, which the file manager browses. + # JWT signing key and secret key (jwt.key, secret.key), kept out of data/, which the file manager browses. # Persisting it keeps users signed in across container rebuilds. - ./keys:/app/keys # Mount skills/ from the project root into the container (overriding the image's built-in /app/skills);