name: rsyslog_local_container_testing description: Mirror rsyslog run_checks.yml container validation locally, including the change-gated Ubuntu 26.04 run-ci.sh check run, the clang static analyzer job, late prompt-based audit passes, Cubic review where applicable, service-skip validation, clean-tree rules, and container path caveats.
rsyslog_local_container_testing
Use this skill when validating rsyslog implementation changes through local dev containers, and treat it as the final pre-finish gate when Docker, Podman, or equivalent container tooling is available. Local container validation should mirror the relevant GitHub Actions container jobs, including their relevance gates, instead of inventing a parallel local-only flow. If container tooling is unavailable, report that limitation explicitly rather than silently substituting a weaker gate.
When To Use
Use this for PR-ready validation whenever local container support is available. It is often faster than waiting for GitHub CI to discover environment-specific failures, especially static-analyzer findings, compiler/toolchain differences, dependency differences, generated build state issues, and service-test skip behavior.
Focused host-side tests from rsyslog_test are still the right first step when
debugging a specific behavior. After the patch is stable, run this skill before
pushing if the change is intended for review.
Pre-PR Testbed Tiers
Use these tiers as a session testbed before opening or updating PRs. The goal is to catch the failures that otherwise cost a full GitHub Actions turnaround and follow-up babysitting cycle, without cloning the entire CI matrix for every small patch.
Start with the repository helper:
devtools/local-validation-plan.sh
The default mode classifies the current local diff and prints the recommended validation path. It includes committed branch changes, staged and unstaged tracked edits, and untracked files. This is important because PR work is often validated before everything is committed.
When you want deterministic execution instead of a checklist, use:
devtools/local-validation-plan.sh --run
--run executes the selected path and exits on the first required failure.
Optional local linters still remain tool-presence guarded, so missing optional
developer tools do not turn a documentation or tooling-only change into a
container validation failure.
By default the helper compares committed branch changes against the worktree's
creation baseline: RSYSLOG_LOCAL_VALIDATION_BASE when set, otherwise
rsyslog.localValidationBase from git config when present, otherwise the
oldest HEAD reflog entry for the worktree. This keeps local Cubic and local
diff classification tied to the commit that was HEAD when the dedicated
worktree was created, even after origin/main moves. Use --base REF for an
intentional one-off override.
Before starting any heavy local validation, run the relevant cheap local checks that are available in the environment. These checks should be diff-scoped and tool-presence guarded:
- changed shell scripts:
shellcheck - changed scripts with a POSIX
shshebang:checkbashisms -p; on Debian/Ubuntu install it withsudo apt-get install -y devscripts. Do not run it as a full-testbench gate by default, because many tests intentionally use Bash-oriented testbench conventions. Keep this check diff-scoped so runtime stays proportional to the changed files. - changed Python files:
devtools/format-python.sh --check-if-available - changed GitHub Actions workflows:
actionlintand pinnedzizmor - changed Dockerfiles:
hadolint - changed infrastructure/config files:
trivy configon the changed paths or smallest relevant directory - larger source/test PRs:
jscpdas an advisory duplication check - changed C sources or headers MUST run the exact read-only check:
devtools/format-code.sh --git-changed --check --check-if-available. This is a read-onlyclang-format-18dry-run gate for deterministic validation; if the exact formatter is unavailable, it warns and leaves hosted CI or a fuller local environment to cover the gap. CI will not pass with improperly formatted C/H code. Usedevtools/format-code.sh --git-changedseparately when you intentionally want to rewrite local files. - changed C sources or headers also get an advisory raw-allocation scan in
devtools/local-validation-plan.sh --run. Treat matches formalloc,calloc,realloc,strdup, andstrndupas review prompts; prefer rsyslog allocation helpers where practical, but inspect low-level exceptions before changing code. - changed shell tests should run
devtools/check-test-antipatterns.shthrough the helper. Its findings are advisory prompts for flake-prone constructs such as fixed sleeps, port preselection, fixed ports, and ad-hoc assertions.
Do not run cppcheck routinely unless a maintainer explicitly asks for it; it
is too noisy for routine rsyslog PR validation.
- Agent-documentation and skill-only changes. If the diff is limited to
AGENTS.md,AGENTS.local.md,.agent/skills/**, or.codex/skills/**, do not run the Ubuntu 26.04 container check or static analyzer merely because validation instructions changed. Validate these edits with normal text review, Markdown/link sanity checks where available, and a small command dry-run only when the edited instructions include command snippets whose syntax is uncertain. If the agent-doc change also edits code, testbench files, workflows, build files, or scripts, validate those touched areas normally. - User-facing documentation changes. If the diff changes rendered
user-facing docs, such as
doc/source/**or Sphinx support files that affect that tree, do not run the Ubuntu 26.04 runtime check just because docs changed. Instead run a high-concurrency docs build:./doc/tools/build-doc-linux.sh --clean --format html --jobs "${RSYSLOG_LOCAL_DOC_JOBS:-$(nproc)}". Use--strictfor larger, structural, or navigation-heavy documentation edits. Internal docs that are not rendered into the user manual, such asdoc/ai/**, repository agent guides, and skill files, do not require this docs build unless they also change rendered Sphinx inputs. - Tier 1: default PR-ready gate for code or testbench changes. Run a
change-gated Ubuntu 26.04
devtools/run-ci.shcheck first, then the existing static-analyzer pass, then late prompt-based audit passes and local Cubic review when applicable. This is the normal local confidence gate for C, parser, module, runtime,tests/*.sh,diag.sh,Makefile.am,configure.ac, andrun_checks.ymlchanges. - Tier 2: compile portability gate for non-trivial C/header changes. Add
the two build-only compile lanes from
run_checks.yml:clang21-ndebugandgcc15-gnu23-debug. Use this when a change touches shared headers, compiler-sensitive code, generated C paths, configure/build inputs, or anything that could behave differently under debug/no-debug or GNU23 compilation. - Tier 3: risk-triggered specialist lanes. Add only the lanes that match the
touched area or risk profile:
ubuntu_26_sanfor memory, parser, string, JSON, property, and bounds work;ubuntu_26_tsanfor threading, queue, action lifecycle, or lock-order work;ubuntu_26_imtcp_no_epollfor imtcp and network input changes;ubuntu_22_distcheckorkafka_distcheck_CIfor dist, autotools, packaging, or Kafka Makefile changes.
Keep macOS, full distro matrix, package builds, and service-backed matrix jobs as CI-owned by default. Run them locally only when the change directly targets that area and the local host can reproduce the required environment.
Keep i386 and Ubuntu 24 regular runtime coverage cloud-only by default. Run them locally only when reproducing a lane-specific failure, validating their workflow/container, or when a maintainer explicitly asks for that local lane.
Normal PR-ready local validation is change-gated. It must not force the full test suite by default. Force full coverage only for daily, weekly, release, flake-campaign, maintainer-requested, or relevance-gate validation work.
Local Capacity Knobs
Use the local machine's configured capacity for broad local checks instead of hard-coding this host's current limit into instructions. Unknown machines should default conservatively:
: "${RSYSLOG_LOCAL_CHECK_JOBS:=10}"
: "${RSYSLOG_LOCAL_BUILD_JOBS:=10}"
export CI_MAKE_OPT="-j${RSYSLOG_LOCAL_BUILD_JOBS}"
export CI_MAKE_CHECK_OPT="-j${RSYSLOG_LOCAL_CHECK_JOBS}"
RSYSLOG_LOCAL_CHECK_JOBS is the normal local make check concurrency gauge.
It should be set by the user or machine profile, for example in .bashrc.
Deflake and overload experiments are prompt-driven and must use explicit
one-off -jN values instead of changing this normal validation knob.
Late Prompt Audits
Run prompt-based audits late in the process, after cheap deterministic checks, mock distcheck when needed, the change-gated Ubuntu 26.04 container run, and the static analyzer have either passed or the implementation is otherwise stable enough that no major rewrite is expected. This keeps review tokens spent on the candidate that is likely to ship instead of on intermediate churn.
Do not launch codex, copilot, or another AI CLI from repository scripts.
The active agent must read the canned prompt and apply it to the current diff,
changed functions, and nearby lifecycle paths. When a separate reviewer session
or subagent is explicitly available, it may be used, but local validation must
not depend on unknown local AI tooling, authentication, or model availability.
Use these prompt passes when they match the change:
- changed C sources or headers: read
ai/rsyslog_memory_auditor/base_prompt.txtand audit changed functions plus nearby allocation, ownership, and cleanup paths. For focused allocation changes, also consultaudit_leaks.txt,audit_lifecycle.txt, andaudit_null_checks.txtas needed. - lock, queue, worker, thread, timer, atomic, shutdown, retry, or resource
ownership changes: read
ai/rsyslog_bug_finder/base_prompt.txtand perform a path-sensitive resource and concurrency audit, including lock ordering and branch-specific counterexamples for any non-clean findings. - testbench, build, or distribution plumbing changes: perform a project
standards audit: check
tests/Makefile.amregistration,EXTRA_DIST, "define at top, distribute unconditionally, register conditionally" patterns, RainerScript syntax in touched tests, and mock distcheck coverage.
Report the prompt audits in the validation summary: which prompts were applied, which findings were fixed, which findings were dismissed with rationale, or that the audit was clean. Skip prompt audits for documentation-only and instruction-only changes unless the edited instructions themselves change audit or validation behavior.
Cubic Review
Run the local cubic CLI as an AI review gate when it applies. Cubic is a small
local shim that forwards the review request to the configured cloud AI service,
so it should run late on the stabilized candidate. It is a broad review pass,
not a fast compile detector.
- Docs-only changes: do not run Cubic.
- Code changes (
*.c,*.h, grammar/parser/runtime/module logic): always run Cubic when the command is installed and reachable. - Test-only changes: run Cubic for non-trivial test logic, timing/sync changes, helper changes, or broad testbench behavior.
- Workflow, build, and tooling changes: run Cubic when the change is
non-trivial, behavior-affecting, security-sensitive, or large. Use
actionlint, pinnedzizmor, and the relevant local linters as the primary deterministic checks for workflow syntax/security. - Mixed or large changes: run Cubic.
Hosted Cubic or Gemini PR comments are useful additional feedback, but they do not replace local Cubic for code changes and do not replace local analyzer, build, or container checks.
Extended Lane Triggers
Use extended lanes to target a plausible failure mode that the default change-gated Ubuntu 26.04 check would not expose. Do not add lanes by habit.
- Compile portability lanes (
clang21-ndebug,gcc15-gnu23-debug): run for shared header changes, configure/build/autotools changes, compiler-sensitive C changes, macro/inline helper changes, generated C paths, debug/no-debug sensitive code, GNU23/C standard sensitivity, or broad C changes where one normal compiler is weak evidence. - SAN (
ubuntu_26_san): run for parser, string, buffer, JSON, property, length accounting, allocation, ownership, malformed-input, crash, undefined-behavior, or security-adjacent changes. - TSAN (
ubuntu_26_tsan): run for queues, actions, worker lifecycle, shutdown, retry, timers, locks, atomics, condition variables, shared state, readiness/polling/synchronization test changes, and all changes toruntime/wti.*orruntime/wtp.*. - imtcp poll/select (
ubuntu_26_imtcp_no_epoll): run when touching imtcp behavior that could differ between epoll and poll/select mode. - Distribution checks (
ubuntu_22_distcheck, mock distcheck, orkafka_distcheck_CI): run when adding, renaming, or deleting files/tests, changingMakefile.am,configure.ac,m4, packaging lists, generated artifacts, or Kafka build/test plumbing. The local validation helper runs the fastmake distcheck TEST_RUN_TYPE=MOCK-OKvariant for changed, added, renamed, or deleted test and build-manifest distribution risks before escalating to heavier container lanes. - Service-specific lanes: run only when directly relevant to the touched module, tests, helpers, build plumbing, or relevance logic. This includes Kafka, Elasticsearch, VictoriaLogs/omhttp, MySQL/libdbi, imfile, and similar focused families. For imjournal, local runtime tests are normally not representative unless the host has a usable journal environment; document the limitation and rely on CI/static checks when local runtime coverage is not practical.
- i386 and Ubuntu 24: leave cloud-only by default. Use local runs only for lane-specific reproduction, explicit 32-bit ABI/width work, dependency or Ubuntu-LTS package behavior, or workflow/container changes in those lanes.
Preferred Order
For the PR-ready final gate, run Cubic where applicable and two container
validations for broad local confidence. Mirror these
.github/workflows/run_checks.yml paths:
- Local Cubic review and the
clang static analyzerjob's container command. These can run in parallel when the agent harness supports parallel commands. - The change-gated Ubuntu 26.04
devtools/run-ci.shcheck run, only after the analyzer and Cubic results are clean or their findings are understood.
This sequence is what "PR-ready local container validation" means in agent
status reports. It is intentionally not an unconditional full-suite run; it
must use the same conservative change-gating and service-relevance model as
regular PR CI. A focused devtools/run-ci.sh TEST=... or build-only
TESTS="" container command is useful supplemental evidence, but it is only a
targeted container test unless this skill explicitly calls that reduced lane
acceptable for the touched area. Hosted CI, including hosted Cubic/Gemini
comments, does not replace this local container gate.
Keep runtimes and summarize failures separately for each run.
Use the skill's configured dev image or another explicit CI-equivalent image.
The Docker Hub rsyslog/rsyslog_dev_base_ubuntu:26.04 image is acceptable for
normal local dev-container validation. When the task specifically validates a
locally built runtime or dev image, use that locally built image/tag for the
container-under-test and record its image ID.
For normal local validation, do not set RSYSLOG_CONTAINER_UID=''. Leaving
RSYSLOG_CONTAINER_UID unset lets devtools/devcontainer.sh run the container
process as the host uid/gid and inject a matching passwd/group entry when
needed. This prevents generated build products from being owned by the dev
image's default user, which is often a different uid than the host checkout
owner. Set RSYSLOG_CONTAINER_UID='' only when intentionally reproducing the
exact GitHub Actions default-container-user behavior, and expect to normalize
ownership afterwards.
Clean Tree Rule
Before switching compiler, sanitizer flags, configure options, container image, or test mode, clean generated build state:
make distclean || true
rm -f tests/runtime_unit_gss_token_util \
tests/runtime_unit_linkedlist \
tests/runtime_unit_stringbuf
Skip this only for an immediate rerun with unchanged settings.
If a previous container run left generated files owned by root or by an
unexpected container UID, make distclean may print permission errors or the
next autoreconf may fail while opening autom4te.cache. In that case,
normalize ownership and writable bits in the throwaway worktree before cleaning
again:
sudo chown -R "$(id -u):$(id -g)" .
chmod -R u+rwX,go+rwX .
make distclean || true
Use this only for local validation worktrees where the generated build output is
not part of the intended diff. Re-check git status --short afterwards and
remove only untracked build products or logs, not source changes.
Container configure runs leave generated Makefiles with absolute paths from
inside the container, such as /rsyslog/missing. Reconfigure on the host before
running host-side make in the same tree.
Run 1: run_checks.yml Clang Static Analyzer
Clean before analyzer mode so scan-build recompiles the tree:
make distclean || true
rm -rf scan-build-report clang-analyzer.log
Run:
RSYSLOG_DEV_CONTAINER='rsyslog/rsyslog_dev_base_ubuntu:26.04' \
SCAN_BUILD='scan-build' \
SCAN_BUILD_CC='clang' \
SCAN_BUILD_REPORT_DIR='scan-build-report' \
CI_MAKE_OPT='-j20' \
DOCKER_RUN_EXTRA_OPTS='-e SCAN_BUILD -e SCAN_BUILD_CC -e SCAN_BUILD_REPORT_DIR' \
RSYSLOG_CONFIGURE_OPTIONS_EXTRA='--disable-elasticsearch --disable-elasticsearch-tests --disable-imkafka --disable-omkafka --disable-kafka-tests --disable-mysql --disable-mysql-tests' \
devtools/devcontainer.sh --rm devtools/run-static-analyzer.sh 2>&1 | tee clang-analyzer.log
The analyzer job intentionally has its own concurrency knob. In run_checks.yml
it uses CI_MAKE_OPT='-j20'; do not infer this from the broad compile matrix.
Optional Tier 2: run_checks.yml Compile Matrix
Run these before PR for non-trivial C/header or portability-sensitive changes. They are build-only checks and normally finish faster than a failed PR cycle. Clean generated state before switching between configurations.
For clang21-ndebug:
make distclean || true
/usr/bin/time -p env \
RSYSLOG_DEV_CONTAINER='rsyslog/rsyslog_dev_base_ubuntu:26.04' \
CI_CONFIGURE_CACHE='1' \
CC='clang-21' \
CFLAGS='-g' \
RSYSLOG_CONFIGURE_OPTIONS_EXTRA='--enable-debug=no' \
devtools/devcontainer.sh --rm devtools/run-configure.sh
/usr/bin/time -p env \
RSYSLOG_DEV_CONTAINER='rsyslog/rsyslog_dev_base_ubuntu:26.04' \
devtools/devcontainer.sh --rm make -j20
For gcc15-gnu23-debug:
make distclean || true
/usr/bin/time -p env \
RSYSLOG_DEV_CONTAINER='rsyslog/rsyslog_dev_base_ubuntu:26.04' \
CI_CONFIGURE_CACHE='1' \
CC='gcc-15' \
CFLAGS='-g -std=gnu23' \
RSYSLOG_CONFIGURE_OPTIONS_EXTRA='--enable-debug=yes --disable-omamqp1' \
devtools/devcontainer.sh --rm devtools/run-configure.sh
/usr/bin/time -p env \
RSYSLOG_DEV_CONTAINER='rsyslog/rsyslog_dev_base_ubuntu:26.04' \
devtools/devcontainer.sh --rm make -j20
Run 2: run_checks.yml Ubuntu 26.04 Check
Use the same devtools/run-ci.sh path as CI, with local concurrency from
RSYSLOG_LOCAL_BUILD_JOBS and RSYSLOG_LOCAL_CHECK_JOBS. For Valgrind-capable
check runs, set a non-sanitizer compiler and CFLAGS; ASAN-instrumented binaries
are not suitable for Valgrind tests.
For PR-ready validation with the actual changed-file set, apply the default service relevance suppressions before entering the container. Local validation normally happens before committing, so include committed branch changes, staged/unstaged tracked changes, and untracked files. Clean generated build state first so untracked build products do not pollute the relevance decision:
make distclean || true
: "${RSYSLOG_LOCAL_CHECK_JOBS:=10}"
: "${RSYSLOG_LOCAL_BUILD_JOBS:=10}"
export RSYSLOG_DEV_CONTAINER='rsyslog/rsyslog_dev_base_ubuntu:26.04'
export RSYSLOG_TESTBENCH_CHANGED_FILES="$({
git diff --name-only origin/main...HEAD
git diff --name-only HEAD
git ls-files --others --exclude-standard
} | sort -u)"
export CC='gcc'
export CFLAGS='-g'
export CI_CONFIGURE_CACHE=1
export CI_MAKE_OPT="-j${RSYSLOG_LOCAL_BUILD_JOBS}"
export CI_MAKE_CHECK_OPT="-j${RSYSLOG_LOCAL_CHECK_JOBS}"
export CI_CHECK_CMD='check'
export VERBOSE=1
. devtools/apply-service-relevance.sh
rsyslog_apply_default_pr_service_suppressions
/usr/bin/time -p env \
devtools/devcontainer.sh --rm devtools/run-ci.sh
For service-skip validation with an irrelevant fake change set, set
RSYSLOG_TESTBENCH_CHANGED_FILES to a representative path such as
doc/README.md before sourcing devtools/apply-service-relevance.sh.
For a faster build-only smoke check, set:
CI_MAKE_CHECK_OPT="-j${RSYSLOG_LOCAL_CHECK_JOBS} TESTS="
This is useful for intermediate feedback, but it does not satisfy the PR-ready validation gate.
Do not replace this run with a focused TEST=... lane just because the PR has a
single new test. The change-gated broad run validates the CI configure path,
generated state, service relevance filters, and broad testbench integration.
Optional Tier 3: Risk-Triggered Specialist Lanes
Run these only when the changed area justifies the extra local time. The command
shape should stay close to run_checks.yml; use the trigger table above and
record deviations in the final status.
- Memory-sensitive changes: mirror
ubuntu_26_sanwithclang-21, AddressSanitizer, UndefinedBehaviorSanitizer, disabled Valgrind, and the same configure extras. Use for parser, property, string, JSON, bounds, and segfault-related work. - Threading changes: mirror
ubuntu_26_tsanwithclang-21, ThreadSanitizer,--security-opt seccomp=unconfined, and the CI TSAN suppressions. Use for queues, worker lifecycle, action shutdown, locks, shared state, and all changes toruntime/wti.*orruntime/wtp.*. - imtcp select-mode changes: mirror
ubuntu_26_imtcp_no_epollwhen touching imtcp behavior that could differ between epoll and poll/select. - 32-bit or ABI-sensitive changes: rely on hosted i386 CI by default.
Mirror
i386_CIlocally only when reproducing an i386-only failure, changing the i386 workflow/container, or when a maintainer explicitly requests local 32-bit validation. - Distribution or build-system changes: mirror
ubuntu_22_distcheckfor general dist/autotools risk, andkafka_distcheck_CIfor Kafka build/test plumbing.
Do not run these by habit. The expected value is highest when the lane is tied to the changed subsystem or to a specific failure mode seen during babysitting.
Limited Local Environment Fallback
Some agents, workstations, and external contributor environments have limited tooling. Web Agents commonly lack Docker/Podman, but the same situation can happen on developer machines, locked-down CI shells, fresh containers, or systems without optional linters. These environments are supported: missing local tools are coverage gaps, not local workflow blockers. In that environment:
- Prefer
devtools/local-validation-plan.shin default plan mode when a local checkout and shell are available. It can classify the change without starting containers. - Use
devtools/local-validation-plan.sh --runonly when the selected class is runnable without containers, such as agent-doc-only, internal-doc-only, local-validation-tooling, or rendered-docs when the docs toolchain exists. Do not use a no-container--runresult as substitute evidence for code, testbench, workflow, or focused container-test changes. - Run every available applicable local check, such as diff-scoped linters,
actionlint, pinnedzizmor, Python style checks, shell syntax checks, documentation builds, host builds, focused host-side tests, and any repository scripts that work without containers. Missing one optional tool does not justify skipping other checks that are present. - Inspect the changed files,
run_checks.yml, and service relevance rules to identify the CI lanes that should cover the change. - Do not claim PR-ready container validation. State clearly that container validation is unavailable in the current environment.
- Provide the exact local container lanes or hosted CI lanes that a container capable agent should run next.
- Missing local tools such as
shellcheck,checkbashisms,actionlint,zizmor,hadolint,trivy,jscpd,pycodestyle, Cubic, Docker, or Podman are not fatal by themselves. Report the missing checks and continue with all deterministic checks that are available and relevant. - For code changes, still run or request Cubic according to the Cubic rules when the local CLI is available. If Cubic is unavailable, report that as a separate AI-review limitation.
Service Relevance
Regular PR CI may use approximate relevance gates to avoid scheduling expensive
service-backed test families that cannot reasonably be affected by the changed
files. The preferred result is that irrelevant families are absent from the
configured Automake TESTS set. Do not rely on starting an expensive test and
letting it skip late after service setup unless that is the only available
plumbing for that family.
Use RSYSLOG_TESTBENCH_CHANGED_FILES for local fake change sets when validating
the decision logic. Source devtools/apply-service-relevance.sh and call
rsyslog_apply_default_pr_service_suppressions before devtools/run-ci.sh to
apply the same PR-style configure suppressions in local container runs:
make distclean || true
export RSYSLOG_DEV_CONTAINER='rsyslog/rsyslog_dev_base_ubuntu:26.04'
export RSYSLOG_TESTBENCH_CHANGED_FILES='runtime/lookup.c'
export CC='gcc'
export CFLAGS='-g'
export CI_CONFIGURE_CACHE=1
export CI_MAKE_OPT='-j20'
export CI_MAKE_CHECK_OPT='-j10'
export CI_CHECK_CMD='check'
export VERBOSE=1
. devtools/apply-service-relevance.sh
rsyslog_apply_default_pr_service_suppressions
devtools/devcontainer.sh --rm devtools/run-ci.sh
For a fast scheduling proof, add TEST_RUN_TYPE=MOCK-OK and pass it into the
container via DOCKER_RUN_EXTRA_OPTS='-e TEST_RUN_TYPE'. The resulting
configure summary and PASS: list should show irrelevant heavy families
configured out rather than scheduled and skipped late.
For workflow or configure changes, validate both layers:
tests/diag.sh module-needs-testing <family>for representative changed files that should run and should skip the family.- A clean container/mock
devtools/run-ci.shpath that confirms configure disables irrelevant test families and the generated test list omits their tests before execution.
The relevance check is intentionally conservative. Direct module changes, related tests, testbench/build plumbing, workflow files, configure inputs, and shared runtime paths that can plausibly affect a family must keep that family enabled. Isolated helper-only changes, such as lookup tables or dynstats, may avoid waking focused heavy families only when there is a clear code-path rationale.
Full coverage must remain forceable. Use RSYSLOG_TESTBENCH_FORCE_SERVICE_TESTS=1,
RSYSLOG_TESTBENCH_FORCE_<FAMILY>_TESTS=1, or
RSYSLOG_TESTBENCH_SKIP_SERVICE_RELEVANCE=1 when intentionally validating
service tests without relevant source changes, or when running daily, weekly,
release, flake-campaign, or maintainer-requested full coverage.
Allowed relaxations are narrow and tied to the touched area:
- imfile-only work may skip unrelated external service lanes.
- Kafka may be disabled only when neither Kafka modules nor Kafka test plumbing are touched.
- Elasticsearch may be disabled only when neither omelasticsearch nor Elasticsearch test plumbing are touched.
- Journal/imjournal runtime tests are static-analysis-only on hosts without a usable journal service. Do not try to force journal runtime tests in that environment; record the static-analysis exception instead.
Record every relaxation with the touched-area rationale. A skipped or relaxed lane without that rationale makes the result targeted validation, not full local container validation.
Reporting
Report:
- exact command shape and container image
- image tag and image ID
- elapsed
realtime from/usr/bin/time -pwhere used - pass/skip/fail summary from
tests/test-suite.log - whether skips were expected from relevance filtering
- lanes run, lanes relaxed/skipped, and touched-area rationale for each relaxation
- whether the result is fully container-validated or targeted
- unrelated local flakes separately from failures caused by the change
If a full container lane fails, inspect the logs and make up to four concrete remediation attempts only when the failure appears locally fixable. Record the command, log path, failure summary, each attempt, the affected PR/unit, and whether host-side validation passed. If it still fails after those attempts, carry the error forward in the session ledger instead of spinning.