{
  "schemaVersion": 1,
  "siteUrl": "https://youniszhang.com/",
  "manifestUrl": "https://youniszhang.com/project-reuse-manifest.json",
  "projects": {
    "ai-blog-portfolio": {
      "id": "ai-blog-portfolio",
      "title": "AI 工程技术博客与内容交付平台",
      "description": "以 GitHub Markdown 为权威内容源，使用 Astro、Fastify、PostgreSQL、Pagefind 和版本化 Docker 镜像完成研究归档、静态发布、读者交互与受控部署。",
      "maturity": "field-tested",
      "revision": "83952b3bae58e05a20be5aed935cfb1dc3959ba5",
      "lastVerifiedAt": "2026-07-19",
      "publicUrl": "https://youniszhang.com/projects/ai-blog-portfolio/",
      "entrypoint": {
        "path": "project-kits/ai-blog-portfolio/README.md",
        "sha256": "fcc108e32a7cbd0a89d59b34811fcd4ee8514fc558a88e1b897749fb4362864c",
        "bytes": 1904,
        "publicUrl": "https://youniszhang.com/project-entrypoints/ai-blog-portfolio.md",
        "sourceUrl": "https://github.com/youniszhang/younis-ai-lab/blob/83952b3bae58e05a20be5aed935cfb1dc3959ba5/project-kits/ai-blog-portfolio/README.md"
      },
      "commands": [
        {
          "id": "content-contract",
          "script": "content:contract",
          "args": [],
          "kind": "test",
          "requires": [
            "Node.js >=22.12.0",
            "仓库根目录中的 Astro 与 CMS schema"
          ],
          "platform": "macOS、Linux 或 Windows；离线 Node.js",
          "output": "stdout 中的 CMS/内容合同一致性结论；退出码 0 为通过",
          "mutates": "none",
          "shellCommand": "npm run content:contract"
        },
        {
          "id": "deployment-contract-test",
          "script": "deploy:test",
          "args": [],
          "kind": "test",
          "requires": [
            "Node.js >=22.12.0",
            "POSIX shell 与可写系统临时目录"
          ],
          "platform": "macOS 或 Linux；使用隔离的 mock Docker/HTTP fixture",
          "output": "stdout 中的部署、验签、备份、readiness 和回滚合同结论",
          "mutates": "runtime",
          "shellCommand": "npm run deploy:test"
        },
        {
          "id": "editorial-check",
          "script": "editorial:check",
          "args": [],
          "kind": "test",
          "requires": [
            "Node.js >=22.12.0",
            "仓库根目录与完整文章来源账本"
          ],
          "platform": "macOS、Linux 或 Windows；离线 Node.js",
          "output": "stdout 中的文章、历史研究和负例数量；退出码 0 表示编辑合同通过",
          "mutates": "none",
          "shellCommand": "npm run editorial:check"
        },
        {
          "id": "monitoring-contract-test",
          "script": "monitor:test",
          "args": [],
          "kind": "test",
          "requires": [
            "Node.js >=22.12.0",
            "POSIX shell 与可写系统临时目录"
          ],
          "platform": "macOS 或 Linux；使用隔离的监控 fixture",
          "output": "stdout 中的七项运行检查、告警转换、留存与恢复证据结论",
          "mutates": "runtime",
          "shellCommand": "npm run monitor:test"
        }
      ],
      "artifacts": [
        {
          "id": "monitoring-production-evidence",
          "label": "生产监控与恢复证据",
          "path": "docs/monitoring-production-evidence.md",
          "sha256": "46cd4d241b368d097d7b7067abcebbec912bbddd8f6bb6f5dbf6784c3e070b3a",
          "bytes": 5864,
          "producedBy": "monitoring-contract-test",
          "publicUrl": "https://youniszhang.com/project-artifacts/ai-blog-portfolio/monitoring-production-evidence.md",
          "sourceUrl": "https://github.com/youniszhang/younis-ai-lab/blob/83952b3bae58e05a20be5aed935cfb1dc3959ba5/docs/monitoring-production-evidence.md"
        },
        {
          "id": "release-v010-production-evidence",
          "label": "v0.1.10 生产告警与恢复验收",
          "path": "docs/release-v0.1.10-production-evidence.md",
          "sha256": "ef0df95f0a5a05cd26d94431f877db3a0a29ef145faad575c3daaa4b44068f7d",
          "bytes": 9331,
          "producedBy": "deployment-contract-test",
          "publicUrl": "https://youniszhang.com/project-artifacts/ai-blog-portfolio/release-v010-production-evidence.md",
          "sourceUrl": "https://github.com/youniszhang/younis-ai-lab/blob/83952b3bae58e05a20be5aed935cfb1dc3959ba5/docs/release-v0.1.10-production-evidence.md"
        }
      ],
      "inputs": [
        "src/content/posts 与 src/content/projects 中通过 schema 的 Markdown 内容",
        "历史来源账本、冻结实验结果和 Asia/Shanghai 发布日合同",
        "构建期站点配置与服务器运行期的最小权限环境变量"
      ],
      "outputs": [
        "Astro 静态 HTML、RSS、Sitemap、Pagefind 索引与内容清单",
        "包含 dist 和 Fastify build-server 的固定版本 Docker 镜像",
        "部署、readiness、告警、备份与恢复的可审计运行记录"
      ],
      "reuseCases": [
        "复用内容 collection、日期门禁和来源合同搭建证据型技术站点",
        "复用 GitHub -> CI -> GHCR -> 宿主机 agent 的受控发布链路",
        "复用评论、账户、管理员 MFA、监控和回滚边界构建小型内容产品"
      ],
      "limitations": [
        "公开文章会被编译进发布镜像，但 GitHub Markdown 仍是权威源；运行时不能直接编辑镜像内正文。",
        "生产证据覆盖单实例发布、一次真实维护恢复和固定日期的告警演练，不代表高流量或多节点可用性。",
        "自动门禁只能验证结构和已编码合同，不能替代作者逐条核对事实、来源与引用语境。"
      ],
      "articles": [
        {
          "id": "2026-06-24-ai-interview-preparation-map",
          "title": "AI 应用开发面试准备地图",
          "relation": "context",
          "note": "本文把模型、RAG、Agent、Prompt、工程化和项目表达组织为文章理解与项目证据两类材料，为本站用文章反查可执行项目、用项目回指方法与证据提供作品集语境。",
          "commandRefs": [],
          "artifactRefs": [],
          "publicUrl": "https://youniszhang.com/blog/2026-06-24-ai-interview-preparation-map/",
          "publishedAt": "2026-06-24",
          "updatedAt": "2026-07-01"
        },
        {
          "id": "2026-06-25-project-retrospective-template",
          "title": "AI 项目复盘应该写什么",
          "relation": "design",
          "note": "本文给出问题、目标、架构、结果与复盘骨架，本站项目页沿用这套结构组织可核验交付证据。",
          "commandRefs": [],
          "artifactRefs": [],
          "publicUrl": "https://youniszhang.com/blog/2026-06-25-project-retrospective-template/",
          "publishedAt": "2026-06-25",
          "updatedAt": "2026-07-01"
        },
        {
          "id": "2026-06-26-ai-toolchain-for-content-workflow",
          "title": "用 AI 工具链改造内容生产流程",
          "relation": "context",
          "note": "本文描述选题、整理、Markdown 落库与发布检查的通用内容流程，为本项目从 Git 内容源到构建门禁提供工作流背景。",
          "commandRefs": [],
          "artifactRefs": [],
          "publicUrl": "https://youniszhang.com/blog/2026-06-26-ai-toolchain-for-content-workflow/",
          "publishedAt": "2026-06-26",
          "updatedAt": "2026-07-01"
        },
        {
          "id": "2026-07-01-ai-app-evaluation-checklist",
          "title": "AI 应用上线前的评估清单",
          "relation": "design",
          "note": "本文提出固定样本、失败归因与上线门槛，本项目据此设计文章实验工件和 preflight 检查，但它本身不是项目运行证据。",
          "commandRefs": [],
          "artifactRefs": [],
          "publicUrl": "https://youniszhang.com/blog/2026-07-01-ai-app-evaluation-checklist/",
          "publishedAt": "2026-07-01",
          "updatedAt": "2026-07-01"
        }
      ]
    },
    "ai-engineering-workbench": {
      "id": "ai-engineering-workbench",
      "title": "Agent 权限与未知终态恢复工作台",
      "description": "用真实 MCP 协议网关和确定性故障状态机验证 Agent 写操作的可信身份、租户隔离、一次性审批、审计、幂等意图与未知终态恢复。",
      "maturity": "reproduced",
      "revision": "83952b3bae58e05a20be5aed935cfb1dc3959ba5",
      "lastVerifiedAt": "2026-07-19",
      "publicUrl": "https://youniszhang.com/projects/ai-engineering-workbench/",
      "entrypoint": {
        "path": "project-kits/ai-engineering-workbench/README.md",
        "sha256": "61df65b1c87124e66b20b8ab3b34b368d44a7be33319bda3d027760505cd22ed",
        "bytes": 1714,
        "publicUrl": "https://youniszhang.com/project-entrypoints/ai-engineering-workbench.md",
        "sourceUrl": "https://github.com/youniszhang/younis-ai-lab/blob/83952b3bae58e05a20be5aed935cfb1dc3959ba5/project-kits/ai-engineering-workbench/README.md"
      },
      "commands": [
        {
          "id": "agent-recovery-capture",
          "script": "lab:agent-recovery:capture",
          "args": [],
          "kind": "capture",
          "requires": [
            "Node.js >=22.12.0",
            "POSIX /tmp 可写"
          ],
          "platform": "macOS 或 Linux；离线 Node.js",
          "output": "/tmp/younis-ai-lab-agent-recovery.json",
          "mutates": "runtime",
          "shellCommand": "npm run lab:agent-recovery:capture"
        },
        {
          "id": "agent-recovery-test",
          "script": "lab:agent-recovery:test",
          "args": [],
          "kind": "test",
          "requires": [
            "Node.js >=22.12.0",
            "仓库根目录"
          ],
          "platform": "macOS、Linux 或 Windows；离线 Node.js",
          "output": "TAP stdout；11 个故障场景及工件 replay/hash 断言",
          "mutates": "none",
          "shellCommand": "npm run lab:agent-recovery:test"
        },
        {
          "id": "mcp-gateway-demo",
          "script": "lab:mcp-gateway",
          "args": [],
          "kind": "capture",
          "requires": [
            "Node.js >=22.12.0",
            "仓库根目录已安装锁定依赖"
          ],
          "platform": "macOS、Linux 或 Windows；离线 Node.js",
          "output": "stdout 中的确定性 MCP 权限网关 JSON 示例",
          "mutates": "none",
          "shellCommand": "npm run lab:mcp-gateway"
        },
        {
          "id": "mcp-gateway-test",
          "script": "lab:mcp:test",
          "args": [],
          "kind": "test",
          "requires": [
            "Node.js >=22.12.0",
            "仓库根目录已安装锁定依赖"
          ],
          "platform": "macOS、Linux 或 Windows；离线 Node.js",
          "output": "TAP stdout；从网关返回、上游调用次数、租户记录和审计阶段共同判定",
          "mutates": "none",
          "shellCommand": "npm run lab:mcp:test"
        }
      ],
      "artifacts": [
        {
          "id": "agent-recovery-result",
          "label": "未知终态 11 场景结果",
          "path": "labs/agent-recovery/results/2026-07-13-results.json",
          "sha256": "2831d4c8cd6b051c20b06fdbf62cb4bc775c6cd7752ee24b4f35e7cc26c63bc5",
          "bytes": 7734,
          "producedBy": "agent-recovery-capture",
          "publicUrl": "https://youniszhang.com/project-artifacts/ai-engineering-workbench/agent-recovery-result.json",
          "sourceUrl": "https://github.com/youniszhang/younis-ai-lab/blob/83952b3bae58e05a20be5aed935cfb1dc3959ba5/labs/agent-recovery/results/2026-07-13-results.json"
        },
        {
          "id": "mcp-gateway-demo-result",
          "label": "MCP 网关状态变更示例",
          "path": "labs/mcp-policy-gateway/results/2026-07-13-demo.json",
          "sha256": "e608eb2cd3e341b9e5530671670bb951f5a19065d1c080eea9483b22a1cc0586",
          "bytes": 534,
          "producedBy": "mcp-gateway-demo",
          "publicUrl": "https://youniszhang.com/project-artifacts/ai-engineering-workbench/mcp-gateway-demo-result.json",
          "sourceUrl": "https://github.com/youniszhang/younis-ai-lab/blob/83952b3bae58e05a20be5aed935cfb1dc3959ba5/labs/mcp-policy-gateway/results/2026-07-13-demo.json"
        }
      ],
      "inputs": [
        "认证层提供的 principal、tenant、resource 与 scopes，不接受 tool arguments 自报身份",
        "包含 expectedVersion、一次性 approvalId 和幂等键的有限写操作",
        "dispatch 前失败、commit 后响应丢失、权威状态分叉等固定故障场景"
      ],
      "outputs": [
        "策略允许或拒绝决定、最小化审计事件和经过 schema 校验的上游结果",
        "权威记录版本、上游 mutation 次数与租户隔离断言",
        "succeeded、blocked、failed 或 unknown 终态及是否需要人工处理"
      ],
      "reuseCases": [
        "为 CRM、工单或知识库 MCP server 增加业务侧身份、租户和参数授权",
        "为不可逆或高价值工具调用增加一次性审批与并发版本保护",
        "把超时后的盲重试改为幂等查询、权威对账和人工接管状态机"
      ],
      "limitations": [
        "身份注入、ApprovalStore、审计、记录和恢复状态均为内存实现，不是生产 IAM 或分布式事务。",
        "确定性故障注入不证明真实网络能够判断请求是否越过 dispatch 或 commit 边界。",
        "没有验证数据库持久化、跨进程并发、durable outbox、速率限制、撤销和长期运行。"
      ],
      "articles": [
        {
          "id": "2026-06-28-agent-boundary",
          "title": "从工具调用理解 Agent 的工程边界",
          "relation": "design",
          "note": "本文把 Agent 收敛为固定工作流中的局部决策，并提出窄工具 schema、写操作审批、审计与失败恢复；本项目将这些原则具体化为 MCP 权限网关和未知终态恢复状态机。",
          "commandRefs": [],
          "artifactRefs": [],
          "publicUrl": "https://youniszhang.com/blog/2026-06-28-agent-boundary/",
          "publishedAt": "2026-06-28",
          "updatedAt": "2026-06-30"
        },
        {
          "id": "2026-07-13-agent-control-plane-mcp-openclaw-hermes",
          "title": "MCP、OpenClaw、Hermes Agent：行动系统真正缺的是控制面",
          "relation": "context",
          "note": "本文说明 MCP 只统一连接契约，身份、授权、审批、审计和恢复必须由外部控制面承担，为本项目划定系统边界。",
          "commandRefs": [],
          "artifactRefs": [],
          "publicUrl": "https://youniszhang.com/blog/2026-07-13-agent-control-plane-mcp-openclaw-hermes/",
          "publishedAt": "2026-07-13",
          "updatedAt": "2026-07-13"
        },
        {
          "id": "2026-07-13-agent-unknown-outcome-recovery-lab",
          "title": "Agent 超时后不能直接重试：11 个故障场景验证未知终态恢复",
          "relation": "validation",
          "note": "本文用 11 个故障场景验证安全重试、幂等意图绑定、权威对账和 unknown 后不自动重放。",
          "commandRefs": [
            "agent-recovery-test",
            "agent-recovery-capture"
          ],
          "artifactRefs": [
            "agent-recovery-result"
          ],
          "publicUrl": "https://youniszhang.com/blog/2026-07-13-agent-unknown-outcome-recovery-lab/",
          "publishedAt": "2026-07-13",
          "updatedAt": "2026-07-13"
        },
        {
          "id": "2026-07-13-ai-system-evolution-latency-reasoning-action",
          "title": "从低延迟交互、推理预算到行动系统：2024-2026 AI 工程主线",
          "relation": "design",
          "note": "本文将行动回路定义为任务身份、资源范围、窄工具 schema、审批、幂等执行、权威结果验证与恢复；本项目把这套控制面设计实现为 MCP 权限网关和未知终态状态机。",
          "commandRefs": [],
          "artifactRefs": [],
          "publicUrl": "https://youniszhang.com/blog/2026-07-13-ai-system-evolution-latency-reasoning-action/",
          "publishedAt": "2026-07-13",
          "updatedAt": "2026-07-13"
        },
        {
          "id": "2026-07-13-mcp-policy-gateway-reproducible-lab",
          "title": "MCP 权限网关可复现实验：身份、租户、一次性审批与审计",
          "relation": "validation",
          "note": "本文逐项重放 MCP 网关的默认拒绝、租户注入、一次性审批、版本冲突和审计故障，并以模拟上游终态验收。",
          "commandRefs": [
            "mcp-gateway-test",
            "mcp-gateway-demo"
          ],
          "artifactRefs": [
            "mcp-gateway-demo-result"
          ],
          "publicUrl": "https://youniszhang.com/blog/2026-07-13-mcp-policy-gateway-reproducible-lab/",
          "publishedAt": "2026-07-13",
          "updatedAt": "2026-07-13"
        }
      ]
    },
    "coding-agent-delivery-toolkit": {
      "id": "coding-agent-delivery-toolkit",
      "title": "Coding Agent 交付评测工具链",
      "description": "用固定任务、可见测试、评分器保留断言、路径边界、证据重放和历史仓库 Runner 校准 Coding Agent 补丁是否达到可合并交付标准。",
      "maturity": "reproduced",
      "revision": "83952b3bae58e05a20be5aed935cfb1dc3959ba5",
      "lastVerifiedAt": "2026-07-18",
      "publicUrl": "https://youniszhang.com/projects/coding-agent-delivery-toolkit/",
      "entrypoint": {
        "path": "project-kits/coding-agent-delivery-toolkit/README.md",
        "sha256": "6dce0373162abdac56f697232908c785dc2e3059f05976997fe16d568e9dd948",
        "bytes": 1948,
        "publicUrl": "https://youniszhang.com/project-entrypoints/coding-agent-delivery-toolkit.md",
        "sourceUrl": "https://github.com/youniszhang/younis-ai-lab/blob/83952b3bae58e05a20be5aed935cfb1dc3959ba5/project-kits/coding-agent-delivery-toolkit/README.md"
      },
      "commands": [
        {
          "id": "delivery-capture",
          "script": "lab:coding-agent:capture",
          "args": [
            "--out",
            "/tmp/younis-ai-lab-coding-agent.json"
          ],
          "kind": "capture",
          "requires": [
            "Node.js >=22.12.0",
            "Git 与 POSIX /tmp 可写"
          ],
          "platform": "macOS 或 Linux；离线 Node.js",
          "output": "/tmp/younis-ai-lab-coding-agent.json",
          "mutates": "runtime",
          "shellCommand": "npm run lab:coding-agent:capture -- --out /tmp/younis-ai-lab-coding-agent.json"
        },
        {
          "id": "delivery-test",
          "script": "lab:coding-agent:test",
          "args": [],
          "kind": "test",
          "requires": [
            "Node.js >=22.12.0",
            "Git 与仓库内固定任务/候选 fixture"
          ],
          "platform": "macOS、Linux 或 Windows；离线 Node.js",
          "output": "TAP stdout；3 个任务 x 4 组候选的 visible、hidden、scope、apply 与 evidence 门",
          "mutates": "runtime",
          "shellCommand": "npm run lab:coding-agent:test"
        },
        {
          "id": "historical-capture",
          "script": "lab:coding-agent:historical:capture",
          "args": [
            "--out",
            "/tmp/younis-ai-cache-policy-calibration.json"
          ],
          "kind": "capture",
          "requires": [
            "Node.js >=22.12.0、Git 与 bsdtar",
            "POSIX /tmp 可写"
          ],
          "platform": "macOS 或 Linux；离线 scorer 校准",
          "output": "/tmp/younis-ai-cache-policy-calibration.json",
          "mutates": "runtime",
          "shellCommand": "npm run lab:coding-agent:historical:capture -- --out /tmp/younis-ai-cache-policy-calibration.json"
        },
        {
          "id": "historical-non-model-smoke",
          "script": "lab:coding-agent:historical:smoke",
          "args": [
            "--out",
            "/Users/Shared/younis-ai-lab/runs/non-model-smoke-83952b3"
          ],
          "kind": "run",
          "requires": [
            "macOS Seatbelt、Git、bsdtar 与离线 Node 依赖",
            "/Users/Shared/younis-ai-lab/runs/non-model-smoke-83952b3 尚不存在"
          ],
          "platform": "macOS；注入 reference stub，不启动模型",
          "output": "/Users/Shared/younis-ai-lab/runs/non-model-smoke-83952b3 中的 non-model-smoke.json、result.json、运行日志与哈希",
          "mutates": "runtime",
          "shellCommand": "npm run lab:coding-agent:historical:smoke -- --out /Users/Shared/younis-ai-lab/runs/non-model-smoke-83952b3"
        },
        {
          "id": "historical-prepare",
          "script": "lab:coding-agent:historical:prepare",
          "args": [
            "--out",
            "/tmp/younis-ai-cache-policy-fixture"
          ],
          "kind": "setup",
          "requires": [
            "Node.js >=22.12.0、Git 与 bsdtar",
            "输出目录尚不存在"
          ],
          "platform": "macOS 或 Linux；离线准备固定历史 Git fixture",
          "output": "/tmp/younis-ai-cache-policy-fixture 中的无 remote 单提交仓库与 fixture manifest",
          "mutates": "runtime",
          "shellCommand": "npm run lab:coding-agent:historical:prepare -- --out /tmp/younis-ai-cache-policy-fixture"
        },
        {
          "id": "historical-profile-matrix",
          "script": "lab:coding-agent:historical:matrix",
          "args": [
            "--out",
            "/Users/Shared/younis-ai-lab/runs/profile-matrix-83952b3"
          ],
          "kind": "run",
          "requires": [
            "macOS Seatbelt 权限 profile 与固定系统工具",
            "/Users/Shared/younis-ai-lab/runs/profile-matrix-83952b3 尚不存在"
          ],
          "platform": "macOS；不启动模型的权限矩阵",
          "output": "/Users/Shared/younis-ai-lab/runs/profile-matrix-83952b3 中的 profile-matrix.json、stdout/stderr 与 SHA-256 校验文件",
          "mutates": "runtime",
          "shellCommand": "npm run lab:coding-agent:historical:matrix -- --out /Users/Shared/younis-ai-lab/runs/profile-matrix-83952b3"
        },
        {
          "id": "historical-run-help",
          "script": "lab:coding-agent:historical:run",
          "args": [
            "--help"
          ],
          "kind": "setup",
          "requires": [
            "macOS 与固定 Codex/Ollama/Node/Git/bsdtar identity",
            "权威零重试调用不得复用旧输出目录或重复历史已消费尝试"
          ],
          "platform": "macOS；只打印当前 Runner 参数合同，不启动模型",
          "output": "stdout 中的 Runner usage、输出目录与前置条件",
          "mutates": "none",
          "shellCommand": "npm run lab:coding-agent:historical:run -- --help"
        },
        {
          "id": "historical-test",
          "script": "lab:coding-agent:historical:test",
          "args": [],
          "kind": "test",
          "requires": [
            "Node.js >=22.12.0、Git、bsdtar 与 POSIX shell",
            "仓库根目录已安装锁定依赖"
          ],
          "platform": "macOS 或 Linux；部分权限 profile 测试仅 macOS",
          "output": "TAP stdout；scorer、fixture、权限 profile、信号和清理合同",
          "mutates": "runtime",
          "shellCommand": "npm run lab:coding-agent:historical:test"
        }
      ],
      "artifacts": [
        {
          "id": "delivery-calibration-result",
          "label": "3x4 交付评分器校准结果",
          "path": "labs/coding-agent-delivery-eval/results/2026-07-14-results.json",
          "sha256": "23a04de541ed94c264ff758e0d41c4031161ade4da5dd0522699598ef010f7e1",
          "bytes": 19166,
          "producedBy": "delivery-capture",
          "publicUrl": "https://youniszhang.com/project-artifacts/coding-agent-delivery-toolkit/delivery-calibration-result.json",
          "sourceUrl": "https://github.com/youniszhang/younis-ai-lab/blob/83952b3bae58e05a20be5aed935cfb1dc3959ba5/labs/coding-agent-delivery-eval/results/2026-07-14-results.json"
        },
        {
          "id": "historical-calibration-result",
          "label": "历史回放 scorer 校准结果",
          "path": "labs/coding-agent-historical-replay/results/2026-07-14-results.json",
          "sha256": "cc9db03c17ad0d5be23711a9460636c8a0edcde56d781dc8a08a1a1ffc0d61d4",
          "bytes": 14288,
          "producedBy": "historical-capture",
          "publicUrl": "https://youniszhang.com/project-artifacts/coding-agent-delivery-toolkit/historical-calibration-result.json",
          "sourceUrl": "https://github.com/youniszhang/younis-ai-lab/blob/83952b3bae58e05a20be5aed935cfb1dc3959ba5/labs/coding-agent-historical-replay/results/2026-07-14-results.json"
        }
      ],
      "inputs": [
        "任务规格、允许路径、受保护路径、fixture tree SHA-256 和公开测试",
        "候选 patch、候选报告的测试证据与候选不可见的 scorer 断言",
        "历史 base/reference commit、run contract、工具链 identity 和隔离 profile"
      ],
      "outputs": [
        "accepted 决定及 visible、hidden、scope、apply、evidence 各门的独立结果",
        "规范化 patch、TAP、失败样本、输入 identity、scorer hash 与清理证明",
        "历史 Runner 的 authority 分类、停止阶段、模型尝试次数和最终结果"
      ],
      "reuseCases": [
        "先用正负夹具校准 Coding Agent 评分器，再接入真实模型或人工基线",
        "为补丁流水线增加 allowed-path、独立测试和候选证据重放门禁",
        "在固定历史 commit 上比较多个 Agent，同时保留可复查输入与运行身份"
      ],
      "limitations": [
        "3x4 结果来自合成单文件任务和人工构造候选，不是任何模型成功率。",
        "历史 JSON 校准的是 scorer；唯一权威 Runner 调用在模型启动前 fail closed，因此没有模型结果。",
        "公开后的保留测试不再是未来模型实验的真正 holdout，生产比较必须冻结新任务和私有 scorer。"
      ],
      "articles": [
        {
          "id": "2025-05-19-openai-codex-cloud-coding-agent",
          "title": "Codex 云端 Coding Agent 首发复盘：异步沙箱交付的不是一段代码",
          "relation": "context",
          "note": "本文把 Coding Agent 的交付物定义为可审查 diff、日志和测试证据，而不是一段代码，为评分合同提供产品背景。",
          "commandRefs": [],
          "artifactRefs": [],
          "publicUrl": "https://youniszhang.com/blog/2025-05-19-openai-codex-cloud-coding-agent/",
          "publishedAt": "2025-05-19",
          "updatedAt": "2025-06-10"
        },
        {
          "id": "2025-05-25-claude-4-code-ga-agent-delivery",
          "title": "Claude 4 与 Claude Code GA：Coding Agent 交付的不是一次补全",
          "relation": "context",
          "note": "本文强调仓库上下文、权限、独立测试和人工合并边界，对应本项目的路径控制与 scorer 隔离设计。",
          "commandRefs": [],
          "artifactRefs": [],
          "publicUrl": "https://youniszhang.com/blog/2025-05-25-claude-4-code-ga-agent-delivery/",
          "publishedAt": "2025-05-25",
          "updatedAt": "2025-06-29"
        },
        {
          "id": "2026-07-14-coding-agent-delivery-evaluation-lab",
          "title": "Coding Agent 交付评测实验：可见测试通过，为什么补丁仍应被拒绝",
          "relation": "validation",
          "note": "本文公开 3x4 评分器校准，并记录历史回放 Runner 唯一一次权威调用在模型启动前因 runtime identity 不匹配而关闭。",
          "commandRefs": [
            "delivery-test",
            "delivery-capture",
            "historical-test",
            "historical-capture"
          ],
          "artifactRefs": [
            "delivery-calibration-result",
            "historical-calibration-result"
          ],
          "publicUrl": "https://youniszhang.com/blog/2026-07-14-coding-agent-delivery-evaluation-lab/",
          "publishedAt": "2026-07-14",
          "updatedAt": "2026-07-14"
        }
      ]
    },
    "genai-observability-recovery-lab": {
      "id": "genai-observability-recovery-lab",
      "title": "GenAI 可观测性与故障恢复实验台",
      "description": "用 OpenTelemetry SDK、Collector、Jaeger、持久队列和可控故障代理验证 GenAI trace 合同、业务结果关联、重复投递、partial success、容量、磁盘与恢复边界。",
      "maturity": "reproduced",
      "revision": "83952b3bae58e05a20be5aed935cfb1dc3959ba5",
      "lastVerifiedAt": "2026-07-18",
      "publicUrl": "https://youniszhang.com/projects/genai-observability-recovery-lab/",
      "entrypoint": {
        "path": "project-kits/genai-observability-recovery-lab/README.md",
        "sha256": "313ed10791fd48bfcbcf09aa62b101f61282e274896628057d8e395f49dd97bb",
        "bytes": 3043,
        "publicUrl": "https://youniszhang.com/project-entrypoints/genai-observability-recovery-lab.md",
        "sourceUrl": "https://github.com/youniszhang/younis-ai-lab/blob/83952b3bae58e05a20be5aed935cfb1dc3959ba5/project-kits/genai-observability-recovery-lab/README.md"
      },
      "commands": [
        {
          "id": "otel-ambiguity-run",
          "script": "lab:otel-ambiguity:run",
          "args": [],
          "kind": "run",
          "requires": [
            "Docker Compose 与固定镜像",
            "故障代理和实验端口可用"
          ],
          "platform": "macOS Docker Desktop 或 Linux Docker",
          "output": "/tmp/younis-ai-lab-otel-commit-ambiguity.json",
          "mutates": "runtime",
          "shellCommand": "npm run lab:otel-ambiguity:run"
        },
        {
          "id": "otel-ambiguity-test",
          "script": "lab:otel-ambiguity:test",
          "args": [],
          "kind": "test",
          "requires": [
            "Node.js >=22.12.0",
            "仓库根目录中的固定代理结果"
          ],
          "platform": "macOS、Linux 或 Windows；离线 fixture",
          "output": "TAP stdout；commit 后响应丢失、字节一致重试与 Jaeger 去重终态",
          "mutates": "none",
          "shellCommand": "npm run lab:otel-ambiguity:test"
        },
        {
          "id": "otel-drain-run",
          "script": "lab:otel-drain:run",
          "args": [],
          "kind": "run",
          "requires": [
            "Docker Compose 与固定镜像",
            "专用 volume、端口与 POSIX /tmp"
          ],
          "platform": "macOS Docker Desktop 或 Linux Docker",
          "output": "/tmp/younis-ai-lab-otel-drain-rate.json",
          "mutates": "runtime",
          "shellCommand": "npm run lab:otel-drain:run"
        },
        {
          "id": "otel-drain-test",
          "script": "lab:otel-drain:test",
          "args": [],
          "kind": "test",
          "requires": [
            "Node.js >=22.12.0",
            "仓库根目录中的固定 drain 结果"
          ],
          "platform": "macOS、Linux 或 Windows；离线 fixture",
          "output": "TAP stdout；12 批顺序、排空速率、queue 指标和 bbolt 文件增长合同",
          "mutates": "none",
          "shellCommand": "npm run lab:otel-drain:test"
        },
        {
          "id": "otel-eio-run",
          "script": "lab:otel-eio:run",
          "args": [],
          "kind": "run",
          "requires": [
            "Linux root、Docker、device-mapper、loop device 与 ext4 工具",
            "专用块设备、端口和 POSIX /tmp"
          ],
          "platform": "Linux amd64/arm64；需要 privileged device-mapper",
          "output": "/tmp/younis-ai-lab-otel-runtime-eio.json",
          "mutates": "runtime",
          "shellCommand": "npm run lab:otel-eio:run"
        },
        {
          "id": "otel-eio-test",
          "script": "lab:otel-eio:test",
          "args": [],
          "kind": "test",
          "requires": [
            "Node.js >=22.12.0",
            "仓库根目录中的固定 EIO 结果"
          ],
          "platform": "macOS、Linux 或 Windows；离线 fixture",
          "output": "TAP stdout；linear-error-linear、health/OTLP 分叉、fsck、恢复与重放合同",
          "mutates": "none",
          "shellCommand": "npm run lab:otel-eio:test"
        },
        {
          "id": "otel-enospc-run",
          "script": "lab:otel-enospc:run",
          "args": [],
          "kind": "run",
          "requires": [
            "Docker Compose、固定镜像与 tmpfs volume 支持",
            "专用端口和 POSIX /tmp"
          ],
          "platform": "macOS Docker Desktop 或 Linux Docker",
          "output": "/tmp/younis-ai-lab-otel-enospc-recovery.json",
          "mutates": "runtime",
          "shellCommand": "npm run lab:otel-enospc:run"
        },
        {
          "id": "otel-enospc-test",
          "script": "lab:otel-enospc:test",
          "args": [],
          "kind": "test",
          "requires": [
            "Node.js >=22.12.0",
            "仓库根目录中的固定 ENOSPC 结果"
          ],
          "platform": "macOS、Linux 或 Windows；离线 fixture",
          "output": "TAP stdout；物理 ENOSPC、字节一致复制、恢复和定向重放合同",
          "mutates": "none",
          "shellCommand": "npm run lab:otel-enospc:test"
        },
        {
          "id": "otel-integration-run",
          "script": "lab:otel-integration:run",
          "args": [],
          "kind": "run",
          "requires": [
            "Docker Compose 与固定镜像 digest",
            "POSIX /tmp 可写且实验端口可用"
          ],
          "platform": "macOS Docker Desktop 或 Linux Docker",
          "output": "/tmp/younis-ai-lab-genai-otel-integration.json",
          "mutates": "runtime",
          "shellCommand": "npm run lab:otel-integration:run"
        },
        {
          "id": "otel-integration-test",
          "script": "lab:otel-integration:test",
          "args": [],
          "kind": "test",
          "requires": [
            "Node.js >=22.12.0",
            "仓库根目录已安装锁定 OpenTelemetry 依赖"
          ],
          "platform": "macOS、Linux 或 Windows；离线 fixture",
          "output": "TAP stdout；SDK batching、采样、属性治理、exporter 故障与最终查询合同",
          "mutates": "none",
          "shellCommand": "npm run lab:otel-integration:test"
        },
        {
          "id": "otel-partial-run",
          "script": "lab:otel-partial:run",
          "args": [],
          "kind": "run",
          "requires": [
            "Docker Compose 与固定镜像",
            "partial-success 代理和实验端口可用"
          ],
          "platform": "macOS Docker Desktop 或 Linux Docker",
          "output": "/tmp/younis-ai-lab-otel-partial-success.json",
          "mutates": "runtime",
          "shellCommand": "npm run lab:otel-partial:run"
        },
        {
          "id": "otel-partial-test",
          "script": "lab:otel-partial:test",
          "args": [],
          "kind": "test",
          "requires": [
            "Node.js >=22.12.0",
            "仓库根目录中的固定 partial-success 结果"
          ],
          "platform": "macOS、Linux 或 Windows；离线 fixture",
          "output": "TAP stdout；HTTP 200 partial success、Collector metrics 与缺失 span 合同",
          "mutates": "none",
          "shellCommand": "npm run lab:otel-partial:test"
        },
        {
          "id": "otel-readonly-run",
          "script": "lab:otel-readonly:run",
          "args": [],
          "kind": "run",
          "requires": [
            "Docker Compose 与固定镜像",
            "可切换挂载模式的专用 volume 和端口"
          ],
          "platform": "macOS Docker Desktop 或 Linux Docker",
          "output": "/tmp/younis-ai-lab-otel-readonly-storage.json",
          "mutates": "runtime",
          "shellCommand": "npm run lab:otel-readonly:run"
        },
        {
          "id": "otel-readonly-test",
          "script": "lab:otel-readonly:test",
          "args": [],
          "kind": "test",
          "requires": [
            "Node.js >=22.12.0",
            "仓库根目录中的固定只读恢复结果"
          ],
          "platform": "macOS、Linux 或 Windows；离线 fixture",
          "output": "TAP stdout；rw-ro-rw、启动 fail closed、queue 恢复与重放合同",
          "mutates": "none",
          "shellCommand": "npm run lab:otel-readonly:test"
        },
        {
          "id": "otel-recovery-run",
          "script": "lab:otel-recovery:run",
          "args": [],
          "kind": "run",
          "requires": [
            "Docker Compose 与固定 Collector/Jaeger 镜像",
            "专用端口和 named volumes 可创建"
          ],
          "platform": "macOS Docker Desktop 或 Linux Docker",
          "output": "/tmp/younis-ai-lab-otel-persistent-recovery.json",
          "mutates": "runtime",
          "shellCommand": "npm run lab:otel-recovery:run"
        },
        {
          "id": "otel-recovery-test",
          "script": "lab:otel-recovery:test",
          "args": [],
          "kind": "test",
          "requires": [
            "Node.js >=22.12.0",
            "仓库根目录中的固定结果与 Compose 配置"
          ],
          "platform": "macOS、Linux 或 Windows；离线 fixture",
          "output": "TAP stdout；SIGKILL、named volume、queue drain 与 Jaeger 终态合同",
          "mutates": "none",
          "shellCommand": "npm run lab:otel-recovery:test"
        },
        {
          "id": "otel-saturation-run",
          "script": "lab:otel-saturation:run",
          "args": [],
          "kind": "run",
          "requires": [
            "Docker Compose 与固定镜像",
            "专用端口和 named volumes 可创建"
          ],
          "platform": "macOS Docker Desktop 或 Linux Docker",
          "output": "/tmp/younis-ai-lab-otel-queue-saturation.json",
          "mutates": "runtime",
          "shellCommand": "npm run lab:otel-saturation:run"
        },
        {
          "id": "otel-saturation-test",
          "script": "lab:otel-saturation:test",
          "args": [],
          "kind": "test",
          "requires": [
            "Node.js >=22.12.0",
            "仓库根目录中的固定结果与配置"
          ],
          "platform": "macOS、Linux 或 Windows；离线 fixture",
          "output": "TAP stdout；queue capacity、503、拒绝账本、恢复与定向重放合同",
          "mutates": "none",
          "shellCommand": "npm run lab:otel-saturation:test"
        },
        {
          "id": "otel-storage-full-run",
          "script": "lab:otel-storage-full:run",
          "args": [],
          "kind": "run",
          "requires": [
            "Docker Compose 与固定镜像",
            "专用 volume、端口与 POSIX /tmp"
          ],
          "platform": "macOS Docker Desktop 或 Linux Docker",
          "output": "/tmp/younis-ai-lab-otel-storage-full.json",
          "mutates": "runtime",
          "shellCommand": "npm run lab:otel-storage-full:run"
        },
        {
          "id": "otel-storage-full-test",
          "script": "lab:otel-storage-full:test",
          "args": [],
          "kind": "test",
          "requires": [
            "Node.js >=22.12.0",
            "仓库根目录中的固定 max_size 结果"
          ],
          "platform": "macOS、Linux 或 Windows；离线 fixture",
          "output": "TAP stdout；bbolt max_size、queue gauge 漂移、恢复与重放合同",
          "mutates": "none",
          "shellCommand": "npm run lab:otel-storage-full:test"
        },
        {
          "id": "trace-capture",
          "script": "lab:trace:capture",
          "args": [],
          "kind": "capture",
          "requires": [
            "Node.js >=22.12.0",
            "POSIX /tmp 可写"
          ],
          "platform": "macOS 或 Linux；离线 Node.js",
          "output": "/tmp/younis-ai-lab-genai-traces.json",
          "mutates": "runtime",
          "shellCommand": "npm run lab:trace:capture"
        },
        {
          "id": "trace-test",
          "script": "lab:trace:test",
          "args": [],
          "kind": "test",
          "requires": [
            "Node.js >=22.12.0",
            "仓库根目录中的固定 trace fixture"
          ],
          "platform": "macOS、Linux 或 Windows；离线 Node.js",
          "output": "TAP stdout；trace 拓扑、隐私、token、成本、失败层与业务终态合同",
          "mutates": "none",
          "shellCommand": "npm run lab:trace:test"
        }
      ],
      "artifacts": [
        {
          "id": "otel-ambiguity-result",
          "label": "后端 commit ambiguity 结果",
          "path": "labs/otel-commit-ambiguity/results/2026-07-15-results.json",
          "sha256": "0f467578e373ff928791e46cd6870f4cd98ffabf2de9833d28d59efe380aeab3",
          "bytes": 8427,
          "producedBy": "otel-ambiguity-run",
          "publicUrl": "https://youniszhang.com/project-artifacts/genai-observability-recovery-lab/otel-ambiguity-result.json",
          "sourceUrl": "https://github.com/youniszhang/younis-ai-lab/blob/83952b3bae58e05a20be5aed935cfb1dc3959ba5/labs/otel-commit-ambiguity/results/2026-07-15-results.json"
        },
        {
          "id": "otel-drain-result",
          "label": "队列排空与磁盘增长结果",
          "path": "labs/otel-drain-rate/results/2026-07-15-results.json",
          "sha256": "169580ecc1c700f6a551143bb3f15b190b8a31f689838a5426a31a859310e236",
          "bytes": 17744,
          "producedBy": "otel-drain-run",
          "publicUrl": "https://youniszhang.com/project-artifacts/genai-observability-recovery-lab/otel-drain-result.json",
          "sourceUrl": "https://github.com/youniszhang/younis-ai-lab/blob/83952b3bae58e05a20be5aed935cfb1dc3959ba5/labs/otel-drain-rate/results/2026-07-15-results.json"
        },
        {
          "id": "otel-eio-result",
          "label": "运行期 device-mapper EIO 结果",
          "path": "labs/otel-runtime-eio/results/2026-07-16-results.json",
          "sha256": "cbb2006ee1481ac7ce0437b804a19c9043fdfbd0463fdc75517839bd964b8a6b",
          "bytes": 12053,
          "producedBy": "otel-eio-run",
          "publicUrl": "https://youniszhang.com/project-artifacts/genai-observability-recovery-lab/otel-eio-result.json",
          "sourceUrl": "https://github.com/youniszhang/younis-ai-lab/blob/83952b3bae58e05a20be5aed935cfb1dc3959ba5/labs/otel-runtime-eio/results/2026-07-16-results.json"
        },
        {
          "id": "otel-enospc-result",
          "label": "tmpfs ENOSPC 异卷恢复结果",
          "path": "labs/otel-enospc-recovery/results/2026-07-15-results.json",
          "sha256": "294a7776647affe5b847b182b701a4a7f9a0059b18d3981e31f1ed5f760302ba",
          "bytes": 16178,
          "producedBy": "otel-enospc-run",
          "publicUrl": "https://youniszhang.com/project-artifacts/genai-observability-recovery-lab/otel-enospc-result.json",
          "sourceUrl": "https://github.com/youniszhang/younis-ai-lab/blob/83952b3bae58e05a20be5aed935cfb1dc3959ba5/labs/otel-enospc-recovery/results/2026-07-15-results.json"
        },
        {
          "id": "otel-integration-result",
          "label": "SDK 到 Collector/Jaeger 集成结果",
          "path": "labs/genai-otel-integration/results/2026-07-15-results.json",
          "sha256": "f97f23147880aa0e437b93750e800290c7fb14afb62e9e7f6db5801c04e779a9",
          "bytes": 21970,
          "producedBy": "otel-integration-run",
          "publicUrl": "https://youniszhang.com/project-artifacts/genai-observability-recovery-lab/otel-integration-result.json",
          "sourceUrl": "https://github.com/youniszhang/younis-ai-lab/blob/83952b3bae58e05a20be5aed935cfb1dc3959ba5/labs/genai-otel-integration/results/2026-07-15-results.json"
        },
        {
          "id": "otel-partial-result",
          "label": "OTLP partial success 结果",
          "path": "labs/otel-partial-success/results/2026-07-15-results.json",
          "sha256": "ef3981e27f13ac26ec33dc4bbff5c498bffa4d0c7b23f0e7e9a6e43a8616d5c3",
          "bytes": 8235,
          "producedBy": "otel-partial-run",
          "publicUrl": "https://youniszhang.com/project-artifacts/genai-observability-recovery-lab/otel-partial-result.json",
          "sourceUrl": "https://github.com/youniszhang/younis-ai-lab/blob/83952b3bae58e05a20be5aed935cfb1dc3959ba5/labs/otel-partial-success/results/2026-07-15-results.json"
        },
        {
          "id": "otel-readonly-result",
          "label": "只读队列启动恢复结果",
          "path": "labs/otel-readonly-storage/results/2026-07-16-results.json",
          "sha256": "01a0e7be8e4e105e81beae1848d8cf661d1de8fa94bad15c8407d059f3a82725",
          "bytes": 11667,
          "producedBy": "otel-readonly-run",
          "publicUrl": "https://youniszhang.com/project-artifacts/genai-observability-recovery-lab/otel-readonly-result.json",
          "sourceUrl": "https://github.com/youniszhang/younis-ai-lab/blob/83952b3bae58e05a20be5aed935cfb1dc3959ba5/labs/otel-readonly-storage/results/2026-07-16-results.json"
        },
        {
          "id": "otel-recovery-result",
          "label": "SIGKILL 持久队列恢复结果",
          "path": "labs/otel-persistent-recovery/results/2026-07-15-results.json",
          "sha256": "7e9c5f17cc28b6ceb7522e45b8b78f541fd695085a19eff36be20fd39ee9f053",
          "bytes": 13750,
          "producedBy": "otel-recovery-run",
          "publicUrl": "https://youniszhang.com/project-artifacts/genai-observability-recovery-lab/otel-recovery-result.json",
          "sourceUrl": "https://github.com/youniszhang/younis-ai-lab/blob/83952b3bae58e05a20be5aed935cfb1dc3959ba5/labs/otel-persistent-recovery/results/2026-07-15-results.json"
        },
        {
          "id": "otel-saturation-result",
          "label": "队列饱和与定向重放结果",
          "path": "labs/otel-queue-saturation/results/2026-07-15-results.json",
          "sha256": "002a85a03d15555fd36105149038977a43d92c158f1efe62bdd9400feb2ae13a",
          "bytes": 5372,
          "producedBy": "otel-saturation-run",
          "publicUrl": "https://youniszhang.com/project-artifacts/genai-observability-recovery-lab/otel-saturation-result.json",
          "sourceUrl": "https://github.com/youniszhang/younis-ai-lab/blob/83952b3bae58e05a20be5aed935cfb1dc3959ba5/labs/otel-queue-saturation/results/2026-07-15-results.json"
        },
        {
          "id": "otel-storage-full-result",
          "label": "bbolt max_size 满盘结果",
          "path": "labs/otel-storage-full/results/2026-07-15-results.json",
          "sha256": "319b1bbaee0458ee1e4b7a164c76ba32a38439230d722da56a089d5474d155be",
          "bytes": 13873,
          "producedBy": "otel-storage-full-run",
          "publicUrl": "https://youniszhang.com/project-artifacts/genai-observability-recovery-lab/otel-storage-full-result.json",
          "sourceUrl": "https://github.com/youniszhang/younis-ai-lab/blob/83952b3bae58e05a20be5aed935cfb1dc3959ba5/labs/otel-storage-full/results/2026-07-15-results.json"
        },
        {
          "id": "trace-contract-result",
          "label": "GenAI trace 合同校准结果",
          "path": "labs/genai-trace-contract/results/2026-07-15-results.json",
          "sha256": "8f877139c703ba19020b5e39042db5ee30b8fb44b3f2745d318093a72519a82b",
          "bytes": 31978,
          "producedBy": "trace-capture",
          "publicUrl": "https://youniszhang.com/project-artifacts/genai-observability-recovery-lab/trace-contract-result.json",
          "sourceUrl": "https://github.com/youniszhang/younis-ai-lab/blob/83952b3bae58e05a20be5aed935cfb1dc3959ba5/labs/genai-trace-contract/results/2026-07-15-results.json"
        }
      ],
      "inputs": [
        "固定 GenAI trace fixture、semantic convention 合同、合成价格与业务结果",
        "固定镜像 digest、Collector/Jaeger 配置、稳定 trace/span ID 和 payload hash",
        "响应丢失、partial success、下游停机、队列满、max_size、ENOSPC、只读与 EIO 故障合同"
      ],
      "outputs": [
        "trace 结构、隐私、token、合成成本、失败层与业务终态的合同违规列表",
        "Collector accepted/refused/sent/failed、queue、storage 与恢复阶段指标",
        "Jaeger 最终 unique、duplicate、missing span 以及重放和 volume 身份证据"
      ],
      "reuseCases": [
        "为 GenAI Agent 定义不记录原始 prompt 的低基数 trace 与业务结果 join 合同",
        "验证 Collector 持久队列在进程崩溃、容量耗尽和存储故障下的真实终态",
        "设计稳定 ID、拒绝账本、定向重放、磁盘水位和 queue age 告警"
      ],
      "limitations": [
        "输入主要是合成 span 和确定性故障，结果不是生产 trace 样本、模型质量或用户满意度证据。",
        "多数容器实验运行在单机 Docker Desktop；不覆盖节点丢失、跨节点故障转移、真实 SSD 损坏或长期负载。",
        "Jaeger/Collector 对重复 span、partial success、health 和错误码的行为与固定版本相关，升级后必须重新验收。"
      ],
      "articles": [
        {
          "id": "2026-07-15-opentelemetry-backend-commit-response-loss-retry-lab",
          "title": "OpenTelemetry 重复投递实验：Jaeger 已写入但响应丢失之后",
          "relation": "validation",
          "note": "本文制造 Jaeger 已写入但响应被重置的 commit ambiguity，观察 Collector 重投相同 payload 与后端最终去重状态。",
          "commandRefs": [
            "otel-ambiguity-test",
            "otel-ambiguity-run"
          ],
          "artifactRefs": [
            "otel-ambiguity-result"
          ],
          "publicUrl": "https://youniszhang.com/blog/2026-07-15-opentelemetry-backend-commit-response-loss-retry-lab/",
          "publishedAt": "2026-07-15",
          "updatedAt": "2026-07-15"
        },
        {
          "id": "2026-07-15-opentelemetry-file-storage-max-size-queue-gauge-drift-lab",
          "title": "OpenTelemetry 存储上限实验：Queue 显示 6/20，重启为什么只恢复 4 批",
          "relation": "validation",
          "note": "本文验证 bbolt max_size 先于 queue capacity 拒绝写入，并证明 queue gauge 可高估可恢复 batch 数。",
          "commandRefs": [
            "otel-storage-full-test",
            "otel-storage-full-run"
          ],
          "artifactRefs": [
            "otel-storage-full-result"
          ],
          "publicUrl": "https://youniszhang.com/blog/2026-07-15-opentelemetry-file-storage-max-size-queue-gauge-drift-lab/",
          "publishedAt": "2026-07-15",
          "updatedAt": "2026-07-15"
        },
        {
          "id": "2026-07-15-opentelemetry-genai-sdk-collector-jaeger-integration-lab",
          "title": "OpenTelemetry GenAI 真实链路实验：24 个 Span 如何穿过 Collector 到达 Jaeger",
          "relation": "validation",
          "note": "本文验证真实 OpenTelemetry SDK 导出的 24 个 span 穿过 Collector 后可由 Jaeger API 查询，并覆盖采样、属性治理和 exporter 故障。",
          "commandRefs": [
            "otel-integration-test",
            "otel-integration-run"
          ],
          "artifactRefs": [
            "otel-integration-result"
          ],
          "publicUrl": "https://youniszhang.com/blog/2026-07-15-opentelemetry-genai-sdk-collector-jaeger-integration-lab/",
          "publishedAt": "2026-07-15",
          "updatedAt": "2026-07-15"
        },
        {
          "id": "2026-07-15-opentelemetry-genai-trace-contract-lab",
          "title": "OpenTelemetry GenAI Trace 合同实验：Agent 成功为什么不等于业务成功",
          "relation": "design",
          "note": "本文定义 Agent、model、retrieval 与 tool span 合同，并校准隐私、token、合成成本、失败层和业务结果关联。",
          "commandRefs": [
            "trace-test",
            "trace-capture"
          ],
          "artifactRefs": [
            "trace-contract-result"
          ],
          "publicUrl": "https://youniszhang.com/blog/2026-07-15-opentelemetry-genai-trace-contract-lab/",
          "publishedAt": "2026-07-15",
          "updatedAt": "2026-07-15"
        },
        {
          "id": "2026-07-15-opentelemetry-persistent-queue-drain-rate-disk-growth-lab",
          "title": "OpenTelemetry 持久队列排空实验：12 批积压清空后，磁盘为什么没有缩小",
          "relation": "validation",
          "note": "本文记录 12 批积压的排空时间、顺序和 bbolt 文件增长；在固定版本、配置与本次进程生命周期内，queue 归零后文件尺寸保持不变。",
          "commandRefs": [
            "otel-drain-test",
            "otel-drain-run"
          ],
          "artifactRefs": [
            "otel-drain-result"
          ],
          "publicUrl": "https://youniszhang.com/blog/2026-07-15-opentelemetry-persistent-queue-drain-rate-disk-growth-lab/",
          "publishedAt": "2026-07-15",
          "updatedAt": "2026-07-15"
        },
        {
          "id": "2026-07-15-opentelemetry-persistent-queue-jaeger-sigkill-recovery-lab",
          "title": "OpenTelemetry 持久恢复实验：SIGKILL 后 7 个 Span 如何从磁盘队列回到 Jaeger",
          "relation": "validation",
          "note": "本文验证 Collector 与 Jaeger 被 SIGKILL 并删除后，保留 named volumes 可恢复 7 个 queued span，最终 7 unique、0 duplicate。",
          "commandRefs": [
            "otel-recovery-test",
            "otel-recovery-run"
          ],
          "artifactRefs": [
            "otel-recovery-result"
          ],
          "publicUrl": "https://youniszhang.com/blog/2026-07-15-opentelemetry-persistent-queue-jaeger-sigkill-recovery-lab/",
          "publishedAt": "2026-07-15",
          "updatedAt": "2026-07-15"
        },
        {
          "id": "2026-07-15-opentelemetry-persistent-queue-saturation-replay-lab",
          "title": "OpenTelemetry 队列容量实验：第 3 个 Span 为什么收到 503",
          "relation": "validation",
          "note": "本文证明 2-batch 队列在第 3 个请求返回 503，恢复只包含已接收两条，显式重放稳定 ID 后才达到 3/3。",
          "commandRefs": [
            "otel-saturation-test",
            "otel-saturation-run"
          ],
          "artifactRefs": [
            "otel-saturation-result"
          ],
          "publicUrl": "https://youniszhang.com/blog/2026-07-15-opentelemetry-persistent-queue-saturation-replay-lab/",
          "publishedAt": "2026-07-15",
          "updatedAt": "2026-07-15"
        },
        {
          "id": "2026-07-15-opentelemetry-tmpfs-enospc-out-of-place-recovery-lab",
          "title": "OpenTelemetry 真满盘实验：5 个 200 之后，为什么必须异卷恢复",
          "relation": "validation",
          "note": "本文在 64 KiB tmpfs 制造真实 ENOSPC，执行字节一致异卷复制，恢复已接受五批并只重放被拒第六批。",
          "commandRefs": [
            "otel-enospc-test",
            "otel-enospc-run"
          ],
          "artifactRefs": [
            "otel-enospc-result"
          ],
          "publicUrl": "https://youniszhang.com/blog/2026-07-15-opentelemetry-tmpfs-enospc-out-of-place-recovery-lab/",
          "publishedAt": "2026-07-15",
          "updatedAt": "2026-07-15"
        },
        {
          "id": "2026-07-15-otlp-partial-success-collector-metrics-data-loss-lab",
          "title": "OTLP Partial Success 实验：Collector 显示 Sent 4，Jaeger 为什么只有 2",
          "relation": "validation",
          "note": "本文验证 HTTP 200 partial success 下 Collector sent=4 仍可能只有 2 个 span 到达 Jaeger，缺失必须由响应与终态共同识别。",
          "commandRefs": [
            "otel-partial-test",
            "otel-partial-run"
          ],
          "artifactRefs": [
            "otel-partial-result"
          ],
          "publicUrl": "https://youniszhang.com/blog/2026-07-15-otlp-partial-success-collector-metrics-data-loss-lab/",
          "publishedAt": "2026-07-15",
          "updatedAt": "2026-07-15"
        },
        {
          "id": "2026-07-16-opentelemetry-readonly-persistent-queue-startup-recovery-lab",
          "title": "OpenTelemetry 只读队列实验：旧数据没坏，Collector 为什么仍启动失败",
          "relation": "validation",
          "note": "本文把原 queue volume 只读挂载给 replacement，验证进程 fail closed、数据库未变，恢复读写后加载三批并定向重放。",
          "commandRefs": [
            "otel-readonly-test",
            "otel-readonly-run"
          ],
          "artifactRefs": [
            "otel-readonly-result"
          ],
          "publicUrl": "https://youniszhang.com/blog/2026-07-16-opentelemetry-readonly-persistent-queue-startup-recovery-lab/",
          "publishedAt": "2026-07-16",
          "updatedAt": "2026-07-16"
        },
        {
          "id": "2026-07-16-opentelemetry-runtime-device-mapper-eio-recovery-lab",
          "title": "OpenTelemetry 运行期 EIO 实验：health 还是 200，为什么已经拒绝数据",
          "relation": "validation",
          "note": "本文在线切换 device-mapper error target，证明 health 仍为 200 时 OTLP 已 503；修复、fsck、重启与定向重放后终态完整。",
          "commandRefs": [
            "otel-eio-test",
            "otel-eio-run"
          ],
          "artifactRefs": [
            "otel-eio-result"
          ],
          "publicUrl": "https://youniszhang.com/blog/2026-07-16-opentelemetry-runtime-device-mapper-eio-recovery-lab/",
          "publishedAt": "2026-07-16",
          "updatedAt": "2026-07-16"
        }
      ]
    },
    "local-inference-capacity-planner": {
      "id": "local-inference-capacity-planner",
      "title": "本地推理容量规划工具",
      "description": "先按总参数与位宽估算名义权重存储，再固定 Ollama 模型 digest、生成参数和结构化任务采集质量、TTFT、总耗时与吞吐，为本地推理建立可复查容量基线。",
      "maturity": "reproduced",
      "revision": "83952b3bae58e05a20be5aed935cfb1dc3959ba5",
      "lastVerifiedAt": "2026-07-19",
      "publicUrl": "https://youniszhang.com/projects/local-inference-capacity-planner/",
      "entrypoint": {
        "path": "project-kits/local-inference-capacity-planner/README.md",
        "sha256": "2433ec86d54bc02406e7efa58044ec401f4366b79d49e4ecaec3289b2c7a28ef",
        "bytes": 1940,
        "publicUrl": "https://youniszhang.com/project-entrypoints/local-inference-capacity-planner.md",
        "sourceUrl": "https://github.com/youniszhang/younis-ai-lab/blob/83952b3bae58e05a20be5aed935cfb1dc3959ba5/project-kits/local-inference-capacity-planner/README.md"
      },
      "commands": [
        {
          "id": "local-inference-benchmark",
          "script": "lab:inference:benchmark",
          "args": [
            "--base-url",
            "http://127.0.0.1:11434",
            "--model",
            "qwen3:8b",
            "--expected-digest",
            "500a1f067a9f782620b40bee6f7b0c89e17ae61f686b92c24933e4ca4b2b8b41",
            "--rounds",
            "2"
          ],
          "kind": "run",
          "requires": [
            "Ollama 已监听 127.0.0.1:11434",
            "qwen3:8b 的 /api/tags digest 与合同完全一致",
            "POSIX /tmp 可写且机器负载可记录"
          ],
          "platform": "macOS 或 Linux；Ollama 本地 HTTP",
          "output": "/tmp/younis-ai-lab-qwen3-8b.json；模型/环境身份、14 次运行、正确性与延迟吞吐汇总",
          "mutates": "runtime",
          "shellCommand": "npm run lab:inference:benchmark -- --base-url http://127.0.0.1:11434 --model qwen3:8b --expected-digest 500a1f067a9f782620b40bee6f7b0c89e17ae61f686b92c24933e4ca4b2b8b41 --rounds 2"
        },
        {
          "id": "local-inference-test",
          "script": "lab:inference:test",
          "args": [],
          "kind": "test",
          "requires": [
            "Node.js >=22.12.0",
            "仓库根目录；不需要真实 Ollama"
          ],
          "platform": "macOS、Linux 或 Windows；离线 fixture",
          "output": "TAP stdout；流解析、指标、CLI、digest 漂移与冻结工件合同",
          "mutates": "none",
          "shellCommand": "npm run lab:inference:test"
        },
        {
          "id": "model-memory-capture",
          "script": "lab:model-memory",
          "args": [
            "--format",
            "json",
            "--out",
            "/tmp/younis-ai-lab-model-memory.json"
          ],
          "kind": "capture",
          "requires": [
            "Node.js >=22.12.0",
            "POSIX /tmp 可写"
          ],
          "platform": "macOS 或 Linux；离线 Node.js",
          "output": "/tmp/younis-ai-lab-model-memory.json；协议、公式、型号输入、16/8/4-bit GiB 与排除项",
          "mutates": "runtime",
          "shellCommand": "npm run lab:model-memory -- --format json --out /tmp/younis-ai-lab-model-memory.json"
        }
      ],
      "artifacts": [
        {
          "id": "nominal-model-memory-estimates",
          "label": "DeepSeek-R1 与蒸馏型号名义权重估算",
          "path": "labs/model-memory-estimator/results/nominal-weight-estimates-v1.json",
          "sha256": "beadddaf7bf3e118e78ee3b38550912c9f7e91a09fa785797463eda77577950b",
          "bytes": 4081,
          "producedBy": "model-memory-capture",
          "publicUrl": "https://youniszhang.com/project-artifacts/local-inference-capacity-planner/nominal-model-memory-estimates.json",
          "sourceUrl": "https://github.com/youniszhang/younis-ai-lab/blob/83952b3bae58e05a20be5aed935cfb1dc3959ba5/labs/model-memory-estimator/results/nominal-weight-estimates-v1.json"
        },
        {
          "id": "qwen3-8b-streaming-baseline",
          "label": "Qwen3 8B 单机流式基线",
          "path": "labs/local-inference-benchmark/results/2026-07-13-qwen3-8b.json",
          "sha256": "1f8ba8056d8978adf6f01d100e62805d223afcad92f97fc04d6a543fe03d863f",
          "bytes": 5470,
          "producedBy": "local-inference-benchmark",
          "publicUrl": "https://youniszhang.com/project-artifacts/local-inference-capacity-planner/qwen3-8b-streaming-baseline.json",
          "sourceUrl": "https://github.com/youniszhang/younis-ai-lab/blob/83952b3bae58e05a20be5aed935cfb1dc3959ba5/labs/local-inference-benchmark/results/2026-07-13-qwen3-8b.json"
        }
      ],
      "inputs": [
        "型号名、十进制名义总参数、可选激活参数与 16/8/4-bit 位宽",
        "Ollama base URL、模型名称和由 /api/tags 返回的精确模型 digest",
        "带结构化验证器的固定任务集，以及预热、轮数和顺序合同",
        "temperature、seed、num_ctx、num_predict、think 和 JSON format 设置"
      ],
      "outputs": [
        "版本化名义权重 JSON：公式、型号输入、理想 GiB 与未覆盖的运行时开销",
        "每次请求的原始 JSON 文本、正确性、TTFT、总耗时和 token 统计",
        "完成率、任务正确率、TTFT P50/P95、总耗时 P50/P95 与输出吞吐 P50/P95",
        "CPU、内存、操作系统、模型量化与 capture 时间等环境证据"
      ],
      "reuseCases": [
        "在同一机器上比较模型或量化版本前冻结身份、任务和生成参数",
        "为结构化抽取、策略判断和简单代码审查建立延迟与正确性基线",
        "在容量扩展前增加并发、上下文长度和持续负载矩阵，估算 SLO 余量"
      ],
      "limitations": [
        "冻结结果只有一台机器、一个 qwen3:8b 量化版本、14 次串行短请求，P95 样本量很小。",
        "未测并发、排队、长上下文、内存峰值、能耗、冷启动、持续负载或故障恢复。",
        "时间指标受机器负载与缓存影响，新 capture 是新观察，不能要求与历史结果逐字节一致。"
      ],
      "articles": [
        {
          "id": "2025-01-22-deepseek-r1-rl-distill-production-boundaries",
          "title": "DeepSeek-R1 的开放推理到底开放了什么：RL、蒸馏与生产成本边界",
          "relation": "validation",
          "note": "本文实际运行名义权重存储估算器，区分 671B 总参数与 37B 激活参数，并用冻结 JSON 限定 16/8/4-bit 理想估算的适用边界。",
          "commandRefs": [
            "model-memory-capture"
          ],
          "artifactRefs": [
            "nominal-model-memory-estimates"
          ],
          "publicUrl": "https://youniszhang.com/blog/2025-01-22-deepseek-r1-rl-distill-production-boundaries/",
          "publishedAt": "2025-01-22",
          "updatedAt": "2025-02-10"
        },
        {
          "id": "2026-06-27-local-llm-deployment-notes",
          "title": "本地大模型部署的取舍记录",
          "relation": "context",
          "note": "本文梳理本地部署在显存、速度、质量和维护上的取舍，本项目把其中速度与任务质量变成固定采集合同。",
          "commandRefs": [],
          "artifactRefs": [],
          "publicUrl": "https://youniszhang.com/blog/2026-06-27-local-llm-deployment-notes/",
          "publishedAt": "2026-06-27",
          "updatedAt": "2026-07-01"
        },
        {
          "id": "2026-06-29-structured-prompt-method",
          "title": "Prompt 工程不是玄学：我的结构化提示词方法",
          "relation": "design",
          "note": "本文把 Prompt 定义为包含目标、上下文、约束、输出格式和评估标准的接口合同；本项目据此固定 JSON 任务、生成参数与独立验证器，并保留含糊字段与收紧 schema 的对照失败样本。",
          "commandRefs": [],
          "artifactRefs": [],
          "publicUrl": "https://youniszhang.com/blog/2026-06-29-structured-prompt-method/",
          "publishedAt": "2026-06-29",
          "updatedAt": "2026-06-30"
        },
        {
          "id": "2026-07-13-open-weight-deployment-economics-llama-qwen-deepseek",
          "title": "Llama、Qwen、DeepSeek 开放权重之后：部署经济学不是免 API 账单",
          "relation": "design",
          "note": "本文要求按满足质量与 SLA 的成功任务总成本选型，本项目先提供单机延迟、吞吐和正确性基线。",
          "commandRefs": [],
          "artifactRefs": [],
          "publicUrl": "https://youniszhang.com/blog/2026-07-13-open-weight-deployment-economics-llama-qwen-deepseek/",
          "publishedAt": "2026-07-13",
          "updatedAt": "2026-07-13"
        },
        {
          "id": "2026-07-13-qwen3-8b-local-inference-benchmark",
          "title": "本地模型不是下载成功就算部署：Qwen3 8B 的流式推理与任务正确性实测",
          "relation": "validation",
          "note": "本文公开 qwen3:8b 的 14 次串行流式请求、固定模型身份、逐任务输出和含糊提示失败样本。",
          "commandRefs": [
            "local-inference-test",
            "local-inference-benchmark"
          ],
          "artifactRefs": [
            "qwen3-8b-streaming-baseline"
          ],
          "publicUrl": "https://youniszhang.com/blog/2026-07-13-qwen3-8b-local-inference-benchmark/",
          "publishedAt": "2026-07-13",
          "updatedAt": "2026-07-13"
        }
      ]
    },
    "rag-knowledge-base": {
      "id": "rag-knowledge-base",
      "title": "RAG 检索与 Agentic 工作流评测台",
      "description": "基于 Node.js 固定语料和查询标签，比较 BM25、显式查询扩展、字符检索、RRF 与有状态自适应检索，并验证 ACL、拒答、预算和单位正确成本。",
      "maturity": "reproduced",
      "revision": "83952b3bae58e05a20be5aed935cfb1dc3959ba5",
      "lastVerifiedAt": "2026-07-18",
      "publicUrl": "https://youniszhang.com/projects/rag-knowledge-base/",
      "entrypoint": {
        "path": "project-kits/rag-knowledge-base/README.md",
        "sha256": "f6378e8af162b7b6c5ca8553932b4fee2bfafadbdac25ede4b15047626ec2cc8",
        "bytes": 2031,
        "publicUrl": "https://youniszhang.com/project-entrypoints/rag-knowledge-base.md",
        "sourceUrl": "https://github.com/youniszhang/younis-ai-lab/blob/83952b3bae58e05a20be5aed935cfb1dc3959ba5/project-kits/rag-knowledge-base/README.md"
      },
      "commands": [
        {
          "id": "agentic-rag-capture",
          "script": "lab:agentic-rag:capture",
          "args": [
            "--corpus",
            "labs/agentic-rag-eval/data/corpus.json",
            "--queries",
            "labs/agentic-rag-eval/data/queries.json"
          ],
          "kind": "capture",
          "requires": [
            "Node.js >=22.12.0",
            "POSIX /tmp 可写"
          ],
          "platform": "macOS 或 Linux；离线 Node.js",
          "output": "/tmp/younis-ai-lab-agentic-rag-results.json；含输入身份、逐查询 trace、终态、ACL、预算与成本",
          "mutates": "runtime",
          "shellCommand": "npm run lab:agentic-rag:capture -- --corpus labs/agentic-rag-eval/data/corpus.json --queries labs/agentic-rag-eval/data/queries.json"
        },
        {
          "id": "agentic-rag-test",
          "script": "lab:agentic-rag:test",
          "args": [],
          "kind": "test",
          "requires": [
            "Node.js >=22.12.0",
            "仓库根目录中的固定多租户 corpus、queries 与结果工件"
          ],
          "platform": "macOS、Linux 或 Windows；离线 Node.js",
          "output": "TAP stdout；路由、ACL、状态机、预算、输入 schema/hash 与工件 replay",
          "mutates": "runtime",
          "shellCommand": "npm run lab:agentic-rag:test"
        },
        {
          "id": "rag-retrieval-capture",
          "script": "lab:rag:capture",
          "args": [
            "--corpus",
            "labs/rag-retrieval-eval/data/corpus.json",
            "--queries",
            "labs/rag-retrieval-eval/data/queries.json"
          ],
          "kind": "capture",
          "requires": [
            "Node.js >=22.12.0",
            "POSIX /tmp 可写"
          ],
          "platform": "macOS 或 Linux；离线 Node.js",
          "output": "/tmp/younis-ai-lab-rag-results.json；含输入字节数/SHA-256、排序指标、失败样本和逐查询排名",
          "mutates": "runtime",
          "shellCommand": "npm run lab:rag:capture -- --corpus labs/rag-retrieval-eval/data/corpus.json --queries labs/rag-retrieval-eval/data/queries.json"
        },
        {
          "id": "rag-retrieval-test",
          "script": "lab:rag:test",
          "args": [],
          "kind": "test",
          "requires": [
            "Node.js >=22.12.0",
            "仓库根目录中的固定 corpus、queries 与结果工件"
          ],
          "platform": "macOS、Linux 或 Windows；离线 Node.js",
          "output": "TAP stdout；tokenizer、扩展、RRF、指标、输入 schema/hash 与工件 replay",
          "mutates": "runtime",
          "shellCommand": "npm run lab:rag:test"
        }
      ],
      "artifacts": [
        {
          "id": "agentic-rag-result",
          "label": "Agentic RAG 状态机固定结果",
          "path": "labs/agentic-rag-eval/results/2026-07-15-results.json",
          "sha256": "7ea15ce227bcb1428bcf693941197ff477e5b9d3567dbe0707795a487d668efa",
          "bytes": 130174,
          "producedBy": "agentic-rag-capture",
          "publicUrl": "https://youniszhang.com/project-artifacts/rag-knowledge-base/agentic-rag-result.json",
          "sourceUrl": "https://github.com/youniszhang/younis-ai-lab/blob/83952b3bae58e05a20be5aed935cfb1dc3959ba5/labs/agentic-rag-eval/results/2026-07-15-results.json"
        },
        {
          "id": "rag-retrieval-result",
          "label": "词法检索与 RRF 固定结果",
          "path": "labs/rag-retrieval-eval/results/2026-07-13-results.json",
          "sha256": "a48b4a9bd64f87d9e70dc9ff562d5aa35b5181249a9ea221262a0e16303dbe5b",
          "bytes": 12605,
          "producedBy": "rag-retrieval-capture",
          "publicUrl": "https://youniszhang.com/project-artifacts/rag-knowledge-base/rag-retrieval-result.json",
          "sourceUrl": "https://github.com/youniszhang/younis-ai-lab/blob/83952b3bae58e05a20be5aed935cfb1dc3959ba5/labs/rag-retrieval-eval/results/2026-07-13-results.json"
        }
      ],
      "inputs": [
        "带稳定 ID、正文、标签与租户可见性的 JSON corpus",
        "带 relevant 文档、期望 answer/abstain、tenant 与 scope 的查询标签",
        "固定检索方法、支持阈值、ACL、步骤预算和合成成本模型"
      ],
      "outputs": [
        "Recall@3、MRR@10、相关文档 micro recall、路由与拒答指标",
        "逐查询排名、状态转移、停止原因、ACL 检查与失败归因",
        "平均检索步骤、工作量、unit accepted cost 与方法间 delta"
      ],
      "reuseCases": [
        "在更换 tokenizer、query expansion、retriever 或 reranker 前建立回归基线",
        "为多租户知识库验证 ACL 在每次检索和最终上下文中均未泄漏",
        "比较一次检索与自适应检索带来的正确率收益和额外工作量"
      ],
      "limitations": [
        "两组数据都是小型合成策略库，不能代表真实知识库的语言、噪声、更新和权限分布。",
        "基础 lab 不含 embedding、向量数据库、reranker 或 LLM；Agentic lab 的答案决策和成本也是确定性模拟。",
        "当前结果不包含在线并发、真实模型 token、延迟、人工满意度或生产数据治理。"
      ],
      "articles": [
        {
          "id": "2026-06-30-rag-practice",
          "title": "RAG 知识库从 0 到 1 的工程实践",
          "relation": "context",
          "note": "本文梳理文档处理、召回、重排和答案生成主链路；本项目把其中检索与决策部分收紧为可重放评测合同。",
          "commandRefs": [],
          "artifactRefs": [],
          "publicUrl": "https://youniszhang.com/blog/2026-06-30-rag-practice/",
          "publishedAt": "2026-06-30",
          "updatedAt": "2026-06-30"
        },
        {
          "id": "2026-07-13-rag-retrieval-evaluation-lab",
          "title": "RAG 检索不是接上向量库就结束：一次可复现的中文策略库排序实验",
          "relation": "validation",
          "note": "本文使用 12 条策略文档和 12 条查询比较四种词法策略，固定排序指标、拒答决策和失败样本。",
          "commandRefs": [
            "rag-retrieval-test",
            "rag-retrieval-capture"
          ],
          "artifactRefs": [
            "rag-retrieval-result"
          ],
          "publicUrl": "https://youniszhang.com/blog/2026-07-13-rag-retrieval-evaluation-lab/",
          "publishedAt": "2026-07-13",
          "updatedAt": "2026-07-13"
        },
        {
          "id": "2026-07-15-agentic-rag-state-machine-evaluation-lab",
          "title": "Agentic RAG 不是多检索一步：状态、ACL、拒答与单位正确成本实验",
          "relation": "validation",
          "note": "本文在 24 条多租户查询上比较固定单次检索与自适应状态机，验证 ACL、预算、答案决策和单位 accepted 成本。",
          "commandRefs": [
            "agentic-rag-test",
            "agentic-rag-capture"
          ],
          "artifactRefs": [
            "agentic-rag-result"
          ],
          "publicUrl": "https://youniszhang.com/blog/2026-07-15-agentic-rag-state-machine-evaluation-lab/",
          "publishedAt": "2026-07-15",
          "updatedAt": "2026-07-15"
        }
      ]
    }
  },
  "articles": {
    "2025-01-22-deepseek-r1-rl-distill-production-boundaries": {
      "id": "2025-01-22-deepseek-r1-rl-distill-production-boundaries",
      "title": "DeepSeek-R1 的开放推理到底开放了什么：RL、蒸馏与生产成本边界",
      "publishedAt": "2025-01-22",
      "updatedAt": "2025-02-10",
      "publicUrl": "https://youniszhang.com/blog/2025-01-22-deepseek-r1-rl-distill-production-boundaries/",
      "projects": [
        {
          "id": "local-inference-capacity-planner",
          "title": "本地推理容量规划工具",
          "relation": "validation",
          "note": "本文实际运行名义权重存储估算器，区分 671B 总参数与 37B 激活参数，并用冻结 JSON 限定 16/8/4-bit 理想估算的适用边界。",
          "commandRefs": [
            "model-memory-capture"
          ],
          "artifactRefs": [
            "nominal-model-memory-estimates"
          ],
          "publicUrl": "https://youniszhang.com/projects/local-inference-capacity-planner/"
        }
      ]
    },
    "2025-05-19-openai-codex-cloud-coding-agent": {
      "id": "2025-05-19-openai-codex-cloud-coding-agent",
      "title": "Codex 云端 Coding Agent 首发复盘：异步沙箱交付的不是一段代码",
      "publishedAt": "2025-05-19",
      "updatedAt": "2025-06-10",
      "publicUrl": "https://youniszhang.com/blog/2025-05-19-openai-codex-cloud-coding-agent/",
      "projects": [
        {
          "id": "coding-agent-delivery-toolkit",
          "title": "Coding Agent 交付评测工具链",
          "relation": "context",
          "note": "本文把 Coding Agent 的交付物定义为可审查 diff、日志和测试证据，而不是一段代码，为评分合同提供产品背景。",
          "commandRefs": [],
          "artifactRefs": [],
          "publicUrl": "https://youniszhang.com/projects/coding-agent-delivery-toolkit/"
        }
      ]
    },
    "2025-05-25-claude-4-code-ga-agent-delivery": {
      "id": "2025-05-25-claude-4-code-ga-agent-delivery",
      "title": "Claude 4 与 Claude Code GA：Coding Agent 交付的不是一次补全",
      "publishedAt": "2025-05-25",
      "updatedAt": "2025-06-29",
      "publicUrl": "https://youniszhang.com/blog/2025-05-25-claude-4-code-ga-agent-delivery/",
      "projects": [
        {
          "id": "coding-agent-delivery-toolkit",
          "title": "Coding Agent 交付评测工具链",
          "relation": "context",
          "note": "本文强调仓库上下文、权限、独立测试和人工合并边界，对应本项目的路径控制与 scorer 隔离设计。",
          "commandRefs": [],
          "artifactRefs": [],
          "publicUrl": "https://youniszhang.com/projects/coding-agent-delivery-toolkit/"
        }
      ]
    },
    "2026-06-24-ai-interview-preparation-map": {
      "id": "2026-06-24-ai-interview-preparation-map",
      "title": "AI 应用开发面试准备地图",
      "publishedAt": "2026-06-24",
      "updatedAt": "2026-07-01",
      "publicUrl": "https://youniszhang.com/blog/2026-06-24-ai-interview-preparation-map/",
      "projects": [
        {
          "id": "ai-blog-portfolio",
          "title": "AI 工程技术博客与内容交付平台",
          "relation": "context",
          "note": "本文把模型、RAG、Agent、Prompt、工程化和项目表达组织为文章理解与项目证据两类材料，为本站用文章反查可执行项目、用项目回指方法与证据提供作品集语境。",
          "commandRefs": [],
          "artifactRefs": [],
          "publicUrl": "https://youniszhang.com/projects/ai-blog-portfolio/"
        }
      ]
    },
    "2026-06-25-project-retrospective-template": {
      "id": "2026-06-25-project-retrospective-template",
      "title": "AI 项目复盘应该写什么",
      "publishedAt": "2026-06-25",
      "updatedAt": "2026-07-01",
      "publicUrl": "https://youniszhang.com/blog/2026-06-25-project-retrospective-template/",
      "projects": [
        {
          "id": "ai-blog-portfolio",
          "title": "AI 工程技术博客与内容交付平台",
          "relation": "design",
          "note": "本文给出问题、目标、架构、结果与复盘骨架，本站项目页沿用这套结构组织可核验交付证据。",
          "commandRefs": [],
          "artifactRefs": [],
          "publicUrl": "https://youniszhang.com/projects/ai-blog-portfolio/"
        }
      ]
    },
    "2026-06-26-ai-toolchain-for-content-workflow": {
      "id": "2026-06-26-ai-toolchain-for-content-workflow",
      "title": "用 AI 工具链改造内容生产流程",
      "publishedAt": "2026-06-26",
      "updatedAt": "2026-07-01",
      "publicUrl": "https://youniszhang.com/blog/2026-06-26-ai-toolchain-for-content-workflow/",
      "projects": [
        {
          "id": "ai-blog-portfolio",
          "title": "AI 工程技术博客与内容交付平台",
          "relation": "context",
          "note": "本文描述选题、整理、Markdown 落库与发布检查的通用内容流程，为本项目从 Git 内容源到构建门禁提供工作流背景。",
          "commandRefs": [],
          "artifactRefs": [],
          "publicUrl": "https://youniszhang.com/projects/ai-blog-portfolio/"
        }
      ]
    },
    "2026-06-27-local-llm-deployment-notes": {
      "id": "2026-06-27-local-llm-deployment-notes",
      "title": "本地大模型部署的取舍记录",
      "publishedAt": "2026-06-27",
      "updatedAt": "2026-07-01",
      "publicUrl": "https://youniszhang.com/blog/2026-06-27-local-llm-deployment-notes/",
      "projects": [
        {
          "id": "local-inference-capacity-planner",
          "title": "本地推理容量规划工具",
          "relation": "context",
          "note": "本文梳理本地部署在显存、速度、质量和维护上的取舍，本项目把其中速度与任务质量变成固定采集合同。",
          "commandRefs": [],
          "artifactRefs": [],
          "publicUrl": "https://youniszhang.com/projects/local-inference-capacity-planner/"
        }
      ]
    },
    "2026-06-28-agent-boundary": {
      "id": "2026-06-28-agent-boundary",
      "title": "从工具调用理解 Agent 的工程边界",
      "publishedAt": "2026-06-28",
      "updatedAt": "2026-06-30",
      "publicUrl": "https://youniszhang.com/blog/2026-06-28-agent-boundary/",
      "projects": [
        {
          "id": "ai-engineering-workbench",
          "title": "Agent 权限与未知终态恢复工作台",
          "relation": "design",
          "note": "本文把 Agent 收敛为固定工作流中的局部决策，并提出窄工具 schema、写操作审批、审计与失败恢复；本项目将这些原则具体化为 MCP 权限网关和未知终态恢复状态机。",
          "commandRefs": [],
          "artifactRefs": [],
          "publicUrl": "https://youniszhang.com/projects/ai-engineering-workbench/"
        }
      ]
    },
    "2026-06-29-structured-prompt-method": {
      "id": "2026-06-29-structured-prompt-method",
      "title": "Prompt 工程不是玄学：我的结构化提示词方法",
      "publishedAt": "2026-06-29",
      "updatedAt": "2026-06-30",
      "publicUrl": "https://youniszhang.com/blog/2026-06-29-structured-prompt-method/",
      "projects": [
        {
          "id": "local-inference-capacity-planner",
          "title": "本地推理容量规划工具",
          "relation": "design",
          "note": "本文把 Prompt 定义为包含目标、上下文、约束、输出格式和评估标准的接口合同；本项目据此固定 JSON 任务、生成参数与独立验证器，并保留含糊字段与收紧 schema 的对照失败样本。",
          "commandRefs": [],
          "artifactRefs": [],
          "publicUrl": "https://youniszhang.com/projects/local-inference-capacity-planner/"
        }
      ]
    },
    "2026-06-30-rag-practice": {
      "id": "2026-06-30-rag-practice",
      "title": "RAG 知识库从 0 到 1 的工程实践",
      "publishedAt": "2026-06-30",
      "updatedAt": "2026-06-30",
      "publicUrl": "https://youniszhang.com/blog/2026-06-30-rag-practice/",
      "projects": [
        {
          "id": "rag-knowledge-base",
          "title": "RAG 检索与 Agentic 工作流评测台",
          "relation": "context",
          "note": "本文梳理文档处理、召回、重排和答案生成主链路；本项目把其中检索与决策部分收紧为可重放评测合同。",
          "commandRefs": [],
          "artifactRefs": [],
          "publicUrl": "https://youniszhang.com/projects/rag-knowledge-base/"
        }
      ]
    },
    "2026-07-01-ai-app-evaluation-checklist": {
      "id": "2026-07-01-ai-app-evaluation-checklist",
      "title": "AI 应用上线前的评估清单",
      "publishedAt": "2026-07-01",
      "updatedAt": "2026-07-01",
      "publicUrl": "https://youniszhang.com/blog/2026-07-01-ai-app-evaluation-checklist/",
      "projects": [
        {
          "id": "ai-blog-portfolio",
          "title": "AI 工程技术博客与内容交付平台",
          "relation": "design",
          "note": "本文提出固定样本、失败归因与上线门槛，本项目据此设计文章实验工件和 preflight 检查，但它本身不是项目运行证据。",
          "commandRefs": [],
          "artifactRefs": [],
          "publicUrl": "https://youniszhang.com/projects/ai-blog-portfolio/"
        }
      ]
    },
    "2026-07-13-agent-control-plane-mcp-openclaw-hermes": {
      "id": "2026-07-13-agent-control-plane-mcp-openclaw-hermes",
      "title": "MCP、OpenClaw、Hermes Agent：行动系统真正缺的是控制面",
      "publishedAt": "2026-07-13",
      "updatedAt": "2026-07-13",
      "publicUrl": "https://youniszhang.com/blog/2026-07-13-agent-control-plane-mcp-openclaw-hermes/",
      "projects": [
        {
          "id": "ai-engineering-workbench",
          "title": "Agent 权限与未知终态恢复工作台",
          "relation": "context",
          "note": "本文说明 MCP 只统一连接契约，身份、授权、审批、审计和恢复必须由外部控制面承担，为本项目划定系统边界。",
          "commandRefs": [],
          "artifactRefs": [],
          "publicUrl": "https://youniszhang.com/projects/ai-engineering-workbench/"
        }
      ]
    },
    "2026-07-13-agent-unknown-outcome-recovery-lab": {
      "id": "2026-07-13-agent-unknown-outcome-recovery-lab",
      "title": "Agent 超时后不能直接重试：11 个故障场景验证未知终态恢复",
      "publishedAt": "2026-07-13",
      "updatedAt": "2026-07-13",
      "publicUrl": "https://youniszhang.com/blog/2026-07-13-agent-unknown-outcome-recovery-lab/",
      "projects": [
        {
          "id": "ai-engineering-workbench",
          "title": "Agent 权限与未知终态恢复工作台",
          "relation": "validation",
          "note": "本文用 11 个故障场景验证安全重试、幂等意图绑定、权威对账和 unknown 后不自动重放。",
          "commandRefs": [
            "agent-recovery-test",
            "agent-recovery-capture"
          ],
          "artifactRefs": [
            "agent-recovery-result"
          ],
          "publicUrl": "https://youniszhang.com/projects/ai-engineering-workbench/"
        }
      ]
    },
    "2026-07-13-ai-system-evolution-latency-reasoning-action": {
      "id": "2026-07-13-ai-system-evolution-latency-reasoning-action",
      "title": "从低延迟交互、推理预算到行动系统：2024-2026 AI 工程主线",
      "publishedAt": "2026-07-13",
      "updatedAt": "2026-07-13",
      "publicUrl": "https://youniszhang.com/blog/2026-07-13-ai-system-evolution-latency-reasoning-action/",
      "projects": [
        {
          "id": "ai-engineering-workbench",
          "title": "Agent 权限与未知终态恢复工作台",
          "relation": "design",
          "note": "本文将行动回路定义为任务身份、资源范围、窄工具 schema、审批、幂等执行、权威结果验证与恢复；本项目把这套控制面设计实现为 MCP 权限网关和未知终态状态机。",
          "commandRefs": [],
          "artifactRefs": [],
          "publicUrl": "https://youniszhang.com/projects/ai-engineering-workbench/"
        }
      ]
    },
    "2026-07-13-mcp-policy-gateway-reproducible-lab": {
      "id": "2026-07-13-mcp-policy-gateway-reproducible-lab",
      "title": "MCP 权限网关可复现实验：身份、租户、一次性审批与审计",
      "publishedAt": "2026-07-13",
      "updatedAt": "2026-07-13",
      "publicUrl": "https://youniszhang.com/blog/2026-07-13-mcp-policy-gateway-reproducible-lab/",
      "projects": [
        {
          "id": "ai-engineering-workbench",
          "title": "Agent 权限与未知终态恢复工作台",
          "relation": "validation",
          "note": "本文逐项重放 MCP 网关的默认拒绝、租户注入、一次性审批、版本冲突和审计故障，并以模拟上游终态验收。",
          "commandRefs": [
            "mcp-gateway-test",
            "mcp-gateway-demo"
          ],
          "artifactRefs": [
            "mcp-gateway-demo-result"
          ],
          "publicUrl": "https://youniszhang.com/projects/ai-engineering-workbench/"
        }
      ]
    },
    "2026-07-13-open-weight-deployment-economics-llama-qwen-deepseek": {
      "id": "2026-07-13-open-weight-deployment-economics-llama-qwen-deepseek",
      "title": "Llama、Qwen、DeepSeek 开放权重之后：部署经济学不是免 API 账单",
      "publishedAt": "2026-07-13",
      "updatedAt": "2026-07-13",
      "publicUrl": "https://youniszhang.com/blog/2026-07-13-open-weight-deployment-economics-llama-qwen-deepseek/",
      "projects": [
        {
          "id": "local-inference-capacity-planner",
          "title": "本地推理容量规划工具",
          "relation": "design",
          "note": "本文要求按满足质量与 SLA 的成功任务总成本选型，本项目先提供单机延迟、吞吐和正确性基线。",
          "commandRefs": [],
          "artifactRefs": [],
          "publicUrl": "https://youniszhang.com/projects/local-inference-capacity-planner/"
        }
      ]
    },
    "2026-07-13-qwen3-8b-local-inference-benchmark": {
      "id": "2026-07-13-qwen3-8b-local-inference-benchmark",
      "title": "本地模型不是下载成功就算部署：Qwen3 8B 的流式推理与任务正确性实测",
      "publishedAt": "2026-07-13",
      "updatedAt": "2026-07-13",
      "publicUrl": "https://youniszhang.com/blog/2026-07-13-qwen3-8b-local-inference-benchmark/",
      "projects": [
        {
          "id": "local-inference-capacity-planner",
          "title": "本地推理容量规划工具",
          "relation": "validation",
          "note": "本文公开 qwen3:8b 的 14 次串行流式请求、固定模型身份、逐任务输出和含糊提示失败样本。",
          "commandRefs": [
            "local-inference-test",
            "local-inference-benchmark"
          ],
          "artifactRefs": [
            "qwen3-8b-streaming-baseline"
          ],
          "publicUrl": "https://youniszhang.com/projects/local-inference-capacity-planner/"
        }
      ]
    },
    "2026-07-13-rag-retrieval-evaluation-lab": {
      "id": "2026-07-13-rag-retrieval-evaluation-lab",
      "title": "RAG 检索不是接上向量库就结束：一次可复现的中文策略库排序实验",
      "publishedAt": "2026-07-13",
      "updatedAt": "2026-07-13",
      "publicUrl": "https://youniszhang.com/blog/2026-07-13-rag-retrieval-evaluation-lab/",
      "projects": [
        {
          "id": "rag-knowledge-base",
          "title": "RAG 检索与 Agentic 工作流评测台",
          "relation": "validation",
          "note": "本文使用 12 条策略文档和 12 条查询比较四种词法策略，固定排序指标、拒答决策和失败样本。",
          "commandRefs": [
            "rag-retrieval-test",
            "rag-retrieval-capture"
          ],
          "artifactRefs": [
            "rag-retrieval-result"
          ],
          "publicUrl": "https://youniszhang.com/projects/rag-knowledge-base/"
        }
      ]
    },
    "2026-07-14-coding-agent-delivery-evaluation-lab": {
      "id": "2026-07-14-coding-agent-delivery-evaluation-lab",
      "title": "Coding Agent 交付评测实验：可见测试通过，为什么补丁仍应被拒绝",
      "publishedAt": "2026-07-14",
      "updatedAt": "2026-07-14",
      "publicUrl": "https://youniszhang.com/blog/2026-07-14-coding-agent-delivery-evaluation-lab/",
      "projects": [
        {
          "id": "coding-agent-delivery-toolkit",
          "title": "Coding Agent 交付评测工具链",
          "relation": "validation",
          "note": "本文公开 3x4 评分器校准，并记录历史回放 Runner 唯一一次权威调用在模型启动前因 runtime identity 不匹配而关闭。",
          "commandRefs": [
            "delivery-test",
            "delivery-capture",
            "historical-test",
            "historical-capture"
          ],
          "artifactRefs": [
            "delivery-calibration-result",
            "historical-calibration-result"
          ],
          "publicUrl": "https://youniszhang.com/projects/coding-agent-delivery-toolkit/"
        }
      ]
    },
    "2026-07-15-agentic-rag-state-machine-evaluation-lab": {
      "id": "2026-07-15-agentic-rag-state-machine-evaluation-lab",
      "title": "Agentic RAG 不是多检索一步：状态、ACL、拒答与单位正确成本实验",
      "publishedAt": "2026-07-15",
      "updatedAt": "2026-07-15",
      "publicUrl": "https://youniszhang.com/blog/2026-07-15-agentic-rag-state-machine-evaluation-lab/",
      "projects": [
        {
          "id": "rag-knowledge-base",
          "title": "RAG 检索与 Agentic 工作流评测台",
          "relation": "validation",
          "note": "本文在 24 条多租户查询上比较固定单次检索与自适应状态机，验证 ACL、预算、答案决策和单位 accepted 成本。",
          "commandRefs": [
            "agentic-rag-test",
            "agentic-rag-capture"
          ],
          "artifactRefs": [
            "agentic-rag-result"
          ],
          "publicUrl": "https://youniszhang.com/projects/rag-knowledge-base/"
        }
      ]
    },
    "2026-07-15-opentelemetry-backend-commit-response-loss-retry-lab": {
      "id": "2026-07-15-opentelemetry-backend-commit-response-loss-retry-lab",
      "title": "OpenTelemetry 重复投递实验：Jaeger 已写入但响应丢失之后",
      "publishedAt": "2026-07-15",
      "updatedAt": "2026-07-15",
      "publicUrl": "https://youniszhang.com/blog/2026-07-15-opentelemetry-backend-commit-response-loss-retry-lab/",
      "projects": [
        {
          "id": "genai-observability-recovery-lab",
          "title": "GenAI 可观测性与故障恢复实验台",
          "relation": "validation",
          "note": "本文制造 Jaeger 已写入但响应被重置的 commit ambiguity，观察 Collector 重投相同 payload 与后端最终去重状态。",
          "commandRefs": [
            "otel-ambiguity-test",
            "otel-ambiguity-run"
          ],
          "artifactRefs": [
            "otel-ambiguity-result"
          ],
          "publicUrl": "https://youniszhang.com/projects/genai-observability-recovery-lab/"
        }
      ]
    },
    "2026-07-15-opentelemetry-file-storage-max-size-queue-gauge-drift-lab": {
      "id": "2026-07-15-opentelemetry-file-storage-max-size-queue-gauge-drift-lab",
      "title": "OpenTelemetry 存储上限实验：Queue 显示 6/20，重启为什么只恢复 4 批",
      "publishedAt": "2026-07-15",
      "updatedAt": "2026-07-15",
      "publicUrl": "https://youniszhang.com/blog/2026-07-15-opentelemetry-file-storage-max-size-queue-gauge-drift-lab/",
      "projects": [
        {
          "id": "genai-observability-recovery-lab",
          "title": "GenAI 可观测性与故障恢复实验台",
          "relation": "validation",
          "note": "本文验证 bbolt max_size 先于 queue capacity 拒绝写入，并证明 queue gauge 可高估可恢复 batch 数。",
          "commandRefs": [
            "otel-storage-full-test",
            "otel-storage-full-run"
          ],
          "artifactRefs": [
            "otel-storage-full-result"
          ],
          "publicUrl": "https://youniszhang.com/projects/genai-observability-recovery-lab/"
        }
      ]
    },
    "2026-07-15-opentelemetry-genai-sdk-collector-jaeger-integration-lab": {
      "id": "2026-07-15-opentelemetry-genai-sdk-collector-jaeger-integration-lab",
      "title": "OpenTelemetry GenAI 真实链路实验：24 个 Span 如何穿过 Collector 到达 Jaeger",
      "publishedAt": "2026-07-15",
      "updatedAt": "2026-07-15",
      "publicUrl": "https://youniszhang.com/blog/2026-07-15-opentelemetry-genai-sdk-collector-jaeger-integration-lab/",
      "projects": [
        {
          "id": "genai-observability-recovery-lab",
          "title": "GenAI 可观测性与故障恢复实验台",
          "relation": "validation",
          "note": "本文验证真实 OpenTelemetry SDK 导出的 24 个 span 穿过 Collector 后可由 Jaeger API 查询，并覆盖采样、属性治理和 exporter 故障。",
          "commandRefs": [
            "otel-integration-test",
            "otel-integration-run"
          ],
          "artifactRefs": [
            "otel-integration-result"
          ],
          "publicUrl": "https://youniszhang.com/projects/genai-observability-recovery-lab/"
        }
      ]
    },
    "2026-07-15-opentelemetry-genai-trace-contract-lab": {
      "id": "2026-07-15-opentelemetry-genai-trace-contract-lab",
      "title": "OpenTelemetry GenAI Trace 合同实验：Agent 成功为什么不等于业务成功",
      "publishedAt": "2026-07-15",
      "updatedAt": "2026-07-15",
      "publicUrl": "https://youniszhang.com/blog/2026-07-15-opentelemetry-genai-trace-contract-lab/",
      "projects": [
        {
          "id": "genai-observability-recovery-lab",
          "title": "GenAI 可观测性与故障恢复实验台",
          "relation": "design",
          "note": "本文定义 Agent、model、retrieval 与 tool span 合同，并校准隐私、token、合成成本、失败层和业务结果关联。",
          "commandRefs": [
            "trace-test",
            "trace-capture"
          ],
          "artifactRefs": [
            "trace-contract-result"
          ],
          "publicUrl": "https://youniszhang.com/projects/genai-observability-recovery-lab/"
        }
      ]
    },
    "2026-07-15-opentelemetry-persistent-queue-drain-rate-disk-growth-lab": {
      "id": "2026-07-15-opentelemetry-persistent-queue-drain-rate-disk-growth-lab",
      "title": "OpenTelemetry 持久队列排空实验：12 批积压清空后，磁盘为什么没有缩小",
      "publishedAt": "2026-07-15",
      "updatedAt": "2026-07-15",
      "publicUrl": "https://youniszhang.com/blog/2026-07-15-opentelemetry-persistent-queue-drain-rate-disk-growth-lab/",
      "projects": [
        {
          "id": "genai-observability-recovery-lab",
          "title": "GenAI 可观测性与故障恢复实验台",
          "relation": "validation",
          "note": "本文记录 12 批积压的排空时间、顺序和 bbolt 文件增长；在固定版本、配置与本次进程生命周期内，queue 归零后文件尺寸保持不变。",
          "commandRefs": [
            "otel-drain-test",
            "otel-drain-run"
          ],
          "artifactRefs": [
            "otel-drain-result"
          ],
          "publicUrl": "https://youniszhang.com/projects/genai-observability-recovery-lab/"
        }
      ]
    },
    "2026-07-15-opentelemetry-persistent-queue-jaeger-sigkill-recovery-lab": {
      "id": "2026-07-15-opentelemetry-persistent-queue-jaeger-sigkill-recovery-lab",
      "title": "OpenTelemetry 持久恢复实验：SIGKILL 后 7 个 Span 如何从磁盘队列回到 Jaeger",
      "publishedAt": "2026-07-15",
      "updatedAt": "2026-07-15",
      "publicUrl": "https://youniszhang.com/blog/2026-07-15-opentelemetry-persistent-queue-jaeger-sigkill-recovery-lab/",
      "projects": [
        {
          "id": "genai-observability-recovery-lab",
          "title": "GenAI 可观测性与故障恢复实验台",
          "relation": "validation",
          "note": "本文验证 Collector 与 Jaeger 被 SIGKILL 并删除后，保留 named volumes 可恢复 7 个 queued span，最终 7 unique、0 duplicate。",
          "commandRefs": [
            "otel-recovery-test",
            "otel-recovery-run"
          ],
          "artifactRefs": [
            "otel-recovery-result"
          ],
          "publicUrl": "https://youniszhang.com/projects/genai-observability-recovery-lab/"
        }
      ]
    },
    "2026-07-15-opentelemetry-persistent-queue-saturation-replay-lab": {
      "id": "2026-07-15-opentelemetry-persistent-queue-saturation-replay-lab",
      "title": "OpenTelemetry 队列容量实验：第 3 个 Span 为什么收到 503",
      "publishedAt": "2026-07-15",
      "updatedAt": "2026-07-15",
      "publicUrl": "https://youniszhang.com/blog/2026-07-15-opentelemetry-persistent-queue-saturation-replay-lab/",
      "projects": [
        {
          "id": "genai-observability-recovery-lab",
          "title": "GenAI 可观测性与故障恢复实验台",
          "relation": "validation",
          "note": "本文证明 2-batch 队列在第 3 个请求返回 503，恢复只包含已接收两条，显式重放稳定 ID 后才达到 3/3。",
          "commandRefs": [
            "otel-saturation-test",
            "otel-saturation-run"
          ],
          "artifactRefs": [
            "otel-saturation-result"
          ],
          "publicUrl": "https://youniszhang.com/projects/genai-observability-recovery-lab/"
        }
      ]
    },
    "2026-07-15-opentelemetry-tmpfs-enospc-out-of-place-recovery-lab": {
      "id": "2026-07-15-opentelemetry-tmpfs-enospc-out-of-place-recovery-lab",
      "title": "OpenTelemetry 真满盘实验：5 个 200 之后，为什么必须异卷恢复",
      "publishedAt": "2026-07-15",
      "updatedAt": "2026-07-15",
      "publicUrl": "https://youniszhang.com/blog/2026-07-15-opentelemetry-tmpfs-enospc-out-of-place-recovery-lab/",
      "projects": [
        {
          "id": "genai-observability-recovery-lab",
          "title": "GenAI 可观测性与故障恢复实验台",
          "relation": "validation",
          "note": "本文在 64 KiB tmpfs 制造真实 ENOSPC，执行字节一致异卷复制，恢复已接受五批并只重放被拒第六批。",
          "commandRefs": [
            "otel-enospc-test",
            "otel-enospc-run"
          ],
          "artifactRefs": [
            "otel-enospc-result"
          ],
          "publicUrl": "https://youniszhang.com/projects/genai-observability-recovery-lab/"
        }
      ]
    },
    "2026-07-15-otlp-partial-success-collector-metrics-data-loss-lab": {
      "id": "2026-07-15-otlp-partial-success-collector-metrics-data-loss-lab",
      "title": "OTLP Partial Success 实验：Collector 显示 Sent 4，Jaeger 为什么只有 2",
      "publishedAt": "2026-07-15",
      "updatedAt": "2026-07-15",
      "publicUrl": "https://youniszhang.com/blog/2026-07-15-otlp-partial-success-collector-metrics-data-loss-lab/",
      "projects": [
        {
          "id": "genai-observability-recovery-lab",
          "title": "GenAI 可观测性与故障恢复实验台",
          "relation": "validation",
          "note": "本文验证 HTTP 200 partial success 下 Collector sent=4 仍可能只有 2 个 span 到达 Jaeger，缺失必须由响应与终态共同识别。",
          "commandRefs": [
            "otel-partial-test",
            "otel-partial-run"
          ],
          "artifactRefs": [
            "otel-partial-result"
          ],
          "publicUrl": "https://youniszhang.com/projects/genai-observability-recovery-lab/"
        }
      ]
    },
    "2026-07-16-opentelemetry-readonly-persistent-queue-startup-recovery-lab": {
      "id": "2026-07-16-opentelemetry-readonly-persistent-queue-startup-recovery-lab",
      "title": "OpenTelemetry 只读队列实验：旧数据没坏，Collector 为什么仍启动失败",
      "publishedAt": "2026-07-16",
      "updatedAt": "2026-07-16",
      "publicUrl": "https://youniszhang.com/blog/2026-07-16-opentelemetry-readonly-persistent-queue-startup-recovery-lab/",
      "projects": [
        {
          "id": "genai-observability-recovery-lab",
          "title": "GenAI 可观测性与故障恢复实验台",
          "relation": "validation",
          "note": "本文把原 queue volume 只读挂载给 replacement，验证进程 fail closed、数据库未变，恢复读写后加载三批并定向重放。",
          "commandRefs": [
            "otel-readonly-test",
            "otel-readonly-run"
          ],
          "artifactRefs": [
            "otel-readonly-result"
          ],
          "publicUrl": "https://youniszhang.com/projects/genai-observability-recovery-lab/"
        }
      ]
    },
    "2026-07-16-opentelemetry-runtime-device-mapper-eio-recovery-lab": {
      "id": "2026-07-16-opentelemetry-runtime-device-mapper-eio-recovery-lab",
      "title": "OpenTelemetry 运行期 EIO 实验：health 还是 200，为什么已经拒绝数据",
      "publishedAt": "2026-07-16",
      "updatedAt": "2026-07-16",
      "publicUrl": "https://youniszhang.com/blog/2026-07-16-opentelemetry-runtime-device-mapper-eio-recovery-lab/",
      "projects": [
        {
          "id": "genai-observability-recovery-lab",
          "title": "GenAI 可观测性与故障恢复实验台",
          "relation": "validation",
          "note": "本文在线切换 device-mapper error target，证明 health 仍为 200 时 OTLP 已 503；修复、fsck、重启与定向重放后终态完整。",
          "commandRefs": [
            "otel-eio-test",
            "otel-eio-run"
          ],
          "artifactRefs": [
            "otel-eio-result"
          ],
          "publicUrl": "https://youniszhang.com/projects/genai-observability-recovery-lab/"
        }
      ]
    }
  }
}
