AntFleet

Anatomy · 650efab1-0

Duplicated per-skill `model` overrides drift from the default and from each other

lowmaintainabilityclosed in d49ad28
repo 53606958·PR #3·reviewed 1 week ago·closed 1 week ago

The vulnerable code

aeon.yml:9-42

9 tick: { enabled: true, schedule: "0 * * * *" } # every hour UTC
10
11 # Proactive health check: skill failures, LP state, memory flags
12 heartbeat: { enabled: true, schedule: "0 8,14,20 * * *" } # 3× daily
13
14 # Monitor LP position and FeeLocker balance
15 lp-monitor: { enabled: true, schedule: "0 12 * * *" } # daily at noon UTC
16
17 # On-chain monitoring of agent wallet and FeeLocker
18 on-chain-monitor: { enabled: true, schedule: "0 6 * * *", model: "claude-sonnet-4-6" }
19
20 # Claim DIEM from FeeLocker, run accumulate-vs-build analysis, route earnings
21 claim-diem: { enabled: true, schedule: "0 */12 * * *", model: "claude-sonnet-4-6" } # every 12h UTC
22
23 # Track LP earnings per position per day — writes to memory/earnings.jsonl
24 track-earnings: { enabled: true, schedule: "55 23 * * *", model: "claude-sonnet-4-6" } # end of day UTC
25
26 # Launch a VVV-denominated token from memory/launch-queue.jsonl
27 launch-vvv-token: { enabled: false, schedule: "0 10 * * *", model: "claude-sonnet-4-6" }
28
29 # Stake accumulated VVV fees on Venice staking contract for sVVV (inference gate)
30 stake-vvv: { enabled: false, schedule: "0 9 * * 1", model: "claude-sonnet-4-6" } # weekly Monday
31
32 # Bootstrap Venice compute via two-tranche presale (VVV irrevocable + DIEM time-lock)
33 compute-presale: { enabled: false, schedule: "0 11 * * *", model: "claude-sonnet-4-6" }
34
35 # Disabled — re-enable when in build mode
36 token-report: { enabled: false, schedule: "30 12 * * *", model: "claude-sonnet-4-6" }
37 price-threshold-alert: { enabled: false, schedule: "*/30 * * * *", model: "claude-sonnet-4-6" }
38
39# Default model for skills without a per-skill override
40model: claude-sonnet-4-6
41
42# AI Gateway — route Claude Code through Venice (staked DIEM pays for inference)

The reasoning

Opus

Unverified Claude model identifier 'claude-sonnet-4-6' used across all skills

highbuild-releasemedium
  • aeon.yml:19-40
Every skill that pins a model uses the string 'claude-sonnet-4-6', and the top-level default is also 'claude-sonnet-4-6'. Anthropic's public model identifiers follow the pattern 'claude-sonnet-4-5-YYYYMMDD' / 'claude-sonnet-4-5' / 'claude-opus-4-1', and there is no released 'claude-sonnet-4-6' model. If the gateway (Venice) or the underlying Claude API rejects unknown model strings, every scheduled skill will fail at dispatch time, silently halting tick/heartbeat/claim-diem/etc. Because this string is repeated 8 times rather than centralised, a typo here propagates across the entire fleet. Either the identifier is wrong, or there is no single source of truth — both are bugs with concrete production impact.

Recommendation

Define the model once (top-level `model:` already exists as 'claude-sonnet-4-6') and remove per-skill overrides, OR replace with a verified identifier such as 'claude-sonnet-4-5' (or the dated variant). At minimum, validate the model id against the provider's catalog in CI before merging config changes.

GPT-5

Redundant per-skill model overrides duplicate the default model, increasing drift risk

lowmaintainabilityhigh
  • aeon.yml:39-40
  • aeon.yml:18
  • aeon.yml:21
  • aeon.yml:24
  • aeon.yml:27
  • aeon.yml:30
  • aeon.yml:33
  • aeon.yml:36
  • aeon.yml:37
A default model is defined globally, yet multiple skills redundantly specify an identical per-skill model. If the default changes later, these skills will silently remain pinned to the old value, causing config drift and inconsistent behavior.

Recommendation

