skillhub/weekly/site/reports/2026-W31/index.html
XiaoSeS b0b8993ca3 fix(docs): align weekly reports to Thursday close
Signed-off-by: XiaoSeS <87064762+XiaoSeS@users.noreply.github.com>
2026-07-31 17:15:00 +08:00

1729 lines
62 KiB
HTML
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<!doctype html>
<html lang="zh-CN">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width,initial-scale=1">
<meta name="description" content="SkillHub 2026 年第 31 周开源周报:仓库状态、功能迭代、生态进展及项目健康明细。">
<title>SkillHub 开源周报|2026 年第 31 周</title>
<script>document.documentElement.classList.add('js')</script>
<style data-report-theme="notion-light">
:root {
color-scheme: light;
--page: #ffffff;
--paper: #ffffff;
--warm: #f6f5f4;
--ink: #0d0d0d;
--ink-soft: #31302e;
--muted: #615d59;
--faint: #76716c;
--line: #e5e3e1;
--line-soft: #efeeec;
--blue: #0075de;
--blue-active: #005bab;
--blue-soft: #f2f9ff;
--green: #147a33;
--green-soft: #e9f7ec;
--orange: #b84d00;
--orange-soft: #fdf0e3;
--red: #b52d25;
--red-soft: #fdecea;
--neutral-soft: #f1f0ef;
--focus: #097fe8;
--radius-sm: 8px;
--radius: 12px;
--shadow: 0 2px 8px rgb(0 0 0 / 4%);
}
* {
box-sizing: border-box;
}
html {
scroll-behavior: smooth;
}
body {
margin: 0;
background: var(--page);
color: var(--ink);
font: 15px/1.65 Inter, -apple-system, BlinkMacSystemFont, "Segoe UI",
"PingFang SC", "Hiragino Sans GB", "Microsoft YaHei", sans-serif;
text-rendering: optimizeLegibility;
-webkit-font-smoothing: antialiased;
}
a {
color: var(--blue);
text-decoration: none;
text-underline-offset: 3px;
}
a:hover {
color: var(--blue-active);
text-decoration: underline;
}
button,
a {
-webkit-tap-highlight-color: transparent;
}
:focus-visible {
outline: 2px solid var(--focus);
outline-offset: 3px;
}
code {
padding: 1px 4px;
border-radius: 4px;
background: var(--neutral-soft);
color: var(--ink-soft);
font-size: .92em;
}
.skip-link {
position: fixed;
z-index: 30;
top: 8px;
left: -999px;
padding: 8px 12px;
border-radius: 4px;
background: var(--ink-soft);
color: #fff;
}
.skip-link:focus {
left: 8px;
}
.report {
width: min(1200px, 100%);
min-height: 100vh;
margin: 0 auto;
background: var(--paper);
}
.masthead {
padding: 44px 28px 36px;
border-bottom: 1px solid var(--line);
}
.topline {
display: flex;
align-items: center;
justify-content: space-between;
gap: 18px;
margin-bottom: 26px;
}
.brand {
display: flex;
align-items: center;
gap: 10px;
color: var(--ink);
}
.brand-mark {
display: inline-flex;
width: 34px;
height: 34px;
align-items: center;
justify-content: center;
border-radius: 6px;
background: var(--ink-soft);
color: #fff;
font-size: 14px;
font-weight: 700;
letter-spacing: .04em;
}
.brand-name {
font-size: 17px;
font-weight: 700;
letter-spacing: -.01em;
}
.brand-tag {
padding: 4px 10px;
border-radius: 9999px;
background: var(--neutral-soft);
color: var(--muted);
font-size: 12px;
font-weight: 600;
}
.utility-links {
display: flex;
flex-wrap: wrap;
gap: 16px;
font-size: 13px;
}
h1,
h2,
h3 {
text-wrap: balance;
}
h1 {
max-width: 820px;
margin: 0;
color: var(--ink);
font-size: clamp(32px, 4vw, 44px);
line-height: 1.15;
letter-spacing: -.025em;
}
.report-sub {
margin: 8px 0 24px;
color: var(--muted);
font-size: 15px;
}
.header-grid {
display: grid;
grid-template-columns: 1.15fr .85fr;
gap: 16px;
}
.meta-card,
.headline {
border-radius: var(--radius-sm);
padding: 20px 22px;
}
.meta-card {
background: var(--warm);
}
.meta-grid {
display: grid;
grid-template-columns: 1fr 1fr;
gap: 16px 24px;
}
.meta-item .key,
.headline-label {
display: block;
margin-bottom: 4px;
color: var(--faint);
font-size: 12px;
font-weight: 500;
letter-spacing: .01em;
}
.meta-item .value {
color: var(--ink-soft);
font-size: 14px;
font-weight: 600;
}
.period {
margin: 0;
}
.headline {
display: flex;
flex-direction: column;
justify-content: center;
margin: 0;
border: 0;
background: var(--orange-soft);
color: var(--ink-soft);
}
.headline-status {
display: flex;
align-items: center;
gap: 10px;
margin-bottom: 7px;
}
.headline-status strong {
color: var(--orange);
font-size: 22px;
line-height: 1.2;
}
.headline p {
margin: 0;
max-width: 60ch;
}
.metrics {
display: grid;
grid-template-columns: repeat(4, 1fr);
gap: 12px;
margin-top: 18px;
border: 0;
}
.metric {
min-width: 0;
padding: 16px;
border: 0;
border-radius: var(--radius-sm);
background: var(--warm);
}
.metric strong {
display: block;
color: var(--ink);
font-size: 26px;
line-height: 1.15;
letter-spacing: -.02em;
font-variant-numeric: tabular-nums;
}
.metric span {
display: block;
margin-top: 4px;
color: var(--muted);
font-size: 12.5px;
}
.tabs-wrap {
position: sticky;
z-index: 20;
top: 0;
overflow-x: auto;
border-bottom: 1px solid var(--line);
background: rgb(255 255 255 / 97%);
backdrop-filter: saturate(1.1) blur(5px);
}
.tabs {
display: flex;
min-width: max-content;
padding: 0 28px;
}
.tab {
position: relative;
min-height: 48px;
padding: 0 14px;
border: 0;
background: transparent;
color: var(--muted);
cursor: pointer;
font: inherit;
font-size: 14px;
font-weight: 500;
}
.tab::after {
position: absolute;
right: 14px;
bottom: -1px;
left: 14px;
height: 2px;
background: transparent;
content: "";
}
.tab:hover,
.tab[aria-selected="true"] {
color: var(--ink);
}
.tab[aria-selected="true"] {
font-weight: 600;
}
.tab[aria-selected="true"]::after {
background: var(--ink-soft);
}
main {
padding: 0 28px 48px;
}
.tab-panel {
padding-top: 4px;
}
.js .tab-panel[hidden] {
display: none;
}
.panel-intro {
display: flex;
justify-content: space-between;
gap: 24px;
margin: 30px 0 0;
color: var(--muted);
font-size: 13px;
}
.panel-intro p {
margin: 0;
}
section.report-section {
margin: 0;
padding: 48px 0;
border: 0;
}
.tab-panel > section.report-section:nth-of-type(even) {
background: var(--warm);
box-shadow: 0 0 0 100vmax var(--warm);
clip-path: inset(0 -100vmax);
}
section.report-section:first-of-type {
padding-top: 42px;
}
h2 {
margin: 0 0 18px;
color: var(--ink);
font-size: 26px;
line-height: 1.25;
letter-spacing: -.02em;
}
h3 {
margin: 30px 0 12px;
color: var(--ink);
font-size: 18px;
line-height: 1.35;
letter-spacing: -.01em;
}
p {
max-width: 75ch;
text-wrap: pretty;
}
.section-lead {
margin: -7px 0 18px;
color: var(--muted);
}
.table-wrap {
overflow-x: auto;
border: 1px solid var(--line);
border-radius: var(--radius-sm);
background: var(--paper);
}
table {
width: 100%;
min-width: 680px;
border-collapse: collapse;
font-size: 13.5px;
}
caption {
padding: 10px 14px;
background: var(--warm);
color: var(--ink-soft);
font-weight: 600;
text-align: left;
}
th,
td {
padding: 10px 14px;
border-bottom: 1px solid var(--line-soft);
vertical-align: top;
text-align: left;
}
th {
background: var(--warm);
color: var(--muted);
font-size: 12.5px;
font-weight: 600;
white-space: nowrap;
}
tbody tr:last-child td {
border-bottom: 0;
}
tbody tr:hover {
background: #faf9f8;
}
.number {
text-align: right;
white-space: nowrap;
font-variant-numeric: tabular-nums;
}
.status,
.value-level {
display: inline-flex;
align-items: center;
gap: 6px;
min-width: 25px;
padding: 4px 9px;
border: 0;
border-radius: 9999px;
font-size: 12px;
font-weight: 600;
line-height: 1.2;
white-space: nowrap;
}
.status::before {
width: 6px;
height: 6px;
border-radius: 50%;
background: currentColor;
content: "";
}
.status.ok {
background: var(--green-soft);
color: var(--green);
}
.status.warn {
background: var(--orange-soft);
color: var(--orange);
}
.status.risk {
background: var(--red-soft);
color: var(--red);
}
.value-a {
background: var(--red-soft);
color: var(--red);
}
.value-b {
background: var(--orange-soft);
color: var(--orange);
}
.value-c {
background: var(--blue-soft);
color: var(--blue-active);
}
.value-d {
background: var(--neutral-soft);
color: var(--muted);
}
.risk-note {
margin: 16px 0 0;
padding: 14px 18px;
border: 0;
border-radius: var(--radius-sm);
background: var(--orange-soft);
color: var(--ink-soft);
}
.repo-visuals {
display: grid;
grid-template-columns: minmax(280px, .85fr) minmax(0, 1.15fr);
gap: 18px;
}
.snapshot-list {
display: grid;
gap: 0;
}
.snapshot-row {
display: grid;
grid-template-columns: minmax(90px, 1fr) auto;
gap: 4px 16px;
align-items: center;
padding: 13px 0;
border-bottom: 1px solid var(--line-soft);
}
.snapshot-row:first-child {
padding-top: 0;
}
.snapshot-row:last-child {
padding-bottom: 0;
border-bottom: 0;
}
.snapshot-row .snapshot-label {
color: var(--muted);
font-size: 13px;
}
.snapshot-row strong {
color: var(--ink);
font-size: 28px;
line-height: 1.05;
letter-spacing: -.02em;
font-variant-numeric: tabular-nums;
}
.snapshot-row .snapshot-change {
grid-column: 1 / -1;
color: var(--muted);
font-size: 12.5px;
}
.snapshot-row .snapshot-change.positive {
color: var(--green);
}
.snapshot-row .snapshot-change.missing {
color: var(--orange);
}
.chart-note {
margin: 14px 0 0;
padding-top: 12px;
border-top: 1px dashed var(--line);
color: var(--muted);
font-size: 12.5px;
}
.ecosystem-signals {
display: grid;
grid-template-columns: repeat(3, minmax(0, 1fr));
gap: 12px;
margin-bottom: 20px;
}
.ecosystem-signal {
padding: 16px 18px;
border-radius: var(--radius-sm);
background: var(--paper);
box-shadow: inset 0 0 0 1px var(--line);
}
.ecosystem-signal strong {
display: block;
color: var(--ink);
font-size: 24px;
line-height: 1.15;
letter-spacing: -.02em;
font-variant-numeric: tabular-nums;
}
.ecosystem-signal span {
display: block;
margin-top: 5px;
color: var(--muted);
font-size: 12.5px;
}
.ecosystem-signal-note {
grid-column: 1 / -1;
margin: -3px 0 0;
color: var(--faint);
font-size: 12px;
}
.ecosystem-list,
.method-list {
margin: 0;
padding: 0;
border-top: 1px solid var(--line);
list-style: none;
}
.ecosystem-list li,
.method-list li {
display: grid;
grid-template-columns: 150px 1fr;
gap: 20px;
padding: 13px 0;
border-bottom: 1px solid var(--line);
}
.method-list li {
grid-template-columns: 180px 1fr;
}
.ecosystem-list strong,
.method-list strong {
color: var(--ink);
}
.next-actions {
margin: 4px 0 30px;
padding: 20px 22px;
border: 1px solid var(--line);
border-radius: var(--radius);
background: var(--paper);
}
.next-actions h2 {
margin-bottom: 8px;
font-size: 18px;
}
.next-actions ol {
margin: 0;
padding-left: 22px;
}
.next-actions li {
margin: 7px 0;
}
.health-cards {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(280px, 1fr));
gap: 16px;
}
.health-card,
.chart-box,
.health-note {
border: 1px solid var(--line);
border-radius: var(--radius);
background: var(--paper);
box-shadow: var(--shadow);
}
.health-card {
display: flex;
flex-direction: column;
gap: 9px;
padding: 20px 22px;
}
.health-card .top {
display: flex;
align-items: center;
justify-content: space-between;
gap: 10px;
}
.health-card .name {
color: var(--ink);
font-size: 15px;
font-weight: 700;
}
.health-card .health-metric {
color: var(--ink);
font-size: 27px;
font-weight: 700;
line-height: 1.1;
letter-spacing: -.02em;
font-variant-numeric: tabular-nums;
}
.health-card .health-metric small {
color: var(--muted);
font-size: 13px;
font-weight: 500;
letter-spacing: 0;
}
.health-card p {
margin: 0;
color: var(--ink-soft);
font-size: 13.5px;
}
.health-card .detail {
padding-top: 9px;
border-top: 1px dashed var(--line);
color: var(--muted);
font-size: 12.5px;
}
.segbar {
display: flex;
height: 24px;
overflow: hidden;
margin: 15px 0 10px;
border-radius: 6px;
background: var(--neutral-soft);
}
.segbar > span {
min-width: 2px;
height: 100%;
}
.seg-success {
background: #1aae39;
}
.seg-failure {
background: #e16259;
}
.seg-auth {
background: #e8a94b;
}
.seg-skipped {
background: #d6d2cd;
}
.seg-cancelled {
background: #8e8984;
}
.chart-legend {
display: flex;
flex-wrap: wrap;
gap: 8px 20px;
color: var(--muted);
font-size: 13px;
}
.chart-legend span {
display: inline-flex;
align-items: center;
gap: 7px;
}
.chart-legend i {
width: 10px;
height: 10px;
border-radius: 3px;
}
.chart-legend b {
color: var(--ink-soft);
font-variant-numeric: tabular-nums;
}
.chart-grid {
display: grid;
grid-template-columns: repeat(2, minmax(0, 1fr));
gap: 18px;
}
.chart-box {
padding: 20px 22px;
}
.chart-box h3 {
margin: 0 0 14px;
font-size: 15px;
}
.bars {
display: grid;
gap: 11px;
}
.bar-row {
display: grid;
grid-template-columns: 88px 1fr 42px;
gap: 10px;
align-items: center;
font-size: 13px;
}
.repo-visuals .bar-row {
grid-template-columns: 112px 1fr 36px;
}
.bar-label {
color: var(--muted);
white-space: nowrap;
}
.bar-track {
height: 16px;
overflow: hidden;
border-radius: 5px;
background: var(--neutral-soft);
}
.bar-fill {
display: block;
height: 100%;
min-width: 2px;
border-radius: 5px;
background: var(--blue);
}
.bar-fill.hot {
background: var(--orange);
}
.bar-value {
color: var(--ink-soft);
font-weight: 700;
text-align: right;
font-variant-numeric: tabular-nums;
}
.donut-layout {
display: grid;
grid-template-columns: 150px 1fr;
gap: 22px;
align-items: center;
}
.donut {
position: relative;
width: 142px;
height: 142px;
border-radius: 50%;
background: conic-gradient(var(--orange) 0 var(--value), #d6d2cd var(--value) 100%);
}
.donut::after {
position: absolute;
inset: 24px;
border-radius: 50%;
background: var(--paper);
content: "";
}
.donut-center {
position: absolute;
z-index: 1;
inset: 0;
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
}
.donut-center strong {
color: var(--ink);
font-size: 26px;
line-height: 1.1;
}
.donut-center span {
color: var(--muted);
font-size: 12px;
}
.donut-copy p {
margin: 0 0 9px;
color: var(--ink-soft);
font-size: 13.5px;
}
.donut-copy p:last-child {
margin-bottom: 0;
}
.health-grid {
display: grid;
grid-template-columns: repeat(2, minmax(0, 1fr));
gap: 18px;
margin-top: 18px;
}
.chart-box + .table-wrap {
margin-top: 18px;
}
.health-note {
padding: 18px;
}
.health-note h3 {
margin: 0 0 7px;
font-size: 15px;
}
.health-note p {
margin: 0;
color: var(--ink-soft);
}
.flow-summary {
display: grid;
grid-template-columns: repeat(2, minmax(0, 1fr));
gap: 12px;
margin: 18px 0 24px;
}
.flow-item {
padding: 16px 18px;
border-radius: var(--radius-sm);
background: var(--warm);
}
.flow-item strong {
display: block;
color: var(--ink);
font-size: 20px;
font-variant-numeric: tabular-nums;
}
.flow-item span {
color: var(--muted);
font-size: 12.5px;
}
details {
margin-top: 16px;
border: 1px solid var(--line);
border-radius: var(--radius);
background: var(--paper);
}
summary {
padding: 14px 18px;
color: var(--ink-soft);
cursor: pointer;
font-weight: 700;
}
.details-body {
padding: 0 18px 16px;
}
footer {
display: flex;
justify-content: space-between;
gap: 24px;
padding: 22px 28px 28px;
border-top: 1px solid var(--line);
background: var(--warm);
color: var(--muted);
font-size: 12px;
}
.sr-only {
position: absolute;
width: 1px;
height: 1px;
padding: 0;
margin: -1px;
overflow: hidden;
clip: rect(0, 0, 0, 0);
white-space: nowrap;
border: 0;
}
@media (max-width: 760px) {
.masthead,
main,
footer {
padding-right: 18px;
padding-left: 18px;
}
.topline,
footer,
.panel-intro {
align-items: flex-start;
flex-direction: column;
gap: 8px;
}
.header-grid,
.meta-grid,
.repo-visuals,
.chart-grid,
.health-grid,
.flow-summary {
grid-template-columns: 1fr;
}
.header-grid > *,
.meta-item {
min-width: 0;
}
.meta-item .value {
overflow-wrap: anywhere;
}
.metrics {
grid-template-columns: repeat(2, 1fr);
}
.tabs {
padding: 0 6px;
}
section.report-section {
padding: 38px 0;
}
.ecosystem-list li,
.method-list li {
grid-template-columns: 1fr;
gap: 3px;
}
.ecosystem-signals {
grid-template-columns: 1fr;
}
.ecosystem-signal-note {
grid-column: auto;
}
.donut-layout {
grid-template-columns: 1fr;
justify-items: center;
}
.donut-copy {
text-align: center;
}
}
@media (max-width: 430px) {
h1 {
font-size: 30px;
overflow-wrap: anywhere;
}
.bar-row {
grid-template-columns: 76px 1fr 32px;
gap: 7px;
}
.repo-visuals .bar-row {
grid-template-columns: 98px 1fr 28px;
}
}
@media (prefers-reduced-motion: reduce) {
html {
scroll-behavior: auto;
}
}
@media print {
@page {
size: A4;
margin: 13mm;
}
body {
background: #fff;
font-size: 10px;
}
.report {
width: 100%;
}
.masthead,
main,
footer {
padding-right: 0;
padding-left: 0;
}
.tabs-wrap,
.skip-link,
.utility-links {
display: none !important;
}
.tab-panel[hidden] {
display: block !important;
}
.tab-panel {
break-before: page;
}
.tab-panel:first-child {
break-before: auto;
}
.tab-panel > section.report-section:nth-of-type(even) {
background: #fff;
box-shadow: none;
clip-path: none;
}
section.report-section {
padding: 16px 0;
}
h1 {
font-size: 27px;
}
h2,
h3,
tr,
.health-card,
.health-note,
.chart-box,
.next-actions {
break-inside: avoid;
}
table {
min-width: 0;
font-size: 8px;
}
th,
td {
padding: 5px 6px;
}
.health-card,
.health-note,
.chart-box {
box-shadow: none;
}
.segbar,
.bar-fill,
.donut,
.status,
.value-level,
.metric,
.headline {
print-color-adjust: exact;
-webkit-print-color-adjust: exact;
}
}
</style>
<noscript>
<style>
.tabs-wrap { display: none !important; }
.tab-panel[hidden] { display: block !important; }
</style>
</noscript>
</head>
<body>
<a class="skip-link" href="#report-content">跳到报告正文</a>
<article class="report"
data-period-start="2026-07-24T00:00:00+08:00"
data-period-end="2026-07-31T00:00:00+08:00"
data-period-boundary="[)"
data-snapshot-at="2026-07-31T14:35:33+08:00"
data-star-evidence="current-visible-arrivals"
data-star-api-status="success"
data-star-arrivals="130"
data-star-observed-at="2026-07-31T16:35:58+08:00"
data-star-start-at=""
data-star-end-at="">
<header class="masthead">
<div class="topline">
<div class="brand">
<span class="brand-mark" aria-hidden="true">SH</span>
<span class="brand-name">SkillHub</span>
<span class="brand-tag">开源周报</span>
</div>
<nav class="utility-links" aria-label="站点链接">
<a href="../../archive.html">历史周报</a>
<a href="https://iflytek.github.io/skillhub/">项目文档</a>
<a href="https://github.com/iflytek/skillhub">GitHub 仓库</a>
</nav>
</div>
<h1>2026 年第 31 周</h1>
<p class="report-sub">项目健康 · 版本交付 · 开源生态 · Issue/PR 流转与价值队列</p>
<div class="header-grid">
<div class="meta-card">
<div class="meta-grid">
<div class="meta-item">
<span class="key">统计周期</span>
<span class="value">2026-07-24 00:00—2026-07-30 23:59 · Asia/Shanghai</span>
</div>
<div class="meta-item">
<span class="key">当前状态快照</span>
<span class="value">2026-07-31 14:35(Asia/Shanghai)</span>
</div>
<div class="meta-item">
<span class="key">项目仓库</span>
<span class="value"><a href="https://github.com/iflytek/skillhub">iflytek/skillhub</a></span>
</div>
<div class="meta-item">
<span class="key">数据来源</span>
<span class="value">GitHub API(认证)· Actions · Git · npm Downloads API</span>
</div>
</div>
</div>
<div class="headline">
<span class="headline-label">总体状态</span>
<div class="headline-status">
<strong>需关注</strong>
<span class="status warn">Attention</span>
</div>
<p>周期内 Actions 有效成功率为 98.2%,应用 v0.2.15 已发布、CLI 未发版;Issue 净流入 21 个,当前开放 P1 达 21 个,是主要风险。</p>
</div>
</div>
<div class="metrics" aria-label="四项核心指标">
<div class="metric"><strong>4,849</strong><span>Stars · 本期当前可见新增 130</span></div>
<div class="metric"><strong>703</strong><span>Forks · 本期当前可见创建 58</span></div>
<div class="metric"><strong>98.2%</strong><span>Actions 有效成功率 · 278/283</span></div>
<div class="metric"><strong>1 / 0</strong><span>应用 / CLI Release · 本期</span></div>
</div>
</header>
<div class="tabs-wrap">
<nav class="tabs" role="tablist" aria-label="周报视图">
<button class="tab" id="tab-overview" type="button" role="tab" aria-selected="true"
aria-controls="panel-overview" tabindex="0" data-tab="overview">总览</button>
<button class="tab" id="tab-health" type="button" role="tab" aria-selected="false"
aria-controls="panel-health" tabindex="-1" data-tab="health">项目健康</button>
<button class="tab" id="tab-flow" type="button" role="tab" aria-selected="false"
aria-controls="panel-flow" tabindex="-1" data-tab="flow">Issue 与 PR</button>
<button class="tab" id="tab-method" type="button" role="tab" aria-selected="false"
aria-controls="panel-method" tabindex="-1" data-tab="method">数据说明</button>
</nav>
</div>
<main id="report-content">
<div class="tab-panel" id="panel-overview" role="tabpanel" tabindex="0"
aria-labelledby="tab-overview" data-panel="overview">
<div class="panel-intro">
<p>三分钟总览:只保留仓库、迭代和生态三类决策信息。</p>
<p>详细健康和维护队列请使用上方 Tab。</p>
</div>
<section class="report-section" data-module="repository-summary" aria-labelledby="repository-title">
<h2 id="repository-title">一、仓库关键信息</h2>
<div class="repo-visuals">
<div class="chart-box" data-module="repository-scale">
<h3>规模快照</h3>
<div class="snapshot-list">
<div class="snapshot-row">
<span class="snapshot-label">Stars</span>
<strong>4,849</strong>
<span class="snapshot-change positive">本期当前可见新增 130</span>
</div>
<div class="snapshot-row">
<span class="snapshot-label">Forks</span>
<strong>703</strong>
<span class="snapshot-change positive">当前可见本期创建 58</span>
</div>
</div>
<p class="chart-note">Stars 与 Forks 的本期值按认证 API 中当前仍可见、创建时间落入半开周期的记录统计;分别为 130 与 58,不代表库存净增长。</p>
</div>
<div class="chart-box" data-module="weekly-collaboration-chart">
<h3>本期协作流转</h3>
<div class="bars" role="img" aria-label="W31 协作流转:Issue 新增 24 个、关闭 3 个;PR 新增 24 个、合并 20 个、关闭未合并 6 个">
<div class="bar-row"><span class="bar-label">Issue 新增</span><span class="bar-track"><span class="bar-fill" style="width:100%"></span></span><span class="bar-value">24</span></div>
<div class="bar-row"><span class="bar-label">Issue 关闭</span><span class="bar-track"><span class="bar-fill" style="width:12.5%"></span></span><span class="bar-value">3</span></div>
<div class="bar-row"><span class="bar-label">PR 新增</span><span class="bar-track"><span class="bar-fill" style="width:100%"></span></span><span class="bar-value">24</span></div>
<div class="bar-row"><span class="bar-label">PR 合并</span><span class="bar-track"><span class="bar-fill" style="width:83.3%"></span></span><span class="bar-value">20</span></div>
<div class="bar-row"><span class="bar-label">PR 关闭未合并</span><span class="bar-track"><span class="bar-fill" style="width:25%"></span></span><span class="bar-value">6</span></div>
</div>
<p class="chart-note">周期内 Issue 净流入 21,PR 净流出 2;当前快照开放 Issue 46 个、PR 16 个。主分支新增 56 个提交,本期合并 20 个 PR。</p>
</div>
</div>
<p class="risk-note"><strong>主要风险:</strong>Issue 输入速度显著高于处置速度,当前开放 P1 21 个、<code>triage/needs-info</code> 28 个;应用 v0.2.15 已在本期发布,但 CLI 仍停留在 0.1.9。</p>
</section>
<section class="report-section" data-module="feature-iterations" aria-labelledby="feature-title">
<h2 id="feature-title">二、功能迭代信息</h2>
<div class="table-wrap">
<table>
<caption>按用户价值排序的重要事项</caption>
<thead><tr><th>状态</th><th>事项</th><th>进展与下一步</th></tr></thead>
<tbody>
<tr>
<td><span class="status ok">已完成</span></td>
<td>部署与生产化</td>
<td><a href="https://github.com/iflytek/skillhub/pull/443">Nginx 代理信任边界</a>与 <a href="https://github.com/iflytek/skillhub/pull/445">Helm Chart 部署方案</a>在周期内合并,补齐反向代理和 Kubernetes 部署能力。</td>
</tr>
<tr>
<td><span class="status ok">已完成</span></td>
<td>认证、CLI 与身份核心</td>
<td>修复 <a href="https://github.com/iflytek/skillhub/pull/607">Device Auth Redis 反序列化</a>、<a href="https://github.com/iflytek/skillhub/pull/608">Namespace 坐标</a>与 <a href="https://github.com/iflytek/skillhub/pull/610">403 错误语义</a>;<a href="https://github.com/iflytek/skillhub/pull/643">统一身份核心</a>在周期内合并。</td>
</tr>
<tr>
<td><span class="status ok">已完成</span></td>
<td>发布与搜索一致性</td>
<td><a href="https://github.com/iflytek/skillhub/pull/601">驳回版本重传</a>和 <a href="https://github.com/iflytek/skillhub/pull/592">标签变更后重建搜索索引</a>已合并,关闭两条核心流程缺陷。</td>
</tr>
<tr>
<td><span class="status ok">已完成</span></td>
<td>生态与文档补全</td>
<td><a href="https://github.com/iflytek/skillhub/pull/593">社区 FAQ</a>、<a href="https://github.com/iflytek/skillhub/pull/598">HarnessClaw 指南</a>、<a href="https://github.com/iflytek/skillhub/pull/599">README Star/Watch 引导</a>与 <a href="https://github.com/iflytek/skillhub/pull/603">生态入口 #603</a>均在周期内合并。</td>
</tr>
<tr>
<td><span class="status ok">已完成</span></td>
<td><a href="https://github.com/iflytek/skillhub/releases/tag/v0.2.15">应用 v0.2.15</a></td>
<td>7 月 30 日 16:25 发布,包含本期已合并的部署、认证、发布与搜索改动;计入 W31 应用 Release。</td>
</tr>
</tbody>
</table>
</div>
</section>
<section class="report-section" data-module="ecosystem-progress" aria-labelledby="ecosystem-title">
<h2 id="ecosystem-title">三、生态相关进展</h2>
<div class="ecosystem-signals" data-module="ecosystem-signals" role="img"
aria-label="W31 开源生态参与信号:新增 Issue 作者 2 位、新增 PR 作者 6 位、合并作者 11 位;当前可见本期创建 Fork 58 个;SkillHub CLI 在 2026 年 7 月 24 日至 30 日 UTC 日桶下载 909 次">
<div class="ecosystem-signal"><strong>2 / 6 / 11</strong><span>新增 Issue 作者 / PR 作者 / 合并作者</span></div>
<div class="ecosystem-signal"><strong>58</strong><span>当前可见本期创建 Fork</span></div>
<div class="ecosystem-signal"><strong>909</strong><span>CLI 下载 · 7 个 UTC 日桶</span></div>
<p class="ecosystem-signal-note">以上为独立参与信号,不构成转化漏斗。</p>
</div>
<ul class="ecosystem-list">
<li><strong>社区贡献</strong><span>20 个 PR 由 11 位作者完成合并,贡献覆盖部署、认证、CLI、核心流程与文档。</span></li>
<li><strong>Agent 集成</strong><span><a href="https://github.com/iflytek/skillhub/pull/598">HarnessClaw Engine 指南</a> 已合并,新增一条 Agent 生态接入路径。</span></li>
<li><strong>项目可发现性</strong><span><a href="https://github.com/iflytek/skillhub/pull/599">README Star/Watch 引导</a>与 <a href="https://github.com/iflytek/skillhub/pull/603">Trendshift、AAIF 入口</a>均在周期内落地。</span></li>
</ul>
</section>
<aside class="next-actions" data-module="next-actions" aria-labelledby="next-title">
<h2 id="next-title">下周关注</h2>
<p>以下动作延续到下一期跟踪。</p>
<ol>
<li>为 21 个开放 P1 Issue 明确负责人和处置顺序,并批量处理 28 个 <code>triage/needs-info</code> Issue。</li>
<li>优先审查 <a href="https://github.com/iflytek/skillhub/pull/623">#623</a>、<a href="https://github.com/iflytek/skillhub/pull/624">#624</a>、<a href="https://github.com/iflytek/skillhub/pull/639">#639</a> 与 <a href="https://github.com/iflytek/skillhub/pull/633">#633</a>,减少高价值开放 PR。</li>
<li>明确 CLI 发版窗口;<a href="https://github.com/iflytek/skillhub/pull/608">#608 Namespace 修复</a>已进入源码,但尚未包含在 npm CLI 0.1.9 中。</li>
</ol>
</aside>
</div>
<div class="tab-panel" id="panel-health" role="tabpanel" tabindex="0"
aria-labelledby="tab-health" data-panel="health" hidden>
<div class="panel-intro">
<p>项目健康详情:用于维护者判断工程、交付和治理风险。</p>
<p>成功流水线不等同于“无漏洞”。</p>
</div>
<section class="report-section" data-module="health-summary" aria-labelledby="health-summary-title">
<h2 id="health-summary-title">项目健康状态</h2>
<div class="health-cards">
<article class="health-card">
<div class="top"><span class="name">工程稳定性</span><span class="status ok">稳定</span></div>
<div class="health-metric">98.2% <small>278/283</small></div>
<p>有效运行中有 5 次失败。</p>
<div class="detail">PR Tests 1 次、PR E2E Tests 3 次、DeepWiki 1 次。</div>
</article>
<article class="health-card">
<div class="top"><span class="name">安全流水线</span><span class="status ok">稳定</span></div>
<div class="health-metric">69 / 69 <small>执行成功</small></div>
<p>另有 12 次等待授权、18 次条件跳过。</p>
<div class="detail">执行成功不代表公开漏洞数量为 0。</div>
</article>
<article class="health-card">
<div class="top"><span class="name">自动化运营</span><span class="status warn">需关注</span></div>
<div class="health-metric">28 / 28 <small>Backlog Rescore</small></div>
<p>Publish Images 12/12,文档部署 4/4。</p>
<div class="detail">Issue Triage 成功 36 次、条件跳过 62 次。</div>
</article>
<article class="health-card">
<div class="top"><span class="name">Release 交付</span><span class="status warn">部分达成</span></div>
<div class="health-metric">1 / 0 <small>应用 / CLI</small></div>
<p><a href="https://github.com/iflytek/skillhub/releases/tag/v0.2.15">v0.2.15</a> 于本期 7 月 30 日 16:25 发布。</p>
<div class="detail">CLI 周期内及期后均无新版本,最新仍为 0.1.9。</div>
</article>
<article class="health-card">
<div class="top"><span class="name">Issue 治理</span><span class="status risk">风险</span></div>
<div class="health-metric">+21 <small>本期净流入</small></div>
<p>当前开放 46 个,其中 P1 21 个、<code>triage/needs-info</code> 28 个。</p>
<div class="detail">输入速度明显高于关闭速度,是当前首要治理风险。</div>
</article>
<article class="health-card">
<div class="top"><span class="name">PR 治理</span><span class="status ok">期内净流出</span></div>
<div class="health-metric">-2 <small>本期净流量</small></div>
<p>合并 20 个、关闭未合并 6 个,当前开放 16 个。</p>
<div class="detail">当前 30 天以上 PR 为 3 个,仍需逐项做关闭或推进决策。</div>
</article>
</div>
</section>
<section class="report-section" data-module="workflow-execution" aria-labelledby="ci-title">
<h2 id="ci-title">CI 与自动化执行</h2>
<p class="section-lead">统计期内有 451 条 Actions 记录,其中 278 次成功、5 次失败、43 次等待授权、119 次跳过、6 次取消。</p>
<div class="chart-box" data-module="actions-outcome-chart">
<h3>Actions 结果构成</h3>
<div class="segbar" role="img" aria-label="W31 Actions 共 451 条记录:成功 278,失败 5,等待授权 43,条件跳过 119,取消 6">
<span class="seg-success" style="width:61.64%"></span>
<span class="seg-failure" style="width:1.11%"></span>
<span class="seg-auth" style="width:9.53%"></span>
<span class="seg-skipped" style="width:26.39%"></span>
<span class="seg-cancelled" style="width:1.33%"></span>
</div>
<div class="chart-legend" aria-hidden="true">
<span><i class="seg-success"></i>成功 <b>278</b></span>
<span><i class="seg-failure"></i>失败 <b>5</b></span>
<span><i class="seg-auth"></i>等待授权 <b>43</b></span>
<span><i class="seg-skipped"></i>跳过 <b>119</b></span>
<span><i class="seg-cancelled"></i>取消 <b>6</b></span>
</div>
</div>
<div class="table-wrap">
<table>
<caption>工作流执行明细</caption>
<thead>
<tr><th>工作流</th><th class="number">总记录</th><th class="number">成功</th><th class="number">失败</th><th class="number">等待授权</th><th class="number">跳过/取消</th></tr>
</thead>
<tbody>
<tr><td>PR Tests</td><td class="number">84</td><td class="number">51</td><td class="number">1</td><td class="number">12</td><td class="number">20</td></tr>
<tr><td>PR E2E Tests</td><td class="number">73</td><td class="number">36</td><td class="number">3</td><td class="number">12</td><td class="number">22</td></tr>
<tr><td>PR Scripts</td><td class="number">36</td><td class="number">30</td><td class="number">0</td><td class="number">6</td><td class="number">0</td></tr>
<tr><td>Security</td><td class="number">99</td><td class="number">69</td><td class="number">0</td><td class="number">12</td><td class="number">18</td></tr>
<tr><td>Issue Triage</td><td class="number">98</td><td class="number">36</td><td class="number">0</td><td class="number">0</td><td class="number">62</td></tr>
<tr><td>Issue Backlog Rescore</td><td class="number">28</td><td class="number">28</td><td class="number">0</td><td class="number">0</td><td class="number">0</td></tr>
<tr><td>Publish Images</td><td class="number">12</td><td class="number">12</td><td class="number">0</td><td class="number">0</td><td class="number">0</td></tr>
<tr><td>Deploy Docs</td><td class="number">4</td><td class="number">4</td><td class="number">0</td><td class="number">0</td><td class="number">0</td></tr>
<tr><td>其他自动化</td><td class="number">17</td><td class="number">12</td><td class="number">1</td><td class="number">1</td><td class="number">3</td></tr>
</tbody>
</table>
</div>
<p class="risk-note"><strong>本期薄弱点:</strong>5 次失败来自 PR Tests 1 次、PR E2E Tests 3 次和 DeepWiki 1 次;等待授权共 43 次,不计入有效成功率分母。</p>
</section>
<section class="report-section" data-module="delivery-and-backlog" aria-labelledby="delivery-title">
<h2 id="delivery-title">安全、Release 与存量健康</h2>
<div class="health-grid">
<article class="health-note">
<h3>安全与供应链</h3>
<p>Security 69 次实际执行全部成功。公开数据无法确认 Dependabot、CodeQL 未修复告警和生产扫描任务数量。</p>
</article>
<article class="health-note">
<h3>Release 交付</h3>
<p>周期内应用 Release 为 1、CLI Release 为 0;<a href="https://github.com/iflytek/skillhub/releases/tag/v0.2.15">应用 v0.2.15</a> 于 7 月 30 日 16:25 发布。#608 的 Namespace 修复尚未进入 npm CLI 0.1.9。</p>
</article>
</div>
<h3>Issue 健康</h3>
<div class="chart-grid">
<div class="chart-box" data-module="issue-age-chart">
<h3>开放 Issue 年龄结构</h3>
<div class="bars" role="img" aria-label="W31 当前开放 Issue 46 个:不足 7 天 26 个,7 到 13 天 4 个,14 到 29 天 4 个,30 天以上 12 个">
<div class="bar-row"><span class="bar-label">&lt; 7 天</span><span class="bar-track"><span class="bar-fill" style="width:100%"></span></span><span class="bar-value">26</span></div>
<div class="bar-row"><span class="bar-label">7—13 天</span><span class="bar-track"><span class="bar-fill" style="width:15.4%"></span></span><span class="bar-value">4</span></div>
<div class="bar-row"><span class="bar-label">14—29 天</span><span class="bar-track"><span class="bar-fill" style="width:15.4%"></span></span><span class="bar-value">4</span></div>
<div class="bar-row"><span class="bar-label">≥ 30 天</span><span class="bar-track"><span class="bar-fill hot" style="width:46.2%"></span></span><span class="bar-value">12</span></div>
</div>
<p class="chart-note">当前快照包含期后进展;短期 Issue 占比高,治理压力集中在分诊、补充信息和价值判断。</p>
</div>
<div class="chart-box" data-module="issue-needs-info-chart">
<h3><code>needs-info</code> 占比</h3>
<div class="donut-layout">
<div class="donut" style="--value:60.9%" role="img" aria-label="W31 当前开放 Issue 中,28 个带 triage/needs-info 标签,占 46 个开放 Issue 的 60.9%">
<div class="donut-center"><strong>60.9%</strong><span>28 / 46</span></div>
</div>
<div class="donut-copy">
<p><strong>28 个</strong>开放 Issue 仍需补充信息。</p>
<p>该比例是当前快照,不作为周期趋势;需要集中澄清或关闭。</p>
</div>
</div>
</div>
</div>
<h3>PR 健康</h3>
<div class="chart-box" data-module="pr-age-chart">
<h3>开放 PR 年龄结构</h3>
<div class="bars" role="img" aria-label="W31 当前开放 PR 16 个:不足 7 天 11 个,7 到 13 天 0 个,14 到 29 天 2 个,30 天以上 3 个">
<div class="bar-row"><span class="bar-label">&lt; 7 天</span><span class="bar-track"><span class="bar-fill" style="width:100%"></span></span><span class="bar-value">11</span></div>
<div class="bar-row"><span class="bar-label">7—13 天</span><span class="bar-track"><span class="bar-fill" style="width:0%"></span></span><span class="bar-value">0</span></div>
<div class="bar-row"><span class="bar-label">14—29 天</span><span class="bar-track"><span class="bar-fill" style="width:18.2%"></span></span><span class="bar-value">2</span></div>
<div class="bar-row"><span class="bar-label">≥ 30 天</span><span class="bar-track"><span class="bar-fill hot" style="width:27.3%"></span></span><span class="bar-value">3</span></div>
</div>
<p class="chart-note">30 天以上 PR 占当前开放队列的 18.8%;该快照包含期后新增项,不用于反推本期存量变化。</p>
</div>
</section>
<section class="report-section" data-module="observable-response" aria-labelledby="response-title">
<h2 id="response-title">社区响应</h2>
<p>24 个新增 Issue 中,<a href="https://github.com/iflytek/skillhub/issues/604">#604</a> 与 <a href="https://github.com/iflytek/skillhub/issues/611">#611</a> 在周期内关闭;#604—#606 已形成 #607—#610 的修复或回归。新增输入主要集中在认证、事务一致性、身份联邦和 Web 工程问题;该口径不等同于首次维护者响应 SLA。</p>
</section>
</div>
<div class="tab-panel" id="panel-flow" role="tabpanel" tabindex="0"
aria-labelledby="tab-flow" data-panel="flow" hidden>
<div class="panel-intro">
<p>先看本周流转,再看当前高价值维护队列。</p>
<p>价值级别是人工治理判断,不替代仓库标签。</p>
</div>
<section class="report-section" data-module="weekly-flow" aria-labelledby="flow-title">
<h2 id="flow-title">本周 Issue 与 PR 流转</h2>
<div class="flow-summary">
<div class="flow-item"><strong>Issue +24 / -3</strong><span>净流入 21 · 当前快照开放 46</span></div>
<div class="flow-item"><strong>PR +24 / 合并 20</strong><span>关闭未合并 6 · 净流出 2 · 当前开放 16</span></div>
</div>
<h3>新增 Issue(按价值排序)</h3>
<div class="table-wrap">
<table>
<caption class="sr-only">W31 新增 Issue 价值排序</caption>
<thead><tr><th>价值</th><th>Issue</th><th>判断</th><th>当前进展</th></tr></thead>
<tbody>
<tr><td><span class="value-level value-a">A</span></td><td><a href="https://github.com/iflytek/skillhub/issues/604">#604 Device Auth Redis 反序列化</a> / <a href="https://github.com/iflytek/skillhub/issues/605">#605 Token 撤销后仍放行</a> / <a href="https://github.com/iflytek/skillhub/issues/606">#606 CLI Namespace 与 403 语义</a></td><td>影响 CLI 登录、凭证撤销和命名空间解析。</td><td>#604 已在周期内关闭;#607—#610 已合并,#605、#606 仍需核对关闭条件。</td></tr>
<tr><td><span class="value-level value-a">A</span></td><td><a href="https://github.com/iflytek/skillhub/issues/611">#611 删除版本残留子外键</a> / <a href="https://github.com/iflytek/skillhub/issues/612">#612 扫描任务早于事务提交</a></td><td>直接影响版本删除和发布扫描一致性。</td><td>#611 于本期关闭;#612 仍开放,需补事务后触发回归。</td></tr>
<tr><td><span class="value-level value-a">A</span></td><td><a href="https://github.com/iflytek/skillhub/issues/613">#613 并发 OAuth 绑定 500</a> / <a href="https://github.com/iflytek/skillhub/issues/614">#614 旧 Session 阻断公开 API</a></td><td>影响登录与公开技能访问。</td><td>当前仍开放,需覆盖并发约束和失效会话回归。</td></tr>
<tr><td><span class="value-level value-a">A</span></td><td><a href="https://github.com/iflytek/skillhub/issues/615">#615 审核审计部分成功</a> / <a href="https://github.com/iflytek/skillhub/issues/617">#617 首次发布坐标竞争</a></td><td>可能造成客户端认知与服务端状态不一致。</td><td>当前仍开放,优先处理幂等与事务一致性。</td></tr>
<tr><td><span class="value-level value-b">B</span></td><td><a href="https://github.com/iflytek/skillhub/issues/616">#616 MVC 客户端错误返回 500</a> / <a href="https://github.com/iflytek/skillhub/issues/618">#618 Web 类型隔离</a></td><td>分别影响 API 错误语义和前端构建稳定性。</td><td>#618 已有开放 PR #619;#616 仍待实现。</td></tr>
<tr><td><span class="value-level value-b">B</span></td><td><a href="https://github.com/iflytek/skillhub/issues/620">#620 审核进度</a> / <a href="https://github.com/iflytek/skillhub/issues/621">#621 主题持久化</a> / <a href="https://github.com/iflytek/skillhub/issues/622">#622 通知轮询</a></td><td>均有用户体验价值,但实现范围与优先级不同。</td><td>仍处于议题阶段,应先拆验收标准再排期。</td></tr>
<tr><td><span class="value-level value-a">A</span></td><td><a href="https://github.com/iflytek/skillhub/issues/628">#628 身份联邦架构</a> / <a href="https://github.com/iflytek/skillhub/issues/629">#629 外部身份可信属性</a> / <a href="https://github.com/iflytek/skillhub/issues/634">#634 禁用旧账户合并</a> / <a href="https://github.com/iflytek/skillhub/issues/640">#640 身份核心</a></td><td>集中影响外部身份信任、账户接管风险和统一身份边界。</td><td>#640 已形成并合并 #643;其余事项继续按迁移与安全门禁推进。</td></tr>
<tr><td><span class="value-level value-b">B</span></td><td><a href="https://github.com/iflytek/skillhub/issues/626">#626</a> / <a href="https://github.com/iflytek/skillhub/issues/627">#627 部署 Smoke Test</a></td><td>影响持久环境和受限 Ingress 下的发布验证。</td><td>需将环境假设改为显式配置,并保留可观察失败。</td></tr>
</tbody>
</table>
</div>
<h3>新增、合并与关闭 PR</h3>
<div class="table-wrap">
<table>
<caption class="sr-only">W31 关键 PR 流转</caption>
<thead><tr><th>类型</th><th>价值</th><th>PR</th><th>结果与判断</th></tr></thead>
<tbody>
<tr><td>新增并合并</td><td><span class="value-level value-a">A</span></td><td><a href="https://github.com/iflytek/skillhub/pull/607">#607 Device Auth</a> / <a href="https://github.com/iflytek/skillhub/pull/608">#608 CLI Namespace</a> / <a href="https://github.com/iflytek/skillhub/pull/609">#609 Token 回归</a> / <a href="https://github.com/iflytek/skillhub/pull/610">#610 403 语义</a></td><td>4 个新增 PR 均已合并,快速处理认证与 CLI 缺陷。</td></tr>
<tr><td>本期合并</td><td><span class="value-level value-b">B</span></td><td><a href="https://github.com/iflytek/skillhub/pull/599">#599 README 引导</a> / <a href="https://github.com/iflytek/skillhub/pull/601">#601 驳回版本重传</a></td><td>两项在 W30 创建,本期完成项目可发现性与发布一致性交付。</td></tr>
<tr><td>新增待审</td><td><span class="value-level value-a">A</span></td><td><a href="https://github.com/iflytek/skillhub/pull/623">#623 OAuth 回跳</a> / <a href="https://github.com/iflytek/skillhub/pull/624">#624 React 19 Portal 崩溃</a></td><td>直接影响登录回跳和 Web 稳定性,建议优先完成回归。</td></tr>
<tr><td>新增待审</td><td><span class="value-level value-b">B</span></td><td><a href="https://github.com/iflytek/skillhub/pull/619">#619 Web 类型隔离</a></td><td>回应 #618,当前仍开放,需先确认构建环境隔离边界。</td></tr>
<tr><td>新增并合并</td><td><span class="value-level value-b">B</span></td><td><a href="https://github.com/iflytek/skillhub/pull/603">#603 生态入口</a></td><td>7 月 24 日创建、7 月 30 日合并,计入本期新增与合并。</td></tr>
<tr><td>新增并合并</td><td><span class="value-level value-a">A</span></td><td><a href="https://github.com/iflytek/skillhub/pull/643">#643 身份核心</a> / <a href="https://github.com/iflytek/skillhub/pull/641">#641 版本依赖删除</a> / <a href="https://github.com/iflytek/skillhub/pull/648">#648 身份门禁</a> / <a href="https://github.com/iflytek/skillhub/pull/649">#649 Binding V2</a></td><td>7 月 30 日完成身份核心、治理安全和迁移护栏交付。</td></tr>
<tr><td>本期合并</td><td><span class="value-level value-a">A</span></td><td><a href="https://github.com/iflytek/skillhub/pull/443">#443</a> / <a href="https://github.com/iflytek/skillhub/pull/445">#445</a> / <a href="https://github.com/iflytek/skillhub/pull/480">#480</a> / <a href="https://github.com/iflytek/skillhub/pull/560">#560</a></td><td>部署与认证:Nginx、Helm、OAuth Provider 与登录页恢复。</td></tr>
<tr><td>本期合并</td><td><span class="value-level value-a">A</span></td><td><a href="https://github.com/iflytek/skillhub/pull/592">#592 搜索索引重建</a></td><td>核心流程:标签变更后异步重建搜索索引。</td></tr>
<tr><td>本期合并</td><td><span class="value-level value-b">B</span></td><td><a href="https://github.com/iflytek/skillhub/pull/593">#593</a> / <a href="https://github.com/iflytek/skillhub/pull/598">#598</a></td><td>生态与文档:FAQ 与 HarnessClaw 指南。</td></tr>
</tbody>
</table>
</div>
</section>
<section class="report-section" data-module="priority-queue" aria-labelledby="priority-title">
<h2 id="priority-title">当前高价值维护队列</h2>
<p class="section-lead">以下为 2026-07-31 14:35 快照,只列需要明确决策的 A/B 项;价值分级是维护治理判断,不替代仓库现有 P1/P2 标签。</p>
<h3>Issue:A 级优先处理</h3>
<div class="table-wrap">
<table>
<caption class="sr-only">A 级开放 Issue</caption>
<thead><tr><th>Issue</th><th>价值判断</th><th>建议动作</th></tr></thead>
<tbody>
<tr><td><a href="https://github.com/iflytek/skillhub/issues/634">#634 禁用不安全的旧账户合并流程</a></td><td>涉及潜在账户接管风险,已有替代实现 #639。</td><td>完成安全回归和迁移兼容审查后优先合并。</td></tr>
<tr><td><a href="https://github.com/iflytek/skillhub/issues/605">#605 Token 撤销后部分 API 仍放行</a></td><td>认证安全语义不一致,且 Issue 在回归测试合并后仍开放。</td><td>确认失败用例覆盖 whoami/search,完成实现后关闭。</td></tr>
<tr><td><a href="https://github.com/iflytek/skillhub/issues/612">#612 扫描任务与发布事务竞争</a></td><td>可能使合法发布因任务提前执行而失败。</td><td>将异步启动约束到事务提交后,并补稳定回归。</td></tr>
<tr><td><a href="https://github.com/iflytek/skillhub/issues/615">#615 审核状态与审计不一致</a></td><td>服务端已提交状态却向客户端返回失败。</td><td>统一事务边界,避免部分成功和重复操作。</td></tr>
<tr><td><a href="https://github.com/iflytek/skillhub/issues/617">#617 首次发布坐标并发竞争</a></td><td>影响同坐标并发发布的幂等与错误语义。</td><td>增加数据库约束映射与并发回归测试。</td></tr>
</tbody>
</table>
</div>
<h3>Issue:B 级需设计或严格审查</h3>
<div class="table-wrap">
<table>
<caption class="sr-only">B 级开放 Issue</caption>
<thead><tr><th>Issue</th><th>建议动作</th></tr></thead>
<tbody>
<tr><td><a href="https://github.com/iflytek/skillhub/issues/613">#613 并发 OAuth 绑定 500</a></td><td>围绕唯一约束和重试边界设计并发回归。</td></tr>
<tr><td><a href="https://github.com/iflytek/skillhub/issues/614">#614 旧 Session 阻断公开 API</a></td><td>明确 permitAll 路由的失效会话处理语义。</td></tr>
<tr><td><a href="https://github.com/iflytek/skillhub/issues/628">#628 统一身份联邦架构</a></td><td>将 #630、#631、#633 作为一个设计批次集中审查。</td></tr>
<tr><td><a href="https://github.com/iflytek/skillhub/issues/640">#640 身份核心与 Provider 权限锁</a></td><td>先收敛与 #628 的边界,再决定实现拆分与兼容策略。</td></tr>
<tr><td><a href="https://github.com/iflytek/skillhub/issues/620">#620 审核进度与重提历史</a></td><td>先定义作者可见字段与审核隐私边界。</td></tr>
<tr><td><a href="https://github.com/iflytek/skillhub/issues/622">#622 通知由 SSE 改为轮询</a></td><td>先用代理兼容性和资源成本数据验证替换必要性。</td></tr>
</tbody>
</table>
</div>
<h3>PR:A 级优先推进</h3>
<div class="table-wrap">
<table>
<caption class="sr-only">A 级开放 PR</caption>
<thead><tr><th>PR</th><th>价值判断</th><th>建议动作</th></tr></thead>
<tbody>
<tr><td><a href="https://github.com/iflytek/skillhub/pull/639">#639 隔离不安全账户合并流程</a></td><td>回应高风险认证 Issue #634,并替代已关闭的 #637。</td><td>优先核对账户接管回归、兼容路径和失败语义。</td></tr>
<tr><td><a href="https://github.com/iflytek/skillhub/pull/623">#623 保留 OAuth 回跳目标</a></td><td>直接影响认证后用户流程连续性。</td><td>验证多 Provider、非法目标和默认回跳后优先合并。</td></tr>
<tr><td><a href="https://github.com/iflytek/skillhub/pull/624">#624 修复 React 19 Portal 崩溃</a></td><td>解决用户可见的 removeChild/insertBefore 崩溃。</td><td>补弹窗开关和路由切换场景 E2E 后合并。</td></tr>
<tr><td><a href="https://github.com/iflytek/skillhub/pull/631">#631 外部身份可信属性</a></td><td>决定外部身份是否可安全触发用户配置。</td><td>与 #630 设计文档同步审查信任来源和降级路径。</td></tr>
<tr><td><a href="https://github.com/iflytek/skillhub/pull/633">#633 审批后配置 global membership</a></td><td>影响新用户审批后的基础授权可用性。</td><td>验证重试幂等、已有成员和审批回滚场景。</td></tr>
</tbody>
</table>
</div>
<details data-module="cleanup-queue">
<summary>展开:本周关闭未合并的 PR</summary>
<div class="details-body">
<p>长期 PR <a href="https://github.com/iflytek/skillhub/pull/442">#442</a>、<a href="https://github.com/iflytek/skillhub/pull/457">#457</a>、<a href="https://github.com/iflytek/skillhub/pull/460">#460</a>,以及本期新增后被替代的 <a href="https://github.com/iflytek/skillhub/pull/637">#637</a>、<a href="https://github.com/iflytek/skillhub/pull/638">#638</a>、<a href="https://github.com/iflytek/skillhub/pull/642">#642</a> 在周期内关闭且未合并。配合 20 个合并 PR,本期 PR 净流出 2 个;当前开放 16 个。</p>
</div>
</details>
</section>
</div>
<div class="tab-panel" id="panel-method" role="tabpanel" tabindex="0"
aria-labelledby="tab-method" data-panel="method" hidden>
<div class="panel-intro">
<p>这里说明时间边界、数据来源与缺失项。</p>
<p>缺失数据均标为“未取得”,不替换为 0。</p>
</div>
<section class="report-section" data-module="metric-definitions" aria-labelledby="method-title">
<h2 id="method-title">统计口径</h2>
<ul class="method-list">
<li><strong>统计周期</strong><span>展示为 2026-07-24 00:00—2026-07-30 23:59,Asia/Shanghai;程序过滤采用等价半开区间 <code>[2026-07-24 00:00, 2026-07-31 00:00)</code>,对应 UTC 为 7 月 23 日 16:00 至 7 月 30 日 16:00。</span></li>
<li><strong>当前快照</strong><span>2026-07-31 14:35;开放队列、Fork 累计数及年龄结构取该时点。Star 总量与新增证据更新于 16:35;周期结束后的变化不计入本期流量。</span></li>
<li><strong>周期衔接</strong><span>W30 的排他截止与 W31 起始均为 7 月 24 日 00:00,相邻报告无重叠;周四 23:59 后的事件进入下一期。</span></li>
<li><strong>Star 证据</strong><span>7 月 31 日 16:35 的当前 Stars 为 4,849;130 表示同次认证 API 查询中,<code>starred_at</code> 落入本期且当前仍可见的 Stargazer。完整分页数量与仓库总数均为 4,849;该值不是周期净增长,也不能替代起止库存快照。</span></li>
<li><strong>Fork 证据</strong><span>当前 Forks 为 703;58 表示当前列表中创建时间落在本期的可见记录,不代表 Fork 库存净增长。</span></li>
<li><strong>Actions 成功率</strong><span><code>success / (success + failure)</code>;等待授权、条件跳过和取消不进入分母。</span></li>
<li><strong>Issue / PR</strong><span>GitHub Issues API 会同时返回 PR,本报告分开统计;价值 A—D 为人工治理判断。</span></li>
<li><strong>Release</strong><span>周期内应用 Release 为 1、CLI Release 为 0;应用 v0.2.15 于 7 月 30 日 16:25 发布,计入本期。</span></li>
<li><strong>npm 下载</strong><span>909 次覆盖 2026-07-24—2026-07-30 的 UTC 日桶,与 Asia/Shanghai 半开周期不完全对齐,因此仅作为带覆盖范围的生态观察,不称为完整周总量。</span></li>
<li><strong>推广数据</strong><span>文章、直播、社区分享和合作项目由维护者补录;本期未提供,因而不展示推广模块,也不记为 0。</span></li>
</ul>
</section>
<section class="report-section" data-module="source-coverage" aria-labelledby="source-title">
<h2 id="source-title">数据来源与限制</h2>
<div class="table-wrap">
<table>
<caption>来源覆盖</caption>
<thead><tr><th>来源</th><th>用途</th><th>限制</th></tr></thead>
<tbody>
<tr><td>GitHub API(认证)</td><td>仓库、Issue、PR、Release、Actions、Fork、Stargazer <code>starred_at</code></td><td>没有周期起止两份库存快照;当前可见新增不等于净增长。</td></tr>
<tr><td>Git 标签与提交历史</td><td>主分支提交、合并与 Release 时间核对</td><td>v0.2.15 计入本期;CLI 仍以 npm 0.1.9 为最新版本。</td></tr>
<tr><td>npm Downloads API</td><td><code>@astron-team/skillhub</code> 的 7 个 UTC 日桶</td><td>909 次下载不等同于独立用户,且覆盖范围与本报告时区边界不完全对齐。</td></tr>
<tr><td>维护者人工判断</td><td>价值排序、推广动作和产品边界</td><td>推广动作尚未提供。</td></tr>
</tbody>
</table>
</div>
<p class="risk-note"><strong>未取得:</strong>GitHub Traffic、Referrers、W31 起止两份可比 Star/Fork 库存快照、私有安全告警,以及生产 SkillHub 实例的可用率、延迟、Skill 数量和扫描成功率。</p>
</section>
</div>
</main>
<footer>
<span>SkillHub Open Source Weekly · 2026-W31</span>
<span>公开报告 · 周四结报 · 维护者治理视图</span>
</footer>
</article>
<script>
(function () {
var tabs = Array.prototype.slice.call(document.querySelectorAll('[role="tab"]'));
var panels = Array.prototype.slice.call(document.querySelectorAll('[role="tabpanel"]'));
function activate(name, moveFocus, updateHash) {
var nextTab = tabs.find(function (tab) { return tab.dataset.tab === name; }) || tabs[0];
tabs.forEach(function (tab) {
var selected = tab === nextTab;
tab.setAttribute('aria-selected', selected ? 'true' : 'false');
tab.tabIndex = selected ? 0 : -1;
});
panels.forEach(function (panel) {
panel.hidden = panel.dataset.panel !== nextTab.dataset.tab;
});
if (moveFocus) nextTab.focus();
if (updateHash && history.replaceState) {
history.replaceState(null, '', '#' + nextTab.dataset.tab);
}
}
tabs.forEach(function (tab, index) {
tab.addEventListener('click', function () {
activate(tab.dataset.tab, false, true);
});
tab.addEventListener('keydown', function (event) {
var nextIndex = index;
if (event.key === 'ArrowRight') nextIndex = (index + 1) % tabs.length;
else if (event.key === 'ArrowLeft') nextIndex = (index - 1 + tabs.length) % tabs.length;
else if (event.key === 'Home') nextIndex = 0;
else if (event.key === 'End') nextIndex = tabs.length - 1;
else return;
event.preventDefault();
activate(tabs[nextIndex].dataset.tab, true, true);
});
});
window.addEventListener('hashchange', function () {
activate(location.hash.replace('#', ''), false, false);
});
activate(location.hash.replace('#', ''), false, false);
}());
</script>
</body>
</html>