Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
116 commits
Select commit Hold shift + click to select a range
99b7ba0
bundle/fuzz: add create-payload parity fuzz test for terraform vs direct
radakam Jun 23, 2026
34157c2
bundle/fuzz: fix lint (intrange, perfsprint) and correct num_workers …
radakam Jun 23, 2026
738554f
bundle/fuzz: wire parity tests into CI and harden harness
radakam Jun 23, 2026
24bd2a7
bundle/fuzz: rotate nightly seeds and add single-seed reproduction
radakam Jun 24, 2026
787253a
bundle: force-send num_workers for single-node task clusters
radakam Jun 24, 2026
5243511
bundle/fuzz: report nightly parity failures and fix create-path comment
radakam Jun 24, 2026
bc55286
bundle/fuzz: make harness files test-only and add num_workers regress…
radakam Jun 24, 2026
afbc0cd
bundle/fuzz: make the whole package test-only and harden parity repor…
radakam Jun 24, 2026
431907e
bundle/fuzz: fix lint (stringsseq, testifylint) in paritySeeds
radakam Jun 25, 2026
9c4d5c0
bundle/fuzz: fix nightly issue dedup and document paritySeeds test
radakam Jun 25, 2026
a0d593f
bundle/fuzz: document divergences instead of fixing them
radakam Jun 25, 2026
600e5f4
bundle/fuzz: narrow num_workers ignore and tidy parity harness
radakam Jun 26, 2026
669b5c9
bundle: force-send num_workers for single-node task clusters
radakam Jun 26, 2026
8718922
bundle/fuzz: replace terraform/direct parity with invariant testing
radakam Jun 26, 2026
05c88b0
acceptance: replace bundle/fuzz parity with schema-driven invariant f…
radakam Jun 29, 2026
0047456
acceptance/fuzz: clarify comments and tidy schema fuzz harness
radakam Jun 29, 2026
d1a2854
acceptance/fuzz: shorten and tighten comments
radakam Jun 29, 2026
32277c4
acceptance/fuzz: report nightly failures on the PR instead of an issue
radakam Jun 29, 2026
31a1a2b
acceptance/fuzz: reuse the no_drift invariant check instead of duplic…
radakam Jun 29, 2026
1ce49b1
acceptance/fuzz: skip INPUT_CONFIG_OK marker when deploy is rejected
radakam Jun 29, 2026
a2ae410
acceptance/fuzz: propagate drift failures so the fuzzer detects them
radakam Jun 30, 2026
80a8150
acceptance/fuzz: make the fuzzer run any invariant, not just no_drift
radakam Jun 30, 2026
583deae
testserver: round-trip catalog create payload fields
radakam Jun 30, 2026
5dc10b6
acceptance/fuzz: add redeploy, canonical, update, destroy_recreate in…
radakam Jun 30, 2026
bcedea9
acceptance/fuzz: extract shared invariant prologue and tighten comments
radakam Jul 2, 2026
5a0ad3d
Restructure invariant fuzz tests into per-target scripts
radakam Jul 6, 2026
90ef480
invariant: regenerate out.test.toml for volume_path_job_ref
radakam Jul 7, 2026
718c4a3
fuzz: pin catalog/schema references and emit valid grants
radakam Jul 7, 2026
d4748ca
fuzz: generate multiple resources with cross-references
radakam Jul 7, 2026
f6859c2
fuzz: keep first resource stable across --resource-count
radakam Jul 7, 2026
f873181
fuzz: link every resource to an earlier one, not just one pair
radakam Jul 8, 2026
400baf1
invariant: regenerate fuzz out.test.toml for FUZZ_RESOURCE_COUNT=3
radakam Jul 8, 2026
13e97d4
fuzz: stage data fixtures and pin typed fields to cut rejections
radakam Jul 10, 2026
2298014
fuzz: add mutate mode that perturbs curated invariant configs
radakam Jul 10, 2026
537f462
fuzz: probe dangerous and near-range-end values in generate mode
radakam Jul 13, 2026
c9054bc
acc/fuzz: skip immutable comment/description in update invariant
radakam Jul 13, 2026
c2522e9
acc/fuzz: treat unmodeled testserver routes as rejections, not failures
radakam Jul 13, 2026
abc26f9
acc/fuzz: bound seed execution by time to separate hangs from slow runs
radakam Jul 13, 2026
182d65c
acc/fuzz: record per-seed classification and a per-variant tally
radakam Jul 13, 2026
b4f468e
acc/fuzz: tighten comments added in this PR
radakam Jul 13, 2026
313ff66
invariant: regenerate out.test.toml for inherited GOOSOnPR and job_ru…
radakam Jul 14, 2026
dd8982e
acc/fuzz: real oracle, coverage, less rejection waste, clean truncation
radakam Jul 15, 2026
4d938f2
Ignore root build/ (fuzz coverage + harness terraform artifacts)
radakam Jul 17, 2026
fd817f4
acc/fuzz: pin parent_path to a valid workspace folder
radakam Jul 22, 2026
46e0dd9
acc/fuzz: regenerate out.test.toml for instance_pool.yml.tmpl
radakam Jul 22, 2026
69a6947
Remove canonical, update, and destroy_recreate fuzz invariants
radakam Jul 22, 2026
136b746
acc/fuzz: inject valid optional fields in mutate mode
radakam Jul 23, 2026
ca3f0fc
acc/fuzz: address review — drop dead edit harness, testserver catalog…
radakam Jul 23, 2026
57ee5d7
acc/fuzz: drop redeploy invariant and multi-resource fuzzing
radakam Jul 24, 2026
34c5edf
acc/fuzz: fix set -e deploy-code capture, gate validate, guard determ…
radakam Jul 24, 2026
0d60c33
acc/fuzz: rename dispatcher, extract shared prologue, tighten comments
radakam Jul 24, 2026
5927eb6
acc/fuzz: fix import order after dispatcher rename
radakam Jul 24, 2026
d7254bd
acc/fuzz: run the schema fuzzer locally only
radakam Jul 27, 2026
0c4115a
acc/fuzz: isolate mutate-mode seeds with a per-seed UNIQUE_NAME
radakam Jul 27, 2026
0aab1d9
acc/fuzz: make the harness fail when it stops testing anything
radakam Jul 28, 2026
f03c309
testserver: reject empty catalog and model names like the backend does
radakam Jul 28, 2026
9a7bd0f
acc/invariant: make the shared prologue reusable by generated configs
radakam Jul 28, 2026
e6ac29a
acc/fuzz: guard INPUT_CONFIG in migrate/script
radakam Jul 28, 2026
03f2fc9
acc/fuzz: fuzz the delete and destroy idempotency invariants
radakam Jul 28, 2026
0598dae
acc/fuzz: run the idempotency targets in mutate mode only
radakam Jul 28, 2026
dd16316
acc/fuzz: restore errexit in the uncapped seed path
radakam Jul 28, 2026
1c9245b
acc/fuzz: run mutate mode on the migrate target
radakam Jul 29, 2026
64d92ac
acc/fuzz: trim comments
radakam Jul 29, 2026
1d5f47e
acc/fuzz: move the seed loop into run_fuzz.py
radakam Aug 3, 2026
4ec556a
acc/fuzz: document why continue_293 is not fuzzed
radakam Aug 3, 2026
9a6d264
acc/fuzz: move the fuzz harness out of the invariant subtree
radakam Aug 4, 2026
4647d88
acc/fuzz: keep the invariant README unchanged
radakam Aug 4, 2026
3dbe617
acc/fuzz: record testserver gaps with catch-all stubs, not a server flag
radakam Aug 4, 2026
777e203
acc/fuzz: drop the verify_no_drift.py empty-plan guard
radakam Aug 4, 2026
ea83076
acc/fuzz: drop out-of-scope tooling and generator leftovers
radakam Aug 4, 2026
cc28984
acc/fuzz: spawn the seed shell by resolved path, not the name "bash"
radakam Aug 4, 2026
914de43
acc/fuzz: fix a masked bug class, a wrong repro, and three silent fai…
radakam Aug 5, 2026
9dac416
acc/fuzz: drop comments that restate code or repeat the README
radakam Aug 5, 2026
50e63ef
acc/fuzz: close an oracle hole and stop generating empty containers
radakam Aug 6, 2026
7130bbf
acc/fuzz: fix a repro that widens the search and a gap that masks bugs
radakam Aug 6, 2026
5211383
acc/fuzz: set INPUT_CONFIG in the fuzzer instead of guarding each target
radakam Aug 6, 2026
14e1d2a
acc/fuzz: fix pinned-name collisions and make the curated tables self…
radakam Aug 6, 2026
ecb0827
acc/fuzz: tighten comments and harden the schema-walk edge cases
radakam Aug 6, 2026
3d67195
acc/fuzz: drop generator branches the bundle schema cannot take
radakam Aug 7, 2026
d2c062c
acc/fuzz: record a post-deploy testserver gap as a gap, not a deploy
radakam Aug 7, 2026
0589ac0
acc/fuzz: size seed windows by time budget, not a fixed 25
radakam Aug 7, 2026
71e9f2e
acc/fuzz: drop generate mode; mutate-only with schema injection
radakam Aug 7, 2026
8a1c232
acc/fuzz: drop generate-only schema helpers from the library
radakam Aug 7, 2026
d988ea1
acc/fuzz: fold emit into mutate; keep stdlib YAML I/O
radakam Aug 7, 2026
4213b93
Reject fuzz seeds whose config is missing a required field
radakam Aug 7, 2026
16a80cf
acc/fuzz: drop contrastive comments
radakam Aug 7, 2026
df8e780
acc/fuzz: drop restated invariants and contrastive comments
radakam Aug 7, 2026
29f33af
acc/fuzz: fix nightly seed rotation, timeout, and deploy panic scan
radakam Aug 10, 2026
48e5ae3
acc/fuzz: replace schema-walk inject with a curated catalog
radakam Aug 10, 2026
dc2661e
acc/fuzz: tighten comments to short why-notes
radakam Aug 10, 2026
3c1020a
acc/fuzz: treat all-gap as coverage, not a broken mutator
radakam Aug 10, 2026
7470fb5
acc/fuzz: drop contrastive comment framing
radakam Aug 10, 2026
dfee9f3
acc/fuzz: emit JSON configs and validate INJECT against the schema
radakam Aug 10, 2026
f800c15
acc/fuzz: tighten comments to short why-notes
radakam Aug 10, 2026
62c6d4b
acc/fuzz: keep harness scripts non-executable like other acceptance s…
radakam Aug 10, 2026
0b955b4
acc/fuzz: drop no-PyYAML aside from mutate_fuzz_config docstring
radakam Aug 10, 2026
58e9437
acc/fuzz: sharpen mutate oracle and triage crumbs
radakam Aug 10, 2026
9ac76f5
acc/fuzz: reject type-mismatch warnings and align triage paths
radakam Aug 10, 2026
43ca5e8
acc/fuzz: JSON bases, strict validate, and seed.sh
radakam Aug 11, 2026
c116d2e
acc/fuzz: move harness under invariant/ for prepare and stub inheritance
radakam Aug 11, 2026
e994673
Revert "acc/fuzz: move harness under invariant/ for prepare and stub …
radakam Aug 11, 2026
5768e6b
acc/fuzz: read bases from invariant configs instead of JSON copies
radakam Aug 11, 2026
3da44a5
acc/fuzz: hide the yaml-to-json debug command
radakam Aug 11, 2026
49cd6cc
acc/fuzz: close mute-seed and zero-deploy holes
radakam Aug 14, 2026
e5891da
acc/fuzz: run test-fuzz via go test so -keeptmp works
radakam Aug 14, 2026
61f9296
acc/fuzz: use ./task in LOG.repro copy-paste lines
radakam Aug 17, 2026
65846de
acc/fuzz: generate JSON bases instead of parsing YAML through the CLI
radakam Aug 17, 2026
8e1e113
acc/fuzz: read JSON-formatted invariant bases directly
radakam Aug 17, 2026
0c98e74
acc/fuzz: parse invariant YAML bases via acceptance yaml2json helper
radakam Aug 17, 2026
a7153f6
acc/fuzz: drop contrastive comment framing
radakam Aug 17, 2026
47b1347
acc/fuzz: put -buildvcs=false before yaml2json package path
radakam Aug 17, 2026
9f4f4fe
acc/fuzz: classify a failed deploy as a bug
radakam Aug 17, 2026
1c95fc3
acc/fuzz: skip migrate-incompatible bases
radakam Aug 17, 2026
ee7af95
acc/fuzz: de-duplicate the seed window and correct stale comments
radakam Aug 17, 2026
6e05be8
ci: re-trigger (GitHub Actions 429 flake)
radakam Aug 17, 2026
fb8d79a
Merge remote-tracking branch 'origin/main' into deco-25361-fuzz-creat…
radakam Aug 18, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
74 changes: 74 additions & 0 deletions .github/workflows/push.yml
Original file line number Diff line number Diff line change
Expand Up @@ -408,6 +408,77 @@ jobs:
run: |
go tool -modfile=tools/task/go.mod task test-sandbox

