skillhub/weekly/site/reports/2026-W32/index.html
XiaoSeS 77e0ff3749 docs(weekly): mirror reviewed W32 report
Signed-off-by: XiaoSeS <87064762+XiaoSeS@users.noreply.github.com>
2026-08-07 10:34:32 +08:00

1734 lines
61 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 年第 32 周开源周报:仓库状态、主分支迭代、生态进展及项目健康明细。">
<title>SkillHub 开源周报|2026 年第 32 周</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-31T00:00:00+08:00"
data-period-end="2026-08-06T18:47:26+08:00"
data-period-boundary="[)"
data-period-status="manual-close"
data-snapshot-at="2026-08-06T18:47:26+08:00"
data-pr-target-branch="main"
data-star-evidence="current-visible-arrivals"
data-star-api-status="success"
data-star-arrivals="77"
data-star-observed-total="4844"
data-star-observed-at="2026-08-06T18:50:41+08:00"
data-star-previous-observed-total="4849"
data-star-previous-observed-at="2026-07-31T16:35:00+08:00"
data-star-observation-delta="-5"
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 年第 32 周</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-31—2026-08-06 · Asia/Shanghai</span>
</div>
<div class="meta-item">
<span class="key">PR 统计分支</span>
<span class="value"><code>main</code></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>本周 Issue 与面向 <code>main</code> 的 PR 开放队列分别净减少 9 和 6,维护吞吐高于新增输入,并处理了 9 个期初存量 PR。Actions 有效成功率为 94.2%,17 次失败中有 12 次集中在批量测试部署。主要风险是自动化稳定性和队列质量:16/33 个开放 Issue 仍需补充信息,13 个已超过 30 天。</p>
</div>
</div>
<div class="metrics" aria-label="四项核心指标">
<div class="metric"><strong>4,844</strong><span>Stars · 较上次观测 -5</span></div>
<div class="metric"><strong>768</strong><span>Forks · 仓库当前库存</span></div>
<div class="metric"><strong>94.2%</strong><span>Actions 有效成功率 · 276/293 · 需关注</span></div>
<div class="metric"><strong>0 / 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,844</strong>
<span class="snapshot-change">较 7 月 31 日 16:35 观测值减少 5</span>
</div>
<div class="snapshot-row">
<span class="snapshot-label">Forks</span>
<strong>768</strong>
<span class="snapshot-change">仓库库存字段</span>
</div>
</div>
<p class="chart-note">Star 库存从上次观测的 4,849 降至 4,844,观测点间净变化为 -5。本期当前可见新增 77 个 Stargazer,但新增与取消会同时发生,77 不是净增长。Fork 列表接口返回 1,023 条,与仓库库存字段 768 不一致,因此不展示本期 Fork 到达数。</p>
</div>
<div class="chart-box" data-module="weekly-collaboration-chart">
<h3>本期协作流转</h3>
<div class="bars" role="img" aria-label="W32 协作流转:Issue 新增 13 个、关闭 22 个;目标为 main 的 PR 新增 18 个、合并 17 个、关闭未合并 7 个">
<div class="bar-row"><span class="bar-label">Issue 新增</span><span class="bar-track"><span class="bar-fill" style="width:59.1%"></span></span><span class="bar-value">13</span></div>
<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">22</span></div>
<div class="bar-row"><span class="bar-label">PR 新增</span><span class="bar-track"><span class="bar-fill" style="width:81.8%"></span></span><span class="bar-value">18</span></div>
<div class="bar-row"><span class="bar-label">PR 合并</span><span class="bar-track"><span class="bar-fill" style="width:77.3%"></span></span><span class="bar-value">17</span></div>
<div class="bar-row"><span class="bar-label">PR 关闭未合并</span><span class="bar-track"><span class="bar-fill" style="width:31.8%"></span></span><span class="bar-value">7</span></div>
</div>
<p class="chart-note">Issue 关闭量比新增量多 9;面向 <code>main</code> 的 PR 完成 24 个、比新增多 6 个,当前开放 PR 为 10 个。其中 9 个完成项来自期初存量,说明主分支维护队列正在收缩。</p>
</div>
</div>
<p class="risk-note"><strong>数据解读:</strong>18 个新增 PR 均以 <code>main</code> 为目标,其中 12 个由维护者 XiaoSeS 创建,包含功能修复、周报同步和替代 PR,不等于 18 项独立功能。队列数量正在下降,但 48.5% 的开放 Issue 仍需补充信息;本期没有发布新的应用或 CLI 版本。</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>按用户价值排序的重要事项;源码合并、Release 与线上部署分别判断</caption>
<thead><tr><th>可验证状态</th><th>事项</th><th>进展与发布状态</th></tr></thead>
<tbody>
<tr>
<td><span class="status warn">主分支待发布</span></td>
<td>内置入门技能</td>
<td><a href="https://github.com/iflytek/skillhub/pull/635">#635</a> 与 <a href="https://github.com/iflytek/skillhub/pull/636">#636</a> 已合入 <code>main</code>;合并时间晚于 v0.2.15,尚无包含这些改动的新应用 Release。</td>
</tr>
<tr>
<td><span class="status warn">主分支待发布</span></td>
<td>稳定性与可观测性</td>
<td><a href="https://github.com/iflytek/skillhub/pull/619">类型隔离</a>、<a href="https://github.com/iflytek/skillhub/pull/624">React 19 Portal 崩溃修复</a>、<a href="https://github.com/iflytek/skillhub/pull/664">请求追踪</a>、<a href="https://github.com/iflytek/skillhub/pull/684">搜索重建失败观测</a>与 <a href="https://github.com/iflytek/skillhub/pull/685">4xx 语义修复</a>已合入 <code>main</code>,但尚未进入应用 Release。</td>
</tr>
<tr>
<td><span class="status warn">状态分离</span></td>
<td>兼容性与生态入口</td>
<td><a href="https://github.com/iflytek/skillhub/pull/674">#674 ClawHub 中文下载修复</a>已合入 <code>main</code>但尚未发布;<a href="https://github.com/iflytek/skillhub/pull/676">#676</a>、<a href="https://github.com/iflytek/skillhub/pull/682">#682</a> 与 <a href="https://github.com/iflytek/skillhub/pull/687">#687</a> 为仓库文档和模板变更,已在 <code>main</code> 可见,不代表应用功能上线。</td>
</tr>
<tr>
<td><span class="status warn">推进中</span></td>
<td>信任属性与子路径部署</td>
<td><a href="https://github.com/iflytek/skillhub/pull/688">#688 OAuth 可信属性</a>待合并;<a href="https://github.com/iflytek/skillhub/pull/576">#576</a> 已有 <a href="https://github.com/iflytek/skillhub/pull/692">#692</a> 草稿验证,需完成子路径部署决策。</td>
</tr>
</tbody>
</table>
</div>
<p class="risk-note"><strong>发布口径:</strong>W32 没有应用或 CLI Release。报告只确认公开可验证的分支与 Release 状态;由于没有生产部署证据,不声称任何应用改动已经上线。</p>
</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="W32 开源生态参与信号:新增 Issue 作者 5 位、面向 main 的新增 PR 作者 3 位、合并社区贡献者 2 位;仓库 Fork 库存 768;SkillHub CLI 在 2026 年 7 月 31 日至 8 月 5 日的 6 个已结算 UTC 日桶下载 504 次">
<div class="ecosystem-signal"><strong>5 / 3 / 2</strong><span>新增 Issue 作者 / PR 作者 / 合并社区贡献者</span></div>
<div class="ecosystem-signal"><strong>768</strong><span>Fork 仓库库存</span></div>
<div class="ecosystem-signal"><strong>504</strong><span>CLI 下载 · 6 个已结算 UTC 日桶</span></div>
<p class="ecosystem-signal-note">以上为独立参与信号,不构成转化漏斗。</p>
</div>
<ul class="ecosystem-list">
<li><strong>社区贡献</strong><span>FenjuFu 与 michael-xiii 共 6 个社区 PR 合并,覆盖 ClawHub 兼容、Web 稳定性、筛选体验与生态文档。</span></li>
<li><strong>生态文档</strong><span><a href="https://github.com/iflytek/skillhub/pull/676">anthropics/skills 定位</a>与 <a href="https://github.com/iflytek/skillhub/pull/682">Related Projects</a> 已合入仓库 <code>main</code>,不表述为应用上线。</span></li>
<li><strong>社区协作</strong><span><a href="https://github.com/iflytek/skillhub/pull/687">HER Hack-Astron 模板</a>已合并;6 个 UTC 日桶内仓库获得 5,220 次浏览与 3,423 次克隆。</span></li>
</ul>
<p class="chart-note"><strong>数据解读:</strong>2 位社区贡献者完成 6 个合并 PR,体现贡献深度;Fork 仅展示可信的库存字段,npm 下载反映包获取行为。三类信号来自不同人群,不能解释为转化漏斗。</p>
</section>
<aside class="next-actions" data-module="next-actions" aria-labelledby="next-title">
<h2 id="next-title">下周关注</h2>
<p>以下动作延续到下一期跟踪。</p>
<ol>
<li>形成下一期应用或 CLI Release,并把本期未发布原因写入发布记录。</li>
<li>合并或给出 <a href="https://github.com/iflytek/skillhub/pull/688">#688</a> 的审查结论,并为 <a href="https://github.com/iflytek/skillhub/issues/690">#690 扫描重试</a>形成可执行方案。</li>
<li>完成 <a href="https://github.com/iflytek/skillhub/pull/576">#576</a>/<a href="https://github.com/iflytek/skillhub/pull/692">#692</a> 子路径部署决策,关闭已被新实现替代的旧 PR。</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 warn">需关注</span></div>
<div class="health-metric">94.2% <small>276/293</small></div>
<p>有效运行中有 17 次失败。</p>
<div class="detail">12 次集中在 8 月 6 日的批量测试部署,另有 PR Tests 2 次、PR E2E 3 次;常规 PR 检查总体稳定,但批量部署链路需要复盘。</div>
</article>
<article class="health-card">
<div class="top"><span class="name">安全流水线</span><span class="status ok">稳定</span></div>
<div class="health-metric">67 / 67 <small>执行成功</small></div>
<p>另有 8 次等待授权、39 次条件跳过。</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">27 / 27 <small>Backlog Rescore</small></div>
<p>Publish Images 7 次成功,文档部署 4/4。</p>
<div class="detail">Issue Triage 成功 19 次、跳过 56 次、取消 1 次。</div>
</article>
<article class="health-card">
<div class="top"><span class="name">Release 交付</span><span class="status warn">未达目标</span></div>
<div class="health-metric">0 / 0 <small>应用 / CLI</small></div>
<p>W32 没有应用或 CLI Release。</p>
<div class="detail">“每周一个 Release”目标本期未达成;最新应用版本仍为 <a href="https://github.com/iflytek/skillhub/releases/tag/v0.2.15">v0.2.15</a>。</div>
</article>
<article class="health-card">
<div class="top"><span class="name">Issue 治理</span><span class="status warn">改善中</span></div>
<div class="health-metric">-9 <small>本期净流量</small></div>
<p>新增 13、关闭 22,当前开放 33 个。</p>
<div class="detail">数量已改善,但 <code>needs-info</code> 占 48.5%、30 天以上占 39.4%,治理重点转向存量质量。</div>
</article>
<article class="health-card">
<div class="top"><span class="name">PR 治理</span><span class="status ok">期内净流出</span></div>
<div class="health-metric">-6 <small>本期净流量</small></div>
<p>面向 <code>main</code>:新增 18、合并 17、关闭未合并 7,当前开放 10 个。</p>
<div class="detail">本期处理 9 个期初存量 PR;剩余队列中 3 个超过 30 天。</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">本期共有 562 条 Actions 记录,其中 276 次成功、17 次失败、40 次等待授权、222 次跳过、7 次取消。</p>
<div class="chart-box" data-module="actions-outcome-chart">
<h3>Actions 结果构成</h3>
<div class="segbar" role="img" aria-label="W32 Actions 共 562 条记录:成功 276,失败 17,等待授权 40,条件跳过 222,取消 7">
<span class="seg-success" style="width:49.11%"></span>
<span class="seg-failure" style="width:3.02%"></span>
<span class="seg-auth" style="width:7.12%"></span>
<span class="seg-skipped" style="width:39.50%"></span>
<span class="seg-cancelled" style="width:1.25%"></span>
</div>
<div class="chart-legend" aria-hidden="true">
<span><i class="seg-success"></i>成功 <b>276</b></span>
<span><i class="seg-failure"></i>失败 <b>17</b></span>
<span><i class="seg-auth"></i>等待授权 <b>40</b></span>
<span><i class="seg-skipped"></i>跳过 <b>222</b></span>
<span><i class="seg-cancelled"></i>取消 <b>7</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>Security</td><td class="number">114</td><td class="number">67</td><td class="number">0</td><td class="number">8</td><td class="number">39</td></tr>
<tr><td>Issue Triage</td><td class="number">76</td><td class="number">19</td><td class="number">0</td><td class="number">0</td><td class="number">57</td></tr>
<tr><td>PR Tests</td><td class="number">96</td><td class="number">47</td><td class="number">2</td><td class="number">8</td><td class="number">39</td></tr>
<tr><td>PR E2E</td><td class="number">83</td><td class="number">30</td><td class="number">3</td><td class="number">8</td><td class="number">42</td></tr>
<tr><td>PR Scripts</td><td class="number">66</td><td class="number">58</td><td class="number">0</td><td class="number">8</td><td class="number">0</td></tr>
<tr><td>Backlog Rescore</td><td class="number">27</td><td class="number">27</td><td class="number">0</td><td class="number">0</td><td class="number">0</td></tr>
<tr><td>Claim Reward</td><td class="number">22</td><td class="number">0</td><td class="number">0</td><td class="number">0</td><td class="number">22</td></tr>
<tr><td>PR Helm Chart</td><td class="number">37</td><td class="number">3</td><td class="number">0</td><td class="number">7</td><td class="number">27</td></tr>
<tr><td>PR Batch Test Deploy</td><td class="number">18</td><td class="number">5</td><td class="number">12</td><td class="number">0</td><td class="number">1</td></tr>
<tr><td>PR CLI</td><td class="number">9</td><td class="number">8</td><td class="number">0</td><td class="number">1</td><td class="number">0</td></tr>
<tr><td>Publish Images</td><td class="number">9</td><td class="number">7</td><td class="number">0</td><td class="number">0</td><td class="number">2</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">1</td><td class="number">1</td><td class="number">0</td><td class="number">0</td><td class="number">0</td></tr>
</tbody>
</table>
</div>
<p class="risk-note"><strong>数据解读:</strong>94.2% 低于前次快照,17 次失败中有 12 次来自 8 月 6 日的批量测试部署;常规 PR Tests 与 PR E2E 共 5 次失败。40 次等待授权仍说明外部 PR 的检查覆盖存在门禁缺口。</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 67 次实际执行全部成功,另有 8 次等待授权和 39 次条件跳过。公开数据无法确认私有安全告警和生产扫描任务数量。</p>
</article>
<article class="health-note">
<h3>Release 交付</h3>
<p>应用与 CLI Release 均为 0;最新应用版本 <a href="https://github.com/iflytek/skillhub/releases/tag/v0.2.15">v0.2.15</a> 于本期开始前发布。“每周一个 Release”目标本期未达成。</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="W32 统计时点开放 Issue 33 个:不足 7 天 2 个,7 到 13 天 12 个,14 到 29 天 6 个,30 天以上 13 个">
<div class="bar-row"><span class="bar-label">&lt; 7 天</span><span class="bar-track"><span class="bar-fill" style="width:15.4%"></span></span><span class="bar-value">2</span></div>
<div class="bar-row"><span class="bar-label">7—13 天</span><span class="bar-track"><span class="bar-fill" style="width:92.3%"></span></span><span class="bar-value">12</span></div>
<div class="bar-row"><span class="bar-label">14—29 天</span><span class="bar-track"><span class="bar-fill" style="width:46.2%"></span></span><span class="bar-value">6</span></div>
<div class="bar-row"><span class="bar-label">≥ 30 天</span><span class="bar-track"><span class="bar-fill hot" style="width:100%"></span></span><span class="bar-value">13</span></div>
</div>
<p class="chart-note">队列净减少说明处置速度改善;但 30 天以上仍有 13 个,占开放 Issue 的 39.4%,长期存量没有随总量同步消失。</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:48.5%" role="img" aria-label="W32 统计时点开放 Issue 中,16 个带 triage/needs-info 标签,占 33 个开放 Issue 的 48.5%">
<div class="donut-center"><strong>48.5%</strong><span>16 / 33</span></div>
</div>
<div class="donut-copy">
<p><strong>16 个</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="W32 统计时点开放 PR 10 个:不足 7 天 3 个,7 到 13 天 2 个,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">3</span></div>
<div class="bar-row"><span class="bar-label">7—13 天</span><span class="bar-track"><span class="bar-fill" style="width:66.7%"></span></span><span class="bar-value">2</span></div>
<div class="bar-row"><span class="bar-label">14—29 天</span><span class="bar-track"><span class="bar-fill" style="width:66.7%"></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:100%"></span></span><span class="bar-value">3</span></div>
</div>
<p class="chart-note">本期已处理 10 个期初存量 PR,开放队列降至 10 个;其中 30 天以上仍占 30.0%,下一步应继续处理已被新实现替代或长期无进展的项。</p>
</div>
</section>
<section class="report-section" data-module="observable-response" aria-labelledby="response-title">
<h2 id="response-title">社区响应</h2>
<p>本期新增 13 个 Issue、关闭 22 个;<a href="https://github.com/iflytek/skillhub/issues/690">#690 扫描失败重试</a>成为新的高风险输入。自动分诊不等同于维护者首次响应,本期未计算人工响应 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 +13 / -22</strong><span>净流出 9 · 当前快照开放 33</span></div>
<div class="flow-item"><strong>PR +18 / 完成 24</strong><span>合并 17 + 关闭未合并 7 · 净流出 6 · 当前开放 10</span></div>
</div>
<p class="risk-note"><strong>数据解读:</strong>本页只统计目标分支为 <code>main</code> 的 PR。“完成 24”是主分支维护流转量,不是 24 项功能上线;其中 9 个是期初存量 PR,17 个合并项仍需通过 Release 证据判断是否发布。</p>
<h3>新增 Issue(按价值排序)</h3>
<div class="table-wrap">
<table>
<caption class="sr-only">W32 新增 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/690">#690 扫描失败后支持人工重试</a></td><td>影响安全扫描失败后的恢复能力,且标记为 P1/high risk。</td><td>仍开放并需要补充信息,应先明确状态机、幂等和权限边界。</td></tr>
<tr><td><span class="value-level value-b">B</span></td><td><a href="https://github.com/iflytek/skillhub/issues/658">#658 中文名称支持</a> / <a href="https://github.com/iflytek/skillhub/issues/678">#678 Helm Chart</a></td><td>分别影响中文用户体验和 Kubernetes 部署体验。</td><td>均已通过对应修复或治理结论关闭。</td></tr>
<tr><td><span class="value-level value-b">B</span></td><td><a href="https://github.com/iflytek/skillhub/issues/683">#683 子路径部署</a></td><td>支持非根路径部署,用户价值明确但改动横跨构建、路由与代理配置。</td><td>Issue 当前开放,已有 #576 与验证草稿 #692。</td></tr>
</tbody>
</table>
</div>
<h3>新增、合并与关闭 PR</h3>
<div class="table-wrap">
<table>
<caption class="sr-only">W32 关键 PR 流转</caption>
<thead><tr><th>类型</th><th>价值</th><th>PR</th><th>结果与判断</th></tr></thead>
<tbody>
<tr><td>合入 main</td><td><span class="value-level value-a">A</span></td><td><a href="https://github.com/iflytek/skillhub/pull/635">#635</a> / <a href="https://github.com/iflytek/skillhub/pull/636">#636</a> / <a href="https://github.com/iflytek/skillhub/pull/624">#624</a> / <a href="https://github.com/iflytek/skillhub/pull/625">#625</a></td><td>内置技能、产物校验和 Web 修复已进入主分支,但尚无包含这些改动的新应用 Release。</td></tr>
<tr><td>合入 main</td><td><span class="value-level value-b">B</span></td><td><a href="https://github.com/iflytek/skillhub/pull/674">#674</a> / <a href="https://github.com/iflytek/skillhub/pull/676">#676</a> / <a href="https://github.com/iflytek/skillhub/pull/682">#682</a> / <a href="https://github.com/iflytek/skillhub/pull/687">#687</a></td><td>社区贡献已进入主分支;#674 为待发布代码,其余为仓库文档或模板变更。</td></tr>
<tr><td>新增待审</td><td><span class="value-level value-a">A</span></td><td><a href="https://github.com/iflytek/skillhub/pull/688">#688 OAuth 可信属性</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/689">#689 Actuator 独立目标</a> / <a href="https://github.com/iflytek/skillhub/pull/692">#692 子路径验证</a></td><td>分别改善持久环境 Smoke Test 与子路径部署验证。</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">以下为统计时点需要明确决策的 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/690">#690 扫描失败后支持人工重试</a></td><td>影响安全扫描失败后的恢复能力,当前为 P1/high risk。</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/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><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/620">#620 审核进度与重提历史</a></td><td>先定义作者可见字段与审核隐私边界。</td></tr>
<tr><td><a href="https://github.com/iflytek/skillhub/issues/621">#621 主题持久化</a></td><td>明确跨设备、匿名用户与系统主题的优先级。</td></tr>
<tr><td><a href="https://github.com/iflytek/skillhub/issues/622">#622 通知由 SSE 改为轮询</a></td><td>先用代理兼容性和资源成本数据验证替换必要性。</td></tr>
<tr><td><a href="https://github.com/iflytek/skillhub/issues/683">#683 子路径部署</a></td><td>结合 #576/#692 明确支持边界和验收矩阵。</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/688">#688 OAuth 可信属性</a></td><td>影响外部身份是否可安全触发资料同步和用户供应。</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/581">#581 Namespace 兼容</a></td><td>影响既有 <code>my</code> namespace 使用路径。</td><td>核对当前坐标协议与回归覆盖,给出合并或关闭结论。</td></tr>
</tbody>
</table>
</div>
<h3>PR:B 级需设计或验证</h3>
<div class="table-wrap">
<table>
<caption class="sr-only">B 级开放 PR</caption>
<thead><tr><th>PR</th><th>建议动作</th></tr></thead>
<tbody>
<tr><td><a href="https://github.com/iflytek/skillhub/pull/689">#689 Smoke Test Actuator 目标</a></td><td>核对持久环境下应用与管理端点分离的配置兼容性。</td></tr>
<tr><td><a href="https://github.com/iflytek/skillhub/pull/576">#576 子路径部署</a> / <a href="https://github.com/iflytek/skillhub/pull/692">#692 验证草稿</a></td><td>用验证矩阵完成路由、静态资源、OAuth 回跳和代理前缀决策。</td></tr>
</tbody>
</table>
</div>
</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>W32 展示范围为 2026-07-31—2026-08-06,Asia/Shanghai。</span></li>
<li><strong>统计边界</strong><span>事件统一过滤区间为 <code>[2026-07-31 00:00:00, 2026-08-06 18:47:26)</code>,对应 UTC 为 <code>[2026-07-30 16:00:00, 2026-08-06 10:47:26)</code>。</span></li>
<li><strong>数据快照</strong><span>开放队列、仓库库存及年龄结构以统计时点的认证 API 为准;Star 完整分页于 18:50 完成,事件流仍使用 18:47:26 的排他边界。</span></li>
<li><strong>周期衔接</strong><span>W31 的排他截止与 W32 起始均为 7 月 31 日 00:00,相邻报告无重叠;统计边界后的事件不计入 W32。</span></li>
<li><strong>Star 证据</strong><span>7 月 31 日 16:35 的认证 API 观测值为 4,849,8 月 6 日 18:50 为 4,844,两个观测点之间的库存净变化为 -5。同期有 77 个 <code>starred_at</code> 落入本期且在后一次查询时仍可见的新增 Stargazer;新增与取消 Star 会同时发生,因此 77 不是净增长。完整分页数量与仓库总数均为 4,844。由于两次库存观测不在严格周期边界,-5 仅表示观测点间变化。</span></li>
<li><strong>Fork 证据</strong><span>仓库库存字段为 768;Fork 列表接口完整分页返回 1,023 条,两个认证 API 来源不一致,因此本期不展示 Fork 到达数,也不推断 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,本报告分开统计;PR 指标、列表和价值队列只纳入目标分支为 <code>main</code> 的记录。本期新增 18、合并 17、关闭未合并 7。价值 A—D 为治理判断。</span></li>
<li><strong>交付状态</strong><span>合入 <code>main</code>、进入 Release、生产部署是不同状态。本报告没有生产部署证据,因此不使用“已上线”结论。</span></li>
<li><strong>Release</strong><span>应用与 CLI Release 均为 0;最新应用版本 v0.2.15 发布于 W32 开始前,不计入本期。“每周一个 Release”目标本期未达成。</span></li>
<li><strong>npm 下载</strong><span>504 次覆盖 2026-07-31—2026-08-05 的 6 个已结算 UTC 日桶;8 月 6 日桶尚未结算,不以 0 计入。该范围与 Asia/Shanghai 统计边界不完全对齐,因此只作为生态观察。</span></li>
<li><strong>Traffic</strong><span>5,220 次浏览与 3,423 次克隆覆盖相同 6 个 UTC 日桶;逐日 uniques 不相加为全周期独立用户。</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>没有周期起止两份库存快照;当前可见新增不等于净增长;Fork 列表与库存字段不一致。</td></tr>
<tr><td>GitHub Traffic API</td><td>6 个 UTC 日桶的 Views 与 Clones</td><td>日桶与 Asia/Shanghai 边界不完全对齐;日 uniques 不可跨日求和。</td></tr>
<tr><td>Git 标签与提交历史</td><td>主分支合并与 Release 时间核对</td><td>最新 v0.2.15 在 W32 开始前发布;本期无 Release。</td></tr>
<tr><td>npm Downloads API</td><td><code>@astron-team/skillhub</code> 的 6 个已结算 UTC 日桶</td><td>504 次下载不等同于独立用户,且覆盖范围与本报告时区边界不完全对齐。</td></tr>
<tr><td>人工治理判断</td><td>价值排序、推广动作和产品边界</td><td>推广动作尚未提供。</td></tr>
</tbody>
</table>
</div>
<p class="risk-note"><strong>未取得:</strong>GitHub Referrers、W32 起止两份可比 Star/Fork 库存快照、可信的本期 Fork 到达数、私有安全告警,以及生产 SkillHub 实例的可用率、延迟、Skill 数量和扫描成功率。推广动作未由项目方提供,因此省略对应模块。</p>
</section>
</div>
</main>
<footer>
<span>SkillHub Open Source Weekly · 2026-W32</span>
<span>SkillHub 开源周报 · 项目治理视图</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>