--- name: community-triage description: GitHub issues, pull requests, bug reports, scope questions, and support threads. Use when handling community reports or PRs to separate supported OpenAI-compatible behavior from out-of-scope provider-specific requests, request missing evidence, route upstream, and close or escalate politely. --- # Community Triage Handle community issues and PRs with respect, evidence, and firm scope discipline. This skill exists to protect maintainer time, avoid speculative changes, and preserve the project's intended boundary. ## Project Boundary - Wyoming OpenAI is an OpenAI-compatible proxy/middleware. - Treat OpenAI-compatible request/response behavior as the primary contract. - Existing backend enum/autodetection exceptions are compatibility shims, not a license to support arbitrary provider-specific transports, routes, or schemas. - Do not expand scope to custom endpoints such as `/tts`, provider-specific `stream=true` semantics, or bespoke response formats unless the maintainer explicitly chooses to widen scope. ## Goals - Be helpful without overcommitting. - Separate local defects from upstream limitations and unsupported integrations. - Prefer minimal actionable next steps: fix locally, request reproduction details, route upstream, or close with clear reasoning. - Maintain a respectful tone even when issue quality is low. ## Default Posture - Assume good faith. - Do not mirror vague or incorrect technical framing. - Translate the report into the actual technical question the project can answer. - Use evidence from code, tests, docs, and upstream behavior before concluding. - Do not let conversation momentum expand the project's scope by accident. ## Triage Workflow 1. Classify the thread. 2. Identify the supported surface. 3. Gather evidence. 4. Decide ownership. 5. Respond with a clear outcome. ### 1. Classify the thread Choose the closest category: - bug/regression on a supported surface - feature request inside scope - feature request outside scope - support question or configuration issue - upstream compatibility issue - low-fidelity report with insufficient reproduction - community PR ### 2. Identify the supported surface Pin down the exact surface before deciding anything: - endpoint path - Wyoming event flow - CLI/config flag - backend compatibility path - testable request/response behavior Explicitly determine whether the report concerns an OpenAI-compatible path or instead depends on a custom provider API. ### 3. Gather evidence Use the repo and upstream references, not assumptions. - inspect the relevant implementation and tests in this repo - read linked upstream docs/issues/PRs, not just their titles or summaries - verify the exact route, request schema, and response transport involved - distinguish between "supports streaming somewhere" and "streams on the exact supported integration surface used here" ### 4. Decide ownership Assign the issue to one bucket: - local defect in this repo - upstream defect or limitation - out-of-scope custom integration request - uncertain because key evidence is still missing ### 5. Respond with a clear outcome Pick one outcome and be explicit: - implement/fix - ask for concrete reproduction details - route upstream - close politely with scope reasoning ## Evidence Standard Treat these as strong evidence: - code paths - tests - official docs - concrete reproductions - exact request/response behavior - linked upstream implementation details Treat these as weak evidence: - issue titles - second-hand descriptions - marketing claims - "OpenAI-compatible" labels without route-level confirmation - "supports streaming" claims without transport details Do not conclude a behavior is supported just because a provider advertises compatibility. Confirm the specific surface this project actually uses. ## Minimum Missing Details To Request When the report is ambiguous, ask for only what is necessary to decide ownership. Good examples: - exact endpoint path - sample request/response behavior - provider or server project link - version or commit - relevant logs - minimal reproduction steps Do not start by asking for everything. Ask for the smallest missing fact that would change the decision. ## Low-Fidelity Issues When a report is vague, technically confused, or incomplete: - extract the likely underlying question - ask at most a small number of precise follow-ups - request only the missing details needed to decide whether this repo owns the problem - avoid speculative fixes or speculative roadmap commitments If the issue remains unsupported by evidence after reasonable follow-up, close it politely rather than leaving it open indefinitely. ## Scope Guardrails - Do not add support for provider-specific custom endpoints when an OpenAI-compatible endpoint already exists but behaves differently. - Do not treat "it works in another server's `/tts` route" as evidence that this repo should adopt that route. - Do not add speculative compatibility code for transports that are not part of the supported contract. - Do not widen the compatibility layer beyond small, clearly bounded backend exceptions without explicit maintainer intent. - Do not add new provider-specific autodetection probes (custom `/health`, `/readyz`, `/test`, or similar routes) when explicit backend configuration or the OpenAI-compatible surface itself can identify the backend. A new provider-specific route is justifiable only when it fills a gap the OpenAI spec does not cover (for example voice listing); pure identity probes do not meet that bar. - Prefer "upstream should make their OpenAI-compatible surface behave correctly" over "this proxy should learn every custom dialect." ## Boundary Example If an upstream Chatterbox server streams on a custom `/tts` endpoint but buffers on its OpenAI-compatible `/v1/audio/speech` endpoint: - do not add `/tts` support here - do not reopen scope just because the custom route exists - explain that Wyoming OpenAI targets the OpenAI-compatible surface - route streaming complaints about `/v1/audio/speech` upstream unless there is evidence this repo mishandles a truly incremental OpenAI-compatible response ## Issue Decision Matrix ### Keep Open Or Fix Here Keep the issue open or fix it when: - there is evidence the failure occurs on a supported OpenAI-compatible surface used by this repo - the behavior regressed from prior repo behavior - a minimal fix exists without expanding scope - the report includes enough detail to reproduce or the code clearly shows a defect ### Ask For Details Ask for more detail when: - the failure might be in this repo, but one or two key facts are missing - the report mixes supported and unsupported surfaces and needs disambiguation - an upstream implementation claims compatibility but the actual route/response behavior is still unknown ### Route Upstream Route upstream when: - the failing behavior lives in another project's OpenAI-compatible server or provider - the linked implementation buffers where true streaming is expected - the only path that provides the requested capability is a custom upstream endpoint outside this repo's target contract ### Close Close when: - the request depends on a custom provider-specific API outside project scope - there is no evidence of a defect in this repo after reasonable triage - the issue asks for a nonexistent or irrelevant API surface - the request would materially expand scope or maintenance burden beyond the maintainer's intent ## PR Review Guidance Review community PRs primarily for: - scope fit - correctness - maintenance cost - tests on supported behavior - regression risk Be especially skeptical of PRs that: - add provider-specific routes or bespoke schemas - teach the proxy custom behavior for one server in a way that weakens the OpenAI-compatible boundary - include broad refactors alongside compatibility changes - add fallback code without evidence of a real supported use case Prefer minimal changes that keep the contract clear. If a PR changes supported behavior, ask for tests. If asked to review a PR, present findings first with file/line references. If the PR's main value is widening scope to cover a custom upstream dialect, recommend narrowing or closing the PR instead of merging it. ## Response Style - Thank the reporter or contributor for concrete links, repros, or code references. - Be direct and factual. - Avoid blame, sarcasm, or dismissal. - Avoid phrases like "you don't know what you're talking about" even if the original framing is wrong. Prefer phrasing such as: - "I do not currently see evidence that the limitation is in this project." - "This appears to be upstream of Wyoming OpenAI." - "That endpoint is outside the OpenAI-compatible surface this project targets." - "If you can show this failing on `/v1/audio/speech`, that would be worth revisiting." Avoid phrasing such as: - "Not my problem." - "Works for me." - speculative roadmap commitments - over-apologizing for enforcing scope ## Closure Pattern When closing, include all of the following: - what was checked - why the issue is out of scope or upstream - the specific supported surface this project targets - the condition under which the issue would become actionable here Template: > Thanks for the report and the additional reference. > > I checked the relevant code path and the linked implementation. Wyoming OpenAI already supports [supported behavior] on its OpenAI-compatible path, and I do not currently see evidence of a defect in this project. > > The behavior you are pointing to depends on [custom endpoint / upstream server behavior], which is outside the OpenAI-compatible surface this project targets. > > If there is evidence of the same problem on [exact supported surface], feel free to share reproduction details and it can be revisited. ## Upstream Escalation Pattern When routing upstream: - name the exact upstream repo, issue, or route - describe the boundary cleanly - do not volunteer to mirror custom APIs locally Template: > This looks like an upstream compatibility issue rather than a Wyoming OpenAI bug. > > The key question is whether [upstream project] behaves correctly on its OpenAI-compatible [route]. If that surface is buffered or otherwise diverges from OpenAI behavior, the fix belongs there rather than in this proxy. ## Re-entry Criteria Reopen or continue when: - a reporter provides a concrete reproduction on a supported OpenAI-compatible surface - a community PR narrows itself to supported behavior and includes tests - upstream changes make the supported surface behave differently and this repo needs a bounded compatibility adjustment ## Anti-Patterns - implementing custom provider transports to salvage one wrapper - keeping vague issues open indefinitely - conflating "streaming exists somewhere in the upstream project" with "the supported integration surface streams here" - adding fallback behavior for undocumented responses - treating backend enum exceptions as permission for general vendor lock-in - adding new provider-specific autodetection probes when explicit backend configuration would work. Provider-specific routes are acceptable only when they fill a gap the OpenAI spec lacks (for example voice/model listing) — not for pure identity probes. ## Maintainer Intent Distilled - Be kind to community contributors. - Keep the contract narrow. - Favor evidence over momentum. - Push upstream when the real defect lives upstream. - Close unsupported or low-fidelity issues cleanly so maintainers are not left carrying indefinite support debt.