Two linked routing/config fixes (tracked in our ledger as hk-es8.2; captain/crew observed).
1. Per-bead .dot-FILE selection by label
Extend tier-1 label parsing in internal/daemon/moderesolve.go (the workflowLabelPrefix parse + loop) to recognize a workflow-ref:<path> label. resolveWorkflowMode must return a ref (signature change + caller workloop.go:~2059 + dot-path consumer workloop.go:~2526-2532). Add a conflict event when workflow-ref: is set without workflow:dot. ~3 call-sites, additive — a bead with neither label behaves exactly as today.
2. Per-workflow no-progress-guard control
The no-progress guard at internal/daemon/dot_cascade.go:~401 is HARDCODED (reads no node/graph/config attribute). Make it consult a per-workflow attribute so a workflow can cap or disable it (the project-level no_progress_guard="capped:1" graph attr is the current blunt workaround).
Evidence
Dogfood run showed dot tool node scenario_tests failed — the doc-workflow.dot has no scenario_tests node, so a doc bead routed through the CODE workflow.dot (the per-bead routing gap).
NOTE: distinct from the ~30-min stalewatch implementer reaper — that is a separate timeout (stale_after= label / beadStaleAfter), not this guard.
Two linked routing/config fixes (tracked in our ledger as hk-es8.2; captain/crew observed).
1. Per-bead .dot-FILE selection by label
Extend tier-1 label parsing in
internal/daemon/moderesolve.go(theworkflowLabelPrefixparse + loop) to recognize aworkflow-ref:<path>label.resolveWorkflowModemust return a ref (signature change + callerworkloop.go:~2059+ dot-path consumerworkloop.go:~2526-2532). Add a conflict event whenworkflow-ref:is set withoutworkflow:dot. ~3 call-sites, additive — a bead with neither label behaves exactly as today.2. Per-workflow no-progress-guard control
The no-progress guard at
internal/daemon/dot_cascade.go:~401is HARDCODED (reads no node/graph/config attribute). Make it consult a per-workflow attribute so a workflow can cap or disable it (the project-levelno_progress_guard="capped:1"graph attr is the current blunt workaround).Evidence
Dogfood run showed
dot tool node scenario_tests failed— the doc-workflow.dot has noscenario_testsnode, so a doc bead routed through the CODEworkflow.dot(the per-bead routing gap).NOTE: distinct from the ~30-min stalewatch implementer reaper — that is a separate timeout (
stale_after=label /beadStaleAfter), not this guard.