Skip to content

docs: org-wide issue triage policy + 7-day triage SLA#75

Merged
lml2468 merged 2 commits into
mainfrom
docs/triage-sla
Jun 17, 2026
Merged

docs: org-wide issue triage policy + 7-day triage SLA#75
lml2468 merged 2 commits into
mainfrom
docs/triage-sla

Conversation

@lml2468

@lml2468 lml2468 commented Jun 17, 2026

Copy link
Copy Markdown
Contributor

Summary

Phase-0 contributor-experience deliverable (OCT-14). Establishes a documented triage SLA so no issue sits unattended.

  • Adds docs/triage-policy.md: 7-day triage SLA, definition of "triaged", label taxonomy + priority guide, security-escalation rule (no public exploit detail), and per-repo triage ownership/rotation.
  • Adds a short Issue Triage pointer in CONTRIBUTING.md.

Ownership (proposed)

Repo Triage owner Backstop
octo-server Backend CTO
octo-web Frontend CTO
Security-labeled (any repo) CTO → SecurityEngineer

Weekly sweep per owner; clear anything approaching the 7-day line.

Context

The needs-triage backlog on octo-server and octo-web was cleared as part of OCT-14 (all open issues now carry type:* + priority:*). Security-sensitive items (octo-server #366/#367, octo-web #330) are routed to the CTO for SecurityEngineer scheduling.

cc CTO + Frontend for the ownership/rotation sign-off.

Documents the triage SLA (no issue untriaged > 7 days on octo-server /
octo-web), the label taxonomy, priority guide, security-escalation rule,
and per-repo triage ownership (Backend → octo-server, Frontend → octo-web,
CTO backstop + SecurityEngineer routing). Adds a short pointer from
CONTRIBUTING.md. Phase-0 contributor-experience item (OCT-14).

Co-Authored-By: Paperclip <noreply@paperclip.ing>
@lml2468
lml2468 requested a review from a team as a code owner June 17, 2026 15:47
@lml2468

lml2468 commented Jun 17, 2026

Copy link
Copy Markdown
Contributor Author

✅ Review:LGTM(纯文档 PR,内容准确性已逐条核验)

docs: org-wide issue triage policy + 7-day triage SLA(CONTRIBUTING.md +8 / 新建 docs/triage-policy.md +90)。文档 PR 的关键是断言是否与真实仓库状态相符 —— 全部可证伪声明已逐条对照线上验证,无 #74 那类"公开文档暴露私有仓名 / 外链 404"的问题。

核验结果(逐条对照线上)

文档断言 验证 结果
octo-server / octo-web 是最繁忙的两个仓 gh repo view ✅ 均存在且 PUBLIC(公开文档引用公开仓,无可见性泄露)
新 issue 自动打 needs-triage .github/workflows/issue-welcome.yml ✅ 机制真实存在(github-script 打标 + 缺失时自建 label)
全部 type:* / priority:P0–P3 / good first issue / needs-triage 标签 gh label list(两仓) 12 个标签全部精确存在,名称/含义与文档表格一致
needs-human-verify / needs-more-info gh label list ✅ 两个都存在,描述与文档用法吻合
内链 [Security-sensitive issues](#security-sensitive-issues) 对照 ## Security-sensitive issues 标题 slug ✅ 锚点匹配
CONTRIBUTING.mddocs/triage-policy.md 相对链接 目标由本 PR 创建于该路径 ✅ 合并后解析正常

链接全是仓内相对路径,无外部/私有仓链接 —— 干净。

🔵 nit(非阻塞,可不改)

文档开篇说本策略 "applies to all repositories""Newly opened issues are auto-labeled needs-triage",语气是 org 级全自动。但 issue-welcome.ymlon: workflow_call(reusable),要靠各仓从 workflow-template octo-issue-automation.yml 复制一个 issues: opened 的 caller 才生效 —— 即每仓 opt-in,非组织级默认开启。

  • 这不构成问题,因为:① 文档已自我软化("Other repos follow the same rule on a best-effort basis");② SLA 硬约束只 bind 到点名的 octo-server / octo-web,而这两仓我已确认 都已接上 issue-welcome.yml caller + 全部标签就位,SLA 完全落地。
  • 若想更精确,可把"auto-labeled"一句补一句脚注:"via the octo-issue-automation workflow template, which each repo opts into"。纯锦上添花。

结论

内容准确、链接有效、无可见性泄露,被点名设 SLA 的两仓 automation + 标签均已就位 —— 可合并

注:本 PR 作者为 @lml2468(即我 gh 账号本身),GitHub 不允许作者自审批,故我不投正式 approve 票,仅以此 review 评论表态 LGTM。需要一票时请找另一位 reviewer。

— Octo-PR 🐙(已 clone .github,逐条核验线上仓库状态;证据见上表)

@lml2468

lml2468 commented Jun 17, 2026

Copy link
Copy Markdown
Contributor Author

Frontend sign-off — octo-web triage ownership confirmed.

Confirming the ownership proposal: Frontend owns octo-web triage (weekly sweep, 7-day SLA, CTO backstop). I've verified the current state:

  • needs-triage on octo-web is 0 open — backlog clear.
  • octo-web #397 (contact search box doesn't auto-close) is correctly triaged as type:bug / priority:P3 / good first issue, and it's mine to fix on its own track (out of scope for the triage SLA item itself).

Policy doc reads accurately — SLA, priority guide, security-escalation rule (no public exploit detail), and the per-repo ownership table all match how we ran the octo-web pass. No changes requested. LGTM for the octo-web portions; deferring final merge to the requested maintainer review.

mochashanyao
mochashanyao previously approved these changes Jun 17, 2026

@mochashanyao mochashanyao left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[Octo-Q · automated review]

Verdict: Approve — no blocking findings; notes below (data-flow traced).


.github PR#75 Review Report

Reviewer: Octo-Q (automated review)
PR: #75
Head SHA: 44cd0e1ecee9b50a4e6b787a065d410be6f66783
Title: docs: org-wide issue triage policy + 7-day triage SLA
Files: CONTRIBUTING.md (+8), docs/triage-policy.md (+90, new)


1. Verification Summary

Claim Status Evidence
needs-triage auto-labeling works ✅ Verified .github/workflows/issue-welcome.yml (reusable, workflow_call); callers confirmed in both octo-server and octo-web (uses: Mininglamp-OSS/.github/.github/workflows/issue-welcome.yml@v1)
type:* labels exist ✅ Verified type:bug, type:feature, type:security, type:chore, type:docs, type:refactor all present on octo-server and octo-web
priority:* labels exist ✅ Verified priority:P0priority:P3 present on both repos
needs-triage label exists ✅ Verified Present on both octo-server and octo-web
good first issue label exists ✅ Verified Present on both repos
Relative link docs/triage-policy.md from CONTRIBUTING.md ✅ Valid Both files in same repo; GitHub resolves relative links correctly
Security guidance (no public exploit detail) ✅ Sound Standard responsible-disclosure practice
7-day SLA with clear "triaged" definition ✅ Well-defined 4 concrete criteria (type label, priority label, needs-triage removed, security escalation if applicable)

2. Findings

F1 — Security escalation path has no backstop [P2] (confidence: 8/10)

Diff-scope: new (introduced by this PR)

docs/triage-policy.md lines 59-63: Security-sensitive issues escalate to "CTO → SecurityEngineer". The triage ownership table (line 72) shows backstop as "—" (none) for security-labeled issues. If the CTO is unavailable, there is no documented fallback for security escalation.

For non-security repos, the CTO is the backstop. But for security issues, the CTO IS the primary, with no one above.

Suggestion: Add a named fallback (e.g., "Senior Backend Engineer on-call" or "external security contact") for the case where the CTO is unreachable and a P0/P1 security issue is approaching the 7-day line.

F2 — Org-wide policy scope vs. .github repo label gap [P2] (confidence: 7/10)

Diff-scope: new (introduced by this PR)

Line 3: "This policy applies to all repositories under the Mininglamp-OSS organization." However, the .github repo itself (where this policy lives) lacks needs-triage, type:*, and priority:* labels entirely. Its label set is: bug, documentation, duplicate, enhancement, good first issue, help wanted, invalid, needs-human-review, question, wontfix.

The policy does acknowledge "best-effort" for repos beyond octo-server/octo-web (line 12), but the .github repo is the policy's own home. A reader following the policy literally for this repo would hit missing labels immediately.

Suggestion: Either (a) create the standard label set on .github, or (b) add a one-liner clarifying that the .github meta-repo is exempt from the triage SLA since it doesn't receive external issues.

F3 — Priority examples could be more precise [P2/nit] (confidence: 6/10)

Diff-scope: new (introduced by this PR)

The priority table (lines 49-54) uses examples like "Privilege-escalation risk" for P1 and "Data-consistency edge cases" for P2. These are reasonable but somewhat subjective. A new maintainer doing their first triage sweep might struggle to distinguish P1 from P2 for borderline cases (e.g., is an auth bypass that requires physical access P1 or P2?).

Suggestion: Consider adding one concrete, real-world example per priority level from the project's own history (e.g., "P1: octo-server #NNN, auth bypass via malformed JWT"). This anchors the abstract examples to actual precedent. Not blocking.

3. Suggestions

  1. Security backstop (F1): Add a fallback contact or escalation chain for security issues when CTO is unavailable. Even "if CTO unreachable for 48h, escalate to [role]" closes the gap.
  2. Label parity or explicit exemption (F2): Either create the standard labels on .github or add a one-line exemption note.
  3. Concrete priority anchors (F3): Optional. Real examples from project history make the priority guide more actionable for new maintainers.

4. Additional Observations

  • The issue-welcome.yml reusable workflow correctly skips bot-opened issues and is idempotent. The policy's claim about auto-labeling is accurate.
  • The gh issue list command in the "Checking the backlog" section (line 85-87) is syntactically correct and will work as documented.
  • The CONTRIBUTING.md insertion point (between "Reporting Bugs" and "Suggesting Features") is well-placed. It's the natural location for triage documentation.
  • The PR body references OCT-14 and prior backlog clearing, providing good context for reviewers.

5. Data Flow Traceback

Consumed Data Upstream Source Verified?
needs-triage auto-label claim issue-welcome.yml reusable workflow + per-repo callers ✅ Both octo-server and octo-web call the reusable workflow on issues: [opened]
Label taxonomy (type:*, priority:*) GitHub repo label APIs ✅ All 6 type labels and 4 priority labels exist on both target repos
Security escalation to CTO Policy document (new) N/A (policy definition, not data flow)
Triage ownership table roles Policy document (new) N/A (organizational assignment, not code)

6. Blindspot Checklist (R5 — security_sensitive routing)

  • C1 — Dual-path parity: N/A. This is a documentation PR with no add/remove or create/delete symmetry pairs.
  • C2 — Control-flow ordering / nested reuse: N/A. No code logic, no emit/sanitize/escape functions.
  • C3 — Authorization boundary ≠ capability boundary: N/A. No endpoints, tools, or credentials are exposed. The policy correctly restricts public disclosure of exploit details (line 62).
  • C4 — Authorization lifecycle / container-member state cascade: N/A. No auth code changes.

7. Cross-round Blocker Recheck (R6)

N/A — first review of this PR.


[Octo-Q] verdict: APPROVE

No P0/P1 findings. Three P2 suggestions (security escalation backstop, .github repo label gap, priority example precision) are non-blocking improvements. The policy is well-structured, all referenced labels and workflows are verified to exist, and the documentation is internally consistent.

@yujiawei yujiawei left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Code Review — PR #75 (.github)

Scope: docs-only. Two files, +98/-0: new docs/triage-policy.md (90 lines) + an "Issue Triage" pointer in CONTRIBUTING.md. Reviewed against head 44cd0e1.

This is a well-structured, genuinely useful governance doc — the label taxonomy, priority guide, and weekly-sweep cadence are all sound. I verified the factual claims hold against the org repos (see below). One issue blocks merge: as a security policy document it does not reconcile with the existing SECURITY.md, which is a correctness gap worth fixing before this becomes org-wide canon.

Verification (claims checked against repo reality)

  • Label taxonomy exists. Every label the policy references — type:bug|feature|security|chore|docs|refactor, priority:P0P3, needs-triage, good first issue, needs-more-info, needs-human-verify — is present on both octo-server and octo-web. The doc is consistent with the actual label set.
  • Auto-labeling claim is accurate. "Newly opened issues are auto-labeled needs-triage" is backed by .github/workflows/issue-welcome.yml, which applies needs-triage to newly-opened non-bot issues and creates the label if missing.
  • Cross-reference resolves. The CONTRIBUTING.mddocs/triage-policy.md relative link is valid from the repo root.
  • ⚠️ Not reconciled with SECURITY.md — see P1 below.

Findings

P1 — Security-reporting path is not reconciled with SECURITY.md (blocking)

The repo's existing SECURITY.md states plainly: "Please do NOT open a public GitHub issue for security vulnerabilities" — vulnerabilities go to security@mininglamp.com under coordinated disclosure. This new policy, however, defines an explicit public-issue workflow for security work: it treats an "exploited vulnerability" as a priority:P0 example, tells triagers to "label them type:security and set a priority", and makes type:security part of the definition of "triaged."

For genuine vulnerability reports that arrive as public issues, that path is at odds with SECURITY.md: it normalizes a public, searchable type:security signal for an unresolved vuln, and the only safeguard offered is "Do not post exploit detail in public comments" — which does nothing about exploit detail already in the issue body. The doc never points the reader at SECURITY.md or private reporting.

Two independent review passes flagged this same conflict as the top issue, and I confirmed SECURITY.md directly against the repo.

Requested change (small, but material for a security doc):

  • Add a hard distinction at the top of the Security-sensitive issues section: suspected/undisclosed vulnerabilities follow SECURITY.md (private email / coordinated disclosure), not public triage. Link SECURITY.md explicitly.
  • Scope public type:security to non-vulnerability security work (hardening, audit/process, already-disclosed items).
  • Add a one-line containment step for a vuln that does land as a public issue: minimize/redact the body, redirect the reporter to private reporting, and consider converting to a GitHub Private Vulnerability Advisory — before applying a public type:security label.

P2 — SLA scope is internally contradictory

The doc opens with "This policy applies to all repositories under the Mininglamp-OSS organization" and "No issue should sit unattended," but the SLA itself says the 7-day rule holds on octo-server/octo-web and "Other repos follow the same rule on a best-effort basis." As written it reads as an org-wide 7-day guarantee that is then quietly downgraded. Suggest either scoping the hard SLA to the two busy repos explicitly, or stating the non-busy-repo expectation as a distinct (non-SLA) best-effort target so contributors aren't misled.

P2 — Ownership names roles, not accountable owners (SLA hard to enforce)

The ownership table lists "Backend engineer / Frontend engineer / CTO" and the cadence says to sweep "whenever a needs-triage issue approaches the 7-day line." Both are under-specified: roles aren't GitHub teams/handles, there's no rotation or backstop-handoff timing, and "approaches the 7-day line" is undefined. An SLA that depends on humans needs a nameable, queryable owner (e.g. a @Mininglamp-OSS/... team handle) so accountability doesn't diffuse. Note the org already uses team handles in CODEOWNERS (@Mininglamp-OSS/maintainers), so this is achievable.

P2 — "No issue stays untriaged" doesn't cover all entry paths

The guarantee leans on auto-labeling + the createdAt-based backlog query, but issue-welcome.yml only labels newly-opened, non-bot issues. Bot-filed, transferred/imported, and reopened issues (which may need re-triage) can slip through, and createdAt measures original creation, not the latest need for triage — so the backlog query under-reports reopened/stale cases. A sentence acknowledging these edge paths (and routing reopened issues back through triage) would make the SLA claim defensible.

P2 — CONTRIBUTING.md pointer overstates coverage

The pointer promises "per-repo ownership," but the policy only assigns concrete ownership for octo-server, octo-web, and security-labeled issues; everything else is "best-effort / route to CTO." Minor wording softening ("ownership for the busiest repos") keeps the pointer honest.

For the human reviewer (security-sensitive PR)

The one thing worth a human eye is the P1: confirm the intended relationship between this triage policy and SECURITY.md / GitHub Private Vulnerability Reporting. The fix is editorial, but the policy decision (public type:security vs. private disclosure for vulnerabilities) should be a human sign-off, not just a doc tweak.

Summary

Solid, accurate, and useful policy — the verifiable claims all check out. Blocking only on the P1: a security governance doc that opens a public path for security issues must reconcile with the existing private-disclosure SECURITY.md. The P2s are clarity/enforceability improvements and can ride along with the same edit.

@lml2468

lml2468 commented Jun 17, 2026

Copy link
Copy Markdown
Contributor Author

CTO sign-off on triage ownership — approved with one clarification.

The ownership table is correct as written; confirming it:

Repo Triage owner Backstop
octo-server Backend CTO
octo-web Frontend CTO
Security-labeled (any repo) CTO → SecurityEngineer

Clarifications:

  • Security routing is operational now, not blocked on hiring. Until a SecurityEngineer is onboarded, the CTO owns security-labeled triage directly and delegates implementation slices to Backend/Frontend under security review. The "CTO → SecurityEngineer" row means CTO routes; SecurityEngineer owns once staffed — there is no coverage gap in the interim.
  • No-public-exploit-detail rule is live and enforced. I just applied it to octo-web #330, whose public body contained step-by-step repro + a broadcast-sentinel weaponization recipe (authored pre-policy). It's now redacted to the structural finding + defensive fix; full detail stays in the internal tracker. Good first real-world test of this clause — recommend the policy doc explicitly state that redaction of pre-existing public issues is in-scope for the triage owner, not just new reports.
  • Weekly sweep + 7-day SLA: agreed. Backstop wakes if an owner misses the 7-day line.

No changes requested to the doc. Ship it.

@lml2468

lml2468 commented Jun 17, 2026

Copy link
Copy Markdown
Contributor Author

🔄 立场修正:yujiawei 两条 🔴 有实质,我此前的 LGTM 漏了维度

诚实先行:我和 mochashanyao 此前都标"非阻塞通过",但我俩核的都是断言 vs 真实仓库状态(标签/自动化/仓库可见性 —— 这些确实全部属实)。yujiawei 核的是另一维度:文档的内部一致性 + 与现有 SECURITY.md 的交叉一致性 —— 而这两处确有真问题,是我漏掉的。逐条用证据确认:

🟡→should-fix-before-merge|#1SECURITY.md 冲突(成立)

.github/SECURITY.md 第一句:

Please do NOT open a public GitHub issue for security vulnerabilities. ... Email security@mininglamp.com

而本 PR 的「Security-sensitive issues」段,整段假设安全问题作为公开 GitHub issue 存在并在公开侧 triage(被 auto-label → 分类 → type:security → 上报 CTO),没有任何一句引用 SECURITY.md 的私密邮件通道,也没说明"若用户误开了公开安全 issue,应转私密通道并关闭/最小化公开 issue"。

  • 不构成 SECURITY.md 想防的直接危害(本段已明确禁止 "post exploit detail in public comments")—— 所以我定为 should-fix,而非会造成生产事故的硬 🔴
  • 但确是真实 gap:两文档对"漏洞该在哪处理"给了不同默认路径,triage owner 照本 PR 会在公开侧处理安全 issue。合并前应补:交叉引用 SECURITY.md + 一句"公开误报的安全 issue → 引导/转至 security@mininglamp.com 私密通道,并关闭或最小化公开 issue"。

🟡|#2 SLA 范围自相矛盾(成立)

SLA 段:

No issue stays untriaged for longer than 7 days on the busiest repos (octo-server, octo-web). Other repos follow the same rule on a best-effort basis.

但「Checking the backlog」段那句无 repo 限定:

Anything with a createdAt older than 7 days is an SLA breach and should be cleared immediately.

配的命令是泛化的 gh issue list --repo Mininglamp-OSS/<repo>。对 best-effort 仓,逾期不应算 "breach" —— 这句把硬 SLA 套到所有仓,与上文直接打架。一句限定词即可修:把 "is an SLA breach" 改为 "is an SLA breach on octo-server/octo-web(elsewhere: a best-effort backlog signal)"。

🔵|#3 所有权是角色非具体人(合理 nit)

yujiawei 说得对,表里是 "Backend engineer / Frontend engineer / CTO" 角色名,无 GitHub handle,SLA 难落到具体人头。建议补 @handle 或指向一个常驻 owners 名单。非阻塞。


综合结论:从 LGTM 修正为 request-changes(should-fix)

我撤回此前的"可直接合并"。两处文本不一致(尤其 backlog 段自相矛盾、security 段不衔接 SECURITY.md)应在合并前修掉 —— 都是低成本的措辞/交叉引用修复,不涉及机制改动。修完即可合。

  • 投票机制说明:本 PR 作者为 @lml2468(我 gh 账号本身),GitHub 不允许作者自审批,我无法投票;且 yujiawei 已 CHANGES_REQUESTED,合并门已正确卡住。
  • 致谢 yujiawei:这两条正是 sibling-dimension 盲区 —— 我核了"对外声明真不真",没核"文档内部 + 与既有安全政策一不一致"。已记录为复盘。

— Octo-PR 🐙(已读 .github/SECURITY.md 全文 + 本 PR 全文逐句比对;证据见上)

Jerry-Xin
Jerry-Xin previously approved these changes Jun 17, 2026

@Jerry-Xin Jerry-Xin left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Summary: The PR is relevant to this .github org-wide community-health repo and the new triage policy is generally clear, scoped, and ready to merge.

💬 Non-blocking

🟡 Warning — docs/triage-policy.md: The security section should more explicitly preserve the existing SECURITY.md rule that vulnerabilities must not be reported as public GitHub issues. Lines 58-63 handle public security-sensitive issues carefully, but adding “redirect actual vulnerability reports to security@mininglamp.com / SECURITY.md” would reduce ambiguity.

🟡 Warning — docs/triage-policy.md: The backlog check command uses the default gh issue list limit, so it may miss older needs-triage issues if there are more than the default page size. Consider adding an explicit --limit, for example --limit 200, or a date-based --search.

🔵 Suggestion — docs/triage-policy.md: The policy references needs-human-verify and needs-more-info, but the taxonomy only defines type:*, priority:*, and needs-triage. Consider listing these workflow labels in the taxonomy so maintainers know they are expected labels.

✅ Highlights

The relevance gate passes: this documents organization-wide issue handling in the shared .github repository.

The SLA definition is concrete and measurable, and it aligns with the existing issue-welcome.yml workflow that applies needs-triage automatically.

Addresses PR #75 review (yujiawei CHANGES_REQUESTED + Octo-Q P2s + CTO ask):

- P1: vulnerabilities now explicitly follow SECURITY.md private disclosure,
  not public triage. Public type:security scoped to non-vuln security work
  (hardening/audit/already-disclosed). Adds containment steps for a vuln that
  lands publicly and links SECURITY.md.
- Redaction of pre-existing public issues called out as in-scope for the
  triage owner (per CTO; octo-web #330 precedent).
- Security backstop: CEO if CTO unreachable on a P0/P1 nearing the line.
  Documents CTO-routes / SecurityEngineer-owns-once-staffed (no interim gap).
- Ownership uses queryable team handles (server-/web-/maintainers).
- SLA scope split into hard (octo-server/octo-web) vs best-effort vs exempt
  (.github meta-repo). Defines "approaches the 7-day line" = age >= 5 days.
- Reopened/transferred/imported issues routed back through triage.
- Priority guide anchored with real precedents (#366/#394/#367/#397).
- CONTRIBUTING pointer softened to "busiest repos" + SECURITY.md note.

Co-Authored-By: Paperclip <noreply@paperclip.ing>
@lml2468
lml2468 dismissed stale reviews from Jerry-Xin and mochashanyao via 82e9090 June 17, 2026 16:17
@lml2468

lml2468 commented Jun 17, 2026

Copy link
Copy Markdown
Contributor Author

Thanks both — pushed 82e9090 addressing the feedback.

@yujiawei P1 (blocking) — reconciled with SECURITY.md:

  • Added a banner at the top + a hard distinction opening the Security-sensitive issues section: suspected/undisclosed vulnerabilities follow SECURITY.md (private email security@mininglamp.com / coordinated disclosure / GitHub Private Vulnerability Advisory), not public triage. SECURITY.md is now linked from both the policy and the CONTRIBUTING pointer.
  • Scoped public type:security to non-vulnerability security work (hardening, authz/architecture follow-ups, audit/process, already-disclosed/fixed).
  • Added a 4-step containment procedure for a vuln that lands as a public issue (redact body → redirect to private reporting → consider Private Vulnerability Advisory → only then classify residual structural finding). Explicitly states redaction of pre-existing public issues is in-scope for the triage owner (CTO's ask; octo-web #330 precedent).

@yujiawei P2s:

  • SLA scope contradiction → split into a table: hard SLA (octo-server/octo-web), best-effort target (other repos), exempt (.github meta-repo).
  • Roles not accountable owners → ownership now uses queryable team handles: @Mininglamp-OSS/server-maintainers, @Mininglamp-OSS/web-maintainers, @Mininglamp-OSS/maintainers. Defined "approaches the 7-day line" = open needs-triage age ≥ 5 days.
  • Entry paths → added a Re-entry section: reopened/transferred/imported issues are routed back through triage; noted the createdAt caveat in the backlog query.
  • CONTRIBUTING overstates coverage → softened to "ownership for the busiest repos" + SECURITY.md note.

@mochashanyao (Octo-Q) P2s: F1 security backstop → CEO if CTO unreachable on a P0/P1 nearing the line, plus CTO-routes / SecurityEngineer-owns-once-staffed (no interim gap). F2 .github label gap → meta-repo now explicitly exempt. F3 → priority guide anchored with real precedents (#366/#394/#367/#397).

Re-requesting review.

@lml2468
lml2468 requested a review from yujiawei June 17, 2026 16:17
@lml2468

lml2468 commented Jun 17, 2026

Copy link
Copy Markdown
Contributor Author

🔄 重审(commit 82e9090):此前两条 🔴 已全部修复 → 我的立场从 request-changes 转为 LGTM

作者这版几乎重写了文档(90→135 行),且新增的所有可证伪声明我都对账了线上真实状态。逐条核:

此前 findings 的修复核验

原 finding 新版处理 核验结果
🔴 与 SECURITY.md 冲突(我+yujiawei+Jerry-Xin+Steve 都点到) 顶部 blockquote 明确"漏洞不走公开 triage,走 SECURITY.md 私密上报";Security 段开头加"hard distinction"(undisclosed vuln→私密;public type:security仅限非漏洞安全工作);补"公开误报漏洞的 containment 流程";CONTRIBUTING 段也加 SECURITY.md 链接 彻底修复,超预期
🔴/🟡 SLA 范围自相矛盾 删除"applies to all repos"糊措辞,新增独立"Scope of the SLA"三层表(Hard=两仓 / Best-effort / Exempt=.github 等 meta-repo);backlog 段语义被圈定,不再矛盾 修复
🟡 所有权是角色非具体人(yujiawei+Steve) 改为 3 个真实 GitHub team handle ✅ 修复 —— 已验 server-maintainers(4人)/web-maintainers(3人)/maintainers(4人)均真实存在,链接不 404
🟡 backlog 命令默认遗漏旧 issue(Jerry-Xin) 加 "Re-entry paths" 段 + reopened 扫描提示 ✅ 修复
🔵 优先级示例主观(我+Steve) 改为 6 个真实 issue 判例 超预期 —— 见下表全部对账通过

新增可证伪声明 —— 全部对账线上,逐条吻合

① 优先级表引用的真实 issue(gh issue view):

文档判例 线上真实标签 吻合
octo-server#366 P1 privilege-escalation type:security + priority:P1
octo-server#394 P2 orphan group rows type:bug + priority:P2
octo-server#367 P2 audit gap type:security + priority:P2
octo-server#353 P1 guards-auth-fix-regression type:chore + priority:P1 ✅ 语义吻合
octo-web#397 P3 联系人搜索框 UX good first issue + type:bug + priority:P3
octo-web#330 已 redact 的 containment 判例 type:security + P2 + bug-verified

② #330 redaction 判例真实性: 我读了 #330 的 body —— 顶部正是 CTO 2026-06-17 的 redaction note:"已移除 step-by-step repro + weaponization recipe,结构性发现+防御修复保留,完整 repro 私密追踪于 OCT-15",并反链回本 PR #75。文档拿它当 containment 实例,精确属实

③ 内部锚点: 3 处 (#security-sensitive-issues) 对应 ## Security-sensitive issues slug,✅ 匹配。

🔵 唯一残留 nit(非阻塞,Steve 提的)

文档用 needs-human-verify / needs-more-info 两个标签 —— 我实测 octo-server/octo-web 两仓确实都已定义这两个 label(描述吻合),所以对受 SLA 约束的两仓可用、不影响落地。Steve 的点是 org 标签 taxonomy 文档(octo-board-operations-manual)里没收录这俩 —— 那是 taxonomy 文档与实际 label 的同步问题,不属于本 PR 范畴,建议另开 issue 收口 taxonomy,不必卡这个 PR。

结论:LGTM,两条 🔴 已实质修复,可合并

我撤回此前的 request-changes。事实/机制/一致性三维全部对账通过,无残留 🔴/🟡。

⚠️ 门禁提示:当前 reviewDecision 仍是 CHANGES_REQUESTED —— 因为 yujiawei 那张 CHANGES_REQUESTED 尚未 dismiss/更新(新 commit 会让 mochashanyao/Jerry-Xin 的旧 approve 转 DISMISSED,但不会自动清掉 CR)。合并前需 yujiawei 基于本 commit 重新 review 解除 CR,否则带保护的 merge 仍被卡。这不是内容问题,是流程闭环。

投票:作者 @lml2468 = 我账号本身,无法自审批,故仅以此评论表态 LGTM。

— Octo-PR 🐙(已对账 6 个引用 issue + 3 个 team handle + #330 body redaction + 内部锚点;证据见上)

@yujiawei yujiawei left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Code Review — PR #75 (.github)

Scope: docs-only re-review. Two files, +144/-0: new docs/triage-policy.md (135 lines) + an "Issue Triage" pointer in CONTRIBUTING.md. Reviewed against head 82e9090.

This is round 2. My earlier pass requested changes on one blocking issue (the policy did not reconcile with the existing SECURITY.md) plus several clarity P2s. This revision addresses all of them, and I re-verified every load-bearing claim against the live org rather than trusting the changelog. The blocker is resolved — approving.

Resolution of prior blocker (P1 → fixed)

The security section now opens with a hard distinction and a banner: suspected/undisclosed vulnerabilities follow SECURITY.md (private report to security@mininglamp.com / coordinated disclosure / GitHub Private Vulnerability Advisory), not public triage. SECURITY.md is linked from both the policy and the CONTRIBUTING pointer (../SECURITY.md and SECURITY.md both resolve). Public type:security is now explicitly scoped to non-vulnerability work (hardening, authz/architecture follow-ups, audit/process, already-disclosed items), and a 4-step containment procedure is defined for a vuln that lands as a public issue (redact body → redirect to private reporting → consider Private Vulnerability Advisory → only then classify residual structural finding). The doc also confirms redaction of pre-existing public issues is in-scope for the triage owner. This is consistent with SECURITY.md's "do NOT open a public GitHub issue for vulnerabilities" stance.

Prior P2s — all addressed

  • SLA scope contradiction → now a 3-tier "Scope of the SLA" table (Hard SLA: octo-server/octo-web; Best-effort: other repos; Exempt: this .github meta-repo). Scoping is now stated clearly up front.
  • Roles, not accountable owners → ownership now uses queryable GitHub team handles, and "approaches the 7-day line" is defined as open needs-triage age ≥ 5 days.
  • Entry-path coverage → a Re-entry section now routes reopened/transferred/imported issues back through triage and notes the createdAt caveat in the backlog query.
  • CONTRIBUTING pointer overstated coverage → softened to "ownership for the busiest repos" + a SECURITY.md note.

Verification (claims checked against live org state)

  • Team handles exist. @Mininglamp-OSS/server-maintainers, @Mininglamp-OSS/web-maintainers, and @Mininglamp-OSS/maintainers all resolve as org teams. (Note: they are "closed"-visibility teams, so the linked team pages are visible to org members but will 404 for non-member/public visitors — see N1.)
  • Cited precedents are accurate. Every referenced issue exists, is public, and its real labels match the priority the doc assigns it: octo-server #366 (type:security / P1), #367 (type:security / P2), #394 (type:bug / P2), #353 (type:chore / P1), octo-web #397 (type:bug / P3 / good first issue). The #330 redaction precedent exists (type:security / P2) and is described without exploit detail.
  • No over-disclosure. The cited security issues are already-public architecture/hardening items; the doc adds no exploit detail or new structural disclosure beyond what is already in those public issues. The "never post exploit detail in public" rule is preserved.
  • Links/anchors resolve. SECURITY.md cross-refs, the docs/triage-policy.md relative link, and the #security-sensitive-issues internal anchor all resolve.

Non-blocking notes

  • N1 (nit). Team links use closed-visibility teams, so an external contributor (non-member) following e.g. the server-maintainers link will hit a 404. The handle itself is the right accountability mechanism (and matches CODEOWNERS usage); just be aware the linked page isn't publicly viewable. Optional: drop the hyperlink and keep the bare @org/team handle, or accept that the routing target is org-internal by design.
  • N2 (nit). In "Checking the backlog," the line "Anything with a createdAt older than 7 days is an SLA breach" is still unqualified by repo, while the SLA table scopes the hard 7-day breach to octo-server/octo-web only. With the new scope table up front this is no longer contradictory, but a trailing qualifier (e.g. "...is an SLA breach on the hard-SLA repos; elsewhere it is a best-effort backlog signal") would make the section self-contained. Editorial only.

For the human reviewer (security-sensitive PR)

The policy decision behind the now-resolved P1 — public type:security reserved for non-vulnerability work vs. private disclosure for vulnerabilities — has org governance weight and was explicitly signed off in the PR thread by the CTO role. Worth a human confirming that intent matches the written policy; the implementation in the doc is sound.

Summary

Accurate, internally consistent, and now reconciled with SECURITY.md. All verifiable claims (team handles, cited precedents, labels, links) check out against the live org. The prior blocker is resolved and the P2s are handled; only two editorial nits remain, neither blocking. Approving.

@lml2468
lml2468 merged commit 41a78c1 into main Jun 17, 2026
1 check passed

@mochashanyao mochashanyao left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[Octo-Q · automated review]

Verdict: Approve — no blocking findings; notes below (data-flow traced).


.github PR#75 Review Report

Reviewer: Octo-Q (automated review)
PR: Mininglamp-OSS/.github #75 — docs: org-wide issue triage policy + 7-day triage SLA
Head SHA: 82e90908b49e969548ff98dfc2313937ac2328e6
Files: CONTRIBUTING.md (+9), docs/triage-policy.md (+135, new)
Routing: complexity=security_sensitive (automated review)


1. Verification Summary

Check Status Evidence
SECURITY.md cross-reference ../SECURITY.md link resolves; email security@mininglamp.com matches SECURITY.md
issue-welcome.yml workflow exists .github/workflows/issue-welcome.yml present, applies needs-triage label on issues event, skips bots
Team handles exist server-maintainers, web-maintainers, maintainers all confirmed via gh api orgs/Mininglamp-OSS/teams
Issue #366 (P1 example) Title: "authz: centralized authorization layer + CI guard..." — labels type:security, priority:P1. Matches PR description
Issue #394 (P2 example) Title: "CreateGroup compensating delete is non-atomic → orphan group rows" — labels type:bug, priority:P2. Matches
Issue #367 (P2 example) Title: "audit: record operator on admin management actions..." — labels type:security, priority:P2. Matches
Issue #397 (P3 example) Title: "联系人搜索框不能自动关闭" — labels good first issue, type:bug, priority:P3. Matches
Issue #330 (security containment precedent) Title: "security: OCTO richtext clipboard payload trust boundary..." — labels type:security, priority:P2. Exists and is security-labeled
Issue #353 (P1 borderline example) ⚠️ See Finding #1 below
Security guidance consistency Triage policy correctly distinguishes undisclosed vulns (private disclosure) from non-vuln security work (type:security label). No conflict with SECURITY.md
CONTRIBUTING.md integration New "Issue Triage" section placed between "Reporting Bugs" and "Suggesting Features" — logical position, no structural disruption

2. Findings

Finding #1 — P2 (confidence: 8/10) — Loose characterization of octo-server #353

Diff-scope: new (this PR introduces this reference)

docs/triage-policy.md line ~68 uses octo-server #353 as an example of a P1 borderline case:

"a latent risk that guards an auth fix from regression (e.g. octo-server #353) is P1"

The actual issue #353 is titled "[P1][test] FollowThread/FollowChannel requireActive split is only covered by an integration-tagged test CI never runs" with labels type:chore, priority:P1. It's about test infrastructure coverage for thread/channel follow permission checks, not specifically about guarding an auth fix from regression.

The characterization is directionally reasonable (the test gap could allow regressions in permission-related code to go undetected), but "guards an auth fix" overstates the connection. The issue is type:chore, not type:security.

Impact: Low. This is an illustrative example in a priority guide, not a policy rule. Readers familiar with the project will recognize the issue. New contributors might form a slightly inaccurate mental model of what #353 covers.

Suggestion: Consider rephrasing to: "a latent risk that guards a permission check from regression via CI coverage gaps (e.g. octo-server #353) is P1" — or pick a more clearly auth-related example.

Finding #2 — P2 (confidence: 6/10) — octo-web #330 title still contains specific vulnerability detail

Diff-scope: new (this PR references the redaction as precedent)

The triage policy (line ~93) cites octo-web #330 as precedent for body redaction:

"Precedent: octo-web #330's body was redacted to the structural finding + defensive fix; full detail moved to the internal tracker."

The current issue title still reads: "security: OCTO richtext clipboard payload trust boundary — mention UID injection + broadcast sentinel (attachment fixed in #328, mention open)". This contains fairly specific vulnerability mechanism detail ("mention UID injection", "broadcast sentinel") in a public, searchable location.

Impact: Low-to-moderate. If the redaction precedent is meant to demonstrate best practice, the title's specificity somewhat undercuts the example. However, the attachment vector was already fixed in #328, and the mention-path issue may have been assessed as low-exploitability, making the title detail acceptable.

Suggestion: Verify with the CTO/SecurityEngineer that the current title detail on #330 is intentional post-redaction, not an oversight. No change needed in this PR.

3. Suggestions

  1. Consider adding a one-liner about SECURITY.md response timelines in the security section, e.g. noting that vulnerability reports follow SECURITY.md's 48h-ack / 5-day-assessment timeline separately from the 7-day triage SLA. The two timelines cover different scopes and don't conflict, but a reader encountering both docs might benefit from an explicit note.

  2. Re-entry path gh query enhancement: The "Checking the backlog" section provides a gh issue list command for needs-triage issues. Consider also suggesting gh issue list --state open --json number,title,createdAt --jq '.[] | select(.createdAt < (now - 7days))' or similar to directly surface SLA breaches, since the doc notes "Anything with a createdAt older than 7 days is an SLA breach."

4. Additional Observations

  • The policy's 5-day early-warning threshold ("approaches the 7-day line") with 2-day buffer is a reasonable operational design.
  • The re-entry path documentation (reopened/transferred/imported issues) correctly identifies a gap in the auto-labeling workflow and provides manual mitigation guidance.
  • The type:security label guidance is well-crafted: explicitly warns against applying it to undisclosed vulnerabilities, which would itself be an information disclosure. This is the correct security posture.
  • The CEO backstop for unreachable CTO on P0/P1 security items is a clear escalation path.

5. Data Flow Tracing

This is a documentation-only PR. No runtime data flows are affected. The "data" consumed by this PR's content consists of references to external entities:

Consumed reference Upstream source Verified?
SECURITY.md link .github repo root ✅ File exists, content matches
issue-welcome.yml workflow .github/workflows/ ✅ Exists, applies needs-triage, skips bots
@server-maintainers team GitHub org teams API ✅ Team slug exists
@web-maintainers team GitHub org teams API ✅ Team slug exists
@maintainers team GitHub org teams API ✅ Team slug exists
Issue #366, #367, #394, #397, #330 GitHub Issues API ✅ All exist, titles/labels match descriptions
Issue #353 GitHub Issues API ⚠️ Exists but characterization slightly off (see Finding #1)

6. R5 Blind-Spot Checklist (security_sensitive — mandatory)

  • C1 — Dual-path parity: N/A. Documentation-only PR. No symmetric code paths (add/remove, subscribe/unsubscribe, etc.) are touched.
  • C2 — Control-flow ordering / nested reuse: N/A. No executable code. No sanitization/escape/anchoring logic to test with non-canonical inputs.
  • C3 — Authorization boundary ≠ capability boundary: Clear. The policy correctly maintains the boundary between public triage (non-vulnerability issues) and private vulnerability disclosure (SECURITY.md path). The explicit warning against applying public type:security labels to undisclosed vulns prevents information leakage through label-based enumeration. The "never post exploit detail in public comments" rule is correctly stated.
  • C4 — Authorization lifecycle / container-member state cascade: N/A. Documentation-only PR. No auth code changes.

7. Cross-Round Blocker Recheck

N/A — first review of this PR.


[Octo-Q] verdict: APPROVE

No P0 or P1 findings. Two P2 notes on reference accuracy (octo-server #353 characterization is slightly loose; octo-web #330 title specificity worth verifying). Neither blocks landing. The security guidance is correct, consistent with SECURITY.md, and maintains proper information containment for undisclosed vulnerabilities. Team handles, workflow references, and issue precedents are all verified.

@lml2468

lml2468 commented Jun 17, 2026

Copy link
Copy Markdown
Contributor Author

复核 mochashanyao 的 🟡(P1 示例描述 vs issue 实体)—— 部分妥当,确认非阻塞

我读了两个 P1 判例的 issue 实体逐句比对(此前我只核了标签 priority:P1 吻合,没核描述文字 vs issue 内容 —— 是我的盲点,mochashanyao 戳对了):

  • octo-server#366 — 文档说 "no central authz layer, so a forgotten role check on a /v1/manager route is a silent privilege escalation"。issue 实体精确吻合:body 原文 "A forgotten check is a silent privilege escalation that nothing catches"、"/v1/manager/*"。✅ 准确,无需改。
  • octo-server#353 — 文档把它列为 "a latent risk that guards an auth fix from regression" 的 P1 判例。这里 mochashanyao 的点成立:#353 的实体是 "auth fix 的回归测试因 //go:build integration 而 CI 从不运行"(测试覆盖缺口),标签是 type:chore 而非 type:security。文档措辞"guards an auth fix from regression"方向对(它确实是防回归),但读起来像在说 auth 风险本身,而非测试问题 —— 是精度问题,非事实错误。

定级:🟡 nit,非阻塞。 文档主旨(P1 = 防回归的 latent risk)对 #353 仍成立;只是若想更精确,可把那句改成 "a test-coverage gap that guards an auth fix from silent regression (e.g. octo-server#353 — the regression test is integration-tagged and never runs in CI)",点明它是测试缺口。可改可不改。

门禁: #75 当前 reviewDecision=APPROVED(yujiawei + mochashanyao 双 active approve,无活跃 CR),横幅"2 票通过可合并"这次准确。这条 🟡 是 post-approve 的可选打磨,不阻塞合并 —— 作者可顺手收进描述精度,或单独留个 nit。

我自己的复盘:验"文档引用 issue"时,标签吻合 ≠ 描述吻合,两者都得读。已记下。

— Octo-PR 🐙(已读 #366/#353 body 逐句比对文档措辞;#75 门禁 = APPROVED 已确认)

@Jerry-Xin Jerry-Xin left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Summary: The PR is relevant to the .github repository, but it currently adds public security-sensitive precedent details that contradict the policy’s own disclosure rules.

🔴 Blocking

🔴 Critical — docs/triage-policy.md publishes a concrete privilege-escalation precedent: repo, issue number, missing central authorization layer, affected route family, and impact. The same document says unresolved or undisclosed vulnerabilities must not be publicly triaged or labeled in a searchable way. Because the PR context says these security items are being routed for scheduling, this should be sanitized before merge. Use generic examples instead, or only reference already-fixed/advisory-published items without exploit-enabling detail.

💬 Non-blocking

🔵 Suggestion — CONTRIBUTING.md says new issues are labeled automatically, while docs/triage-policy.md correctly qualifies that this depends on each repo opting into the reusable workflow. Consider adding the same qualifier to the short contributor-facing section to avoid overpromising for repos that have not enabled the caller workflow.

✅ Highlights

The relevance gate passes: org-wide issue triage policy and contributor guidance are in scope for Mininglamp-OSS/.github.

The SLA definition, triaged criteria, re-entry paths, and weekly sweep cadence are clear and align with the existing issue-welcome.yml behavior.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants