feat: publish Git collaboration and AI development research

This commit is contained in:
wuyang6
2026-08-10 02:49:12 +08:00
parent 8bd96c892a
commit 64ad40c9c6
15 changed files with 1339 additions and 8 deletions
File diff suppressed because it is too large Load Diff
File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 28 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 MiB

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 21 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 MiB

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 28 KiB

+15 -1
View File
@@ -2,7 +2,21 @@ import { access, readFile, readdir } from "node:fs/promises";
import { join } from "node:path";
const root = new URL("../dist/", import.meta.url);
const required = ["index.html", "archive/index.html", "method/index.html", "articles/research-publishing-method/index.html", "rss.xml", "sitemap.xml"];
const required = [
"index.html",
"archive/index.html",
"method/index.html",
"articles/research-publishing-method/index.html",
"articles/git-collaboration-ai-development/index.html",
"articles/git-collaboration-ai-development/git-collaboration-flow.png",
"articles/git-collaboration-ai-development/ai-responsibility-lanes.png",
"articles/git-collaboration-ai-development/ai-project-workflow-positions.png",
"articles/git-collaboration-ai-development/change-evidence-state.svg",
"articles/git-collaboration-ai-development/test-selection-funnel.svg",
"articles/git-collaboration-ai-development/agent-trust-boundary.svg",
"rss.xml",
"sitemap.xml"
];
for (const path of required) await access(new URL(path, root));
async function walk(path) {
+9 -2
View File
@@ -6,15 +6,18 @@ interface Props {
description?: string;
canonical?: string;
article?: boolean;
image?: string;
}
const {
title = "K1412 Research",
description = "技术研究、实验记录与可验证的公开成果。",
canonical = Astro.url.href,
article = false
article = false,
image = "/og-default.svg"
} = Astro.props;
const pageTitle = title === "K1412 Research" ? title : `${title} · K1412 Research`;
const socialImage = new URL(image, Astro.site ?? Astro.url).href;
---
<!doctype html>
@@ -32,7 +35,11 @@ const pageTitle = title === "K1412 Research" ? title : `${title} · K1412 Resear
<meta property="og:title" content={pageTitle} />
<meta property="og:description" content={description} />
<meta property="og:url" content={canonical} />
<meta property="og:image" content="https://blog.k1412.top/og-default.svg" />
<meta property="og:image" content={socialImage} />
<meta name="twitter:card" content="summary_large_image" />
<meta name="twitter:title" content={pageTitle} />
<meta name="twitter:description" content={description} />
<meta name="twitter:image" content={socialImage} />
<title>{pageTitle}</title>
</head>
<body>
+8 -2
View File
@@ -10,13 +10,19 @@ export async function getStaticPaths() {
interface Props { post: CollectionEntry<"posts"> }
const { post } = Astro.props;
const { Content, headings } = await render(post);
const topicLabels: Record<string, string> = {
"agent-systems": "Agent 系统",
"llm-systems": "LLM 系统",
"ai-research": "AI 研究",
"research-method": "研究方法"
};
---
<BaseLayout title={post.data.title} description={post.data.summary} canonical={post.data.canonicalUrl} article>
<BaseLayout title={post.data.title} description={post.data.summary} canonical={post.data.canonicalUrl} article image={post.data.preview}>
<article class="article-page">
<header class="article-header">
<a class="back-link" href="/">← 返回研究索引</a>
<div class="article-kicker"><span>{post.data.topic}</span><span>{post.data.date}</span><span>更新 {post.data.updated}</span></div>
<div class="article-kicker"><span>{topicLabels[post.data.topic] ?? post.data.topic}</span><span>{post.data.date}</span><span>更新 {post.data.updated}</span></div>
<h1>{post.data.title}</h1>
<p>{post.data.summary}</p>
<div class="tag-row">{post.data.tags.map((tag) => <span>{tag}</span>)}</div>
+5 -3
View File
@@ -156,7 +156,7 @@ button, input { font: inherit; }
.prose pre { overflow-x: auto; padding: 22px; border-radius: 2px; font-size: 13px; line-height: 1.6; }
.prose code:not(pre code) { padding: .12em .35em; background: var(--paper-deep); font-family: ui-monospace, SFMono-Regular, Menlo, monospace; font-size: .88em; }
.prose table { width: 100%; margin: 2.2em 0; border-collapse: collapse; font-family: var(--sans); font-size: 13px; line-height: 1.55; }
.prose th, .prose td { padding: 12px 10px; border-bottom: 1px solid var(--line); text-align: left; vertical-align: top; }
.prose th, .prose td { padding: 12px 10px; border-bottom: 1px solid var(--line); text-align: left; vertical-align: top; overflow-wrap: anywhere; }
.prose th { color: var(--rust); font-size: 10px; letter-spacing: .08em; text-transform: uppercase; }
.prose img, .prose svg { width: min(1100px, calc(100vw - 48px)); max-width: none; margin: 2.6em 0 2.6em 50%; transform: translateX(-50%); }
@@ -213,13 +213,15 @@ button, input { font: inherit; }
.method-steps section { min-height: 230px; padding: 28px; }
.article-header { padding: 54px 0 64px; }
.article-kicker { margin-top: 40px; }
.article-header h1 { font-size: 48px; }
.article-kicker { gap: 10px; font-size: 9px; letter-spacing: .11em; }
.article-header h1 { font-size: clamp(38px, 11vw, 44px); line-height: 1.02; letter-spacing: -.035em; }
.article-header > p { font-size: 17px; }
.article-grid { padding-top: 48px; gap: 40px; }
.article-outline ol { grid-template-columns: 1fr; }
.prose { font-size: 17px; line-height: 1.85; }
.prose h2 { font-size: 32px; }
.prose table { display: block; overflow-x: auto; white-space: nowrap; }
.prose table { display: block; overflow-x: auto; white-space: normal; font-size: 12px; }
.prose th, .prose td { min-width: 112px; padding: 10px 8px; }
.prose img, .prose svg { width: calc(100vw - 28px); }
}
@@ -0,0 +1,104 @@
# Visual provenance
## 基本信息
- Renderer: OpenAI ImageGenbuilt-in mode
- Generated: 2026-08-10
- Article: `content/posts/git-collaboration-ai-development.md`
- Validation: 三张图片均已人工检查流程方向、中文标签、重复文字和水印;技术事实以正文为准。
## git-collaboration-flow.png
```text
Use case: infographic-diagram
Asset type: wide editorial infographic for a serious Chinese technical blog
Primary request: Create a clean horizontal infographic explaining the standard multi-person Git development workflow.
Scene/backdrop: warm off-white background, generous margins.
Style/medium: polished flat editorial infographic, vector-like shapes rendered as a raster image, restrained and professional, not playful, not futuristic.
Composition/framing: 16:9 landscape. One clear left-to-right flow with eight large nodes connected by simple arrows. A small role label is placed near each relevant stage. Strong visual hierarchy and ample whitespace.
Title text (verbatim): "多人协作开发流程"
Main node text, each verbatim and in this exact order:
"需求" → "方案" → "Issue" → "分支开发" → "PR / MR" → "CI" → "人工评审" → "合并发布"
Role labels, verbatim:
"产品负责人"
"技术负责人"
"开发者"
"工程系统"
"Reviewer"
Color palette: navy, muted teal, slate gray, a small amount of warm amber for decision points.
Typography: highly legible simplified Chinese sans serif; all text must be spelled exactly; large enough for a blog page.
Constraints: show only the listed labels; no extra prose; no company logos; no mascot; no decorative code; no watermark. Keep arrows unambiguous and avoid crossing lines.
Avoid: dense dashboard, 3D, gradients, neon colors, tiny text, English sentence fragments, duplicate nodes.
```
## ai-responsibility-lanes.png
```text
Use case: infographic-diagram
Asset type: wide editorial infographic for a serious Chinese technical blog
Primary request: Create a clear three-lane workflow showing the division of responsibilities after AI is integrated into software development.
Scene/backdrop: warm off-white background with generous whitespace.
Style/medium: polished flat editorial infographic, vector-like raster rendering, restrained, professional, calm.
Composition/framing: 16:9 landscape. Three horizontal swimlanes stacked vertically. Each lane has three large rounded cards connected left to right. Use subtle vertical alignment to show collaboration across lanes, but no tangled arrows.
Title text (verbatim): "AI 加入后的职责分工"
Lane 1 label (verbatim): "人"
Lane 1 cards, verbatim: "目标与验收" / "架构与风险" / "最终批准"
Lane 2 label (verbatim): "AI"
Lane 2 cards, verbatim: "调研与计划" / "编码与测试" / "失败分析"
Lane 3 label (verbatim): "工程系统"
Lane 3 cards, verbatim: "权限与隔离" / "CI 与门禁" / "记录与审计"
Color palette: human lane muted navy, AI lane muted teal, engineering system lane slate gray; small amber accents only at approval points.
Typography: highly legible simplified Chinese sans serif; all text must be spelled exactly and large enough for a blog page.
Constraints: show only the listed labels; no extra prose; no company logos; no robot mascot; no human faces; no watermark. Use simple abstract icons sparingly.
Avoid: dense dashboard, 3D, gradients, neon, tiny text, duplicate labels, illegible Chinese, decorative code snippets.
```
## ai-project-workflow-positions.png
```text
Use case: infographic-diagram
Asset type: wide editorial overview graphic for a serious Chinese technical blog
Primary request: Create a clean overview showing where five public AI development practices place AI in the software workflow. Do not rank products.
Scene/backdrop: warm off-white background, generous whitespace.
Style/medium: polished flat editorial infographic, vector-like raster rendering, restrained and professional.
Composition/framing: 16:9 landscape. A simple left-to-right development spine across the upper middle with four large stage labels. Below it, five distinct rounded cards positioned near the stage they influence. Cards may overlap adjacent stages visually through subtle connectors, but lines must remain simple.
Title text (verbatim): "AI 进入开发流程的位置"
Development stage labels, verbatim and in order: "任务与需求" → "实现" → "评审" → "仓库治理"
Five card titles and subtitles, all verbatim:
"OpenAI Codex" / "调研、实现与审查"
"Copilot coding agent" / "Issue 到 Draft PR"
"Claude Code Action" / "Issue / PR 触发"
"OpenClaw(项目实践)" / "规则、验证与自动审查"
"Agentic Workflows" / "事件驱动的持续自动化"
Color palette: navy, muted teal, slate gray, restrained amber accents.
Typography: highly legible simplified Chinese and English sans serif; all text must be spelled exactly; large enough for a blog.
Constraints: no ranking, no scores, no logos, no robot mascot, no company illustrations, no extra prose, no watermark. Make the distinction between a project practice, coding agents, an Action, and a workflow framework visually neutral.
Avoid: dense feature matrix, 3D, gradients, neon colors, tiny text, duplicate cards, illegible Chinese, crossed connectors.
```
## change-evidence-state.svg
- Asset type: deterministic Mermaid flow diagram.
- Renderer: `@mermaid-js/mermaid-cli`.
- Source: `change-evidence-state.mmd`.
- Purpose: explain the state, evidence and decision owner required as a change moves from problem discovery to production observation.
- Validation: manually checked node order, evidence labels, decision labels, arrow direction and desktop readability.
- Technical boundary: this is the article's general model, not a claim that every referenced repository implements identical states.
## test-selection-funnel.svg
- Asset type: deterministic Mermaid flow diagram.
- Renderer: `@mermaid-js/mermaid-cli`.
- Source: `test-selection-funnel.mmd`.
- Purpose: show how a test manifest is derived from Git Diff, directory rules, dependency graph, explicit risk mappings and historical regressions, with broad fallback when confidence is insufficient.
- Validation: manually checked selection order, fallback route, gate result and text wrapping.
- Technical boundary: the diagram combines verified public patterns with the article's generalized test-selection model; exact selectors differ by repository.
## agent-trust-boundary.svg
- Asset type: deterministic Mermaid security-boundary diagram.
- Renderer: `@mermaid-js/mermaid-cli`.
- Source: `agent-trust-boundary.mmd`.
- Purpose: separate untrusted input, read-only Agent execution, deterministic output validation, credentialed write execution and merge authorization.
- Validation: manually checked that the Agent never directly crosses into the credentialed write step and that CI/owner/human approval remains after the write request.
- Technical boundary: the diagram is a reference architecture synthesized from the cited official security designs, not the internal topology of any one vendor.
@@ -0,0 +1,30 @@
%%{init: {"theme": "base", "themeVariables": {"background": "transparent", "primaryColor": "#f2ede3", "primaryTextColor": "#253047", "primaryBorderColor": "#64748b", "lineColor": "#6b7280", "secondaryColor": "#e6edf5", "tertiaryColor": "#f7f4ed", "fontFamily": "Inter, PingFang SC, sans-serif"}, "flowchart": {"curve": "basis", "nodeSpacing": 32, "rankSpacing": 55}}}%%
flowchart TB
subgraph R1[" "]
direction LR
U["Issue / PR / 定时事件<br/>可能含不可信文本"] --> R["只读上下文<br/>代码、规则、历史"]
R --> A["Agent 沙箱<br/>有限文件、网络、工具和预算"]
A --> O["候选输出<br/>补丁、报告或结构化请求"]
end
subgraph R2[" "]
direction LR
V{"确定性验证<br/>Schema、允许目标、数量、补丁大小、威胁检测"} -->|"通过"| W["独立写入任务<br/>短期、最小权限凭据"]
W --> P["分支 / Draft PR / Issue 评论"]
P --> C["CI + Code Owner + 人工批准"]
C -->|"批准"| M["合并或发布"]
end
O --> V
V -->|"拒绝"| X["停止并保留证据"]
C -->|"不批准"| Y["返回审查意见"]
style R1 fill:transparent,stroke:transparent
style R2 fill:transparent,stroke:transparent
classDef untrusted fill:#f9e8e5,stroke:#a14f45,color:#35231f,stroke-width:1.5px;
classDef sandbox fill:#e6edf5,stroke:#486581,color:#1f2937,stroke-width:1.5px;
classDef gate fill:#f4edcf,stroke:#8a6d1f,color:#2f291a,stroke-width:1.5px;
classDef trusted fill:#e6f0e7,stroke:#4b7352,color:#1f2937,stroke-width:1.5px;
class U untrusted;
class R,A,O sandbox;
class V,X,Y,C gate;
class W,P,M trusted;
@@ -0,0 +1,22 @@
%%{init: {"theme": "base", "themeVariables": {"background": "transparent", "primaryColor": "#f2ede3", "primaryTextColor": "#253047", "primaryBorderColor": "#64748b", "lineColor": "#6b7280", "secondaryColor": "#e6edf5", "tertiaryColor": "#f7f4ed", "fontFamily": "Inter, PingFang SC, sans-serif"}, "flowchart": {"curve": "basis", "nodeSpacing": 26, "rankSpacing": 48}}}%%
flowchart TB
subgraph R1[" "]
direction LR
A["提出问题<br/>证据:用户影响、复现"] -->|"产品决定"| B["接受工作<br/>证据:目标、范围、优先级"]
B -->|"技术决定"| C["形成方案<br/>证据:影响面、风险、验收标准"]
C -->|"授权实现"| D["分支开发<br/>证据:Commit、测试、文档"]
end
subgraph R2[" "]
direction LR
E["PR / MR<br/>证据:Diff、检查清单、审查意见<br/>失败则返回开发"] -->|"门禁通过"| F["合入主分支<br/>证据:必需状态、批准记录"]
F -->|"发布策略"| G["部署与观察<br/>证据:版本、指标、日志、告警<br/>缺陷形成新一轮工作"]
end
D -->|"请求合并"| E
style R1 fill:transparent,stroke:transparent
style R2 fill:transparent,stroke:transparent
classDef decision fill:#e6edf5,stroke:#475569,color:#1f2937,stroke-width:1.5px;
classDef work fill:#f7f4ed,stroke:#8b7355,color:#1f2937,stroke-width:1.5px;
class A,B,C,E,F,G decision;
class D work;
@@ -0,0 +1,32 @@
%%{init: {"theme": "base", "themeVariables": {"background": "transparent", "primaryColor": "#f2ede3", "primaryTextColor": "#253047", "primaryBorderColor": "#64748b", "lineColor": "#6b7280", "secondaryColor": "#e6edf5", "tertiaryColor": "#f7f4ed", "fontFamily": "Inter, PingFang SC, sans-serif"}, "flowchart": {"curve": "basis", "nodeSpacing": 32, "rankSpacing": 45}}}%%
flowchart TB
subgraph R1[" "]
direction LR
A["Git Diff<br/>新增、修改、删除、重命名"] --> B["影响证据<br/>目录 · 依赖 · 业务风险 · 历史失败"]
B --> C["检查清单 Manifest<br/>选择什么、跳过什么、为什么"]
C --> D{"影响面完整、可信<br/>且足够小?"}
end
subgraph R2[" "]
direction LR
E["目标检查<br/>相关测试 + 永久门禁"] --> G["统一 Required Gate"]
F["扩大检查<br/>模块全量 / 平台矩阵 / 完整套件"] --> G
G --> H{"检查通过<br/>且跳过均有合法原因?"}
H -->|"是"| I["进入下一阶段"]
H -->|"否"| J["阻断并显示失败证据"]
end
D -->|"是"| E
D -->|"否 / 删除 / 公共契约 / 选择器改动"| F
style R1 fill:transparent,stroke:transparent
style R2 fill:transparent,stroke:transparent
classDef input fill:#f7f4ed,stroke:#8b7355,color:#1f2937,stroke-width:1.5px;
classDef analysis fill:#e6edf5,stroke:#486581,color:#1f2937,stroke-width:1.5px;
classDef gate fill:#f4edcf,stroke:#8a6d1f,color:#2f291a,stroke-width:1.5px;
classDef pass fill:#e6f0e7,stroke:#4b7352,color:#1f2937,stroke-width:1.5px;
classDef fail fill:#f9e8e5,stroke:#a14f45,color:#35231f,stroke-width:1.5px;
class A input;
class B,C,E,F analysis;
class D,G,H gate;
class I pass;
class J fail;