Remove per-skill model entries that are identical to the default, or use a YAML anchor/alias to centralize the model version. Keep per-skill overrides only where they intentionally differ.

The agreement

Both frontier models flagged this within the same line range. AntFleet's unanimous gate fired — the finding posted on the PR. Closed in d49ad28.

The fix

9 tick: { enabled: true, schedule: "0 * * * *" } # every hour UTC
10
11 # Proactive health check: skill failures, LP state, memory flags
12 heartbeat: { enabled: true, schedule: "0 8,14,20 * * *" } # 3× daily
13
14 # Monitor LP position and FeeLocker balance
15 lp-monitor: { enabled: true, schedule: "0 12 * * *" } # daily at noon UTC
16
17 # On-chain monitoring of agent wallet and FeeLocker
18 on-chain-monitor: { enabled: true, schedule: "0 6 * * *", model: "claude-sonnet-4-6" }
19
20 # Claim DIEM from FeeLocker, run accumulate-vs-build analysis, route earnings
21 claim-diem: { enabled: true, schedule: "0 */12 * * *", model: "claude-sonnet-4-6" } # every 12h UTC
22
23 # Track LP earnings per position per day — writes to memory/earnings.jsonl
24 track-earnings: { enabled: true, schedule: "55 23 * * *", model: "claude-sonnet-4-6" } # end of day UTC
25
26 # Launch a VVV-denominated token from memory/launch-queue.jsonl
27 launch-vvv-token: { enabled: false, schedule: "0 10 * * *", model: "claude-sonnet-4-6" }
28
29 # Stake accumulated VVV fees on Venice staking contract for sVVV (inference gate)
30 stake-vvv: { enabled: false, schedule: "0 9 * * 1", model: "claude-sonnet-4-6" } # weekly Monday
31
32 # Bootstrap Venice compute via two-tranche presale (VVV irrevocable + DIEM time-lock)
33 compute-presale: { enabled: false, schedule: "0 11 * * *", model: "claude-sonnet-4-6" }
34
35 # Disabled — re-enable when in build mode
36 token-report: { enabled: false, schedule: "30 12 * * *", model: "claude-sonnet-4-6" }
37 price-threshold-alert: { enabled: false, schedule: "*/30 * * * *", model: "claude-sonnet-4-6" }
38
39# Default model for skills without a per-skill override
40model: claude-sonnet-4-6
41
42# AI Gateway — route Claude Code through Venice (staked DIEM pays for inference)

Closure

Closed 1 week ago

SHA: d49ad285ecca6f6aeb180756fcc9bd7c00be8347

View closure receipt on GitHub →

Tweet thread template

tweet 1 of 8172 / 280

Two frontier models reviewed PR #3 on 53606958. Both found this bug: low maintainability: Duplicated per-skill `model` overrides drift from the default and from each other

tweet 2 of 899 / 280

The vulnerable code (aeon.yml:9-42): (full snippet at https://www.antfleet.dev/anatomy/650efab1-0)

tweet 3 of 8280 / 280

What Opus saw: "Every skill that pins a model uses the string 'claude-sonnet-4-6', and the top-level default is also 'claude-sonnet-4-6'. Anthropic's public model identifiers follow the pattern 'claude-sonnet-4-5-YYYYMMDD' / 'claude-sonnet-4-5' / 'claude-opus-4-1', and there is…

tweet 4 of 8262 / 280

What GPT-5 saw: "A default model is defined globally, yet multiple skills redundantly specify an identical per-skill model. If the default changes later, these skills will silently remain pinned to the old value, causing config drift and inconsistent behavior."

tweet 5 of 897 / 280

Both flagged the same line range. AntFleet's unanimous gate fired — the finding posted on the PR.

tweet 6 of 893 / 280

The fix landed in commit d49ad28: (view diff at https://www.antfleet.dev/anatomy/650efab1-0)

tweet 7 of 881 / 280

AntFleet reviews every PR with two frontier models. Only unanimous findings post.

tweet 8 of 877 / 280

Full anatomy + reasoning + diffs: https://www.antfleet.dev/anatomy/650efab1-0

Paste into X composer one tweet at a time. X has no multi-tweet intent API.