Watch
2
Externalize infra topology hardcoded in ward: hosts, SSM, registry, telemetry (audit bucket C) #395
Closed
opened 2026-07-01 04:26:13 +00:00 by coilysiren
·
3 comments
No Branch/Tag specified
main
release
docs/readme-agents-surface
fix/pr-repair-verb-lookup
aos/claude/aw85-docs-bands
aos/claude/aw85-declare-band
aos/claude/bk79-autonomy-label-scope
fix/gofmt-runner
chore/umbra-rename
aos/claude/mg96-fm
claude/agents-temp-clone-note
aos/claude/qa57
remove-format-exec-gate-refusal
fix/ward-1649-ci-fixture
fix/detached-ci-exec
issue-1626-generic-agent-broker
issue-1177
issue-1160
issue-1501
ward-salvage/ward-12486bc7
ward-salvage/ward-babfa2ba
ward-salvage/ward-a832df03
ward-salvage/ward-85c795b2
ward-salvage/ward-b87f8859
issue-1484
ward-salvage/ward-86b72dcf
ward-salvage/ward-b7b26d1d
recovery/2026-07-28-triaged-branch-archive
recovery/2026-07-27-local-work
issue-1584
issue-1571
issue-1524
ward-salvage/ward-3800c2d1
ward-salvage/ward-70175da3
ward-salvage/ward-bcbfef78
issue-1298
issue-737-signoz-deferred
ward-salvage/ward-c6aa5da9
ward-salvage/ward-94dd7346
ward-salvage/ward-58aa3fe3
ward-salvage/ward-ff6c509f
ward-salvage/ward-e80f0460
ward-salvage/ward-3e2e4760
ward-salvage/ward-649addd7
ward-salvage/ward-890e4d29
ward-salvage/ward-645b750b
ward-salvage/ward-bf851a72
ward-salvage/ward-98c8652f
ward-salvage/ward-bb10b620
ward-salvage/ward-1ee9be1c
ward-salvage/ward-d18595f6
ward-salvage/ward-5f914692
ward-salvage/ward-6ca05cbd
ward-salvage/ward-14f676cf
ward-salvage/ward-de811c20
ward-salvage/ward-eba3e824
ward-salvage/ward-16eb4ad0
ward-salvage/ward-c58e9c43
ward-salvage/ward-7487270b
v0.890.0
v0.889.0
v0.888.0
v0.887.0
v0.886.0
v0.885.0
v0.884.0
v0.883.0
v0.882.0
v0.881.0
v0.880.0
v0.879.0
v0.878.0
v0.877.0
v0.876.0
v0.875.0
v0.874.0
v0.873.0
v0.872.0
v0.871.0
v0.870.0
v0.869.0
v0.868.0
v0.867.0
v0.866.0
v0.865.0
v0.864.0
v0.863.0
v0.862.0
v0.861.0
v0.860.0
v0.859.0
v0.858.0
v0.857.0
v0.856.0
v0.855.0
v0.854.0
v0.853.0
v0.852.0
v0.851.0
v0.850.0
v0.849.0
v0.848.0
v0.847.0
v0.846.0
v0.845.0
v0.844.0
v0.843.0
v0.842.0
v0.841.0
v0.840.0
v0.839.0
v0.838.0
v0.837.0
v0.836.0
v0.835.0
v0.834.0
v0.833.0
v0.832.0
v0.830.0
v0.831.0
v0.829.0
v0.828.0
v0.827.0
v0.826.0
v0.825.0
v0.824.0
v0.823.0
v0.822.0
v0.821.0
v0.820.0
v0.819.0
v0.818.0
v0.817.0
v0.816.0
v0.815.0
v0.814.0
v0.813.0
v0.812.0
v0.811.0
v0.810.0
v0.809.0
v0.808.0
v0.807.0
v0.806.0
v0.805.0
v0.804.0
v0.803.0
v0.802.0
v0.801.0
v0.800.0
v0.799.0
v0.798.0
v0.797.0
v0.796.0
v0.795.0
v0.794.0
v0.793.0
v0.792.0
v0.791.0
v0.790.0
v0.789.0
v0.788.0
v0.787.0
v0.786.0
v0.785.0
v0.784.0
v0.783.0
v0.782.0
v0.781.0
v0.780.0
v0.779.0
v0.778.0
v0.777.0
v0.775.0-tmp
v0.776.0
v0.775.0
v0.774.0
v0.773.0
v0.772.0
v0.771.0
v0.770.0
v0.769.0
v0.768.0
v0.767.0
v0.766.0
v0.765.0
v0.764.0
v0.763.0
v0.762.0
v0.761.0
v0.760.0
v0.759.0
v0.758.0
v0.757.0
v0.756.0
v0.755.0
v0.754.0
v0.753.0
v0.752.0
v0.751.0
v0.750.0
v0.749.0
v0.748.0
v0.747.0
v0.746.0
v0.745.0
v0.744.0
v0.743.0
v0.742.0
v0.741.0
v0.740.0
v0.739.0
v0.738.0
v0.737.0
v0.736.0
v0.735.0
v0.734.0
v0.733.0
v0.732.0
v0.731.0
v0.730.0
v0.729.0
v0.728.0
v0.727.0
v0.726.0
v0.725.0
v0.724.0
v0.723.0
v0.722.0
v0.721.0
v0.720.0
v0.719.0
v0.718.0
v0.717.0
v0.716.0
v0.715.0
v0.714.0
v0.713.0
v0.712.0
v0.711.0
v0.710.0
v0.709.0
v0.708.0
v0.707.0
v0.706.0
v0.705.0
v0.704.0
v0.703.0
v0.702.0
v0.701.0
v0.700.0
v0.699.0
v0.698.0
v0.697.0
v0.696.0
v0.695.0
v0.694.0
v0.693.0
v0.692.0
v0.691.0
v0.690.0
v0.689.0
v0.688.0
v0.687.0
v0.686.0
v0.685.0
v0.684.0
v0.683.0
v0.682.0
v0.681.0
v0.680.0
v0.679.0
v0.678.0
v0.677.0
v0.676.0
v0.675.0
v0.674.0
v0.673.0
v0.672.0
v0.671.0
v0.670.0
v0.669.0
v0.668.0
v0.667.0
v0.666.0
v0.665.0
v0.664.0
v0.663.0
v0.662.0
v0.661.0
v0.660.0
v0.659.0
v0.658.0
v0.657.0
v0.656.0
v0.655.0
v0.654.0
v0.653.0
v0.652.0
v0.651.0
v0.650.0
v0.649.0
v0.648.0
v0.647.0
v0.646.0
v0.645.0
v0.644.0
v0.643.0
v0.642.0
v0.641.0
v0.640.0
v0.639.0
v0.638.0
v0.637.0
v0.636.0
v0.635.0
v0.634.0
v0.633.0
v0.632.0
v0.631.0
v0.630.0
v0.629.0
v0.628.0
v0.627.0
v0.626.0
v0.625.0
v0.624.0
v0.623.0
v0.622.0
v0.621.0
v0.620.0
v0.619.0
v0.618.0
v0.617.0
v0.616.0
v0.615.0
v0.614.0
v0.613.0
v0.612.0
v0.611.0
v0.610.0
v0.609.0
v0.608.0
v0.607.0
v0.606.0
v0.605.0
v0.604.0
v0.603.0
v0.602.0
v0.601.0
v0.600.0
v0.599.0
v0.598.0
v0.597.0
v0.596.0
v0.595.0
v0.594.0
v0.593.0
v0.592.0
v0.591.0
v0.590.0
v0.589.0
v0.588.0
v0.587.0
v0.586.0
v0.585.0
v0.584.0
v0.583.0
v0.582.0
v0.581.0
v0.580.0
v0.579.0
v0.578.0
v0.577.0
v0.576.0
v0.575.0
v0.574.0
v0.573.0
v0.572.0
v0.571.0
v0.570.0
v0.569.0
v0.568.0
v0.567.0
v0.566.0
v0.565.0
v0.564.0
v0.563.0
v0.562.0
v0.561.0
v0.560.0
v0.559.0
v0.558.0
v0.557.0
v0.556.0
v0.555.0
v0.554.0
v0.553.0
v0.552.0
v0.551.0
v0.550.0
v0.549.0
v0.548.0
v0.547.0
v0.546.0
v0.545.0
v0.544.0
v0.543.0
v0.542.0
v0.541.0
v0.540.0
v0.539.0
v0.538.0
v0.537.0
v0.536.0
v0.535.0
v0.534.0
v0.533.0
v0.532.0
v0.531.0
v0.530.0
v0.529.0
v0.528.0
v0.527.0
v0.526.0
v0.525.0
v0.524.0
v0.523.0
v0.522.0
v0.521.0
v0.520.0
v0.519.0
v0.518.0
v0.517.0
v0.516.0
v0.515.0
v0.514.0
v0.513.0
v0.512.0
v0.511.0
v0.510.0
v0.509.0
v0.508.0
v0.507.0
v0.506.0
v0.505.0
v0.504.0
v0.503.0
v0.502.0
v0.501.0
v0.500.0
v0.499.0
v0.498.0
v0.497.0
v0.496.0
v0.495.0
v0.494.0
v0.493.0
v0.492.0
v0.491.0
v0.490.0
v0.489.0
v0.488.0
v0.487.0
v0.486.0
v0.485.0
v0.484.0
v0.483.0
v0.482.0
v0.481.0
v0.480.0
v0.479.0
v0.478.0
v0.477.0
v0.476.0
v0.475.0
v0.474.0
v0.473.0
v0.472.0
v0.471.0
v0.470.0
v0.469.0
v0.468.0
v0.467.0
v0.466.0
v0.465.0
v0.464.0
v0.463.0
v0.462.0
v0.461.0
v0.460.0
v0.459.0
v0.458.0
v0.457.0
v0.456.0
v0.455.0
v0.454.0
v0.453.0
v0.452.0
v0.451.0
v0.450.0
v0.449.0
v0.448.0
v0.447.0
v0.446.0
v0.445.0
v0.444.0
v0.443.0
v0.442.0
v0.441.0
v0.440.0
v0.439.0
v0.438.0
v0.437.0
v0.436.0
v0.435.0
v0.434.0
v0.433.0
v0.432.0
v0.431.0
v0.430.0
v0.429.0
v0.428.0
v0.427.0
v0.426.0
v0.425.0
v0.424.0
v0.423.0
v0.422.0
v0.421.0
v0.420.0
v0.419.0
v0.418.0
v0.417.0
v0.416.0
v0.415.0
v0.414.0
v0.413.0
v0.412.0
v0.411.0
v0.410.0
v0.409.0
v0.408.0
v0.407.0
v0.406.0
v0.405.0
v0.404.0
v0.403.0
v0.402.0
v0.401.0
v0.400.0
v0.399.0
v0.398.0
v0.397.0
v0.396.0
v0.395.0
v0.394.0
v0.393.0
v0.392.0
v0.391.0
v0.390.0
v0.389.0
v0.388.0
v0.387.0
v0.386.0
v0.385.0
v0.384.0
v0.383.0
v0.382.0
v0.381.0
v0.380.0
v0.379.0
v0.378.0
v0.377.0
v0.376.0
v0.375.0
v0.374.0
v0.373.0
v0.372.0
v0.371.0
v0.370.0
v0.369.0
v0.368.0
v0.367.0
v0.366.0
v0.365.0
v0.364.0
v0.363.0
v0.362.0
v0.361.0
v0.360.0
v0.359.0
v0.358.0
v0.357.0
v0.356.0
v0.355.0
v0.354.0
v0.353.0
v0.352.0
v0.351.0
v0.350.0
v0.349.0
v0.348.0
v0.347.0
v0.346.0
v0.345.0
v0.344.0
v0.343.0
v0.342.0
v0.341.0
v0.340.0
v0.339.0
v0.338.0
v0.337.0
v0.336.0
v0.335.0
v0.334.0
v0.333.0
v0.332.0
v0.331.0
v0.330.0
v0.329.0
v0.328.0
v0.327.0
v0.326.0
v0.325.0
v0.324.0
v0.323.0
v0.322.0
v0.321.0
v0.320.0
v0.319.0
v0.318.0
v0.317.0
v0.316.0
v0.315.0
v0.314.0
v0.313.0
v0.312.0
v0.311.0
v0.310.0
v0.309.0
v0.308.0
v0.307.0
v0.306.0
v0.305.0
v0.304.0
v0.303.0
v0.302.0
v0.301.0
v0.300.0
v0.299.0
v0.298.0
v0.297.0
v0.296.0
v0.295.0
v0.294.0
v0.293.0
v0.292.0
v0.291.0
v0.290.0
v0.289.0
v0.288.0
v0.287.0
v0.286.0
v0.285.0
v0.284.0
v0.283.0
v0.282.0
v0.281.0
v0.280.0
v0.279.0
v0.278.0
v0.277.0
v0.276.0
v0.275.0
v0.274.0
v0.273.0
v0.272.0
v0.271.0
v0.270.0
v0.269.0
v0.268.0
v0.267.0
v0.266.0
v0.265.0
v0.264.0
v0.263.0
v0.262.0
v0.261.0
v0.260.0
v0.259.0
v0.258.0
v0.257.0
v0.256.0
v0.255.0
v0.254.0
v0.253.0
v0.252.0
v0.251.0
v0.250.0
v0.249.0
v0.248.0
v0.247.0
v0.246.0
v0.245.0
v0.244.0
v0.243.0
v0.242.0
v0.241.0
v0.240.0
v0.239.0
v0.238.0
v0.237.0
v0.236.0
v0.235.0
v0.234.0
v0.233.0
v0.232.0
v0.231.0
v0.230.0
v0.229.0
v0.228.0
v0.227.0
v0.226.0
v0.225.0
v0.224.0
v0.223.0
v0.222.0
v0.221.0
v0.220.0
v0.219.0
v0.218.0
v0.217.0
v0.216.0
v0.215.0
v0.214.0
v0.213.0
v0.212.0
v0.211.0
v0.210.0
v0.209.0
v0.208.0
v0.207.0
v0.206.0
v0.205.0
v0.204.0
v0.203.0
v0.202.0
v0.201.0
v0.200.0
v0.199.0
v0.198.0
v0.197.0
v0.196.0
v0.195.0
v0.194.0
v0.193.0
v0.192.0
v0.191.0
v0.190.0
v0.189.0
v0.188.0
v0.187.0
v0.186.0
v0.185.0
v0.184.0
v0.183.0
v0.182.0
v0.181.0
v0.180.0
v0.179.0
v0.178.0
v0.177.0
v0.176.0
v0.175.0
v0.174.0
v0.173.0
v0.172.0
v0.171.0
v0.170.0
v0.169.0
v0.168.0
v0.167.0
v0.166.0
v0.165.0
v0.164.0
v0.163.0
v0.162.0
v0.161.0
v0.160.0
v0.159.0
v0.158.0
v0.157.0
v0.156.0
v0.155.0
v0.154.0
v0.153.0
v0.152.0
v0.151.0
v0.150.0
v0.149.0
v0.148.0
v0.147.0
v0.146.0
v0.145.0
v0.144.0
v0.143.0
v0.142.0
v0.141.0
v0.140.0
v0.139.0
v0.138.0
v0.137.0
v0.136.0
v0.135.0
v0.134.0
v0.133.0
v0.132.0
v0.131.0
v0.130.0
v0.129.0
v0.128.0
v0.127.0
v0.126.0
v0.125.0
v0.124.0
v0.123.0
v0.122.0
v0.121.0
v0.120.0
v0.119.0
v0.118.0
v0.117.0
v0.116.0
v0.115.0
v0.114.0
v0.113.0
v0.112.0
v0.111.0
v0.110.0
v0.109.0
v0.108.0
v0.107.0
v0.106.0
v0.105.0
v0.104.0
v0.103.0
v0.102.0
v0.101.0
v0.100.0
v0.99.0
v0.98.0
v0.97.0
v0.96.0
v0.95.0
v0.94.0
v0.93.0
v0.92.0
v0.91.0
v0.90.0
v0.89.0
v0.88.0
v0.87.0
v0.86.0
v0.85.0
v0.84.0
v0.83.0
v0.82.0
v0.81.0
v0.80.0
v0.79.0
v0.78.0
v0.77.0
v0.76.0
v0.75.0
v0.74.0
v0.73.0
v0.72.0
v0.71.0
v0.70.0
v0.69.0
v0.68.0
v0.67.0
v0.66.0
v0.65.0
v0.64.0
v0.63.0
v0.62.0
v0.61.0
v0.60.0
v0.59.0
v0.58.0
v0.57.0
v0.56.0
v0.55.0
v0.54.0
v0.53.0
v0.52.0
v0.51.0
v0.50.0
v0.49.0
v0.48.0
v0.47.0
v0.46.0
v0.45.0
v0.44.0
v0.43.0
v0.42.0
v0.41.0
v0.40.0
v0.39.0
v0.38.0
v0.37.0
v0.36.0
v0.35.0
v0.34.0
v0.33.0
v0.32.0
v0.31.0
v0.30.0
v0.29.0
v0.28.0
v0.27.0
v0.26.0
v0.25.0
v0.24.0
v0.23.0
v0.22.0
v0.21.0
v0.20.0
v0.19.0
v0.18.0
v0.17.0
v0.16.0
v0.15.0
v0.14.0
v0.13.0
v0.12.0
v0.11.0
v0.10.0
v0.9.0
v0.8.0
v0.7.0
v0.6.0
v0.5.8
v0.5.7
v0.5.6
v0.5.5
v0.5.4
v0.5.3
v0.5.2
v0.5.1
v0.5.0
v0.4.0
v0.3.0
v0.2.2
v0.2.1
v0.2.0
v0.1.3
v0.1.2
v0.1.1
v0.1.0
v0.0.18
v0.0.17
v0.0.16
v0.0.15
v0.0.14
v0.0.13
v0.0.12
v0.0.11
v0.0.10
v0.0.9
v0.0.8
v0.0.7
v0.0.6
v0.0.5
v0.0.4
v0.0.3
v0.0.2
v0.0.1
Labels
Clear labels
burndown-2026-06
Backlog burndown June 2026
pressure-test
Cold-read release pressure-test findings and coordination
sunday-sprint
Burn-down by Sunday 2026-06-07
autonomy
async-consult
A human needs to consult on the issue to upgrade it to headless
autonomy
epic
This issue has many units of sub work - its size makes it meaningfully exclusive with other autonomy types
autonomy
headless
The agent can perform the work on its own
autonomy
live-collab
The agent and the human need to work together in realtime
coherence-core
Core review set for the warded control plane coherence milestone. These issues form the release spine; adjacent milestone issues are stretch or supporting work.
priority
P0
priority tier
priority
P1
priority tier
priority
P2
priority tier
priority
P3
priority tier
priority
P4
priority tier
qa-fixture
Disposable issue admitted to the bounded Ward QA verification lane.
role/advocate
requires work from the Developer Advocate seat
role/director
requires work from the Portfolio Director seat
role/exec
requires work from the exec role
role/frontend
requires work from the Frontend Engineer seat
role/gamedev
requires work from the Game Developer seat
role/human
requires a person, and specifically not an agent seat
role/platform
requires work from the Platform Engineer seat
role/qa
requires work from the QA role
role/science
requires work from the Applied Scientist seat
role/sysadmin
requires work from the Systems Administrator seat
state
ambient
ambient and ephemeral work, held as a maintained document rather than a queue
No labels
burndown-2026-06
pressure-test
sunday-sprint
autonomy
async-consult
autonomy
epic
autonomy
headless
autonomy
live-collab
coherence-core
priority
P0
priority
P1
priority
P2
priority
P3
priority
P4
qa-fixture
role/advocate
role/director
role/exec
role/frontend
role/gamedev
role/human
role/platform
role/qa
role/science
role/sysadmin
state
ambient
Milestone
Clear milestone
No items
No milestone
Projects
Clear projects
No items
No project
Assignees
Clear assignees
No assignees
2 participants
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".
No due date set.
Dependencies
No dependencies set
Reference
coilyco-flight-deck/ward#395
Loading…
Reference in a new issue
No description provided.
Delete branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Bucket C of the dependency-direction audit (agentic-os#308). ward hardcodes infrastructure topology (hosts, ports, SSM paths, registry, telemetry sink) as Go literals. These are infra config, NOT agent config - they do not belong in the aos agents.yaml, they belong resolved from the infrastructure repo, SSM, or env. Several already have an env-override seam that just needs to become the primary path.
Sites
ward-tailnet,mac-proxy,kai-tower-3026, port11434(cmd/ward/container_compute.go:93,97,109,112), tower ollama URLs (container_compute.go:116,cmd/ward/forward.go:26), ollama defaulthttp://localhost:11434/v1(cmd/ward/container_bootstrap.go:87).http://ser8:4318/v1/logs(cmd/ward/agent_telemetry.go:31).https://forgejo.coilysiren.me(cmd/ward/forgejo_ops.go:20), the registry half of the agent image (container_compute.go:16)./forgejo/api-token,/coilysiren/ollama/host(cmd/ward/container.go:43,47).Fix
ward resolves these from env / SSM / an infra-provided config rather than baking them. The edits land in ward (drop the literals, read the source), likely paired with an infrastructure-repo change to publish the values where ward reads them. Keep ward's URL/connection-construction CODE - only the topology DATA moves out.
Review note: cross-repo (ward + infrastructure). Confirm each host/path still has a live source before removing its literal fallback.
Parent: agentic-os#308. Filed from the read-only director surface (she/her).
🔎 ward agent advisor
ward agent advisor --driver clauderan a one-shot standard research pass on this question:ward#395 landing plan - map the cluster, sequence the drop
One-shot research from the read-only director surface (she/her). This is a plan to verify against a live checkout, not a carried change. Line numbers below are re-grounded against
mainat63184f8, since the issue's cites have drifted.Headline
Two of #395's four site-groups are already externalized by work that landed after the issue was filed, and the remaining two split cleanly into a spec-bundle half (subsumed by ward#453/#503) and a runtime-topology half (genuinely #395's own, ward-only). The
~/.ward/fleet.local.kdlreader (ward#413) is closed but narrow - it accepts only adirectorblock - so it is a host for these values only if Kai wants operator-local file override, which forces a cli-guardfleetconfigwidening first. Env override is the top of the precedence chain and needs neither cli-guard nor the infrastructure repo, so most of #395 is dispatchable now without either.Cluster map (verified state)
runner.goprimary-orgs,git_clone.goclone allowlist,agent_route.gointake). Sibling, security-adjacent, not a blocker for #395.cmd/ward/fleetlocal.go), butfleetconfig.ParseSource(.., OperatorLocal)rejects thefleetblock and accepts onlydirector(cli-guard/pkg/fleetconfig/fleetconfig.go:142-144). So model/endpoint/topology cannot be set there yet.examples/ward-specs/, assets-dir convention,refactor: source ward specs from sibling bundleatb7fae91).base-url forgejo.coilysiren.me/api/v1, the SSM token path, owner/attribution defaults).ward doctorhost-side Ollama-reachability probe for goose/opencode. This is the live successor to the closed docs-only ward#487 (the task's "in-container ollama probe" - note #487 itself is closed and was doc-symmetry, #499 is the real probe work). Adjacent, not a blocker.ser8:4318telemetry literal.agent_telemetry.gonow defaults tohttp://localhost:4318/v1/logswithWARD_AGENT_TELEMETRY_ENDPOINToverride. #395's telemetry-sink site is done.fleet.generated.kdlfile. Currentlyinternal/agents/goose/config.go:22-23hardcodesenvOr("WARD_GOOSE_PROVIDER","ollama")/envOr("WARD_GOOSE_MODEL","qwen3-coder:30b"), and theagent gooseblock in the manifest carries nomodel/endpoint/provider(unlikeopencode/codex, which are read viacontainer_bootstrap.go:131-135).#395 site-by-site, current state
ser8:4318- LANDED (ward#532). Literal gone. No work.http://localhost:11434/v1- LANDED into the manifest (ward#416). Nowopencode.Endpointfromfleet.generated.kdl, read viaenvOr("WARD_OLLAMA_URL", opencode.Endpoint)atcontainer_bootstrap.go:132. This is the pattern the rest should copy.forgejo.coilysiren.me/coilyco-flight-deck/agentic-os(container_compute.go:17) - PARTIAL.--image/--tagalready source fromWARD_AGENT_IMAGE/WARD_AGENT_TAG(agent.go:424-425). Env seam exists, embedded default remains. This value is spec-bundle-shaped -> belongs with #453/#503.https://forgejo.coilysiren.me(forgejo_ops.go:19) - CONTESTED. Its own comment says "Safe to hardcode." The ops guardfile already carriesbase-url forgejo.coilysiren.me/api/v1as deployment config (per #453), so this is double-sourced. Per #396's "ward legitimately knows itself," ward's own release/broker forge is arguably identity that stays. Fork for Kai (below)./forgejo/api-token(container.go:45),/coilysiren/ollama/host(container.go:49) - OPEN, no seam. Bare consts. Both have live sources confirmed:resolveForgejoTokenandresolveOllamaHostread them today, and the guardfile carries the token path (#453). These are spec-bundle/deployment-shaped.wardTailnetNetwork/ward-tailnet,proxyBoxName/mac-proxy,towerMagicDNSName/kai-tower-3026,towerOllamaPort/11434,towerOllamaURL(container_compute.go:98,102,114,117,121),forwardListenAddr/towerOllamaLocalURL(forward.go:19,26) - OPEN, no seam. Bare consts, no env override, not in the KDL bundle. These are runtime topology and are genuinely #395's own to externalize. Note: the code deliberately keeps these as MagicDNS names, not SSM ("a MagicDNS name, not a secret IP, rides plain"container_compute.go:551), which is consistent with the meaningful-name-hardcodes / opaque-value-to-SSM rule.The architectural fork: where do the values live?
The precedence chain (
docs/fleet-local.md) is env > operator-local > embedded manifest. That gives three candidate homes, and the ward#413 question turns entirely on which one Kai picks:WARD_*var the primary path, keep the embedded const as the last-resort layer. No cli-guard change, no infra change. Downside: the default still ships in the binary (relocated, not externalized) - exactly the critique #453/#503 make.~/.ward/fleet.local.kdl) - the only home that lets a different operator/host repoint ward without a rebuild. This is gated:fleetconfig'sOperatorLocalsubset must be widened to accept an infra/endpoint/topology block first. It rejects everything butdirectortoday (fleetconfig.go:142-144). ward#413's own boundary note anticipates exactly this: "Iffleetconfig'sOperatorLocalaccepted-node-set needs fleshing... file a cli-guard follow-up - do not fork the parser." So yes, ward#413 has to accept an infra block first, but only for the operator-local design branch - env and embedded-manifest branches do not need it.Dependency-ordered landing sequence
Step 0 - already done (no work). ward#532 (telemetry) and ward#416 (ollama endpoint into manifest). #395's site list is stale on both. The agent should open by re-scoping #395 to the four remaining site-groups.
Step 1 - Kai decides the home per half (blocking fork, human). Adjudicate: (a) spec-bundle-shaped values (registry image, forge base, SSM token path) -> converge with #453/#503; (b) runtime topology (tailnet/tower) -> env now, or operator-local later; (c) forge base -> keep-as-identity vs externalize. No code moves until this is set.
Step 2 - ward-only, dispatchable NOW: env-primary for the runtime-topology half. Add
WARD_*overrides for the tailnet/tower consts (container_compute.goblock,forward.go), make env the primary path, keep the embedded const as the fail-safe last layer (never fully removed - it is the only source, so a hard removal breaks the tower path). Source: env. Green check: a new test asserting aWARD_TOWER_OLLAMA/WARD_TAILNET_*override wins over the const, plus existingcontainer_computetests stay green.Step 3 - ward-only, dispatchable NOW: goose consolidation (Bucket A / agentic-os#306). Add
model/provider/endpointto theagent gooseblock in the hand-edited fleet source,make sync-fleet-assets, and projectWARD_GOOSE_MODEL/WARD_GOOSE_PROVIDERfrom the fleet incontainer_bootstrap.gothe wayopencode/codexalready are (:131-135), sogoose/config.goreads the manifest default instead of the bakedollama/qwen3-coder:30b. Source: embedded manifest, env override. Green check:fleetassets_test.godrift check passes and a bootstrap test shows goose model defaulting from the manifest.Step 4 - cross-repo GATE, only if operator-local design chosen (cli-guard first). Widen
fleetconfigOperatorLocalto accept an infra/endpoint block (mount/exec/permission tokens still rejected - the block names topology, not a grant). Then ward wires the operator-local layer into resolution for these sites (env > operator-local > embedded). Green check:fleetconfig_test.goaccepts the new block underOperatorLocaland still rejectsfleet; afleetlocaltest shows an operator-local endpoint overriding the embedded default.Step 5 - coordinate with ward#503 for the spec-bundle half. Registry image, forge base, and the SSM token path externalize as part of #503's bundle flip, not as an independent #395 edit (else two runs fight over the same
fleetassets/guardfile). If #503 lands first, #395 authors these in the aos bundle; if #395 moves first, they author in ward's manifest and migrate with #453. Green check:TestExampleBundleHasNoCoilycoValues(already incmd/ward) extends to cover these values.Dispatchable-now vs gated
Two forks Kai must call
fleetconfigwidening first. Recommendation: land the env seam now (Step 2), file the operator-local widening as a follow-up only if a second host actually needs it.forgejo_ops.goconst as ward's issue-URL rendering identity, and scope #395 down to the runtime topology + goose consolidation.Correction to the issue's framing
The review note says "cross-repo (ward + infrastructure)" and "likely paired with an infrastructure-repo change to publish the values." Grounded against the code, the infrastructure repo is not on the critical path: every host/path in #395 already has a live source (SSM params exist, tower resolves via MagicDNS, the ollama endpoint is in the manifest), so ward only needs to read from those sources instead of baking literals. The genuine cross-repo dependency is cli-guard (Step 4, conditional) and intra-repo coordination with ward#453/#503, not infrastructure.
Plan to verify against a live checkout before carrying. Filed one-shot from the read-only director surface (she/her).
Researched and posted automatically by
ward agent advisor --driver claude(ward#179). This is one-shot research, not a carried change - verify before acting on it.— Claude (she/her), via
ward agent🔒 Reserved by
ward agent --driver claude— containerengineer-claude-ward-395on hostkais-macbook-pro-2.localis carrying this issue (reserved 2026-07-02T16:02:04Z). Concurrentward agentruns are blocked until it finishes or the reservation goes stale (2h0m0s TTL);--forceoverrides.— Claude (she/her), via
ward agentWARD-OUTCOME: done - tailnet + tower topology (network, proxy box, tower host/port) now resolve through WARD_* env seams with the old literals as fail-safe defaults, landed on main.
Honestly this one was less about the code and more about reading the room. The advisor landing-plan comment did the heavy lifting - it had already scoped #395 down from four site-groups to just the runtime-topology half, so I mostly followed that map instead of re-litigating what to externalize. Forge base, registry image, and SSM paths I left alone (they belong to ward#453/#503), and goose model to agentic-os#306, which matched the bucket split.
What actually fought back was the catalog pre-commit suite, not the Go. The docs are hand-tuned to a 4000-char cap and agent-ts-sidecar.md was already sitting at 3993/4000, so my override section had nowhere to land inline. I split it into a new docs/agent-tailnet-topology.md and added it to the ref-linter contributor-doc set. The 2-line comment cap also made me retrim comments a few times. The code change itself (a const block becoming env-resolved funcs, plus one propagation seam so the in-container forwarder follows a host override) was mechanical and well covered by the existing ts-sidecar/forward tests plus a new override test.
Fairly confident in the result: it is purely additive, every value keeps its literal fallback, and build/vet/test/pre-commit are all green. The one rough edge worth a follow-up: the bash entrypoint still carries a couple of literal localhost:11434 spots on the goose/local path, so the port override is Go-coherent but a port change would not reach those bash lines. Unlikely to bite (11434 is ollama's fixed port), but worth noting if anyone ever genuinely repoints it.