You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
fix(config): fix 8 DX bugs found field-testing the --config/--profile precedence changes
A field-test pass against this branch's config-loading changes (multi-file --config
merging, profile precedence, config get/set) found 8 real, live-reproduced issues and
fixes them all, each with a failing test committed first:
- config set/delete/format silently edited only the FIRST --config file while config
get reported the fully-merged value -- a false-success bug whenever a later file also
set the same key. Now refuses ambiguous multi-file --config with a clear error
(pkg/config/config_edit.go: new ErrAmbiguousConfigFile/ResolveConfigOverride, shared
by cmd/config/operations.go and the duplicate in pkg/mcp/config/config.go).
- ATMOS_CONFIG/ATMOS_CONFIG_PATH with multiple comma-separated values worked for some
commands (via pkg/config's own os.Args/env fallback) but broke ~40 others reading
these flags through pkg/flags' Viper-based ParseGlobalFlags, which splits env-sourced
values on whitespace, not commas. Fixed once at that shared choke point by exporting
the existing --profile fix (parseViperProfilesFromEnv -> cfg.FixViperEnvStringSliceQuirk)
and applying it there too.
- profiles.base_path declared in a non-first --config file resolved against the FIRST
file's directory regardless of which file actually declared it, silently failing to
find profiles that exist. Added per-file directory tracking (mirroring the existing
base_path tracking in mergeFiles) threaded through to discoverProfileLocations.
- Vendor/workflow error messages (ErrEmptySources, ErrMissingVendorConfigDefinition,
ErrDuplicateComponents, ErrComponentNotDefined, ErrNoComponentsWithTags, and others)
still leaked absolute paths right next to the "Vendoring from" line already fixed in
the prior commit -- a half-fixed pattern. Wrapped 13 sites in displayPath(), plus
fixed a copy/paste bug in one workflow directory-read error that showed the raw
unresolved config value instead of the path actually searched.
- displayPath() itself was silently defeated whenever the working directory was reached
through a symlink (e.g. macOS's /tmp), because os.Getwd() preserves the logical $PWD
path while git-root-discovery-resolved config paths are physical. Fixed with a
two-attempt comparison (raw first, then both sides resolved via the directory, since
the target file often doesn't exist yet).
- --config-path always wins over --config regardless of CLI argument order (undocumented,
now documented, not code-changed -- effort didn't justify a fix for this ordering nuance).
- Documented the previously-undocumented ATMOS_CONFIG/ATMOS_CONFIG_PATH env vars and
fixed --config's flag-type description on config-set/delete/format.mdx (all three
incorrectly said "string" instead of "string slice").
Also updates the field-test skill to default to testing the current branch's diff
against its base branch when no explicit target is given, instead of asking.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Copy file name to clipboardExpand all lines: .claude/skills/field-test/SKILL.md
+22-5Lines changed: 22 additions & 5 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -1,7 +1,7 @@
1
1
---
2
2
name: field-test
3
-
description: "Hands-on manual DX test pass of a feature or CLI command: read the real implementation and tests, hypothesize plausible user misunderstandings and misuse automated tests don't cover, build durable fixtures, execute for real against real state, and report ranked findings. Investigation only — never fixes anything found. Invoke on explicit requests like 'field test X' / 'do a DX test pass on X' / 'find vibe-coded slop in X'."
4
-
argument-hint: "Feature or command to test, e.g. 'atmos vendor pull'"
3
+
description: "Hands-on manual DX test pass of a feature or CLI command: read the real implementation and tests, hypothesize plausible user misunderstandings and misuse automated tests don't cover, build durable fixtures, execute for real against real state, and report ranked findings. Investigation only — never fixes anything found. Defaults to testing whatever the current branch changed vs its base branch when no explicit target is given. Invoke on explicit requests like 'field test X' / 'do a DX test pass on X' / 'find vibe-coded slop in X' / 'field test this branch'."
4
+
argument-hint: "Feature or command to test, e.g. 'atmos vendor pull' (omit to default to this branch's change)"
5
5
metadata:
6
6
copyright: Copyright Cloud Posse, LLC 2026
7
7
version: "1.0.0"
@@ -10,8 +10,17 @@ metadata:
10
10
# Field Test
11
11
12
12
Hands-on, adversarial test pass of **`$ARGUMENTS`** (the feature/command named when this skill
13
-
was invoked, e.g. `atmos vendor pull`). If no target was given, ask which feature/command to test
14
-
before starting.
13
+
was invoked, e.g. `atmos vendor pull`).
14
+
15
+
**If no target was given, default to the change introduced on the current branch** rather than
16
+
asking. Determine the base branch (the upstream tracking branch via
17
+
`git rev-parse --abbrev-ref --symbolic-full-name @{u}`, falling back to `origin/main`/`main` if
18
+
no upstream is configured), then run `git diff <base>...HEAD --stat` (and the full diff for
19
+
context) to see what actually changed. Derive the test target from that diff — the CLI
20
+
command(s), flag(s), config option(s), or subsystem the changed files implement — and state
21
+
explicitly what you inferred and why before proceeding to Phase 1. Only fall back to asking the
22
+
user if the diff is empty (nothing to test) or spans multiple unrelated features with no coherent
23
+
single target (ask which one to focus on, don't silently pick one).
15
24
16
25
Goal: catch "vibe-coded slop" — behavior that looks fine in code review but breaks or misleads a
17
26
real user — not to re-run what automated tests already cover. Anticipate plausible user
@@ -27,10 +36,18 @@ The goal is a map of "documented or plausible usage" minus "already tested" = wh
27
36
verification. This phase is broad, read-only research — delegate it to `Agent subagent_type:
28
37
"Explore"` (1-3 agents in parallel, one per bullet below) rather than doing it all serially inline.
29
38
39
+
When defaulting to the current branch (no explicit target given), scope every bullet below to the
40
+
target inferred from the branch diff — don't research the whole surrounding subsystem when the
41
+
branch only touched one corner of it. If the branch's changed files span more than one command or
42
+
package, treat each as a separate target to cover in Phase 2-4, prioritized by how much of the
43
+
diff each accounts for.
44
+
30
45
-**Implementation** — the actual code, not just its docs or the skill describing it. Per this
31
46
repo's conventions, business logic lives in narrow `pkg/` packages, not `internal/exec/` (being
32
47
phased out) — check both `cmd/<command>/` (thin call site) and the `pkg/` package(s) it
33
-
delegates to for the real logic and error paths.
48
+
delegates to for the real logic and error paths. When defaulting from a branch diff, read the
49
+
diff itself first (not just the post-change files) — the diff shows what changed *from*,
50
+
which is exactly where a regression or half-finished edge case would show up.
34
51
-**Docs and skills** — every relevant page under `website/docs/cli/commands/`, the matching
35
52
`.claude/skills/atmos-*` skill(s) for the subsystem, and any README describing the feature. Note
36
53
anything phrased with confidence you haven't independently confirmed against the code — docs and
0 commit comments