test-fuzz:
needs:
- cleanups

# Nightly drift-on exploration; PRs rely on the committed acceptance/bundle/fuzz test.
if: ${{ github.event_name == 'schedule' }}
name: "task test-fuzz"
runs-on:
group: databricks-protected-runner-group-large
labels: linux-ubuntu-latest-large

defaults:
run:
shell: bash

permissions:
id-token: write
contents: read

steps:
- name: Checkout repository and submodules
uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1

- name: Setup build environment
uses: ./.github/actions/setup-build-environment
with:
cache-key: test-fuzz

- name: Run tests
run: |
go tool -modfile=tools/task/go.mod task test-fuzz

- name: Summarize failure for triage
if: ${{ failure() }}
run: |
# Resolve once and hand it to the upload step: -keeptmp writes under os.TempDir().
fuzz_tmp_dir="${TMPDIR:-/tmp}/acceptance"
echo "FUZZ_TMP_DIR=$fuzz_tmp_dir" >> "$GITHUB_ENV"
{
echo "## Fuzz nightly failed"
echo
echo "Exact drift is on (\`FUZZ_CHECK_DRIFT=1\`); a red nightly is a finding to triage."
echo "Use the failing variant's \`LOG.repro\`, or:"
echo
echo '```'
echo 'ENVFILTER=FUZZ_TARGET=<target> FUZZ_SEED_START=<seed> FUZZ_SEED_COUNT=1 FUZZ_CHECK_DRIFT=1 ./task test-fuzz'
echo '```'
echo
echo "Run: ${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }}"
# Paste each failing variant's LOG.repro from the kept workdirs.
echo
while IFS= read -r repro; do
echo
echo "### \`${repro}\`"
echo
echo '```'
cat "$repro"
echo '```'
done < <(find "$fuzz_tmp_dir" -name LOG.repro 2>/dev/null | sort)
} | tee -a "$GITHUB_STEP_SUMMARY"

