Summary
Factory.#issueSource() currently probes ensureSubRoot('/linear/issues') when config.issueSource is unset and resolves the source as linear whenever that mount happens to be ready. This is a latent routing defect and contradicts the operating contract: an unset source must refuse to route, not assume Linear.
Current behavior
- The presence of a
/linear/issues mount silently selects Linear, regardless of the intended issue surface.
#resolvedIssueSource memoizes that probe result for the process lifetime, so a transient/startup mount state pins the wrong surface until Factory is restarted.
- Logging is asymmetric and backwards for diagnosis: Factory logs when it falls back to GitHub, but says nothing when it selects Linear. The dangerous, unintended outcome is therefore the silent one.
The operating manual explicitly says that when the active contract leaves issueSource unset Factory must refuse to route rather than assume Linear, and calls out that “assuming Linear is exactly the defect this replaced.”
Production status
This is not currently firing in production. The deployed factory-cloud config template explicitly sets issueSource: "github", so this probe is bypassed. This issue is intentionally framed as a latent defect, not a diagnosis of the current production incident. It will affect the first profile shipped without the field.
Expected behavior
When issueSource is unset, Factory should fail closed/refuse routing with a clear operator-facing error. It should not infer a provider from whichever mount happens to answer during startup. Any eventual fix should also remove lifetime pinning of an accidental probe result and make source resolution logging symmetric.
Scope
Track and fix separately from the silent-empty discovery observability work. Do not fold this behavior change into that PR.
Summary
Factory.#issueSource()currently probesensureSubRoot('/linear/issues')whenconfig.issueSourceis unset and resolves the source aslinearwhenever that mount happens to be ready. This is a latent routing defect and contradicts the operating contract: an unset source must refuse to route, not assume Linear.Current behavior
/linear/issuesmount silently selects Linear, regardless of the intended issue surface.#resolvedIssueSourcememoizes that probe result for the process lifetime, so a transient/startup mount state pins the wrong surface until Factory is restarted.The operating manual explicitly says that when the active contract leaves
issueSourceunset Factory must refuse to route rather than assume Linear, and calls out that “assuming Linear is exactly the defect this replaced.”Production status
This is not currently firing in production. The deployed
factory-cloudconfig template explicitly setsissueSource: "github", so this probe is bypassed. This issue is intentionally framed as a latent defect, not a diagnosis of the current production incident. It will affect the first profile shipped without the field.Expected behavior
When
issueSourceis unset, Factory should fail closed/refuse routing with a clear operator-facing error. It should not infer a provider from whichever mount happens to answer during startup. Any eventual fix should also remove lifetime pinning of an accidental probe result and make source resolution logging symmetric.Scope
Track and fix separately from the silent-empty discovery observability work. Do not fold this behavior change into that PR.