Problem
compose.onchain.yml defines the on-chain orchestrator once, and each example pulls it in with extends. Two examples cannot: api-proxy and vllm need -liveRunnerConfig=/config/runners.json for their static runner, and extends replaces a command list rather than appending to it. Both therefore restate all sixteen flags verbatim, with only that one line added.
The result is three copies of the same command. A change to the shared file reaches three of the five examples and silently skips the other two.
This is not hypothetical: #50 raised -ticketEV from 1e9 to 1e10 so a metered session could pay without exceeding the signer's 100 ticket cap. api-proxy and vllm kept the old value, and vllm is metered, so it would have hit the same cap the moment its price rose above about 0.067 USD per hour. Caught by hand while reviewing, not by anything automatic.
Options
- A CI guard. Parse the restated
command blocks and assert they equal the shared one plus the known additions. Cheap, keeps the duplication honest, catches the next drift.
- Put the flag in the shared file.
-liveRunnerConfig would then need a config file present for every example, which the dynamic ones do not have.
- Generate the overlays. More machinery than five examples justify.
A CI guard looks like the right size. Whichever way it goes, the next example to copy one of these files (a static-runner whisper, say) inherits whatever is stale at the time.
Problem
compose.onchain.ymldefines the on-chain orchestrator once, and each example pulls it in withextends. Two examples cannot:api-proxyandvllmneed-liveRunnerConfig=/config/runners.jsonfor their static runner, andextendsreplaces acommandlist rather than appending to it. Both therefore restate all sixteen flags verbatim, with only that one line added.The result is three copies of the same command. A change to the shared file reaches three of the five examples and silently skips the other two.
This is not hypothetical: #50 raised
-ticketEVfrom1e9to1e10so a metered session could pay without exceeding the signer's 100 ticket cap.api-proxyandvllmkept the old value, andvllmis metered, so it would have hit the same cap the moment its price rose above about 0.067 USD per hour. Caught by hand while reviewing, not by anything automatic.Options
commandblocks and assert they equal the shared one plus the known additions. Cheap, keeps the duplication honest, catches the next drift.-liveRunnerConfigwould then need a config file present for every example, which the dynamic ones do not have.A CI guard looks like the right size. Whichever way it goes, the next example to copy one of these files (a static-runner whisper, say) inherits whatever is stale at the time.