- name: Upload fuzz triage logs
if: ${{ failure() }}
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
with:
name: fuzz-triage-logs
# Same workdir root the summary step listed; path is not shell-expanded.
path: ${{ env.FUZZ_TMP_DIR }}/**/LOG.*
if-no-files-found: warn
retention-days: 14

# This job groups the result of all the above test jobs.
# It is a required check, so it blocks auto-merge and the merge queue.
#
Expand All @@ -417,13 +488,16 @@ jobs:
#
# The step checks `contains(needs.*.result, 'failure')` to fail if any dependency failed.
# Reference: https://github.com/orgs/community/discussions/25970
#
# test-fuzz is schedule-only (skipped on PRs); listed so nightlies gate test-result.
test-result:
needs:
- test
- test-exp-aitools
- test-exp-ssh
- test-pipelines
- test-sandbox
- test-fuzz

if: ${{ always() }}
name: test-result
Expand Down
14 changes: 14 additions & 0 deletions Taskfile.yml
Original file line number Diff line number Diff line change
Expand Up @@ -733,6 +733,20 @@ tasks:
--packages ./acceptance/... \
-- -timeout=${LOCAL_TIMEOUT:-60m} -run "TestAccept/cmd/sandbox"

test-fuzz:
desc: Run invariant fuzz tests (mutated configs, direct engine)
# No sources fingerprint: the window depends on FUZZ_* env vars Task can't see.
cmds:
- |
# Ceiling; run_fuzz.py stops at FUZZ_TIME_BUDGET.
export FUZZ_SEED_COUNT="${FUZZ_SEED_COUNT:-10000}"
# Day-of-epoch start keeps consecutive nightly windows disjoint.
export FUZZ_SEED_START="${FUZZ_SEED_START:-$(( $(date -u +%s) / 86400 * FUZZ_SEED_COUNT ))}"
export FUZZ_CHECK_DRIFT="${FUZZ_CHECK_DRIFT:-1}"
export FUZZ_TIME_BUDGET="${FUZZ_TIME_BUDGET:-900}"
# go test (not gotestsum): -keeptmp must follow the package list.
go test ./acceptance -count=1 -keeptmp -timeout=${LOCAL_TIMEOUT:-90m} -run "TestAccept/bundle/fuzz"

