Repository navigation
docs(api): daily audit 2026-10-09 — drop the reverted incident_list panel kind, add the resolve and feed assignee fields - #1032
Merged
Conversation
added 2 commits
October 9, 2026 08:08
…anel kind, add the resolve and feed assignee fields
…work-item assignees required, list anchor)
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.
Daily API-reference audit — 2026-10-09
Scope:
--mode generate --scope all --auto. Round drawn againstflashduty-docsmain=35773ebf. Branchapi-review/20261009T080857Z.Window analysis
Window start = the previous run (
2026-10-08T08:00:17Z, the round that produced #1023). Each source repo was base-diffed from the last commit before that instant toorigin/main, so commits merged in-window with older author dates are not missed:origin/main75bf6c59997944types/dashboard/{contract,validate,variants,runtime}.go,logic/{dashboard_runtime_template,logic_dashboard_runtime,logic_dashboard,logic_explore}.go94bc9a68bccb5e78structs/{feed,change,severity,work_item}.go,logic/{transfer,insight/incident,post_incident/*}.go,cmd/server/controller/{insight,post_incident,resource}/*0943fb2065c93fcmd/engine/controller/event/event.go,logic/sourcemap/*1226e6b95c75610logic/idp/*,logic/charge/*(all non-public auth)Operation changes per module
No operation was added, removed, or re-versioned. The fc-pgy registry is unchanged at 366
auth: "all"rows (row-level diff against the window base1226e6b: 0 added, 0 removed, 0authflips), and the committed spec still holds 365 public operations — the one-row gap is fully accounted for below. Noauthflip. The only registryauth: "all"rows with no matching spec operation are two, both known:POST /channel/incident/daily-counts(no handler, 6th consecutive round) andGET /monit/prometheus/api/v1/label/:label_name/values, which is the gin:paramspelling of the spec's{label_name}— same operation, not a gap.New non-public registry rows added this window (
GET /safari/oauth/client-metadata.jsonauth: none,POST /oauth/client/describeauth: jwt,GET /.well-known/oauth-authorization-serverauth: none) are correctly skipped.Because there is no page add/delete,
docs.jsonand both{en,zh}/openapi/api-catalog.mdxare deliberately untouched, andapi-reference/openapi.legacy.zh.jsonis untouched.What changed
1.
incident_listis gone — the panel kind was reverted upstream (5 leaves × 4 files).monit-webapi5ee1fec(2026-10-08 04:38 −0700) reverts PR #135feat/dashboard-incident-list-panel; the revert was merged by PR #151 (b0053a5, 04:47 −0700). Both land after the previous run's window, which is why #1023 documented the kind and this round has to take it back out. Currentorigin/mainevidence:types/dashboard/contract.go—QuerylessVizKind()deleted (git grep incident_list origin/main -- '*.go'returns nothing).types/dashboard/variants.go—VizConfig.UnmarshalJSONcase "incident_list"deleted.types/dashboard/validate.go:475— back tocase "text":, with the message hard-coded to"text requires no queries"/"text cannot have a datasource".Reverted in the specs:
DashboardIncidentListViz(monitorssplit 185 → 184 schemas; consolidated 826 → 825);DashboardIncidentListVizarm fromDashboardVizConfig.oneOfand theincident_listkey fromdiscriminator.mapping;incident_listfrom theDashboardOutlineVizConfig.kindenum and from its| value | meaning |-style description;DashboardPanel.queriesdescription goes back to "textaccepts none" (「text不允许查询」).2.
POST /monit/dashboard/runtime/queries/resolvegained two request fields.monit-webapitypes/dashboard/runtime.go—QueriesResolveInputattypes/dashboard/runtime.go:66,68(merged viaab51490/ PR #155 and338f44b/ PR #156, both in-window) now has:DashboardQueriesResolveRequesttherefore gainsmax_data_points(type: ["integer","null"],minimum: 2,maximum: 5000— the pointer scalar rule fromgenerate.mdStep 3, bounds fromMinMaxDataPoints/MaxMaxDataPointsattypes/dashboard/runtime.go:17-18) andpreserve_builtin_variables(type: boolean, a value bool so it stays non-nullable). Inserted aftervariables, matching the Go struct order in the split files and the file's own existing order in the consolidated copies.3. The feed detail for work items carries structured assignees.
fc-event7eff20f30 feat(work-item): let AI SRE be an assignee(author date 2026-09-23) reachedmainthis window via PR #2456 (8bccb5e78), which is why earlier rounds could not act on it and this one can.structs/feed.go:FDetailWorkItemCreatedgainsAssignees []WorkItemAssigneeRef \json:"assignees,omitempty"``;FDetailWorkItemAssigneesChangedgainsAssignees,AddedAssignees,RemovedAssignees.Declared at
structs/feed.go:427and:449; populated atlogic/post_incident/work_item.go:318and:543;added_assignee_ids/removed_assignee_idsare computed bypersonAssigneeIDs()(logic/post_incident/work_item_validate.go:178), which skipsai_sreand non-positive ids — hence the "person-only subset" wording. All three fields areomitempty, so the descriptions say "omitted when empty" rather than the "never null" wording used byWorkItemItem.assignees(which has noomitempty).4. Two input-validation rules the API now enforces.
monit-webapitypes/dashboard/validate.go:270— a dashboard variable name starting with__is rejected (reserved): added to thenamedescription ofDashboardCustomVariable,DashboardDatasourceVariable,DashboardQueryVariable.monit-webapitypes/dashboard/validate.go:429-439— for a Loki variable query an emptyexpris now accepted (it lists the field's values across all streams),fieldmust match^[A-Za-z_][A-Za-z0-9_]*$(a bare stream label), andargsmust be empty. Added toDashboardLogsVariableQuery.{expr,args,field}.5. Committed split↔consolidated drift, resolved from the Go source (rule 7).
A full sort-key comparison of every schema shared between a split file and the consolidated copy found exactly two content drifts besides the known
DutyError.reasonitem, and in both the split side was the stale one:WorkItemItem.required— the split files listed 12 fields, the consolidated 13.fc-eventstructs/work_item.godeclaresAssignees []WorkItemAssigneeRef \json:"assignees"`**without**omitempty, so it is always serialized and belongs inrequired(itsomitemptysiblingspost_mortem_id,description,priority,legacy_source_id,converted_by,converted_at_seconds,agent_session_id,agent_session_venueare all correctly absent).assigneesadded at index 8, afterassignee_ids`.ListWorkItemRequest.description— the split described three anchors, the consolidated four.fc-eventlogic/post_incident/work_item.go:942rejects the call with the literal message"incident_id, post_mortem_id, assignee_id, or assignee_type=ai_sre is required", andworkItemAssigneeFilter(model/post_incident/work_item.go) treatsassignee_type=ai_sreas a standalone scope. The split description now carries the fourth anchor.Per the direction rule, these were judged against the Go source, not against which file "wins" by role; the consolidated copy happened to be right both times. The remaining split↔consolidated difference is
DutyError.reasoninon-call/rum/safari/platform, which carries the deliberatex-flashduty-preserve-absencemarker — left alone and reported under unresolved, as in previous rounds.Verification performed
python3 -c "import json; json.load(open(path))"—monitors41 paths / 184 schemas,on-call202 / 410, consolidated 365 / 825.python3 scripts/lint_openapi.py→OK: 12 spec files, no violations(the same gate CI runs onapi-reference/*.json).git show 35773ebf:<path>, i.e. the committed baseline only, never the worktree): 172 changed leaves in total, every one itemised above —monitors.openapi.*7 added / 13 removed / 8 changed,on-call.openapi.*12 added / 0 / 0 plus the 4required-shift + 1 description leaf from section 5, consolidated 19 / 13 / 8. No reorder-only leaf.git diff --numstatequalsgit diff --numstat --minimalfor all six files (23/37, 23/37, 30/1, 30/1, 51/37, 51/37), i.e. no phantom delete/re-add despite the schema removal.json.dumps(obj, ensure_ascii=False, indent=2) + "\n"(trailing newline probed per file).summary,description,title,x-mint,tags,name,x-enumDescriptions,examples): 0 differences across all five modules and the consolidated pair.operationId/path/schema names/$refs are untouched.mintis unavailable):on-call202,monitors41,rum41,safari53,platform28 — every path found indocs.jsonand in bothapi-catalog.mdx, 0 missing in all three surfaces.on-callsplit↔consolidated re-scanned after section 5: onlyDutyErrorremains (see unresolved).formatfields — the only "EN has a keyword / ZH does not" hits are the 12 short-form fields (AlertInfo/IncidentInfo/IncidentFeedItem/WarRoomItem*_at), whose ZH text uses 时间戳;scripts/lint_openapi.py'sEPOCH_REaccepts 时间戳, and the lint passes. Not drift.+208 / −150across 6 files (two commits: the audit, then the drift alignment). This exceeds the "under 100 lines when no operation is added" heuristic because the round is dominated by a schema deletion (25 lines) rather than a text tweak; every line is enumerated above.Unresolved / deferred
POST /channel/incident/daily-counts— registryAuth: "all", no handler found in any repo. 6th consecutive round. Not emitted.DutyError.reasonsplit/consolidated inconsistency (x-flashduty-preserve-absencepresent inmonitorssplit + both consolidated files, absent from the other four splits). Deliberate human marker vsreferences/response-envelope.md's two-fieldDutyError— human arbitration, untouched.{{ }}template wording in themonitorsmodule is inaccurate and was not touched this round:monit-webapionly supports${name}(types/dashboard/validate.go:1295—"only ${name} templates are supported") plus, since this window, bare$namefor Prometheus/Loki. 10 occurrences per file inmonitors.openapi.{en,zh}.jsonand both consolidated files describe the syntax as{{ }}and speak of "event labels". This predates the window, so changing it would have tripled the diff; it deserves its own pass.$__auto,$__interval,$__rate_interval,$__range, availability per datasource × mode intypes/dashboard/validate.go:1180-1200) are a new capability of the public panel-query endpoints but are not yet documented anywhere in the spec. Candidate for anx-mint.contentusage section on/monit/dashboard/panel/runrather than a field description.mint broken-linkscould not be run — nonode/npxin this environment. Substituted the Step 5.5 reachability check above.DutyError.reasoncarriesx-flashduty-preserve-absencein monitors/rum only, contradictingreferences/response-envelope.md(which requires exactlycode+message); left to human arbitration as in previous rounds.Automated notes
FLASHDUTY_APP_KEYis not reachable from the agent's shell), which was not needed.origin/mainofflashcatcloud/<repo>only; thefc-pgyregistry parser was run againstlogic/api/api_test.goat both the window base andorigin/mainfor the row-level diff.