docs(api): daily audit 2026-09-30 — alert detail_url into the rendered on-call spec, RUM issue-detail team_id semantics - #778
Open
flashduty[bot] wants to merge 1 commit into
Open
flashduty[bot] wants to merge 1 commit into
flashduty[bot] wants to merge 1 commit into
Conversation
…d on-call spec, RUM issue-detail team_id semantics Two changes, both derived from the source repos at origin/main. B. on-call AlertItem / AlertInfo gain `detail_url`. fc-event structs/alert.go:74-78 — `DetailUrl string `json:"detail_url,omitempty"``, filled at read time, empty when the deployment has no console base. The consolidated specs got the field on 2026-09-29 (4b9015a) but the per-module split files — the ones Mintlify renders — never did, so POST /alert/info documented no detail_url on the docs site. A. POST /rum/issue/info documents that `team_id` is the application's current team. fc-rum cmd/server/controller/issue/info.go:221 `item.TeamID = application.TeamID` (PR #230, merge a190844, 2026-09-29). Issue rows keep the team recorded at creation (logic/transfer.go:55), which is what list and export still report.
This branch has not been deployed
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
api-review daily audit — 2026-09-30
--mode generate --scope all --auto.Registry baseline:
fc-pgy@origin/main1ab03856; the public row set was compared against the previous round's baseline (api_test.go@4f3e98cb, 2026-09-29T08:18Z): 348Auth == "all"non-/event/push/rows on both sides — 0 added, 0 removed, 0 auth reclassifications. The registry churn in the window (a02a42ae,7bf0896d,7952c342,4d97318d, …) is entirely/event/push/*integration registration, which is out of public scope.Operations changed
No path was added or removed, so
docs.jsonand{en,zh}/openapi/api-catalog.mdxare deliberately untouched (the reconcile step only applies when the operation set changes). As a cross-check, the catalog's per-module and total counts still match the specs exactly: On-call 193, Monitors 23, RUM 41, AI SRE 53, Platform 28, total 338.1. on-call —
AlertItemandAlertInfogaindetail_url(2 files × 2 languages)Source:
fc-eventstructs/alert.go:74-78—POST /alert/inforeturns this struct. The consolidated specs received the property on 2026-09-29 (4b9015a4), but the per-module split files — the ones Mintlify actually renders — did not, so the docs site documented nodetail_urlfor that endpoint. The property is inserted afterimages, matching the Go struct order the split files preserve, with the description text copied verbatim from the consolidated file (EN and ZH).2. rum —
POST /rum/issue/inforeports the application's current teamfc-rum@origin/main,cmd/server/controller/issue/info.go:221(merged 2026-09-29 in PR #230,a190844):Everywhere else the value comes from the issue row (
logic/transfer.go:55IssueTableToItem→row.TeamID), soPOST /rum/issue/listandPOST /rum/issue/exportstill report the creation-time team. The sharedRumIssueItem.team_iddescription (“copied from the owning application'steam_idat issue creation”) remains accurate for those two operations, so it is left untouched; the divergence is stated as a one-bullet## Usage/## 使用说明section on the detail operation only.Committed internal drift found while reconciling (one acted on, two reported)
Comparing every schema and operation of each split file against the consolidated file at
HEADturned up three disagreements. Only the first is remediated here.AlertItem/AlertInfodetail_url— fixed above (split aligned up to the code, since the field exists infc-eventmain).DutyError.reason— present inopenapi.{en,zh}.jsonandmonitors.openapi.{en,zh}.json(added 2026-09-06 byd1c68d0e, PR docs(monit): define datasource diagnostic tools and host-only Agent APIs #353, documenting the releasedPOST /monit/datasource/tools/invokeerror contract), absent from the on-call / platform / rum / safari splits. Not touched.go-pkgsrv/error.go:177defines exactlycode+messageinorigin/main, and the skill's canonical envelope says “document exactlycodeandmessage— nothing else”, so adding it to the other splits would document an undocumented field on four modules; removing it would delete a contract that PR docs(monit): define datasource diagnostic tools and host-only Agent APIs #353 deliberately documented against monit-webapi, which is not on GitHub and therefore unverifiable here. It needs a human decision: either add the field to the envelope contract for every module, or drop it from the two files that carry it.WorkItemItem.assignees/agent_session_id/agent_session_venue,create/resetassignees,listassignee_type, plusWorkItemAssigneeand the 7 work-item examples) — present in the consolidated files only (added 2026-09-23 bya6db6044), absent from the on-call split. Not touched in either direction. The backing commit7eff20f30(feat(work-item): let AI SRE be an assignee) is not infc-eventmain —git branch -r --containslists onlyorigin/devandorigin/feat/work-item-ai-sre— andassignee_typenever existed in any commit of main. Applying the split-wins rule here would delete documentation for a feature that is still in development; the consolidated copy stays until the backend lands on main (or the docs author reverts it deliberately). No rendered-docs impact either way.Ruled out this round (window = 2026-09-29T08:18Z → now)
fc-event— 3 commits touched handler/struct dirs.98155f413fix(change): scope change_key uniqueness to the integrationchanges the Mongo index and the repeat-event filter in the engine (logic/change/change_event.go,model/change/change_event.go) — no/change/*request or response field, nobinding:tag, no enum.8354dba21is a Markdown-only change. No public-contract change.fc-eventd811d8f4f(PR #2626, merged 2026-09-29 16:28+05:00) — 36 files, of which onlylogic/change/change.go,structs/change.go,structs/severity.go(+ their tests) are outside the change-source engines and.claude/skills/*. It does move the public change-status vocabulary:structs.ChangeEvent.ChangeStatusgoes frombinding:"oneof=Planned Ready Processing Canceled Done"to... Done Failedandstructs.ChangeStatusFailed = "Failed"is added (commit762ec7043, carried into main by this merge), andIsChangeStatusTerminalnow treatsFailedas ending a change (end_timeset) — the stale-event guard from8318d3e9fis behaviour-only. Already documented — no drift:ChangeItem.change_statusandChangeEventItem.change_statusin both the on-call split and the consolidated files already carry["Planned","Ready","Processing","Canceled","Done","Failed"](same order as theoneof) with the EN/ZH value tables, added 2026-09-28 inc76e84be. TheChangeEventingest struct itself is reached only from the/event/push/*integration handlers; the only public/changeoperation isPOST /change/list, whose response enums are the ones verified above.fc-pgy— every file changed in the window is wallet/billing (platform/walletishidden: true), on-prem license mail,structs/i18n.go(email strings), the registry, and newknowledge.*IfVersionpermission factors that belong tojwt/buttonroutes (deploy/permission.sql,logic/permission/permission_test.go). Noauth == "all"row moved. No public-contract change.fc-rum—ad698c2(PR docs(comparison): sharpen status page, AI SRE billing, and stakeholder pricing points #234) only prevents a panicking JSON column decode (ApplicationRepositories.JSONColumn/ParseApplicationRepositories); the schema is unchanged. Therepositoriesfield itself (PR fix(api-reference): sync merged spec with timezone and grouping window fixes #220) was already documented in main on 2026-09-14 (7e3a424b), and the emittedRumApplicationItem/ create / update properties match the Go types — no drift.fc-datasource—48cc588swaps the required Slack scope list fordata_source.SlackAISREBotScopes()insideVerifyWarRoomPermission; no schema change (scopes do not appear in any spec). The remaining commits register alert-source plugins (/event/push/*, out of scope).fc-oncall,fc-statuspage,go-pkg— 0 commits in the window.One open question left by that window
structs.SupportChangeStatus— the only exported enumeration of change statuses infc-event— was deleted in the same window (structs/severity.go). The public read schemastructs.ChangeItem.ChangeStatusis a plainstringwith nobinding:tag, so the enum now documented onChangeItem.change_status/ChangeEventItem.change_statusis not tag-derived; its Go source of truth is theChangeStatus*constants (still present) plusIsChangeStatusTerminal. Nothing in the specs is wrong today, but if the generator ever keys an enum offSupportChangeStatus, the next full regeneration would drop it. Not actionable here — flagging it because this round is the first to regenerate nothing and therefore could not have caught it.unresolved
POST /channel/incident/daily-counts(channel:read:incidentDailyCounts) —Auth == "all", mapped toon-call/channel, but no handler exists anywhere infc-eventmain, and no spec documents it. Left undocumented rather than guessed. Same finding as the previous round (PR docs(api): daily audit 2026-09-29 — RUM remote-config error-session switches, channel filter UTF-8 note #581); it is not indocs.jsonand is not rendered.POST /integration/*rows — public, but no non-hidden module in the skill'smapping.yamlclaims the/integrationprefix. Still covered by the open PR docs(api): daily audit 2026-09-25 — document the new /integration API family #472; not duplicated here.requestBodyexample because they are file uploads —/enrichment/mapping/data/upload,/safari/skill/upload, and/monit/datasource/tools/invoke; the last one also has no JSON200example. Every other “missing 200 example” is a CSV/binary export (text/csv,application/octet-stream,application/x-ndjson). The monitors ones cannot be reconciled here: monit-webapi is not on GitHub.Not duplicated from open PRs
#581(2026-09-29) already carries the RUMRemoteConfigValueserror-session switches and the/channel/*UTF-8 validation note;#472carries the/integrationfamily;#461carries the monitors/on-call/safari spec sync. None of them touchesAlertItem.detail_url,AlertInfo.detail_urlor/rum/issue/info, so this change is additive to all three.Verification
python3 -c "import json; json.load(open(path))".HEAD(baseline read fromgit show HEAD:<path>, never the working tree) over all 12 non-legacy spec files: exactly 12 changed leaf paths, all intended —on-call.{en,zh}/components/schemas/{AlertItem,AlertInfo}/properties/detail_url/{description,type}plus~, and{rum.openapi,openapi}.{en,zh}/paths//rum/issue/info/post/x-mint/contentplus~.monitors,platform,safariandopenapi.legacy.zh.jsonare byte-identical.detail_urlobject is byte-identical (after key sort) between the on-call split and the consolidated file.Examples
No operation was added and no
200example was re-captured: the app-key environment variable is not readable from this environment, so dev-API capture was not possible. Nothing in this diff is a machine-fabricated example value — the addeddetail_urltext is copied from the consolidated spec (which itself mirrors the Go doc comment), and the only newly authored prose is the singleteam_idusage bullet in EN and ZH.How this diff was produced — please read
The documented pipeline (
scripts/generate_openapi.py) still could not be run: it consumes per-module data files at.api-review/modules/*.json, which are gitignored and absent from the repo, and the team knowledge pack's restore procedure (runbooks/api-review-daily.md) together with its baseline-fidelity patch script (runbooks/api-review-apply-patches.py) are both missing — this is the 10th consecutive round blocked this way. Running the generator without those inputs drops committed paths and aborts onguard_no_path_drop(), so it was not run rather than run unsafely.The edits were therefore applied as a verified minimal diff: before writing,
json.dumps(obj, indent=2, ensure_ascii=False)was confirmed to reproduce each target file byte-for-byte (per-file trailing-newline handling included), so no byte outside the two intended changes could move. Script:/opt/scripts/api-review-20260930-patch.py(dry-run by default,--applyto write); the deep compare is/opt/scripts/api-deep-compare-20260930.py. A reviewer who wants this re-derived by the generator should expect the same two properties and the same usage bullet from the same Go sources.