# --- Integration tests ---

integration:
Expand Down
23 changes: 23 additions & 0 deletions acceptance/acceptance_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -346,6 +346,11 @@ func testAccept(t *testing.T, inprocessMode bool, singleTest string) int {
t.Setenv("CLI", execPath)
repls.SetPath(execPath, "[CLI]")

// Fuzzer mutator is stdlib-only Python; yaml2json parses bases the way the bundle does.
yaml2jsonPath := BuildYaml2Json(t, buildDir, runtime.GOOS, runtime.GOARCH)
t.Setenv("YAML2JSON", yaml2jsonPath)
repls.SetPath(yaml2jsonPath, "[YAML2JSON]")

if !inprocessMode {
cli293Path := DownloadCLI(t, buildDir, "0.293.0")
t.Setenv("CLI_293", cli293Path)
Expand Down Expand Up @@ -1300,6 +1305,24 @@ func BuildCLI(t *testing.T, buildDir, coverDir, osName, arch string) string {
return execPath
}

// BuildYaml2Json builds the acceptance-only yaml2json helper and returns its path.
func BuildYaml2Json(t *testing.T, buildDir, osName, arch string) string {
execPath := filepath.Join(buildDir, "yaml2json")
if osName == "windows" {
execPath += ".exe"
}

args := []string{"go", "build", "-o", execPath}
if osName == "windows" {
// Same as BuildCLI: "error obtaining VCS status: exit status 128" without this.
args = append(args, "-buildvcs=false")
}
args = append(args, "./acceptance/cmd/yaml2json")

RunCommand(t, args, "..", []string{"GOOS=" + osName, "GOARCH=" + arch})
return execPath
}

// CreateReleaseArtifacts builds release artifacts for the given OS using amd64 and arm64 architectures,
// archives them into zip files, and returns the directory containing the release artifacts.
func CreateReleaseArtifacts(t *testing.T, cwd, coverDir, osName string) string {
Expand Down
Loading
Loading