From d5640c9c5cd6ec1d6c32a7976d123731501d6a31 Mon Sep 17 00:00:00 2001 From: Wang Shining Date: Mon, 18 May 2026 14:20:20 +0800 Subject: [PATCH 1/5] =?UTF-8?q?data:=20Ornn=20roadmap=20=E2=80=94=20add=20?= =?UTF-8?q?4=20missing=20regions=20(QA=20/=20Community=20/=20Code-Review?= =?UTF-8?q?=20/=20Launch)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Surface the launch-gate and post-launch buckets that were missing from the Ornn track. Net change: 4 new regions, 1 dep update. - Ornn-QA-PreLaunch (obligation, focus) — #534 umbrella + 12 module trackers (#535-#546). SOP-style "上线准出 checklist". Parallel to Code-Review-Hardening, not part of it (functional UI tests vs code-level audit findings). - Ornn-Code-Review-Hardening (obligation, focus) — 36 findings from the W19 automated code review, split across 5 sub-milestones (Security #438-#442, Vulnerability #443-#447, Coding Standards #448-#454, Industry Standards #456-#465, OSS Readiness #466-#474). Launch gate, parallel to QA. - Ornn-Launch-Marketing (seed, focus) — 10-channel pre-launch playbook in the private ChronoAIProject/Ornn-Marketing repo (created 2026-05-15). Currently pre-launch with 0 posts; blocked on account warmup + ≥50 stars + QA/Code-Review green. - Ornn-Community-Engagement (seed) — post-launch social layer: ratings, reviews, likes, per-skill discussion. Replaces the abandoned M5 marketplace direction (billing/revenue-share). Concept seed in #3; GitHub Discussions already enabled at repo level (#377). Depends on Launch-Marketing so the graph correctly shows it as a post-launch direction. Co-Authored-By: Claude Opus 4.7 (1M context) --- regions.json | 109 +++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 109 insertions(+) diff --git a/regions.json b/regions.json index 1d52da9..a88c2c5 100644 --- a/regions.json +++ b/regions.json @@ -1118,6 +1118,115 @@ ], "gh_query": "is:issue is:open repo:ChronoAIProject/Ornn milestone:\"M4 - Platform Power\"" }, + "Ornn-Code-Review-Hardening": { + "label": { + "en": "Code Review Hardening (5 tracks)", + "zh": "代码审计收尾 (5 条轨道)" + }, + "desc": { + "en": "36 findings from automated code review (2026-05-13), split across 5 sub-milestones: Security (5, #438-#442, due 2026-05-22), Vulnerability (5, #443-#447, due 2026-05-29), Coding Standards (7, #448-#454, due 2026-06-05), Industry Standards (10, #456-#465, due 2026-06-12 — RFC 7807 / cursor pagination / integrity hash / dist-tags / Idempotency-Key), OSS Readiness (9, #466-#474, due 2026-06-19 — docker-compose / examples / SDK npm+PyPI publish / public demo). Launch gate, parallel to QA — both must pass to unblock Marketing. Industry Standards + OSS Readiness specifically gate Show HN credibility.", + "zh": "2026-05-13 一轮自动代码审计产出的 36 个 finding, 拆 5 个子 milestone: Security (5, #438-#442, due 2026-05-22), Vulnerability (5, #443-#447, due 2026-05-29), Coding Standards (7, #448-#454, due 2026-06-05), Industry Standards (10, #456-#465, due 2026-06-12 — RFC 7807 / cursor 分页 / integrity hash / dist-tags / Idempotency-Key), OSS Readiness (9, #466-#474, due 2026-06-19 — docker-compose / examples / SDK 上 npm+PyPI / 公开 demo)。Launch gate, 与 QA 并行 — 两个都过才能解锁 Marketing。Industry Standards + OSS Readiness 直接决定 Show HN 的可信度" + }, + "closure": "obligation", + "formal": "none", + "product": "ornn", + "milestone": "Code-Review", + "owner": "chronoai-shining", + "issue_count": 36, + "focus": true, + "archived": false, + "promoted_at": { + "obligation": "2026-05-13" + }, + "deps": [ + "Ornn-Skill-Lifecycle-Core", + "Ornn-Build-Pipeline", + "Ornn-Web-Frontend" + ] + }, + "Ornn-Launch-Marketing": { + "label": { + "en": "Launch Marketing Playbook", + "zh": "Launch 推广 Playbook" + }, + "desc": { + "en": "Ornn public-launch marketing playbook (private repo ChronoAIProject/Ornn-Marketing, created 2026-05-15). 10-channel coordinated push: HN Show HN, Product Hunt (3 categories), Reddit r/LocalLLaMA + r/mcp + r/AI_Agents, GitHub Awesome Lists ×3, X thread, Anthropic Discord, 即刻, V2EX. Status: pre-launch — 0 posts, D-Day not set, all account audits ⬜. Launch gift: 400 free GPT-5.5 conversations for first 500 sign-ups, NyxID invite NYX-2XXJI08A. Blocked by: account warmup (HN ≥6mo+karma, Reddit ≥30d+karma, V2EX/即刻 history), Ornn stars ≥50 (Awesome Lists prereq), QA + Code Review hardening green. Account warmup is the only non-compressible calendar item.", + "zh": "Ornn 公开发布推广 playbook (私仓 ChronoAIProject/Ornn-Marketing, 2026-05-15 建)。10 渠道协同: HN Show HN, Product Hunt (3 category), Reddit r/LocalLLaMA + r/mcp + r/AI_Agents, GitHub Awesome Lists ×3, X thread, Anthropic Discord, 即刻, V2EX。状态: pre-launch — 0 posts, D-Day 未定, 所有账号 audit ⬜。Launch 福利: 前 500 名注册赠 400 次免费 GPT-5.5 对话, NyxID 邀请码 NYX-2XXJI08A。阻塞: 账号 warmup (HN ≥6mo+karma, Reddit ≥30d+karma, V2EX/即刻 历史), Ornn stars ≥50 (Awesome Lists 前置), QA + Code Review 收尾全绿。账号 warmup 是唯一不可压缩的日历时间" + }, + "closure": "seed", + "formal": "sop", + "product": "ornn", + "milestone": "Launch", + "owner": "chronoai-shining", + "issue_count": 0, + "focus": true, + "archived": false, + "promoted_at": { + "seed": "2026-05-15" + }, + "deps": [ + "Ornn-QA-PreLaunch", + "Ornn-Code-Review-Hardening", + "Ornn-Web-Frontend" + ] + }, + "Ornn-QA-PreLaunch": { + "label": { + "en": "QA Pre-Launch Gate", + "zh": "QA 上线准出" + }, + "desc": { + "en": "Pre-launch functional QA umbrella (#534, started 2026-05-14): 12 module-level test trackers (#535-#546) covering login/permissions, skill creation+GitHub import, format validation, playground+sandbox, security, registry+detail, owner mgmt, admin dashboard+quota+codes, CLI/agent/NyxID proxy, notifications, admin skill mgmt+config, static pages. Explicit go-live exit criteria written into the umbrella. Bugs discovered (e.g. #563-#567) become standalone issues outside this umbrella. Parallel to (not part of) the 5 Review · * code-audit tracks — same gate level, different axis (functional UI vs code-level).", + "zh": "上线前功能 QA 总章 (#534, 2026-05-14 启动): 12 个模块测试跟踪 (#535-#546), 覆盖登录+权限 / Skill 创建+GitHub 导入 / 包格式校验 / Playground+sandbox / 安全权限 / Registry+详情页 / Owner 管理 / Admin Dashboard+配额+兑换码 / CLI+Agent+NyxID proxy / 通知 / Admin 配置 / 静态页面。总章里写了明确「上线准出标准」。发现的 bug (如 #563-#567) 独立成 issue, 不挂在本总章下。与 5 条 Review · * 代码审计轨道并行 — 同 gate 级别, 不同维度 (功能 UI vs 代码层)" + }, + "closure": "obligation", + "formal": "sop", + "product": "ornn", + "milestone": "QA", + "owner": "chronoai-shining", + "issue_count": 13, + "focus": true, + "archived": false, + "promoted_at": { + "obligation": "2026-05-14" + }, + "deps": [ + "Ornn-Skill-Lifecycle-Core", + "Ornn-Build-Pipeline", + "Ornn-Audit-System", + "Ornn-AgentSeal-Trust", + "Ornn-Analytics-PostHog", + "Ornn-Quota-Admin", + "Ornn-NyxID-Integration", + "Ornn-Web-Frontend" + ], + "gh_query": "is:issue is:open repo:ChronoAIProject/Ornn \"[QA]\" in:title" + }, + "Ornn-Community-Engagement": { + "label": { + "en": "Community Engagement", + "zh": "Community 社区互动" + }, + "desc": { + "en": "User-facing social layer on the skill registry: skill ratings, text reviews, likes / upvotes, per-skill comment threads, author reputation, activity feed. Replaces the abandoned billing/marketplace direction. Concept seed in #3 ('Skill Audit & Community' — audit half shipped in M3, 'ratings & reviews' half deferred). GitHub Discussions enabled at repo level (#377, 6 categories live) but in-product social signals are net-new. Post-launch — needs real external users to be meaningful.", + "zh": "Skill registry 上的社区互动层: skill 评分 / 文字评价 / 点赞 / 每个 skill 的讨论 / 作者声誉 / 活动 feed。替代已放弃的 billing/marketplace 方向。概念种子在 #3 ('Skill Audit & Community' — audit 一半已 ship 在 M3, 'ratings & reviews' 一半推迟)。GitHub Discussions 已开 (#377, 6 个 category), 但站内 social signal 完全新建。post-launch 才有意义 — 需要真实外部用户才能跑得起来" + }, + "closure": "seed", + "formal": "none", + "product": "ornn", + "milestone": "Community", + "owner": "chronoai-shining", + "issue_count": 0, + "focus": false, + "archived": false, + "promoted_at": {}, + "deps": [ + "Ornn-Skill-Lifecycle-Core", + "Ornn-Web-Frontend", + "Ornn-NyxID-Integration", + "Ornn-Launch-Marketing" + ] + }, "Sisyphus-V3-Branch": { "label": { "en": "Sisyphus v3 Branch (active)", From 9a133c7800136191501b154f22bed218d6838843 Mon Sep 17 00:00:00 2001 From: Wang Shining Date: Mon, 18 May 2026 14:58:13 +0800 Subject: [PATCH 2/5] =?UTF-8?q?data:=20Ornn=20roadmap=20=E2=80=94=20full?= =?UTF-8?q?=20milestone=20refactor=20+=20auto-sync=20workflow?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Complete restructuring driven by user instruction: delete all 13 existing Ornn milestones, re-bucket every issue (open + closed) into a fresh 9-milestone Ornn taxonomy, create 3 marketing milestones + 25 issues in ornn-marketing, refactor regions.json to 1 region per milestone, and add an auto-sync workflow that keeps each region's desc populated with its milestone's live GitHub issues. ## GitHub state changes (already applied, not undoable from this PR) ChronoAIProject/Ornn: - Deleted 13 milestones (Refactor / M1-M5 / Go Live Prep / i18n Coverage / Review · {Security, Vulnerability, Coding Standards, Industry Standards, OSS Readiness}). Snapshot saved at _archive/ornn_milestone_snapshot_2026-05-18.json. - Created 9 new milestones with descriptions + objectives: - M0 Engineering Foundation & Infra (closed, 33 issues) - M1 Skill Lifecycle Core (closed, 36 issues) - M2 Build Experience (closed, 10 issues) - M3 Trust & Quality (open, 36 issues, 3 still open) - M4 Go Live Prep (closed, 112 issues, 6 still open) - M5 QA Pre-Launch Gate (open, 13 issues) - M6 Code Review Hardening (open, 38 issues) - M7 Platform Power (open, 3 issues) - M8 Community Engagement (open, 2 historical) - Re-bucketed all 283 issues. Categorization rationale persisted at _archive/categorization.json. ChronoAIProject/Ornn-Marketing: - Created 3 milestones (L0 Pre-flight & Warmup / L1 D-Day Launch / L2 Post-Launch Followup) with objectives. - Created 25 issues per marketing.md sections §0.5–§10 (account audits, warmup, prep, copy drafts, launch executions, post-launch followups). ## regions.json refactor Replaced 15 Ornn product regions with 12 milestone-mirror regions: - Ornn-M0-Engineering-Foundation through Ornn-M8-Community-Engagement - Ornn-Marketing-L0/L1/L2 Each carries a new `milestone_ref` field linking it to a real GitHub milestone, plus an AUTO_GH_ISSUES marker block in both desc.en and desc.zh that the sync script fills in. NyxID-Skill-Install-CLI's dep updated: Ornn-Skill-Lifecycle-Core → Ornn-M1-Skill-Lifecycle-Core ## Auto-sync mechanism tools/sync_milestone_issues.py — pulls every region's milestone_ref, fetches open+closed issues from that milestone, replaces the AUTO_GH_ISSUES block in desc.{en,zh}. Updates issue_count to match. .github/workflows/sync-milestone-issues.yml — runs hourly + on workflow_dispatch + on repository_dispatch event-type milestone-issues-sync. Cross-repo / private-repo access via CROSS_REPO_PAT secret (fallback to default GITHUB_TOKEN for public repos only). tools/upstream-trigger-sample.yml — sample workflow to drop into Ornn / Ornn-Marketing repos. Fires repository_dispatch on every issue/milestone event so region-map updates near-real-time instead of waiting for hourly cron. Requires REGION_MAP_DISPATCH_PAT secret in the upstream repo. ## Validation - python3 tools/validate_regions.py → OK: regions.json valid (57 regions) - python3 -m unittest discover tools/ → 12 tests OK - python3 tools/sync_milestone_issues.py → 12 regions synced, all match Co-Authored-By: Claude Opus 4.7 (1M context) --- .github/workflows/sync-milestone-issues.yml | 68 + _archive/categorization.json | 334 ++ _archive/created_milestones.json | 38 + _archive/marketing_issues.json | 130 + _archive/marketing_milestones.json | 5 + .../ornn_milestone_snapshot_2026-05-18.json | 3489 +++++++++++++++++ regions.json | 764 ++-- tools/sync_milestone_issues.py | 191 + tools/upstream-trigger-sample.yml | 33 + 9 files changed, 4639 insertions(+), 413 deletions(-) create mode 100644 .github/workflows/sync-milestone-issues.yml create mode 100644 _archive/categorization.json create mode 100644 _archive/created_milestones.json create mode 100644 _archive/marketing_issues.json create mode 100644 _archive/marketing_milestones.json create mode 100644 _archive/ornn_milestone_snapshot_2026-05-18.json create mode 100755 tools/sync_milestone_issues.py create mode 100644 tools/upstream-trigger-sample.yml diff --git a/.github/workflows/sync-milestone-issues.yml b/.github/workflows/sync-milestone-issues.yml new file mode 100644 index 0000000..4c19af6 --- /dev/null +++ b/.github/workflows/sync-milestone-issues.yml @@ -0,0 +1,68 @@ +name: Sync milestone issues into region desc + +# Pulls every GitHub milestone referenced from a region's `milestone_ref` +# field and replaces the AUTO_GH_ISSUES block in that region's desc with +# the live issue list. Commits the result back to the default branch. +# +# Triggers: +# - Hourly cron — picks up new issues / closures with ≤1h lag +# - workflow_dispatch — manual "sync now" +# - repository_dispatch with type=milestone-issues-sync +# — receive from upstream repos via gh workflow run on issue events +# (set up in Ornn / Ornn-Marketing repos to call this) +# +# Cross-repo / private-repo access: +# GITHUB_TOKEN is scoped to THIS repo only. For ChronoAIProject/Ornn-Marketing +# (private) we need a PAT. Store it as repo secret CROSS_REPO_PAT with +# `repo` scope. Fallback to default token if absent (will warn on private +# repos but still work for public ones). + +on: + schedule: + - cron: "5 * * * *" # hourly at :05 + workflow_dispatch: + repository_dispatch: + types: [milestone-issues-sync] + +permissions: + contents: write # need write so we can commit + push + +concurrency: + group: sync-milestone-issues + cancel-in-progress: false # don't cancel an in-flight commit + +jobs: + sync: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + with: + token: ${{ secrets.GITHUB_TOKEN }} + + - uses: actions/setup-python@v5 + with: + python-version: "3.11" + + - name: Run sync script + env: + # PAT with repo scope for cross-repo / private-repo reads. + # Falls back to default token if CROSS_REPO_PAT not set. + GH_TOKEN: ${{ secrets.CROSS_REPO_PAT || secrets.GITHUB_TOKEN }} + run: | + python3 tools/sync_milestone_issues.py + python3 tools/validate_regions.py + + - name: Commit and push if changed + run: | + if [[ -z "$(git status --porcelain regions.json)" ]]; then + echo "no changes to commit" + exit 0 + fi + git config user.name "github-actions[bot]" + git config user.email "41898282+github-actions[bot]@users.noreply.github.com" + git add regions.json + git commit -m "auto: sync milestone issues into region desc + + Triggered by: ${{ github.event_name }} + Run: ${{ github.run_id }}" + git push diff --git a/_archive/categorization.json b/_archive/categorization.json new file mode 100644 index 0000000..9671b40 --- /dev/null +++ b/_archive/categorization.json @@ -0,0 +1,334 @@ +{ + "milestones": { + "M0": { + "title": "M0 \u2014 Engineering Foundation & Infra", + "state": "closed", + "objective": "Engineering foundation that the rest of the product stands on: convention freeze, /api/v1 contract, architecture teardown, nginx + runtime-config for ornn-web, K8s deploy + CD, env-var hygiene, MinIO/ingress, changeset-release pipeline, Dependabot + bun-audit CI, vite upgrades, repo-health metadata. Outcome: a codebase + delivery pipeline that scales beyond one author." + }, + "M1": { + "title": "M1 \u2014 Skill Lifecycle Core", + "state": "closed", + "objective": "Agent-facing skill lifecycle: search \u2192 pull \u2192 install \u2192 execute \u2192 build \u2192 upload \u2192 share. MCP-native discovery, versioning + version history, sandboxed execution (Playground), local dev with hot reload, NyxID-services pages, system-skills auto-generation, organization-scope visibility. Outcome: any AI agent can do the full lifecycle through one API surface." + }, + "M2": { + "title": "M2 \u2014 Build Experience", + "state": "closed", + "objective": "Generate skills from nothing or from any API spec. Dual-mode build (local + remote LLM), OpenAPI-to-skill, generation wizard with reference selection, GitHub-folder import (pull skills from a repo path), TypeScript SDK, Python SDK, testcontainers-backed integration tests. Outcome: skill authoring takes minutes, first-class support for \"import existing API\"." + }, + "M3": { + "title": "M3 \u2014 Trust & Quality", + "state": "open", + "objective": "LLM-based skill audit + waiver flow + per-version audit history + share workflows + in-product notifications + analytics dashboards. Audit-as-label pivot (share is unconditional, audit is a badge). Frontend UIs for audit/shares/notifications/analytics/github-sync. Outcome: every published skill carries trust + usage signals users can see and act on." + }, + "M4": { + "title": "M4 \u2014 Go Live Prep", + "state": "closed", + "objective": "Make Ornn publicly usable. Per-user quota with admin redemption codes, admin model selection from Chrono LLM catalog, AgentSeal security scan on every public skill, PostHog analytics, GitHub auto-mirror of public skills to ornn-skills, unified agent manuals (CLI + HTTP), full i18n (zh + en parity), Editorial Forge UI migration, landing/legal/contact/News pages, launch-celebration popup, admin broadcasts, release engineering for v0.4 \u2192 v0.8. Outcome: a launch-ready hosted instance at ornn.chrono-ai.fun." + }, + "M5": { + "title": "M5 \u2014 QA Pre-Launch Gate", + "state": "open", + "objective": "Manual functional QA against ornn.chrono-ai.fun before public launch. Twelve module-level test trackers (login+permissions, skill creation+GitHub import, format validation, playground+sandbox, security checks, registry+detail, owner skill mgmt, admin dashboard+quota+codes, CLI+agent+NyxID proxy, notifications, admin skill mgmt+config, static pages). Explicit go-live exit criteria. Discovered bugs become standalone issues filed against the feature milestone they affect. Outcome: green checklist confirming every user-facing flow works end-to-end." + }, + "M6": { + "title": "M6 \u2014 Code Review Hardening", + "state": "open", + "objective": "Resolve all findings from the 2026-05-13 automated code-review pass across five axes: Security (auth/secrets/SSRF/sandbox), Vulnerability (dep audit, ZIP slip, regex DoS, Zod-less LLM parsing), Coding Standards (TS strictness, god-file decomposition, test coverage), Industry Standards (RFC 7807, cursor pagination, integrity hash, dist-tags, Idempotency-Key), OSS Readiness (docker-compose, examples/, SDK npm+PyPI publish, public demo). Outcome: 36 findings closed; project clears the \"is this safe to point HN at?\" bar." + }, + "M7": { + "title": "M7 \u2014 Platform Power", + "state": "open", + "objective": "Skills compose into workflows. Skill chaining (declarative pipelines), webhook + event system for skill-lifecycle events, templates & starter kits for common patterns. Deferred behind QA + Code Review hardening \u2014 comes after the launch gate. Outcome: a skill is no longer a leaf; it is a composable building block." + }, + "M8": { + "title": "M8 \u2014 Community Engagement", + "state": "open", + "objective": "Social engagement layer on the skill registry: in-product skill ratings, text reviews, likes/upvotes, per-skill discussion threads, author reputation/profile, activity feed. Replaces the abandoned marketplace direction (#38 billing / #39 curated archived here as historical). Activates after launch when there are real external users. Outcome: skill discovery driven by community signal, not just admin curation." + } + }, + "categorization": { + "1": "M1", + "2": "M1", + "3": "M3", + "4": "M1", + "5": "M1", + "6": "M1", + "7": "M1", + "8": "M1", + "9": "M1", + "11": "M1", + "12": "M1", + "22": "M4", + "23": "M1", + "24": "M1", + "25": "M1", + "26": "M3", + "27": "M1", + "28": "M1", + "29": "M2", + "30": "M2", + "31": "M2", + "32": "M3", + "33": "M3", + "34": "M3", + "35": "M7", + "36": "M7", + "37": "M7", + "38": "M8", + "39": "M8", + "40": "M1", + "41": "M2", + "42": "M2", + "43": "M1", + "44": "M1", + "45": "M2", + "54": "M2", + "56": "M1", + "57": "M2", + "64": "M1", + "65": "M1", + "66": "M1", + "67": "M1", + "68": "M1", + "69": "M1", + "70": "M1", + "71": "M1", + "72": "M1", + "79": "M0", + "83": "M0", + "94": "M3", + "95": "M3", + "96": "M3", + "97": "M3", + "98": "M3", + "102": "M2", + "103": "M3", + "104": "M3", + "105": "M0", + "106": "M3", + "110": "M2", + "112": "M0", + "116": "M0", + "119": "M0", + "122": "M0", + "154": "M4", + "156": "M3", + "157": "M3", + "158": "M3", + "159": "M3", + "160": "M3", + "161": "M3", + "167": "M0", + "172": "M3", + "181": "M3", + "182": "M3", + "183": "M3", + "184": "M3", + "185": "M3", + "186": "M3", + "187": "M3", + "188": "M3", + "197": "M3", + "199": "M0", + "201": "M4", + "203": "M4", + "205": "M4", + "207": "M4", + "209": "M4", + "211": "M4", + "213": "M4", + "215": "M4", + "217": "M0", + "218": "M3", + "219": "M4", + "220": "M4", + "221": "M4", + "223": "M4", + "225": "M4", + "226": "M4", + "229": "M4", + "232": "M4", + "237": "M0", + "238": "M4", + "240": "M4", + "242": "M4", + "243": "M1", + "244": "M3", + "245": "M4", + "246": "M3", + "247": "M3", + "248": "M4", + "250": "M4", + "251": "M4", + "252": "M4", + "253": "M4", + "254": "M3", + "264": "M0", + "266": "M4", + "268": "M4", + "270": "M4", + "271": "M3", + "273": "M0", + "275": "M4", + "278": "M4", + "279": "M4", + "281": "M4", + "283": "M4", + "284": "M4", + "286": "M4", + "287": "M0", + "290": "M4", + "292": "M4", + "294": "M0", + "296": "M0", + "298": "M4", + "300": "M4", + "302": "M4", + "304": "M4", + "306": "M4", + "307": "M4", + "310": "M4", + "312": "M4", + "314": "M4", + "316": "M4", + "318": "M4", + "320": "M4", + "322": "M4", + "324": "M4", + "326": "M4", + "328": "M4", + "330": "M4", + "333": "M4", + "335": "M4", + "339": "M4", + "341": "M4", + "343": "M4", + "344": "M4", + "345": "M4", + "346": "M4", + "347": "M4", + "348": "M4", + "349": "M0", + "352": "M4", + "354": "M0", + "355": "M4", + "357": "M4", + "359": "M4", + "361": "M4", + "363": "M4", + "365": "M4", + "367": "M4", + "369": "M4", + "371": "M0", + "373": "M4", + "375": "M4", + "377": "M4", + "379": "M4", + "381": "M4", + "383": "M0", + "387": "M0", + "399": "M0", + "400": "M0", + "402": "M0", + "411": "M4", + "413": "M4", + "414": "M4", + "416": "M4", + "418": "M4", + "429": "M0", + "431": "M0", + "433": "M0", + "435": "M0", + "437": "M4", + "438": "M6", + "439": "M6", + "440": "M6", + "441": "M6", + "442": "M6", + "443": "M6", + "444": "M6", + "445": "M6", + "446": "M6", + "447": "M6", + "448": "M6", + "449": "M6", + "450": "M6", + "451": "M6", + "452": "M6", + "453": "M6", + "454": "M6", + "456": "M6", + "457": "M6", + "458": "M6", + "459": "M6", + "460": "M6", + "461": "M6", + "462": "M6", + "463": "M6", + "464": "M6", + "465": "M6", + "466": "M6", + "467": "M6", + "468": "M6", + "469": "M6", + "470": "M6", + "471": "M6", + "472": "M6", + "473": "M6", + "474": "M6", + "475": "M4", + "477": "M0", + "482": "M4", + "484": "M4", + "486": "M0", + "491": "M4", + "493": "M4", + "495": "M0", + "500": "M4", + "502": "M4", + "503": "M4", + "505": "M4", + "506": "M4", + "507": "M4", + "509": "M4", + "511": "M4", + "513": "M4", + "515": "M4", + "517": "M4", + "519": "M0", + "522": "M4", + "524": "M4", + "526": "M4", + "528": "M1", + "529": "M1", + "530": "M1", + "531": "M1", + "532": "M4", + "534": "M5", + "535": "M5", + "536": "M5", + "537": "M5", + "538": "M5", + "539": "M5", + "540": "M5", + "541": "M5", + "542": "M5", + "543": "M5", + "544": "M5", + "545": "M5", + "546": "M5", + "547": "M4", + "549": "M4", + "551": "M4", + "553": "M4", + "555": "M0", + "560": "M4", + "562": "M1", + "563": "M6", + "564": "M1", + "565": "M1", + "566": "M3", + "567": "M6", + "572": "M4" + } +} \ No newline at end of file diff --git a/_archive/created_milestones.json b/_archive/created_milestones.json new file mode 100644 index 0000000..c024d6d --- /dev/null +++ b/_archive/created_milestones.json @@ -0,0 +1,38 @@ +{ + "M0": { + "number": 14, + "title": "M0 \u2014 Engineering Foundation & Infra" + }, + "M1": { + "number": 15, + "title": "M1 \u2014 Skill Lifecycle Core" + }, + "M2": { + "number": 16, + "title": "M2 \u2014 Build Experience" + }, + "M3": { + "number": 17, + "title": "M3 \u2014 Trust & Quality" + }, + "M4": { + "number": 18, + "title": "M4 \u2014 Go Live Prep" + }, + "M5": { + "number": 19, + "title": "M5 \u2014 QA Pre-Launch Gate" + }, + "M6": { + "number": 20, + "title": "M6 \u2014 Code Review Hardening" + }, + "M7": { + "number": 21, + "title": "M7 \u2014 Platform Power" + }, + "M8": { + "number": 22, + "title": "M8 \u2014 Community Engagement" + } +} \ No newline at end of file diff --git a/_archive/marketing_issues.json b/_archive/marketing_issues.json new file mode 100644 index 0000000..fb0fec3 --- /dev/null +++ b/_archive/marketing_issues.json @@ -0,0 +1,130 @@ +{ + "created": [ + [ + 12, + "[Audit] HN account readiness", + "L0 \u2014 Pre-flight & Warmup" + ], + [ + 13, + "[Audit] Product Hunt maker + contact Hunter", + "L0 \u2014 Pre-flight & Warmup" + ], + [ + 14, + "[Audit] Reddit account + 3 sub histories", + "L0 \u2014 Pre-flight & Warmup" + ], + [ + 15, + "[Audit] X / Discord / \u5373\u523b / V2EX accounts", + "L0 \u2014 Pre-flight & Warmup" + ], + [ + 16, + "[Warmup] HN \u2014 10 substantive comments / 7 days", + "L0 \u2014 Pre-flight & Warmup" + ], + [ + 17, + "[Warmup] Reddit \u00d73 subs \u2014 5 comments each / 7 days", + "L0 \u2014 Pre-flight & Warmup" + ], + [ + 18, + "[Warmup] V2EX + \u5373\u523b \u2014 daily presence", + "L0 \u2014 Pre-flight & Warmup" + ], + [ + 19, + "[Prep] Push Ornn GitHub stars to \u2265 50 (Awesome Lists prereq)", + "L0 \u2014 Pre-flight & Warmup" + ], + [ + 20, + "[Prep] Fork 3 Awesome Lists + draft PR diffs", + "L0 \u2014 Pre-flight & Warmup" + ], + [ + 21, + "[Copy] HN Show HN \u2014 title + first-comment story", + "L1 \u2014 D-Day Launch" + ], + [ + 22, + "[Copy] Product Hunt \u2014 tagline + description + 4 images", + "L1 \u2014 D-Day Launch" + ], + [ + 23, + "[Copy] Reddit \u00d73 subs \u2014 channel-specific drafts", + "L1 \u2014 D-Day Launch" + ], + [ + 24, + "[Copy] X launch thread \u2014 10 tweets + 3 quote-tweet plans", + "L1 \u2014 D-Day Launch" + ], + [ + 25, + "[Copy] Discord / \u5373\u523b / V2EX posts", + "L1 \u2014 D-Day Launch" + ], + [ + 26, + "[Launch] HN Show HN \u2014 submit + 90-min monitor", + "L1 \u2014 D-Day Launch" + ], + [ + 27, + "[Launch] Product Hunt \u2014 00:01 PT Hunter post + 24h maker response", + "L1 \u2014 D-Day Launch" + ], + [ + 28, + "[Launch] Reddit \u00d73 subs \u2014 sequential posting (NOT cross-post)", + "L1 \u2014 D-Day Launch" + ], + [ + 29, + "[Launch] X thread + Discord + \u5373\u523b + V2EX", + "L1 \u2014 D-Day Launch" + ], + [ + 30, + "[Launch] Submit 3 Awesome List PRs", + "L1 \u2014 D-Day Launch" + ], + [ + 31, + "[Followup] HN T+24h boomerang comment", + "L2 \u2014 Post-Launch Followup" + ], + [ + 32, + "[Followup] Reddit weekly self-promotion thread participation", + "L2 \u2014 Post-Launch Followup" + ], + [ + 33, + "[Followup] X 3 milestone quote-tweets (T+24h / T+7d / T+30d)", + "L2 \u2014 Post-Launch Followup" + ], + [ + 34, + "[Followup] DM PH upvoters thank-you (T+0 \u2192 T+24h)", + "L2 \u2014 Post-Launch Followup" + ], + [ + 35, + "[Followup] D+7 retro post", + "L2 \u2014 Post-Launch Followup" + ], + [ + 36, + "[Followup] D+30 outcome + learnings post", + "L2 \u2014 Post-Launch Followup" + ] + ], + "failed": [] +} \ No newline at end of file diff --git a/_archive/marketing_milestones.json b/_archive/marketing_milestones.json new file mode 100644 index 0000000..8d61e8e --- /dev/null +++ b/_archive/marketing_milestones.json @@ -0,0 +1,5 @@ +{ + "L0 \u2014 Pre-flight & Warmup": 1, + "L1 \u2014 D-Day Launch": 2, + "L2 \u2014 Post-Launch Followup": 3 +} \ No newline at end of file diff --git a/_archive/ornn_milestone_snapshot_2026-05-18.json b/_archive/ornn_milestone_snapshot_2026-05-18.json new file mode 100644 index 0000000..6f332de --- /dev/null +++ b/_archive/ornn_milestone_snapshot_2026-05-18.json @@ -0,0 +1,3489 @@ +{ + "snapshot_at": "2026-05-18T06:35:27.524785Z", + "repo": "ChronoAIProject/Ornn", + "reason": "Pre-refactor snapshot before deleting all milestones (per user instruction 2026-05-18)", + "milestone_count": 13, + "issue_count": 283, + "milestones": [ + { + "number": 1, + "title": "M1 - Foundation", + "state": "closed", + "description": "The only platform where agents can build, find, and run skills in one place. API unification, e2e lifecycle, versioning, sandboxed execution.", + "open_issues": 0, + "closed_issues": 33, + "due_on": "2026-04-24T00:00:00Z", + "closed_at": "2026-04-23T05:55:38Z", + "created_at": "2026-04-14T06:20:11Z" + }, + { + "number": 2, + "title": "M2 - Build Experience", + "state": "closed", + "description": "Generate skills from nothing, or from any API spec. Dual-mode build, OpenAPI-to-skill, CLI/SDK.", + "open_issues": 0, + "closed_issues": 14, + "due_on": "2026-05-05T00:00:00Z", + "closed_at": "2026-04-23T06:49:56Z", + "created_at": "2026-04-14T06:20:11Z" + }, + { + "number": 3, + "title": "M3 - Trust & Quality", + "state": "open", + "description": "The only registry where you know a skill is safe before running it. LLM-based audit, waiver system, analytics, reputation.", + "open_issues": 1, + "closed_issues": 37, + "due_on": "2026-05-12T00:00:00Z", + "closed_at": null, + "created_at": "2026-04-14T06:20:12Z" + }, + { + "number": 4, + "title": "M4 - Platform Power", + "state": "open", + "description": "Skills that compose into workflows. Skill chaining, webhooks, templates, network effects.", + "open_issues": 8, + "closed_issues": 0, + "due_on": "2026-05-22T00:00:00Z", + "closed_at": null, + "created_at": "2026-04-14T06:20:12Z" + }, + { + "number": 5, + "title": "M5 - Marketplace", + "state": "closed", + "description": "Developers get paid for building skills. Usage billing, revenue share, org sharing, curation.", + "open_issues": 0, + "closed_issues": 3, + "due_on": "2026-05-29T00:00:00Z", + "closed_at": "2026-05-12T05:52:48Z", + "created_at": "2026-04-14T06:20:13Z" + }, + { + "number": 6, + "title": "Refactor", + "state": "closed", + "description": "API v1 standardization + architecture refactor \u2014 tracks Epic 0 through Epic 4 (issue #64).", + "open_issues": 0, + "closed_issues": 8, + "due_on": "2026-04-22T00:00:00Z", + "closed_at": "2026-04-22T08:53:26Z", + "created_at": "2026-04-22T07:46:39Z" + }, + { + "number": 7, + "title": "Go Live Preparation", + "state": "closed", + "description": "Pre-launch foundations: per-user quota system + admin model selection. Targeting Friday 2026-05-08.", + "open_issues": 0, + "closed_issues": 14, + "due_on": "2026-05-08T00:00:00Z", + "closed_at": "2026-05-13T05:49:00Z", + "created_at": "2026-05-05T04:59:18Z" + }, + { + "number": 8, + "title": "i18n Coverage", + "state": "open", + "description": "Close out i18n gaps across ornn-web \u2014 every page, component, and bubbled error surface goes through t() (zh + en parity).", + "open_issues": 0, + "closed_issues": 0, + "due_on": "2026-05-24T00:00:00Z", + "closed_at": null, + "created_at": "2026-05-11T03:35:43Z" + }, + { + "number": 9, + "title": "Review \u00b7 Security", + "state": "open", + "description": "Findings from automated security review \u2014 auth, secrets, input validation, SSRF, sandbox", + "open_issues": 5, + "closed_issues": 0, + "due_on": "2026-05-22T00:00:00Z", + "closed_at": null, + "created_at": "2026-05-13T04:07:44Z" + }, + { + "number": 10, + "title": "Review \u00b7 Vulnerability", + "state": "open", + "description": "Findings from automated vulnerability + dependency review \u2014 zip handling, regex, env-var, SDK deps", + "open_issues": 5, + "closed_issues": 0, + "due_on": "2026-05-29T00:00:00Z", + "closed_at": null, + "created_at": "2026-05-13T04:07:44Z" + }, + { + "number": 11, + "title": "Review \u00b7 Coding Standards", + "state": "open", + "description": "Findings from automated coding-standards review \u2014 TS strictness, conventions, tests, file size", + "open_issues": 7, + "closed_issues": 0, + "due_on": "2026-06-05T00:00:00Z", + "closed_at": null, + "created_at": "2026-05-13T04:07:45Z" + }, + { + "number": 12, + "title": "Review \u00b7 Industry Standards", + "state": "open", + "description": "Findings from automated industry-standard conformance review \u2014 RFC 7807, pagination, dist-tags, npm-style integrity", + "open_issues": 10, + "closed_issues": 0, + "due_on": "2026-06-12T00:00:00Z", + "closed_at": null, + "created_at": "2026-05-13T04:07:45Z" + }, + { + "number": 13, + "title": "Review \u00b7 OSS Readiness", + "state": "open", + "description": "Findings from automated OSS-popularity review \u2014 docker-compose, demo, examples, marketing, SDK publish", + "open_issues": 9, + "closed_issues": 0, + "due_on": "2026-06-19T00:00:00Z", + "closed_at": null, + "created_at": "2026-05-13T04:07:46Z" + } + ], + "issues": [ + { + "number": 1, + "title": "[Bug] Inconsistent skill_build validation: invalid messages payloads bypass validation and error semantics are mixed", + "state": "CLOSED", + "milestone": null, + "labels": [], + "createdAt": "2026-03-18T08:32:42Z", + "closedAt": "2026-04-07T20:41:28Z" + }, + { + "number": 2, + "title": "[Bug] skill_build does not validate unknown model and may silently fallback", + "state": "CLOSED", + "milestone": null, + "labels": [], + "createdAt": "2026-03-18T09:59:29Z", + "closedAt": "2026-04-07T20:41:32Z" + }, + { + "number": 3, + "title": "[Feature] Skill Audit & Community", + "state": "CLOSED", + "milestone": "M3 - Trust & Quality", + "labels": [ + "enhancement", + "phase:3", + "security" + ], + "createdAt": "2026-03-26T06:30:33Z", + "closedAt": "2026-04-23T07:25:43Z" + }, + { + "number": 4, + "title": "Skill-Only API", + "state": "CLOSED", + "milestone": "M1 - Foundation", + "labels": [ + "enhancement", + "phase:1", + "api" + ], + "createdAt": "2026-03-26T06:31:19Z", + "closedAt": "2026-04-20T03:34:21Z" + }, + { + "number": 5, + "title": "Skill upload issue", + "state": "CLOSED", + "milestone": "M1 - Foundation", + "labels": [ + "bug", + "phase:1" + ], + "createdAt": "2026-03-26T07:11:32Z", + "closedAt": "2026-04-20T03:30:53Z" + }, + { + "number": 6, + "title": "[Bug] Ornn authoring is not usable from the Nyx CLI / proxy path and the required auth boundary is unclear", + "state": "CLOSED", + "milestone": "M1 - Foundation", + "labels": [ + "bug", + "phase:1" + ], + "createdAt": "2026-03-31T16:55:45Z", + "closedAt": "2026-04-20T03:14:06Z" + }, + { + "number": 7, + "title": "Skill page should provide a copyable install URL for LLMs", + "state": "CLOSED", + "milestone": "M1 - Foundation", + "labels": [ + "phase:1", + "dx" + ], + "createdAt": "2026-04-03T13:36:15Z", + "closedAt": "2026-04-20T06:07:51Z" + }, + { + "number": 8, + "title": "feat: Organization scope skills \u2014 \u652f\u6301\u516c\u53f8/\u56e2\u961f\u7ea7\u5171\u4eab skills", + "state": "CLOSED", + "milestone": "M5 - Marketplace", + "labels": [ + "phase:5" + ], + "createdAt": "2026-04-03T13:42:15Z", + "closedAt": "2026-04-22T04:46:57Z" + }, + { + "number": 9, + "title": "[CI/CD] CI/CD pipeline \u2014 \u81ea\u52a8\u6d4b\u8bd5 + \u90e8\u7f72", + "state": "CLOSED", + "milestone": "M1 - Foundation", + "labels": [ + "phase:1", + "infra" + ], + "createdAt": "2026-04-03T14:10:28Z", + "closedAt": "2026-04-23T05:53:41Z" + }, + { + "number": 11, + "title": "feat: Skill Registry API \u2014 supply skill definitions + metadata to Aevatar", + "state": "CLOSED", + "milestone": null, + "labels": [], + "createdAt": "2026-04-06T08:18:19Z", + "closedAt": "2026-04-06T08:20:47Z" + }, + { + "number": 12, + "title": "feat: daily-briefing skill \u2014 \u79fb\u690d /daily \u903b\u8f91\u4e3a Ornn skill", + "state": "CLOSED", + "milestone": null, + "labels": [], + "createdAt": "2026-04-06T08:18:30Z", + "closedAt": "2026-04-06T08:20:49Z" + }, + { + "number": 22, + "title": "[Misc] Owner \u81ea\u4e3b\u76ee\u6807: \u5b9a\u4e49 Ornn O1 \u8def\u5f84 + \u5f00\u53d1\u8005\u89e6\u8fbe\u8ba1\u5212", + "state": "OPEN", + "milestone": null, + "labels": [ + "phase:1", + "dx" + ], + "createdAt": "2026-04-13T14:57:11Z", + "closedAt": null + }, + { + "number": 23, + "title": "[M1] API route refactor: merge /api/web + /api/agent into unified /api", + "state": "CLOSED", + "milestone": "M1 - Foundation", + "labels": [ + "phase:1", + "api" + ], + "createdAt": "2026-04-14T06:20:52Z", + "closedAt": "2026-04-20T03:28:49Z" + }, + { + "number": 24, + "title": "[Feature] End-to-end skill lifecycle: build -> search -> pull -> execute", + "state": "CLOSED", + "milestone": "M1 - Foundation", + "labels": [ + "phase:1", + "api" + ], + "createdAt": "2026-04-14T06:21:04Z", + "closedAt": "2026-04-23T05:54:15Z" + }, + { + "number": 25, + "title": "[M1] Skill versioning & version history", + "state": "CLOSED", + "milestone": "M1 - Foundation", + "labels": [ + "phase:1", + "api" + ], + "createdAt": "2026-04-14T06:21:15Z", + "closedAt": "2026-04-20T07:11:34Z" + }, + { + "number": 26, + "title": "[Feature] Skill diff & changelog on version updates", + "state": "CLOSED", + "milestone": "M3 - Trust & Quality", + "labels": [ + "phase:3", + "dx" + ], + "createdAt": "2026-04-14T06:21:29Z", + "closedAt": "2026-04-23T07:32:10Z" + }, + { + "number": 27, + "title": "[M1] Local dev server with hot-reload for skill authoring", + "state": "CLOSED", + "milestone": "M1 - Foundation", + "labels": [ + "phase:1", + "dx" + ], + "createdAt": "2026-04-14T06:21:38Z", + "closedAt": "2026-04-22T04:46:59Z" + }, + { + "number": 28, + "title": "[M1] MCP-native skill discovery", + "state": "CLOSED", + "milestone": "M1 - Foundation", + "labels": [ + "phase:1", + "dx" + ], + "createdAt": "2026-04-14T06:21:47Z", + "closedAt": "2026-04-22T04:47:01Z" + }, + { + "number": 29, + "title": "[Feature] Dual-mode skill build: local boundaries + remote generation", + "state": "CLOSED", + "milestone": "M2 - Build Experience", + "labels": [ + "phase:2", + "api" + ], + "createdAt": "2026-04-14T06:22:05Z", + "closedAt": "2026-04-23T06:11:22Z" + }, + { + "number": 30, + "title": "[Feature] REST API skill generation from OpenAPI specs / source code", + "state": "CLOSED", + "milestone": "M2 - Build Experience", + "labels": [ + "phase:2", + "api" + ], + "createdAt": "2026-04-14T06:22:18Z", + "closedAt": "2026-04-23T06:11:41Z" + }, + { + "number": 31, + "title": "[Feature] Ornn SDK: TypeScript + Python client libraries", + "state": "CLOSED", + "milestone": "M2 - Build Experience", + "labels": [ + "phase:2", + "dx" + ], + "createdAt": "2026-04-14T06:22:30Z", + "closedAt": "2026-04-23T06:29:11Z" + }, + { + "number": 32, + "title": "[Feature] LLM-based quality & security audit with multi-dimensional scoring", + "state": "CLOSED", + "milestone": "M3 - Trust & Quality", + "labels": [ + "phase:3", + "security" + ], + "createdAt": "2026-04-14T06:22:52Z", + "closedAt": "2026-04-23T07:25:29Z" + }, + { + "number": 33, + "title": "[Feature] Skill activation waiver system", + "state": "CLOSED", + "milestone": "M3 - Trust & Quality", + "labels": [ + "phase:3", + "security" + ], + "createdAt": "2026-04-14T06:23:05Z", + "closedAt": "2026-04-23T05:30:59Z" + }, + { + "number": 34, + "title": "[Feature] Skill analytics & observability dashboard", + "state": "CLOSED", + "milestone": "M3 - Trust & Quality", + "labels": [ + "phase:3", + "dx" + ], + "createdAt": "2026-04-14T06:23:18Z", + "closedAt": "2026-04-23T07:37:20Z" + }, + { + "number": 35, + "title": "[Feature] Skill composition & chaining", + "state": "OPEN", + "milestone": "M4 - Platform Power", + "labels": [ + "phase:4", + "api" + ], + "createdAt": "2026-04-14T06:23:35Z", + "closedAt": null + }, + { + "number": 36, + "title": "[Feature] Webhook & event system for skill lifecycle", + "state": "OPEN", + "milestone": "M4 - Platform Power", + "labels": [ + "phase:4", + "api" + ], + "createdAt": "2026-04-14T06:23:44Z", + "closedAt": null + }, + { + "number": 37, + "title": "[Feature] Skill templates & starter kits", + "state": "OPEN", + "milestone": "M4 - Platform Power", + "labels": [ + "phase:4", + "dx" + ], + "createdAt": "2026-04-14T06:23:55Z", + "closedAt": null + }, + { + "number": 38, + "title": "[Feature] Usage-based billing & author revenue share", + "state": "CLOSED", + "milestone": "M5 - Marketplace", + "labels": [ + "phase:5" + ], + "createdAt": "2026-04-14T06:24:09Z", + "closedAt": "2026-05-12T05:50:45Z" + }, + { + "number": 39, + "title": "[Feature] Featured & curated skill collections", + "state": "CLOSED", + "milestone": "M5 - Marketplace", + "labels": [ + "phase:5", + "dx" + ], + "createdAt": "2026-04-14T06:24:20Z", + "closedAt": "2026-05-12T05:50:47Z" + }, + { + "number": 40, + "title": "[Docs] Move docs to frontend static build, remove /api/docs backend routes", + "state": "CLOSED", + "milestone": "M1 - Foundation", + "labels": [ + "phase:1", + "dx" + ], + "createdAt": "2026-04-14T07:45:23Z", + "closedAt": "2026-04-23T05:37:10Z" + }, + { + "number": 41, + "title": "[M2] Generate skills from OpenAPI specs", + "state": "CLOSED", + "milestone": "M2 - Build Experience", + "labels": [ + "phase:2", + "api" + ], + "createdAt": "2026-04-14T07:49:33Z", + "closedAt": "2026-04-20T03:28:49Z" + }, + { + "number": 42, + "title": "[Feature] Generate skills from source code repos", + "state": "CLOSED", + "milestone": "M2 - Build Experience", + "labels": [ + "phase:2", + "api" + ], + "createdAt": "2026-04-14T07:49:36Z", + "closedAt": "2026-04-23T06:36:51Z" + }, + { + "number": 43, + "title": "[M1] System Skills: auto-generate skills from NyxID service catalog", + "state": "CLOSED", + "milestone": "M1 - Foundation", + "labels": [ + "phase:1", + "dx", + "api" + ], + "createdAt": "2026-04-14T08:02:01Z", + "closedAt": "2026-04-20T03:28:49Z" + }, + { + "number": 44, + "title": "[M1] NyxID Services pages: My Services + Admin Services with skill generation", + "state": "CLOSED", + "milestone": "M1 - Foundation", + "labels": [ + "phase:1", + "dx" + ], + "createdAt": "2026-04-14T09:56:38Z", + "closedAt": "2026-04-20T03:28:49Z" + }, + { + "number": 45, + "title": "[M2] Skill generation wizard with reference selection and progress UI", + "state": "CLOSED", + "milestone": "M2 - Build Experience", + "labels": [ + "phase:2", + "dx", + "api" + ], + "createdAt": "2026-04-14T10:53:31Z", + "closedAt": "2026-04-20T03:28:49Z" + }, + { + "number": 54, + "title": "[M2] Ship TypeScript and Python SDKs for skill operations", + "state": "CLOSED", + "milestone": null, + "labels": [ + "enhancement", + "phase:2", + "dx", + "api" + ], + "createdAt": "2026-04-20T03:34:14Z", + "closedAt": "2026-04-22T08:55:09Z" + }, + { + "number": 56, + "title": "Skill Topics: group skills under named topics, with API CRUD", + "state": "CLOSED", + "milestone": null, + "labels": [ + "enhancement", + "api" + ], + "createdAt": "2026-04-20T06:01:11Z", + "closedAt": "2026-04-20T08:00:41Z" + }, + { + "number": 57, + "title": "[Feature] Pull skills from GitHub: one-way sync from a GitHub repo/path into Ornn", + "state": "CLOSED", + "milestone": "M2 - Build Experience", + "labels": [ + "enhancement", + "dx", + "api" + ], + "createdAt": "2026-04-20T06:03:04Z", + "closedAt": "2026-04-23T06:49:44Z" + }, + { + "number": 64, + "title": "[Feature] API endpoint standardization & refactor (prep for Ornn Manual v1)", + "state": "CLOSED", + "milestone": "M1 - Foundation", + "labels": [ + "phase:1", + "api" + ], + "createdAt": "2026-04-22T06:00:08Z", + "closedAt": "2026-04-23T05:55:23Z" + }, + { + "number": 65, + "title": "Epic 0: Convention freeze (foundations)", + "state": "CLOSED", + "milestone": "M1 - Foundation", + "labels": [], + "createdAt": "2026-04-22T07:46:57Z", + "closedAt": "2026-04-22T07:58:12Z" + }, + { + "number": 66, + "title": "Epic 1: Architecture refactor (no external API change)", + "state": "CLOSED", + "milestone": "M1 - Foundation", + "labels": [], + "createdAt": "2026-04-22T07:46:59Z", + "closedAt": "2026-04-22T08:46:00Z" + }, + { + "number": 67, + "title": "Epic 1 [first step]: Topic domain teardown", + "state": "CLOSED", + "milestone": "M1 - Foundation", + "labels": [], + "createdAt": "2026-04-22T07:47:02Z", + "closedAt": "2026-04-22T08:11:57Z" + }, + { + "number": 68, + "title": "[Feature] Epic 2: /api/v1/ cut (breaking external contract)", + "state": "CLOSED", + "milestone": "M1 - Foundation", + "labels": [ + "phase:1", + "api" + ], + "createdAt": "2026-04-22T07:47:04Z", + "closedAt": "2026-04-23T05:54:37Z" + }, + { + "number": 69, + "title": "[Feature] Epic 2 prep: Reserved-verb DB audit", + "state": "CLOSED", + "milestone": "M1 - Foundation", + "labels": [ + "phase:1", + "api" + ], + "createdAt": "2026-04-22T07:47:06Z", + "closedAt": "2026-04-22T09:02:59Z" + }, + { + "number": 70, + "title": "[Feature] Epic 2 prep: NyxID permission catalog rollout (cross-team)", + "state": "CLOSED", + "milestone": "M1 - Foundation", + "labels": [ + "phase:1", + "security" + ], + "createdAt": "2026-04-22T07:47:08Z", + "closedAt": "2026-04-23T05:53:30Z" + }, + { + "number": 71, + "title": "[Feature] Epic 3: Frontend modernization", + "state": "CLOSED", + "milestone": "M1 - Foundation", + "labels": [ + "phase:1", + "dx" + ], + "createdAt": "2026-04-22T07:47:10Z", + "closedAt": "2026-04-23T05:53:50Z" + }, + { + "number": 72, + "title": "[CI/CD] Epic 4: Ops, testing, observability", + "state": "CLOSED", + "milestone": "M1 - Foundation", + "labels": [ + "phase:1", + "infra" + ], + "createdAt": "2026-04-22T07:47:12Z", + "closedAt": "2026-04-23T05:54:03Z" + }, + { + "number": 79, + "title": "[Docs] Add GitHub issue management rules to CLAUDE.md", + "state": "CLOSED", + "milestone": null, + "labels": [ + "documentation" + ], + "createdAt": "2026-04-22T08:39:29Z", + "closedAt": "2026-04-22T08:48:24Z" + }, + { + "number": 83, + "title": "[Docs] Require new work to branch from latest develop", + "state": "CLOSED", + "milestone": null, + "labels": [ + "documentation" + ], + "createdAt": "2026-04-22T08:45:32Z", + "closedAt": "2026-04-22T08:48:24Z" + }, + { + "number": 94, + "title": "[Feature] Auditing-gated skill sharing: private skills skip audit; shared skills require green audit or reviewed justification", + "state": "CLOSED", + "milestone": "M3 - Trust & Quality", + "labels": [ + "enhancement", + "phase:3", + "security" + ], + "createdAt": "2026-04-23T05:26:26Z", + "closedAt": "2026-04-23T07:24:30Z" + }, + { + "number": 95, + "title": "[Feature] Move audit trigger from publish to share; private skills exempt", + "state": "CLOSED", + "milestone": "M3 - Trust & Quality", + "labels": [ + "enhancement", + "phase:3", + "api", + "security" + ], + "createdAt": "2026-04-23T05:26:48Z", + "closedAt": "2026-04-23T07:17:33Z" + }, + { + "number": 96, + "title": "[Feature] Owner justification flow on failed audit for share", + "state": "CLOSED", + "milestone": "M3 - Trust & Quality", + "labels": [ + "enhancement", + "phase:3", + "dx", + "security" + ], + "createdAt": "2026-04-23T05:26:56Z", + "closedAt": "2026-04-23T07:24:55Z" + }, + { + "number": 97, + "title": "[Feature] Target-based review routing for failed-audit shares (org admin / recipient / Ornn admin)", + "state": "CLOSED", + "milestone": "M3 - Trust & Quality", + "labels": [ + "enhancement", + "phase:3", + "api", + "security" + ], + "createdAt": "2026-04-23T05:27:04Z", + "closedAt": "2026-04-23T07:25:11Z" + }, + { + "number": 98, + "title": "[Feature] In-Ornn notification center for audit + share-review events", + "state": "CLOSED", + "milestone": "M3 - Trust & Quality", + "labels": [ + "enhancement", + "phase:3", + "dx", + "api" + ], + "createdAt": "2026-04-23T05:27:08Z", + "closedAt": "2026-04-23T07:24:13Z" + }, + { + "number": 102, + "title": "[CI/CD] Integration test layer with testcontainers-backed Mongo", + "state": "CLOSED", + "milestone": "M2 - Build Experience", + "labels": [ + "phase:2", + "infra" + ], + "createdAt": "2026-04-23T05:52:21Z", + "closedAt": "2026-04-23T06:11:02Z" + }, + { + "number": 103, + "title": "[Feature] RR7 data router migration", + "state": "CLOSED", + "milestone": "M3 - Trust & Quality", + "labels": [ + "dx" + ], + "createdAt": "2026-04-23T05:52:32Z", + "closedAt": "2026-04-27T09:09:16Z" + }, + { + "number": 104, + "title": "[Feature] Resource-grouped page layout", + "state": "CLOSED", + "milestone": "M3 - Trust & Quality", + "labels": [ + "dx" + ], + "createdAt": "2026-04-23T05:52:43Z", + "closedAt": "2026-04-27T08:56:27Z" + }, + { + "number": 105, + "title": "[CI/CD] CD to k8s cluster + rollback + deploy notifications", + "state": "CLOSED", + "milestone": null, + "labels": [ + "infra" + ], + "createdAt": "2026-04-23T05:52:57Z", + "closedAt": "2026-04-27T06:52:42Z" + }, + { + "number": 106, + "title": "[Feature] NyxID permission catalog flip \u2014 post-NyxID-rename", + "state": "OPEN", + "milestone": "M3 - Trust & Quality", + "labels": [ + "security" + ], + "createdAt": "2026-04-23T05:53:15Z", + "closedAt": null + }, + { + "number": 110, + "title": "[Feature] Ornn Python SDK", + "state": "CLOSED", + "milestone": "M2 - Build Experience", + "labels": [ + "phase:2", + "dx" + ], + "createdAt": "2026-04-23T06:20:18Z", + "closedAt": "2026-04-23T06:28:59Z" + }, + { + "number": 112, + "title": "[Bug] ornn-web nginx fails to start with \"host not found in upstream 'minio'\" on clusters without MinIO", + "state": "CLOSED", + "milestone": null, + "labels": [ + "bug", + "infra" + ], + "createdAt": "2026-04-23T06:32:45Z", + "closedAt": "2026-04-23T06:34:59Z" + }, + { + "number": 116, + "title": "[Feature] ornn-web: make config runtime-driven (nginx upstreams + Vite env via ConfigMap)", + "state": "CLOSED", + "milestone": null, + "labels": [ + "enhancement", + "dx", + "infra" + ], + "createdAt": "2026-04-23T06:46:26Z", + "closedAt": "2026-04-23T06:57:14Z" + }, + { + "number": 119, + "title": "[Misc] ornn-web nginx.conf.template: drop dead /api/v1/openapi.json bypass", + "state": "CLOSED", + "milestone": null, + "labels": [ + "dx", + "infra" + ], + "createdAt": "2026-04-23T07:01:17Z", + "closedAt": "2026-04-23T07:04:38Z" + }, + { + "number": 122, + "title": "[Bug] ornn-web ConfigMap reuses ornn-api's NYXID_TOKEN_URL / NYXID_CLIENT_ID (wrong values in browser)", + "state": "CLOSED", + "milestone": null, + "labels": [ + "bug", + "infra" + ], + "createdAt": "2026-04-23T07:09:44Z", + "closedAt": "2026-04-23T07:16:04Z" + }, + { + "number": 154, + "title": "[Docs] Consolidate docs site: add Agent Manual, merge Tech References, drop Version Roadmap/FAQs", + "state": "CLOSED", + "milestone": null, + "labels": [ + "documentation", + "dx" + ], + "createdAt": "2026-04-24T04:46:09Z", + "closedAt": "2026-04-24T04:54:30Z" + }, + { + "number": 156, + "title": "[Feature] Phase-3 frontend catch-up \u2014 audit / shares / notifications / analytics / github-sync UI", + "state": "CLOSED", + "milestone": "M3 - Trust & Quality", + "labels": [ + "enhancement", + "phase:3", + "dx" + ], + "createdAt": "2026-04-24T05:17:03Z", + "closedAt": "2026-04-24T06:20:46Z" + }, + { + "number": 157, + "title": "[Feature] Frontend UI for in-product notifications (bell + /notifications page + unread badge + mark-read)", + "state": "CLOSED", + "milestone": "M3 - Trust & Quality", + "labels": [ + "enhancement", + "phase:3", + "dx" + ], + "createdAt": "2026-04-24T05:17:59Z", + "closedAt": "2026-04-24T05:25:33Z" + }, + { + "number": 158, + "title": "[Feature] Frontend UI for skill audit findings (SkillDetailPage banner + admin rerun)", + "state": "CLOSED", + "milestone": "M3 - Trust & Quality", + "labels": [ + "enhancement", + "phase:3", + "dx", + "security" + ], + "createdAt": "2026-04-24T05:18:02Z", + "closedAt": "2026-04-24T05:39:44Z" + }, + { + "number": 159, + "title": "[Feature] Frontend UI for GitHub skill import + 'Refresh from GitHub' re-sync", + "state": "CLOSED", + "milestone": "M3 - Trust & Quality", + "labels": [ + "enhancement", + "phase:3", + "dx" + ], + "createdAt": "2026-04-24T05:18:05Z", + "closedAt": "2026-04-24T05:48:08Z" + }, + { + "number": 160, + "title": "[Feature] Frontend UI for audit-gated sharing workflow (share modal + justification + review queue + admin review)", + "state": "CLOSED", + "milestone": "M3 - Trust & Quality", + "labels": [ + "enhancement", + "phase:3", + "dx", + "security" + ], + "createdAt": "2026-04-24T05:18:08Z", + "closedAt": "2026-04-24T06:19:46Z" + }, + { + "number": 161, + "title": "[Feature] Frontend UI for skill analytics (per-skill card on SkillDetailPage)", + "state": "CLOSED", + "milestone": "M3 - Trust & Quality", + "labels": [ + "enhancement", + "phase:3", + "dx" + ], + "createdAt": "2026-04-24T05:18:11Z", + "closedAt": "2026-04-24T05:51:42Z" + }, + { + "number": 167, + "title": "[Infra] Local minio ingress + browser-reachable presigned URLs", + "state": "CLOSED", + "milestone": null, + "labels": [ + "bug", + "infra" + ], + "createdAt": "2026-04-24T06:07:20Z", + "closedAt": "2026-04-24T06:20:49Z" + }, + { + "number": 172, + "title": "[Feature] Fold audit-gated share initiation into PermissionsModal (single entry point)", + "state": "CLOSED", + "milestone": "M3 - Trust & Quality", + "labels": [ + "enhancement", + "phase:3", + "dx" + ], + "createdAt": "2026-04-24T06:28:10Z", + "closedAt": "2026-04-27T07:00:36Z" + }, + { + "number": 181, + "title": "[Feature] Per-version audit history + analytics filter", + "state": "CLOSED", + "milestone": "M3 - Trust & Quality", + "labels": [ + "phase:3", + "api" + ], + "createdAt": "2026-04-24T09:57:24Z", + "closedAt": "2026-04-27T07:34:32Z" + }, + { + "number": 182, + "title": "[Feature] Skill JSON pull tracking + time-bucket aggregation", + "state": "CLOSED", + "milestone": "M3 - Trust & Quality", + "labels": [ + "phase:3", + "api" + ], + "createdAt": "2026-04-24T09:57:53Z", + "closedAt": "2026-04-27T07:34:32Z" + }, + { + "number": 183, + "title": "[Feature] Delete non-latest skill versions", + "state": "CLOSED", + "milestone": "M3 - Trust & Quality", + "labels": [ + "phase:3", + "api" + ], + "createdAt": "2026-04-24T09:58:13Z", + "closedAt": "2026-04-27T07:42:20Z" + }, + { + "number": 184, + "title": "[Bug] My sharing requests page missing top-left back nav", + "state": "CLOSED", + "milestone": "M3 - Trust & Quality", + "labels": [ + "phase:3" + ], + "createdAt": "2026-04-24T09:58:48Z", + "closedAt": "2026-04-27T07:21:39Z" + }, + { + "number": 185, + "title": "[Bug] Review queue page missing top-left back nav", + "state": "CLOSED", + "milestone": "M3 - Trust & Quality", + "labels": [ + "phase:3" + ], + "createdAt": "2026-04-24T09:58:57Z", + "closedAt": "2026-04-27T07:21:40Z" + }, + { + "number": 186, + "title": "[Bug] Reviewer cannot approve or reject a share request from the review page", + "state": "CLOSED", + "milestone": "M3 - Trust & Quality", + "labels": [ + "bug", + "phase:3", + "api" + ], + "createdAt": "2026-04-24T09:59:20Z", + "closedAt": "2026-04-27T07:21:40Z" + }, + { + "number": 187, + "title": "[Feature] SkillDetailPage layout rework + usage charts with time range", + "state": "CLOSED", + "milestone": "M3 - Trust & Quality", + "labels": [ + "phase:3" + ], + "createdAt": "2026-04-24T09:59:50Z", + "closedAt": "2026-04-27T09:06:54Z" + }, + { + "number": 188, + "title": "[Feature] Per-version audit badges + share semantics (scheme B)", + "state": "CLOSED", + "milestone": "M3 - Trust & Quality", + "labels": [ + "phase:3", + "api" + ], + "createdAt": "2026-04-24T10:00:15Z", + "closedAt": "2026-04-27T09:03:33Z" + }, + { + "number": 197, + "title": "[Feature] Pivot share/audit relationship \u2014 share is unconditional, audit is a label", + "state": "CLOSED", + "milestone": null, + "labels": [ + "api" + ], + "createdAt": "2026-04-27T09:56:08Z", + "closedAt": "2026-04-27T09:58:37Z" + }, + { + "number": 199, + "title": "[Docs] Encode \"agent-API not marketplace\" positioning into CLAUDE.md + landing page + docs index", + "state": "CLOSED", + "milestone": null, + "labels": [ + "dx" + ], + "createdAt": "2026-04-28T05:36:38Z", + "closedAt": "2026-04-28T05:39:17Z" + }, + { + "number": 201, + "title": "[Feature] Skill Detail Page redesign \u2014 Editorial Forge wireframe v1", + "state": "CLOSED", + "milestone": null, + "labels": [ + "dx" + ], + "createdAt": "2026-04-28T06:25:18Z", + "closedAt": "2026-04-28T06:40:40Z" + }, + { + "number": 203, + "title": "[Feature] Editorial Forge migration \u2014 Phase A: shared UI primitives", + "state": "CLOSED", + "milestone": null, + "labels": [ + "dx" + ], + "createdAt": "2026-04-28T06:45:03Z", + "closedAt": "2026-04-28T06:46:35Z" + }, + { + "number": 205, + "title": "[Feature] Editorial Forge migration \u2014 Phase B: global chrome + token remap", + "state": "CLOSED", + "milestone": null, + "labels": [ + "dx" + ], + "createdAt": "2026-04-28T06:52:01Z", + "closedAt": "2026-04-28T06:53:44Z" + }, + { + "number": 207, + "title": "[Feature] Editorial Forge migration \u2014 Phase C: auth + 404 pages", + "state": "CLOSED", + "milestone": null, + "labels": [ + "dx" + ], + "createdAt": "2026-04-28T06:55:21Z", + "closedAt": "2026-04-28T06:56:24Z" + }, + { + "number": 209, + "title": "[Feature] Editorial Forge migration \u2014 Phase D: Landing + Docs", + "state": "CLOSED", + "milestone": null, + "labels": [ + "dx" + ], + "createdAt": "2026-04-28T06:58:37Z", + "closedAt": "2026-04-28T07:00:15Z" + }, + { + "number": 211, + "title": "[Feature] Editorial Forge migration \u2014 Phase E: registry / my-skills / audit history / edit", + "state": "CLOSED", + "milestone": null, + "labels": [ + "dx" + ], + "createdAt": "2026-04-28T07:02:06Z", + "closedAt": "2026-04-28T07:03:48Z" + }, + { + "number": 213, + "title": "[Feature] Editorial Forge migration \u2014 Phase F: remaining pages sweep", + "state": "CLOSED", + "milestone": null, + "labels": [ + "dx" + ], + "createdAt": "2026-04-28T07:05:16Z", + "closedAt": "2026-04-28T07:06:46Z" + }, + { + "number": 215, + "title": "[Docs] Restructure docs site (About / Quick Start / Technical References) + per-domain API reference + copy-as-skill agent manual", + "state": "CLOSED", + "milestone": null, + "labels": [ + "dx" + ], + "createdAt": "2026-04-28T07:49:45Z", + "closedAt": "2026-04-28T07:51:47Z" + }, + { + "number": 217, + "title": "[Bug] /health, /livez, /readyz, /api/v1/openapi.json not routed correctly \u2014 nginx/proxy intercepts them", + "state": "CLOSED", + "milestone": null, + "labels": [ + "bug", + "api" + ], + "createdAt": "2026-04-28T08:07:02Z", + "closedAt": "2026-04-28T08:10:36Z" + }, + { + "number": 218, + "title": "[Bug] Legacy share/audit-gated data leaks through /notifications and /admin/activities after PR #198", + "state": "CLOSED", + "milestone": null, + "labels": [ + "bug", + "api" + ], + "createdAt": "2026-04-28T08:07:26Z", + "closedAt": "2026-05-12T06:16:40Z" + }, + { + "number": 219, + "title": "[Bug] /admin/stats response shape doesn't match docs/api.md", + "state": "CLOSED", + "milestone": null, + "labels": [ + "bug", + "api" + ], + "createdAt": "2026-04-28T08:07:54Z", + "closedAt": "2026-05-12T06:24:49Z" + }, + { + "number": 220, + "title": "[Bug] NyxID service registry: 'ornn' slug had wrong upstream + identity-mode mismatch with 'ornn-api' slug", + "state": "OPEN", + "milestone": null, + "labels": [ + "bug", + "infra", + "security" + ], + "createdAt": "2026-04-28T08:08:25Z", + "closedAt": null + }, + { + "number": 221, + "title": "[Feature] Landing page redesign \u2014 editorial forge expression", + "state": "CLOSED", + "milestone": null, + "labels": [ + "dx" + ], + "createdAt": "2026-04-28T09:37:55Z", + "closedAt": "2026-04-30T04:02:13Z" + }, + { + "number": 223, + "title": "[Feature] System skills + registry redesign + NyxID-service ties", + "state": "CLOSED", + "milestone": null, + "labels": [ + "dx", + "api" + ], + "createdAt": "2026-04-28T10:02:43Z", + "closedAt": "2026-04-28T10:07:33Z" + }, + { + "number": 225, + "title": "[Feature] Frontend: surface skill version diff in the UI", + "state": "CLOSED", + "milestone": null, + "labels": [ + "dx" + ], + "createdAt": "2026-04-29T07:26:05Z", + "closedAt": "2026-04-29T10:04:33Z" + }, + { + "number": 226, + "title": "[Feature] Frontend: surface delete-non-latest-version in the UI", + "state": "CLOSED", + "milestone": null, + "labels": [ + "dx" + ], + "createdAt": "2026-04-29T07:26:12Z", + "closedAt": "2026-04-29T10:04:54Z" + }, + { + "number": 229, + "title": "[Bug] /me/nyxid-services returns binary-garbage id for chrono-sandbox service", + "state": "CLOSED", + "milestone": null, + "labels": [ + "bug", + "api" + ], + "createdAt": "2026-04-30T04:52:59Z", + "closedAt": "2026-04-30T04:58:38Z" + }, + { + "number": 232, + "title": "[Feature] Forge Workshop v3 migration \u2014 app-shell visual alignment + landing-nav avatar dropdown", + "state": "CLOSED", + "milestone": null, + "labels": [ + "dx" + ], + "createdAt": "2026-04-30T06:00:35Z", + "closedAt": "2026-04-30T07:36:04Z" + }, + { + "number": 237, + "title": "[CI/CD] changeset-release bot \u2014 replace default GITHUB_TOKEN with PAT/App token so bot-opened PRs trigger required workflows", + "state": "CLOSED", + "milestone": null, + "labels": [ + "dx" + ], + "createdAt": "2026-04-30T07:44:17Z", + "closedAt": "2026-05-12T07:37:22Z" + }, + { + "number": 238, + "title": "[Bug] Admin user list + permissions-modal show empty email/displayName for users with non-empty activity history", + "state": "CLOSED", + "milestone": "Go Live Preparation", + "labels": [ + "dx" + ], + "createdAt": "2026-04-30T09:06:37Z", + "closedAt": "2026-05-05T06:12:34Z" + }, + { + "number": 240, + "title": "[Feature] Featured-skill tag pills, nav active highlighter wash, skill-detail layout flow", + "state": "CLOSED", + "milestone": null, + "labels": [ + "dx" + ], + "createdAt": "2026-04-30T09:26:00Z", + "closedAt": "2026-04-30T09:42:20Z" + }, + { + "number": 242, + "title": "[Feature] Unified agent manual \u2014 fold NyxID + NyxID CLI into the Ornn agent manual as one skill", + "state": "CLOSED", + "milestone": "Go Live Preparation", + "labels": [ + "dx" + ], + "createdAt": "2026-04-30T09:41:34Z", + "closedAt": "2026-05-05T06:14:23Z" + }, + { + "number": 243, + "title": "[Feature] Service-binding agent prompt \u2014 encourage agents to promote repeated service operations into a reusable Ornn skill bound to that service", + "state": "OPEN", + "milestone": null, + "labels": [ + "dx" + ], + "createdAt": "2026-04-30T09:58:50Z", + "closedAt": null + }, + { + "number": 244, + "title": "[Feature] Skill auditing \u2014 Gen Agent Trust Hub integration", + "state": "CLOSED", + "milestone": "M3 - Trust & Quality", + "labels": [ + "api", + "security" + ], + "createdAt": "2026-05-04T03:22:25Z", + "closedAt": "2026-05-05T05:21:47Z" + }, + { + "number": 245, + "title": "[Feature] Universal API audit middleware \u2014 all-route capture with redaction, caller-type detect, MongoDB + MinIO storage", + "state": "CLOSED", + "milestone": "Go Live Preparation", + "labels": [ + "api", + "security" + ], + "createdAt": "2026-05-04T03:56:48Z", + "closedAt": "2026-05-05T06:09:13Z" + }, + { + "number": 246, + "title": "[Feature] Frontend pageview tracking + caller-type header \u2014 cookie-free analytics with consent", + "state": "CLOSED", + "milestone": "M3 - Trust & Quality", + "labels": [ + "dx", + "api" + ], + "createdAt": "2026-05-04T03:57:33Z", + "closedAt": "2026-05-05T05:21:50Z" + }, + { + "number": 247, + "title": "[Feature] Admin audit + analytics dashboard \u2014 pageviews, API audit, caller-type breakdown", + "state": "CLOSED", + "milestone": "M3 - Trust & Quality", + "labels": [ + "dx", + "api" + ], + "createdAt": "2026-05-04T03:58:21Z", + "closedAt": "2026-05-05T05:21:52Z" + }, + { + "number": 248, + "title": "[Feature] Auto-mirror public + system skills to ChronoAIProject/ornn-skills GitHub repo for npx skills compatibility", + "state": "CLOSED", + "milestone": "Go Live Preparation", + "labels": [ + "dx" + ], + "createdAt": "2026-05-04T07:21:55Z", + "closedAt": "2026-05-05T06:01:49Z" + }, + { + "number": 250, + "title": "[Feature] Per-user playground & skill-gen quota with admin-granted beta credits", + "state": "CLOSED", + "milestone": "Go Live Preparation", + "labels": [ + "dx", + "api" + ], + "createdAt": "2026-05-05T04:59:51Z", + "closedAt": "2026-05-05T06:42:16Z" + }, + { + "number": 251, + "title": "[Feature] Admin model selection (Chrono LLM catalog) + per-call user picker", + "state": "CLOSED", + "milestone": "Go Live Preparation", + "labels": [ + "dx", + "api" + ], + "createdAt": "2026-05-05T05:00:08Z", + "closedAt": "2026-05-05T06:42:17Z" + }, + { + "number": 252, + "title": "[Feature] PostHog integration \u2014 platform-wide product analytics", + "state": "CLOSED", + "milestone": "Go Live Preparation", + "labels": [ + "dx", + "api" + ], + "createdAt": "2026-05-05T05:04:32Z", + "closedAt": "2026-05-05T06:23:22Z" + }, + { + "number": 253, + "title": "[Feature] AgentSeal integration \u2014 security trust score on every published skill", + "state": "CLOSED", + "milestone": "Go Live Preparation", + "labels": [ + "api", + "security" + ], + "createdAt": "2026-05-05T05:05:04Z", + "closedAt": "2026-05-05T06:23:23Z" + }, + { + "number": 254, + "title": "[Bug] backfill-skill-author-display-names.ts uses $last for activity labels \u2014 same root cause as #238 runtime aggregator", + "state": "OPEN", + "milestone": null, + "labels": [ + "bug", + "api" + ], + "createdAt": "2026-05-05T05:48:31Z", + "closedAt": null + }, + { + "number": 264, + "title": "[Feature] Playground chat \u2014 message entrance animation + strengthen PR-issue linkage rule in CLAUDE.md", + "state": "CLOSED", + "milestone": null, + "labels": [ + "documentation", + "enhancement" + ], + "createdAt": "2026-05-06T07:11:03Z", + "closedAt": "2026-05-06T07:14:04Z" + }, + { + "number": 266, + "title": "[Feature] Apply Playground UI/UX design principles to Generative Skill creation page", + "state": "CLOSED", + "milestone": null, + "labels": [ + "documentation", + "enhancement" + ], + "createdAt": "2026-05-06T07:19:44Z", + "closedAt": "2026-05-06T07:26:38Z" + }, + { + "number": 268, + "title": "[Feature] Quota redesign + admin panel restructure + centralized settings", + "state": "CLOSED", + "milestone": null, + "labels": [ + "enhancement", + "dx", + "api" + ], + "createdAt": "2026-05-06T09:20:26Z", + "closedAt": "2026-05-07T05:09:18Z" + }, + { + "number": 270, + "title": "[Feature] Fold model catalog into LLM Provider settings (per-provider model management)", + "state": "CLOSED", + "milestone": null, + "labels": [ + "dx" + ], + "createdAt": "2026-05-07T06:06:18Z", + "closedAt": "2026-05-07T06:38:10Z" + }, + { + "number": 271, + "title": "[Feature] PostHog-only platform analytics \u2014 wire DB-driven telemetry, remove custom audit infrastructure", + "state": "CLOSED", + "milestone": "M3 - Trust & Quality", + "labels": [ + "phase:3", + "dx", + "api", + "infra" + ], + "createdAt": "2026-05-07T06:29:34Z", + "closedAt": "2026-05-07T07:22:12Z" + }, + { + "number": 273, + "title": "[Docs] CLAUDE.md \u2014 codify commit-size rule (small self-contained > one big)", + "state": "CLOSED", + "milestone": null, + "labels": [ + "dx" + ], + "createdAt": "2026-05-07T06:35:43Z", + "closedAt": "2026-05-07T06:40:25Z" + }, + { + "number": 275, + "title": "[Feature] Move NyxID frontend link config from admin settings to ornn-web runtime config", + "state": "CLOSED", + "milestone": null, + "labels": [ + "dx" + ], + "createdAt": "2026-05-07T07:04:59Z", + "closedAt": "2026-05-07T07:14:29Z" + }, + { + "number": 278, + "title": "[Feature] Embed contact page into the frontend", + "state": "CLOSED", + "milestone": null, + "labels": [ + "enhancement", + "dx" + ], + "createdAt": "2026-05-07T07:22:52Z", + "closedAt": "2026-05-07T08:25:31Z" + }, + { + "number": 279, + "title": "[Bug] Extras section \u2014 baseUrl rejects empty string in admin form (frontend-only)", + "state": "CLOSED", + "milestone": null, + "labels": [ + "dx" + ], + "createdAt": "2026-05-07T07:23:28Z", + "closedAt": "2026-05-07T07:27:18Z" + }, + { + "number": 281, + "title": "[Bug] Replace browser-native window.confirm in UnsavedChangesGuard with styled Modal", + "state": "CLOSED", + "milestone": null, + "labels": [ + "dx" + ], + "createdAt": "2026-05-07T07:28:45Z", + "closedAt": "2026-05-07T07:32:07Z" + }, + { + "number": 283, + "title": "[Misc] Pre-production UI audit + fixes", + "state": "CLOSED", + "milestone": null, + "labels": [ + "enhancement", + "dx" + ], + "createdAt": "2026-05-07T07:36:50Z", + "closedAt": "2026-05-07T08:25:31Z" + }, + { + "number": 284, + "title": "[Bug] Extras section name regex rejects uppercase \u2014 can't add 'NyxID'", + "state": "CLOSED", + "milestone": null, + "labels": [ + "dx" + ], + "createdAt": "2026-05-07T07:38:03Z", + "closedAt": "2026-05-07T07:42:33Z" + }, + { + "number": 286, + "title": "[Misc] Migrate residual neon-input class to semantic input tokens", + "state": "OPEN", + "milestone": null, + "labels": [ + "dx" + ], + "createdAt": "2026-05-07T07:47:58Z", + "closedAt": null + }, + { + "number": 287, + "title": "[Chore] Audit + clean up env-var surface \u2014 drop stale config keys, align names", + "state": "CLOSED", + "milestone": null, + "labels": [ + "dx" + ], + "createdAt": "2026-05-07T07:52:18Z", + "closedAt": "2026-05-07T07:57:54Z" + }, + { + "number": 290, + "title": "[Bug] /admin/users 500s with ZodError on sort param \u2014 frontend sends key:dir, backend wants two params", + "state": "CLOSED", + "milestone": null, + "labels": [ + "dx" + ], + "createdAt": "2026-05-07T08:00:59Z", + "closedAt": "2026-05-07T08:11:13Z" + }, + { + "number": 292, + "title": "[Chore] Delete admin Categories / Tags / Auditing / Activities pages \u2014 fold redundant link into Dashboard", + "state": "CLOSED", + "milestone": null, + "labels": [ + "dx" + ], + "createdAt": "2026-05-07T08:20:16Z", + "closedAt": "2026-05-07T09:24:23Z" + }, + { + "number": 294, + "title": "[Chore] Restructure .env.sample.ornn into sections; move NyxID SA creds to admin settings; consolidate ornn-web URLs to base+path", + "state": "CLOSED", + "milestone": null, + "labels": [ + "dx", + "infra" + ], + "createdAt": "2026-05-07T09:13:30Z", + "closedAt": "2026-05-07T09:18:14Z" + }, + { + "number": 296, + "title": "[Bug] ornn-web crashloops on first deploy \u2014 15-derive-nyxid-api-host.envsh shipped non-executable", + "state": "CLOSED", + "milestone": null, + "labels": [ + "bug", + "infra" + ], + "createdAt": "2026-05-07T09:31:52Z", + "closedAt": "2026-05-07T09:36:51Z" + }, + { + "number": 298, + "title": "[Bug] ornn-web /api/v1/* proxy_pass broken in dev \u2014 wrong architecture: SPA should hit NyxID proxy directly", + "state": "CLOSED", + "milestone": null, + "labels": [ + "bug", + "infra" + ], + "createdAt": "2026-05-07T09:44:30Z", + "closedAt": "2026-05-07T09:47:33Z" + }, + { + "number": 300, + "title": "[Bug] Playground model dropdown clipped \u2014 open upward when bottom is tight", + "state": "CLOSED", + "milestone": null, + "labels": [ + "bug", + "dx" + ], + "createdAt": "2026-05-07T09:56:36Z", + "closedAt": "2026-05-07T10:00:19Z" + }, + { + "number": 302, + "title": "[Chore] Admin settings reorganization \u2014 fold quota into surfaces, services into NyxID, rename telemetry/extras", + "state": "CLOSED", + "milestone": null, + "labels": [ + "dx" + ], + "createdAt": "2026-05-07T10:14:05Z", + "closedAt": "2026-05-07T10:16:42Z" + }, + { + "number": 304, + "title": "[Chore] PostHog hardening \u2014 respect DNT + mask all session-replay text", + "state": "CLOSED", + "milestone": null, + "labels": [ + "dx" + ], + "createdAt": "2026-05-08T02:44:43Z", + "closedAt": "2026-05-08T02:47:27Z" + }, + { + "number": 306, + "title": "[Feature] Admin-issued redeem codes for quota grants", + "state": "CLOSED", + "milestone": null, + "labels": [ + "enhancement", + "api" + ], + "createdAt": "2026-05-08T03:20:03Z", + "closedAt": "2026-05-08T04:54:19Z" + }, + { + "number": 307, + "title": "[Feature] Landing-page announcement popup (admin-managed)", + "state": "CLOSED", + "milestone": null, + "labels": [ + "enhancement", + "api" + ], + "createdAt": "2026-05-08T03:21:08Z", + "closedAt": "2026-05-08T03:56:05Z" + }, + { + "number": 310, + "title": "[Bug] Redeem code form unreachable \u2014 SettingsPage not mounted in router", + "state": "CLOSED", + "milestone": null, + "labels": [ + "bug" + ], + "createdAt": "2026-05-08T05:04:55Z", + "closedAt": "2026-05-08T05:07:59Z" + }, + { + "number": 312, + "title": "[Feature] Restyle landing announcement popup as ember-stamp card", + "state": "CLOSED", + "milestone": null, + "labels": [ + "enhancement" + ], + "createdAt": "2026-05-08T05:38:45Z", + "closedAt": "2026-05-08T05:41:24Z" + }, + { + "number": 314, + "title": "[Chore] api.request \u2014 capture userAgent / query keys / request+response bytes for richer observability", + "state": "CLOSED", + "milestone": null, + "labels": [ + "dx" + ], + "createdAt": "2026-05-08T06:02:31Z", + "closedAt": "2026-05-08T06:04:46Z" + }, + { + "number": 316, + "title": "[Bug] Username sometimes shows as UUID after browser restart \u2014 id_token-light backfill never re-runs on rehydrate", + "state": "CLOSED", + "milestone": null, + "labels": [ + "bug" + ], + "createdAt": "2026-05-08T06:12:48Z", + "closedAt": "2026-05-08T06:15:45Z" + }, + { + "number": 318, + "title": "[Feature] SPA stale-bundle self-recovery \u2014 auto-reload when a new ornn-web is deployed", + "state": "CLOSED", + "milestone": null, + "labels": [ + "dx", + "infra" + ], + "createdAt": "2026-05-08T06:13:56Z", + "closedAt": "2026-05-08T06:29:41Z" + }, + { + "number": 320, + "title": "[Feature] Legal pages \u2014 Privacy / ToS / AUP for launch + contact-page trim", + "state": "CLOSED", + "milestone": null, + "labels": [ + "dx" + ], + "createdAt": "2026-05-08T07:17:08Z", + "closedAt": "2026-05-08T07:19:55Z" + }, + { + "number": 322, + "title": "[Chore] Consolidate legal-page email contacts to support@chrono-ai.fun", + "state": "CLOSED", + "milestone": null, + "labels": [ + "dx" + ], + "createdAt": "2026-05-08T07:34:28Z", + "closedAt": "2026-05-08T07:36:54Z" + }, + { + "number": 324, + "title": "[Feature] Landing \u2014 trim to hero + reposition copy as skill life-cycle manager", + "state": "CLOSED", + "milestone": null, + "labels": [ + "dx" + ], + "createdAt": "2026-05-08T07:40:00Z", + "closedAt": "2026-05-08T07:42:19Z" + }, + { + "number": 326, + "title": "[Chore] Reposition Ornn as end-to-end skill life-cycle manager + drop redundant footer link columns", + "state": "CLOSED", + "milestone": null, + "labels": [ + "dx" + ], + "createdAt": "2026-05-08T07:49:48Z", + "closedAt": "2026-05-08T07:52:34Z" + }, + { + "number": 328, + "title": "[Chore] Manually re-apply v0.5.0 sync onto develop after stale sync PR closed", + "state": "CLOSED", + "milestone": null, + "labels": [ + "dx", + "infra" + ], + "createdAt": "2026-05-08T08:03:16Z", + "closedAt": "2026-05-08T08:46:58Z" + }, + { + "number": 330, + "title": "[Bug] Admin settings Export/Import broken \u2014 both directions", + "state": "CLOSED", + "milestone": null, + "labels": [ + "bug", + "api" + ], + "createdAt": "2026-05-08T08:09:57Z", + "closedAt": "2026-05-08T08:14:26Z" + }, + { + "number": 333, + "title": "[Chore] Landing \u2014 remove the 'NOW FORGING \u00b7 v 0.9.3' stamp", + "state": "CLOSED", + "milestone": null, + "labels": [ + "dx" + ], + "createdAt": "2026-05-08T08:29:12Z", + "closedAt": "2026-05-08T08:49:29Z" + }, + { + "number": 335, + "title": "[Bug] Settings export still includes provider 'models' array \u2014 drop entirely", + "state": "CLOSED", + "milestone": null, + "labels": [ + "bug", + "dx" + ], + "createdAt": "2026-05-08T08:31:47Z", + "closedAt": "2026-05-08T08:44:22Z" + }, + { + "number": 339, + "title": "[Chore] i18n cleanup pre-v0.6.0 \u2014 drop workshop/forge framing + t()-ify ServiceDetailPage + AnnouncementsPage", + "state": "CLOSED", + "milestone": null, + "labels": [ + "dx" + ], + "createdAt": "2026-05-08T09:34:34Z", + "closedAt": "2026-05-08T09:46:01Z" + }, + { + "number": 341, + "title": "[Bug] SkillDetailPage main grid grows infinitely with long content \u2014 fix to viewport-relative frame with per-column scroll", + "state": "CLOSED", + "milestone": null, + "labels": [ + "bug", + "dx" + ], + "createdAt": "2026-05-08T09:43:46Z", + "closedAt": "2026-05-08T09:50:00Z" + }, + { + "number": 343, + "title": "[Feature] i18n coverage \u2014 pages/admin/* (P0)", + "state": "CLOSED", + "milestone": "Go Live Preparation", + "labels": [ + "dx", + "i18n" + ], + "createdAt": "2026-05-11T03:37:31Z", + "closedAt": "2026-05-11T05:50:15Z" + }, + { + "number": 344, + "title": "[Feature] i18n coverage \u2014 shared controls + drawer Close (P0)", + "state": "CLOSED", + "milestone": "Go Live Preparation", + "labels": [ + "dx", + "i18n" + ], + "createdAt": "2026-05-11T03:37:34Z", + "closedAt": "2026-05-11T05:50:14Z" + }, + { + "number": 345, + "title": "[Feature] i18n coverage \u2014 form, skill, settings, user, editor components (P1)", + "state": "CLOSED", + "milestone": "Go Live Preparation", + "labels": [ + "dx", + "i18n" + ], + "createdAt": "2026-05-11T03:37:38Z", + "closedAt": "2026-05-11T05:50:15Z" + }, + { + "number": 346, + "title": "[Feature] i18n coverage \u2014 aria-label sweep across landing, layout, admin (P1)", + "state": "CLOSED", + "milestone": "Go Live Preparation", + "labels": [ + "dx", + "i18n" + ], + "createdAt": "2026-05-11T03:37:41Z", + "closedAt": "2026-05-11T05:50:14Z" + }, + { + "number": 347, + "title": "[Feature] i18n coverage \u2014 services/utils error-code refactor (P2, structural)", + "state": "CLOSED", + "milestone": "Go Live Preparation", + "labels": [ + "dx", + "api", + "i18n" + ], + "createdAt": "2026-05-11T03:37:44Z", + "closedAt": "2026-05-11T05:50:15Z" + }, + { + "number": 348, + "title": "[Misc] i18n coverage \u2014 review 11 suspicious zh==en values (P2)", + "state": "CLOSED", + "milestone": "Go Live Preparation", + "labels": [ + "dx", + "i18n" + ], + "createdAt": "2026-05-11T03:37:47Z", + "closedAt": "2026-05-11T05:50:15Z" + }, + { + "number": 349, + "title": "[Docs] Align README with CLAUDE.md, drop .ornn-skills, reorganize markdown layout", + "state": "CLOSED", + "milestone": null, + "labels": [ + "documentation" + ], + "createdAt": "2026-05-11T04:02:01Z", + "closedAt": "2026-05-11T04:06:46Z" + }, + { + "number": 352, + "title": "[Misc] Drop unused ornn-web/public/ assets + align README logo with frontend Logo.tsx", + "state": "CLOSED", + "milestone": null, + "labels": [ + "documentation" + ], + "createdAt": "2026-05-11T05:58:13Z", + "closedAt": "2026-05-11T06:21:53Z" + }, + { + "number": 354, + "title": "[Misc] Repo organization: move SDKs into sdk/, ALL-CAPS docs/ filenames, CLAUDE.md doc index", + "state": "CLOSED", + "milestone": null, + "labels": [ + "documentation" + ], + "createdAt": "2026-05-11T06:15:42Z", + "closedAt": "2026-05-11T06:21:54Z" + }, + { + "number": 355, + "title": "[Bug] Admin pages missing top Navbar (no theme/language switcher, no main nav)", + "state": "CLOSED", + "milestone": null, + "labels": [ + "bug" + ], + "createdAt": "2026-05-11T06:42:27Z", + "closedAt": "2026-05-11T06:59:56Z" + }, + { + "number": 357, + "title": "[Feature] News page listing all released announcements", + "state": "CLOSED", + "milestone": null, + "labels": [ + "enhancement", + "api" + ], + "createdAt": "2026-05-11T06:47:37Z", + "closedAt": "2026-05-11T07:03:28Z" + }, + { + "number": 359, + "title": "[Bug] Replace browser native alert/confirm dialogs with Ornn ConfirmDialog component", + "state": "CLOSED", + "milestone": null, + "labels": [ + "bug", + "enhancement", + "dx" + ], + "createdAt": "2026-05-11T07:15:52Z", + "closedAt": "2026-05-11T07:23:30Z" + }, + { + "number": 361, + "title": "[Bug] i18n + nav coverage gaps: Redeem code, admin Dashboard, LandingNav News", + "state": "CLOSED", + "milestone": null, + "labels": [ + "bug", + "i18n" + ], + "createdAt": "2026-05-11T07:26:31Z", + "closedAt": "2026-05-11T07:32:28Z" + }, + { + "number": 363, + "title": "[Bug] Extract shared UserMenuItems to stop Navbar/LandingNav dropdown drift", + "state": "CLOSED", + "milestone": null, + "labels": [ + "bug", + "enhancement", + "dx" + ], + "createdAt": "2026-05-11T08:23:50Z", + "closedAt": "2026-05-11T08:32:20Z" + }, + { + "number": 365, + "title": "[Bug] README logo washes out on GitHub light mode \u2014 wordmark hardcoded to dark-theme parchment", + "state": "CLOSED", + "milestone": null, + "labels": [ + "bug", + "documentation" + ], + "createdAt": "2026-05-11T08:45:51Z", + "closedAt": "2026-05-11T08:49:58Z" + }, + { + "number": 367, + "title": "[Misc] Replace favicon with the Forge gear (transparent background)", + "state": "CLOSED", + "milestone": null, + "labels": [ + "documentation", + "enhancement" + ], + "createdAt": "2026-05-11T08:51:40Z", + "closedAt": "2026-05-11T08:56:09Z" + }, + { + "number": 369, + "title": "[Docs] Rewrite README: trim header, drop developer-internals sections, add agent-onboarding flow", + "state": "CLOSED", + "milestone": null, + "labels": [ + "documentation" + ], + "createdAt": "2026-05-11T09:03:47Z", + "closedAt": "2026-05-11T09:07:27Z" + }, + { + "number": 371, + "title": "[Misc] PAT permission smoke test \u2014 safe to ignore", + "state": "CLOSED", + "milestone": null, + "labels": [ + "dx" + ], + "createdAt": "2026-05-11T09:54:51Z", + "closedAt": "2026-05-11T09:55:07Z" + }, + { + "number": 373, + "title": "[Feature] i18n the PostHog cookie-consent banner", + "state": "CLOSED", + "milestone": null, + "labels": [ + "dx" + ], + "createdAt": "2026-05-11T10:38:09Z", + "closedAt": "2026-05-11T10:41:32Z" + }, + { + "number": 375, + "title": "[Misc] Consolidate LandingNav into unified Navbar + reorder items", + "state": "CLOSED", + "milestone": null, + "labels": [ + "enhancement", + "dx" + ], + "createdAt": "2026-05-11T10:42:59Z", + "closedAt": "2026-05-12T03:58:54Z" + }, + { + "number": 377, + "title": "[Misc] OSS repo-health setup: community files, issue/PR templates, discoverability metadata", + "state": "CLOSED", + "milestone": null, + "labels": [ + "documentation", + "dx" + ], + "createdAt": "2026-05-12T02:54:15Z", + "closedAt": "2026-05-12T03:56:52Z" + }, + { + "number": 379, + "title": "[Bug] User menu \u2014 NyxID 'My Services' and 'Admin Services' links point to wrong URLs", + "state": "CLOSED", + "milestone": null, + "labels": [ + "bug", + "dx" + ], + "createdAt": "2026-05-12T04:58:31Z", + "closedAt": "2026-05-12T05:04:31Z" + }, + { + "number": 381, + "title": "[Bug] UploadSkillPage (Build entry) is not responsive \u2014 content clipped on common laptop sizes", + "state": "CLOSED", + "milestone": null, + "labels": [ + "bug", + "dx", + "i18n" + ], + "createdAt": "2026-05-12T05:17:15Z", + "closedAt": "2026-05-12T05:20:30Z" + }, + { + "number": 383, + "title": "[CI/CD] Add Dependabot config + bun audit CI gate for supply-chain baseline", + "state": "CLOSED", + "milestone": null, + "labels": [ + "infra", + "security" + ], + "createdAt": "2026-05-12T05:48:46Z", + "closedAt": "2026-05-12T06:07:46Z" + }, + { + "number": 387, + "title": "[CI/CD] Wire bun audit gate to block high/critical advisories on PR", + "state": "CLOSED", + "milestone": null, + "labels": [ + "infra", + "security" + ], + "createdAt": "2026-05-12T06:08:06Z", + "closedAt": "2026-05-12T06:10:20Z" + }, + { + "number": 399, + "title": "[Docs] Skill manuals reference removed endpoints \u2014 refresh `api-reference.md` against current API", + "state": "OPEN", + "milestone": null, + "labels": [ + "documentation", + "dx", + "api" + ], + "createdAt": "2026-05-12T06:24:37Z", + "closedAt": null + }, + { + "number": 400, + "title": "[CI/CD] Upgrade vite 6 \u2192 8 and @vitejs/plugin-react 4 \u2192 6", + "state": "CLOSED", + "milestone": null, + "labels": [ + "dx", + "infra" + ], + "createdAt": "2026-05-12T06:29:42Z", + "closedAt": "2026-05-12T06:31:40Z" + }, + { + "number": 402, + "title": "[CI/CD] Whitelist Dependabot in require-review + exempt from changeset-check", + "state": "CLOSED", + "milestone": null, + "labels": [ + "dx", + "infra" + ], + "createdAt": "2026-05-12T06:33:13Z", + "closedAt": "2026-05-12T06:35:51Z" + }, + { + "number": 411, + "title": "[Feature] Skill detail \u2014 fold install-to-agent prompt + npx into one tabbed Install card", + "state": "CLOSED", + "milestone": null, + "labels": [ + "dx", + "i18n" + ], + "createdAt": "2026-05-12T07:46:45Z", + "closedAt": "2026-05-12T07:53:20Z" + }, + { + "number": 413, + "title": "[Bug] Install card hidden for unauthenticated viewers \u2014 should follow skill visibility", + "state": "CLOSED", + "milestone": null, + "labels": [ + "bug", + "dx" + ], + "createdAt": "2026-05-12T07:57:40Z", + "closedAt": "2026-05-12T08:02:41Z" + }, + { + "number": 414, + "title": "[Bug] Install card \u2014 Via prompt is too tall, card height changes when switching tabs", + "state": "CLOSED", + "milestone": null, + "labels": [ + "bug", + "dx" + ], + "createdAt": "2026-05-12T07:58:54Z", + "closedAt": "2026-05-12T08:02:42Z" + }, + { + "number": 416, + "title": "[Bug] Install card \u2014 Via npx has giant empty space, COPY button looks disconnected on Via prompt", + "state": "CLOSED", + "milestone": null, + "labels": [ + "bug", + "dx" + ], + "createdAt": "2026-05-12T08:06:52Z", + "closedAt": "2026-05-12T08:08:47Z" + }, + { + "number": 418, + "title": "[Bug] Install card stretches too wide on desktop \u2014 cap its max-width", + "state": "CLOSED", + "milestone": null, + "labels": [ + "bug", + "dx" + ], + "createdAt": "2026-05-12T08:13:13Z", + "closedAt": "2026-05-12T08:23:40Z" + }, + { + "number": 429, + "title": "[CI/CD] changeset-release: GitHub Release body exceeds 125 000-char limit on big releases (v0.6.0 hit it)", + "state": "CLOSED", + "milestone": null, + "labels": [ + "bug", + "infra" + ], + "createdAt": "2026-05-12T09:28:39Z", + "closedAt": "2026-05-12T09:31:01Z" + }, + { + "number": 431, + "title": "[CI/CD] Release notes from in-repo file (Fixed / New Feature / Changed)", + "state": "CLOSED", + "milestone": null, + "labels": [ + "dx", + "infra" + ], + "createdAt": "2026-05-12T09:44:40Z", + "closedAt": "2026-05-12T09:48:13Z" + }, + { + "number": 433, + "title": "[CI/CD] Gate develop \u2192 main PRs on a properly-filled release-notes-next.md", + "state": "CLOSED", + "milestone": null, + "labels": [ + "dx", + "infra" + ], + "createdAt": "2026-05-12T09:50:57Z", + "closedAt": "2026-05-12T09:53:39Z" + }, + { + "number": 435, + "title": "[CI/CD] Restructure release notes \u2014 fixed template + per-release dated files", + "state": "CLOSED", + "milestone": null, + "labels": [ + "dx", + "infra" + ], + "createdAt": "2026-05-12T09:57:49Z", + "closedAt": "2026-05-12T10:02:53Z" + }, + { + "number": 437, + "title": "[Feature] In-process mirror reconcile scheduler with admin-configurable schedule", + "state": "CLOSED", + "milestone": null, + "labels": [ + "dx", + "api", + "infra" + ], + "createdAt": "2026-05-13T03:41:19Z", + "closedAt": "2026-05-13T04:22:50Z" + }, + { + "number": 438, + "title": "[Bug] Some routes bypass validateBody middleware \u2014 raw c.req.json() reads break RFC 7807 errors", + "state": "OPEN", + "milestone": "Review \u00b7 Security", + "labels": [ + "bug", + "api", + "security", + "review:auto" + ], + "createdAt": "2026-05-13T04:09:15Z", + "closedAt": null + }, + { + "number": 439, + "title": "[Feature] Rate limiting on /skill-search (semantic mode) + auth/upload endpoints", + "state": "OPEN", + "milestone": "Review \u00b7 Security", + "labels": [ + "api", + "security", + "perf", + "review:auto" + ], + "createdAt": "2026-05-13T04:09:44Z", + "closedAt": null + }, + { + "number": 440, + "title": "[Misc] Tighten Mermaid SVG rendering \u2014 replace dangerouslySetInnerHTML with iframe sandbox", + "state": "OPEN", + "milestone": "Review \u00b7 Security", + "labels": [ + "security", + "web", + "review:auto" + ], + "createdAt": "2026-05-13T04:09:47Z", + "closedAt": null + }, + { + "number": 441, + "title": "[Misc] Validate GitHub App private key shape on mirror config write", + "state": "OPEN", + "milestone": "Review \u00b7 Security", + "labels": [ + "api", + "security", + "review:auto" + ], + "createdAt": "2026-05-13T04:09:50Z", + "closedAt": null + }, + { + "number": 442, + "title": "[Bug] AgentSeal subprocess: validate python/script paths at boot + unref child after kill", + "state": "OPEN", + "milestone": "Review \u00b7 Security", + "labels": [ + "bug", + "infra", + "security", + "review:auto" + ], + "createdAt": "2026-05-13T04:09:53Z", + "closedAt": null + }, + { + "number": 443, + "title": "[Misc] ZIP validator \u2014 add total-uncompressed-size cap + explicit zip-slip check", + "state": "OPEN", + "milestone": "Review \u00b7 Vulnerability", + "labels": [ + "security", + "web", + "review:auto" + ], + "createdAt": "2026-05-13T04:10:33Z", + "closedAt": null + }, + { + "number": 444, + "title": "[Bug] LLM re-ranker output parsed without Zod schema (cast as Array)", + "state": "OPEN", + "milestone": "Review \u00b7 Vulnerability", + "labels": [ + "bug", + "api", + "security", + "review:auto" + ], + "createdAt": "2026-05-13T04:10:36Z", + "closedAt": null + }, + { + "number": 445, + "title": "[CI/CD] Lock + audit Python SDK dependencies (lockfile + pip-audit in CI)", + "state": "OPEN", + "milestone": "Review \u00b7 Vulnerability", + "labels": [ + "infra", + "security", + "ci", + "sdk", + "review:auto" + ], + "createdAt": "2026-05-13T04:10:39Z", + "closedAt": null + }, + { + "number": 446, + "title": "[Misc] Admin search MongoDB regex \u2014 add maxTimeMS + ensure name/description indexes", + "state": "OPEN", + "milestone": "Review \u00b7 Vulnerability", + "labels": [ + "api", + "perf", + "review:auto" + ], + "createdAt": "2026-05-13T04:10:42Z", + "closedAt": null + }, + { + "number": 447, + "title": "[Misc] Migration scripts \u2014 replace Number(env) with validated parseInt + fail-fast", + "state": "OPEN", + "milestone": "Review \u00b7 Vulnerability", + "labels": [ + "dx", + "infra", + "review:auto" + ], + "createdAt": "2026-05-13T04:10:45Z", + "closedAt": null + }, + { + "number": 448, + "title": "[Misc] Eliminate \"as any\" on MongoDB _id \u2014 introduce toObjectId(guid) helper", + "state": "OPEN", + "milestone": "Review \u00b7 Coding Standards", + "labels": [ + "dx", + "api", + "review:auto" + ], + "createdAt": "2026-05-13T04:11:40Z", + "closedAt": null + }, + { + "number": 449, + "title": "[Misc] Type playground chat events with Zod discriminated union (drop \"as any\")", + "state": "OPEN", + "milestone": "Review \u00b7 Coding Standards", + "labels": [ + "dx", + "api", + "review:auto" + ], + "createdAt": "2026-05-13T04:11:43Z", + "closedAt": null + }, + { + "number": 450, + "title": "[Misc] Enable stricter TS flags: noUncheckedIndexedAccess, noImplicitOverride, exactOptionalPropertyTypes", + "state": "OPEN", + "milestone": "Review \u00b7 Coding Standards", + "labels": [ + "dx", + "review:auto" + ], + "createdAt": "2026-05-13T04:11:47Z", + "closedAt": null + }, + { + "number": 451, + "title": "[Bug] Array index as React key in skeleton/grid components \u2014 list reorder bugs", + "state": "OPEN", + "milestone": "Review \u00b7 Coding Standards", + "labels": [ + "bug", + "dx", + "web", + "review:auto" + ], + "createdAt": "2026-05-13T04:11:50Z", + "closedAt": null + }, + { + "number": 452, + "title": "[Misc] Replace hardcoded hex colors in landing pages with design tokens", + "state": "OPEN", + "milestone": "Review \u00b7 Coding Standards", + "labels": [ + "documentation", + "dx", + "web", + "review:auto" + ], + "createdAt": "2026-05-13T04:11:53Z", + "closedAt": null + }, + { + "number": 453, + "title": "[Misc] Decompose god-files: SkillDetailPage (1133L), DocsPage (857L), PlaygroundPage (802L)", + "state": "OPEN", + "milestone": "Review \u00b7 Coding Standards", + "labels": [ + "dx", + "web", + "review:auto" + ], + "createdAt": "2026-05-13T04:11:56Z", + "closedAt": null + }, + { + "number": 454, + "title": "[Feature] Backfill unit tests for 7 untested domain services + 8 repositories", + "state": "OPEN", + "milestone": "Review \u00b7 Coding Standards", + "labels": [ + "dx", + "api", + "review:auto" + ], + "createdAt": "2026-05-13T04:12:00Z", + "closedAt": null + }, + { + "number": 456, + "title": "[Bug] Error responses violate RFC 7807 \u2014 implementation uses { data, error } envelope instead of problem+json", + "state": "OPEN", + "milestone": "Review \u00b7 Industry Standards", + "labels": [ + "bug", + "api", + "review:auto" + ], + "createdAt": "2026-05-13T04:49:30Z", + "closedAt": null + }, + { + "number": 457, + "title": "[Feature] Cursor-based pagination for list endpoints (drop offset page/pageSize/total)", + "state": "OPEN", + "milestone": "Review \u00b7 Industry Standards", + "labels": [ + "api", + "review:auto" + ], + "createdAt": "2026-05-13T04:49:33Z", + "closedAt": null + }, + { + "number": 458, + "title": "[Bug] POST create endpoints return 200 OK without Location header (should be 201 Created)", + "state": "OPEN", + "milestone": "Review \u00b7 Industry Standards", + "labels": [ + "bug", + "api", + "review:auto" + ], + "createdAt": "2026-05-13T04:49:36Z", + "closedAt": null + }, + { + "number": 459, + "title": "[Feature] Idempotency-Key middleware (24h cache) per CONVENTIONS.md \u00a73.4", + "state": "OPEN", + "milestone": "Review \u00b7 Industry Standards", + "labels": [ + "api", + "review:auto" + ], + "createdAt": "2026-05-13T04:49:39Z", + "closedAt": null + }, + { + "number": 460, + "title": "[Feature] RFC 9239 rate-limit response headers (RateLimit-Limit/Remaining/Retry-After)", + "state": "OPEN", + "milestone": "Review \u00b7 Industry Standards", + "labels": [ + "api", + "review:auto" + ], + "createdAt": "2026-05-13T04:49:42Z", + "closedAt": null + }, + { + "number": 461, + "title": "[Feature] Surface integrity hash (sha256-base64) on skill version manifest like npm", + "state": "OPEN", + "milestone": "Review \u00b7 Industry Standards", + "labels": [ + "api", + "security", + "review:auto" + ], + "createdAt": "2026-05-13T04:50:23Z", + "closedAt": null + }, + { + "number": 462, + "title": "[CI/CD] OpenAPI contract tests \u2014 assert every route appears in spec with declared errors", + "state": "OPEN", + "milestone": "Review \u00b7 Industry Standards", + "labels": [ + "dx", + "api", + "ci", + "review:auto" + ], + "createdAt": "2026-05-13T04:50:26Z", + "closedAt": null + }, + { + "number": 463, + "title": "[Feature] Dist-tags (latest / stable / next) for skill version resolution", + "state": "OPEN", + "milestone": "Review \u00b7 Industry Standards", + "labels": [ + "api", + "review:auto" + ], + "createdAt": "2026-05-13T04:50:30Z", + "closedAt": null + }, + { + "number": 464, + "title": "[Feature] Publish versioned JSON Schema for SKILL.md frontmatter", + "state": "OPEN", + "milestone": "Review \u00b7 Industry Standards", + "labels": [ + "documentation", + "dx", + "api", + "review:auto" + ], + "createdAt": "2026-05-13T04:50:33Z", + "closedAt": null + }, + { + "number": 465, + "title": "[Feature] SDK ergonomics \u2014 auto-pagination iterator + exponential-backoff retry wrapper", + "state": "OPEN", + "milestone": "Review \u00b7 Industry Standards", + "labels": [ + "dx", + "sdk", + "review:auto" + ], + "createdAt": "2026-05-13T04:50:36Z", + "closedAt": null + }, + { + "number": 466, + "title": "[Feature] docker-compose.yml for one-command local dev \u2014 replace K8s-only onboarding", + "state": "OPEN", + "milestone": "Review \u00b7 OSS Readiness", + "labels": [ + "dx", + "infra", + "review:auto" + ], + "createdAt": "2026-05-13T04:51:21Z", + "closedAt": null + }, + { + "number": 467, + "title": "[Feature] Public hosted demo / playground for try-before-install", + "state": "OPEN", + "milestone": "Review \u00b7 OSS Readiness", + "labels": [ + "dx", + "infra", + "review:auto" + ], + "createdAt": "2026-05-13T04:51:25Z", + "closedAt": null + }, + { + "number": 468, + "title": "[Misc] Add npm/PyPI keywords + GitHub repo topics for discoverability", + "state": "OPEN", + "milestone": "Review \u00b7 OSS Readiness", + "labels": [ + "dx", + "sdk", + "review:auto" + ], + "createdAt": "2026-05-13T04:51:28Z", + "closedAt": null + }, + { + "number": 469, + "title": "[Docs] examples/ directory with 2-3 minimal starter skills (TS + Python)", + "state": "OPEN", + "milestone": "Review \u00b7 OSS Readiness", + "labels": [ + "documentation", + "dx", + "review:auto" + ], + "createdAt": "2026-05-13T04:51:32Z", + "closedAt": null + }, + { + "number": 470, + "title": "[Docs] SDK quickstart (5-line copy-paste) in main README", + "state": "OPEN", + "milestone": "Review \u00b7 OSS Readiness", + "labels": [ + "documentation", + "sdk", + "review:auto" + ], + "createdAt": "2026-05-13T04:51:35Z", + "closedAt": null + }, + { + "number": 471, + "title": "[CI/CD] Codecov integration + coverage badge + stated coverage target", + "state": "OPEN", + "milestone": "Review \u00b7 OSS Readiness", + "labels": [ + "dx", + "ci", + "review:auto" + ], + "createdAt": "2026-05-13T04:52:17Z", + "closedAt": null + }, + { + "number": 472, + "title": "[Docs] Positioning / comparison table vs MCP servers + Smithery + npm in README", + "state": "OPEN", + "milestone": "Review \u00b7 OSS Readiness", + "labels": [ + "documentation", + "review:auto" + ], + "createdAt": "2026-05-13T04:52:20Z", + "closedAt": null + }, + { + "number": 473, + "title": "[Bug] SDK publish status \u2014 TS SDK has private:true, clarify npm/PyPI publication strategy", + "state": "OPEN", + "milestone": "Review \u00b7 OSS Readiness", + "labels": [ + "bug", + "dx", + "sdk", + "review:auto" + ], + "createdAt": "2026-05-13T04:52:23Z", + "closedAt": null + }, + { + "number": 474, + "title": "[Docs] API stability commitment + breaking-change & deprecation policy", + "state": "OPEN", + "milestone": "Review \u00b7 OSS Readiness", + "labels": [ + "documentation", + "api", + "review:auto" + ], + "createdAt": "2026-05-13T04:52:26Z", + "closedAt": null + }, + { + "number": 475, + "title": "[Feature] Surface last-run status of the scheduled mirror reconcile", + "state": "CLOSED", + "milestone": null, + "labels": [ + "dx", + "api" + ], + "createdAt": "2026-05-13T05:22:46Z", + "closedAt": "2026-05-13T05:33:53Z" + }, + { + "number": 477, + "title": "[CI/CD] Curate release notes for 2026-05-13 cut", + "state": "CLOSED", + "milestone": null, + "labels": [ + "infra" + ], + "createdAt": "2026-05-13T05:48:09Z", + "closedAt": "2026-05-13T05:49:44Z" + }, + { + "number": 482, + "title": "[Misc] Cookie consent banner \u2014 drop PostHog vendor name from body copy", + "state": "CLOSED", + "milestone": null, + "labels": [ + "dx" + ], + "createdAt": "2026-05-13T06:40:08Z", + "closedAt": "2026-05-13T06:42:50Z" + }, + { + "number": 484, + "title": "[Misc] Contact page \u2014 route between Discussions, Issues/PRs, and support email", + "state": "CLOSED", + "milestone": null, + "labels": [ + "dx" + ], + "createdAt": "2026-05-13T07:14:32Z", + "closedAt": "2026-05-13T07:18:45Z" + }, + { + "number": 486, + "title": "[CI/CD] Cut release v0.7.1 (web copy polish)", + "state": "CLOSED", + "milestone": null, + "labels": [ + "infra" + ], + "createdAt": "2026-05-13T07:31:30Z", + "closedAt": "2026-05-13T07:33:45Z" + }, + { + "number": 491, + "title": "[Bug] Contact page \u2014 Discussion category cards inconsistent height in same row", + "state": "CLOSED", + "milestone": null, + "labels": [ + "dx" + ], + "createdAt": "2026-05-13T07:43:12Z", + "closedAt": "2026-05-13T07:45:26Z" + }, + { + "number": 493, + "title": "[Feature] Bilingual announcements (EN + ZH)", + "state": "CLOSED", + "milestone": null, + "labels": [ + "dx", + "api" + ], + "createdAt": "2026-05-13T07:58:09Z", + "closedAt": "2026-05-13T08:03:11Z" + }, + { + "number": 495, + "title": "[CI/CD] Cut release v0.7.2 (bilingual announcements + contact page polish)", + "state": "CLOSED", + "milestone": null, + "labels": [ + "infra" + ], + "createdAt": "2026-05-13T08:04:05Z", + "closedAt": "2026-05-13T08:06:18Z" + }, + { + "number": 500, + "title": "[Feature] Admin broadcast notifications \u2014 author/edit/delete inbox messages for all users", + "state": "CLOSED", + "milestone": null, + "labels": [ + "enhancement", + "api", + "i18n", + "web" + ], + "createdAt": "2026-05-13T10:20:56Z", + "closedAt": "2026-05-14T04:09:53Z" + }, + { + "number": 502, + "title": "[Feature] Targeted broadcasts + click-to-popup markdown viewer", + "state": "CLOSED", + "milestone": null, + "labels": [ + "enhancement", + "api", + "i18n", + "web" + ], + "createdAt": "2026-05-14T04:20:29Z", + "closedAt": "2026-05-14T05:07:12Z" + }, + { + "number": 503, + "title": "[Bug] Playground + Generative skill builder \u2014 i18n gaps in hero, starters, drawer, quota chip, model picker", + "state": "CLOSED", + "milestone": null, + "labels": [ + "bug", + "i18n", + "web" + ], + "createdAt": "2026-05-14T04:26:58Z", + "closedAt": "2026-05-14T05:26:53Z" + }, + { + "number": 505, + "title": "[Feature] Admin user-id-to-email lookup endpoint for picker resolution", + "state": "OPEN", + "milestone": null, + "labels": [ + "enhancement", + "api", + "web" + ], + "createdAt": "2026-05-14T05:08:41Z", + "closedAt": null + }, + { + "number": 506, + "title": "[Misc] Decide whether admins can be broadcast recipients (UserEmailPicker role scope)", + "state": "OPEN", + "milestone": null, + "labels": [ + "question", + "web" + ], + "createdAt": "2026-05-14T05:08:51Z", + "closedAt": null + }, + { + "number": 507, + "title": "[Bug] Recipients tooltip on BroadcastsPage unreadable for many recipients", + "state": "OPEN", + "milestone": null, + "labels": [ + "bug", + "web" + ], + "createdAt": "2026-05-14T05:08:57Z", + "closedAt": null + }, + { + "number": 509, + "title": "[Bug] Clicking broadcast notification triggers update-depth loop (React error #185)", + "state": "CLOSED", + "milestone": null, + "labels": [ + "bug", + "web" + ], + "createdAt": "2026-05-14T05:25:34Z", + "closedAt": "2026-05-14T05:31:13Z" + }, + { + "number": 511, + "title": "[Feature] Landing-page launch-celebration popup (hardcoded, every-visit)", + "state": "CLOSED", + "milestone": null, + "labels": [ + "enhancement", + "web" + ], + "createdAt": "2026-05-14T06:04:15Z", + "closedAt": "2026-05-14T06:07:11Z" + }, + { + "number": 513, + "title": "[Bug] LaunchCelebrationPopup \u2014 low contrast on ember surface, GitHub link invisible", + "state": "CLOSED", + "milestone": null, + "labels": [ + "bug", + "web" + ], + "createdAt": "2026-05-14T06:16:14Z", + "closedAt": "2026-05-14T06:18:45Z" + }, + { + "number": 515, + "title": "[Bug] LaunchCelebrationPopup \u2014 light-theme broken, design not launch-worthy", + "state": "CLOSED", + "milestone": null, + "labels": [ + "bug", + "web" + ], + "createdAt": "2026-05-14T06:29:15Z", + "closedAt": "2026-05-14T06:32:11Z" + }, + { + "number": 517, + "title": "[Bug] LaunchCelebrationPopup \u2014 letterpress plate paints OVER card surface, breaks light mode", + "state": "CLOSED", + "milestone": null, + "labels": [ + "bug", + "web" + ], + "createdAt": "2026-05-14T06:40:11Z", + "closedAt": "2026-05-14T06:42:50Z" + }, + { + "number": 519, + "title": "[Misc] LaunchCelebrationPopup \u2014 explain the NyxID SSO flow next to the invite code", + "state": "CLOSED", + "milestone": null, + "labels": [ + "dx" + ], + "createdAt": "2026-05-14T06:52:54Z", + "closedAt": "2026-05-14T06:57:20Z" + }, + { + "number": 522, + "title": "[Bug] Playground / skill-gen rail tab labels render upside-down for CJK", + "state": "CLOSED", + "milestone": null, + "labels": [ + "bug", + "web" + ], + "createdAt": "2026-05-14T07:06:30Z", + "closedAt": "2026-05-14T08:06:12Z" + }, + { + "number": 524, + "title": "[Misc] LaunchCelebrationPopup \u2014 add fulfillment note (24h delivery, where to redeem, support link)", + "state": "CLOSED", + "milestone": null, + "labels": [ + "dx" + ], + "createdAt": "2026-05-14T07:21:45Z", + "closedAt": "2026-05-14T07:24:09Z" + }, + { + "number": 526, + "title": "[Misc] LaunchCelebrationPopup \u2014 polish (offer-tile flow + caption consistency)", + "state": "CLOSED", + "milestone": null, + "labels": [ + "dx" + ], + "createdAt": "2026-05-14T08:23:56Z", + "closedAt": "2026-05-14T08:26:34Z" + }, + { + "number": 528, + "title": "[Bug] [Skill Creation] Saving AI-generated or guided skills fails with CORS error", + "state": "OPEN", + "milestone": null, + "labels": [ + "bug" + ], + "createdAt": "2026-05-14T08:25:49Z", + "closedAt": null + }, + { + "number": 529, + "title": "[Bug] [GitHub Import] Skip validation still fails on Ornn frontmatter validation", + "state": "OPEN", + "milestone": null, + "labels": [ + "bug" + ], + "createdAt": "2026-05-14T08:27:10Z", + "closedAt": null + }, + { + "number": 530, + "title": "[Bug] [Playground Sandbox] nyxid skill tool execution returns 500 internal_error", + "state": "OPEN", + "milestone": null, + "labels": [ + "bug" + ], + "createdAt": "2026-05-14T08:27:12Z", + "closedAt": null + }, + { + "number": 531, + "title": "[Bug] [Playground Sandbox] Installed CLI state is not preserved across tool calls", + "state": "OPEN", + "milestone": null, + "labels": [ + "bug" + ], + "createdAt": "2026-05-14T08:27:18Z", + "closedAt": null + }, + { + "number": 532, + "title": "[Bug] Quota credit notifications can't be opened \u2014 dead clicks on /notifications and bell", + "state": "CLOSED", + "milestone": null, + "labels": [ + "bug", + "web" + ], + "createdAt": "2026-05-14T09:02:09Z", + "closedAt": "2026-05-14T09:11:48Z" + }, + { + "number": 534, + "title": "[QA] Ornn \u529f\u80fd\u6d4b\u8bd5\u8fdb\u5ea6\u8ddf\u8e2a", + "state": "OPEN", + "milestone": null, + "labels": [], + "createdAt": "2026-05-14T09:24:17Z", + "closedAt": null + }, + { + "number": 535, + "title": "[QA] \u767b\u5f55\u4e0e\u6743\u9650\u63a7\u5236\u529f\u80fd\u6d4b\u8bd5", + "state": "OPEN", + "milestone": "M4 - Platform Power", + "labels": [], + "createdAt": "2026-05-14T09:24:20Z", + "closedAt": null + }, + { + "number": 536, + "title": "[QA] \u9759\u6001\u9875\u9762\u4e0e\u516c\u5f00\u5bfc\u822a\u529f\u80fd\u6d4b\u8bd5", + "state": "OPEN", + "milestone": null, + "labels": [], + "createdAt": "2026-05-14T09:24:24Z", + "closedAt": null + }, + { + "number": 537, + "title": "[QA] Skill Registry \u4e0e\u8be6\u60c5\u9875\u529f\u80fd\u6d4b\u8bd5", + "state": "OPEN", + "milestone": null, + "labels": [], + "createdAt": "2026-05-14T09:24:27Z", + "closedAt": null + }, + { + "number": 538, + "title": "[QA] Skill \u521b\u5efa\u4e0e GitHub \u5bfc\u5165\u529f\u80fd\u6d4b\u8bd5", + "state": "OPEN", + "milestone": "M4 - Platform Power", + "labels": [], + "createdAt": "2026-05-14T09:24:31Z", + "closedAt": null + }, + { + "number": 539, + "title": "[QA] Skill \u5305\u7c7b\u578b\u4e0e\u683c\u5f0f\u6821\u9a8c\u529f\u80fd\u6d4b\u8bd5", + "state": "OPEN", + "milestone": "M4 - Platform Power", + "labels": [], + "createdAt": "2026-05-14T09:24:35Z", + "closedAt": null + }, + { + "number": 540, + "title": "[QA] Playground \u4e0e sandbox \u529f\u80fd\u6d4b\u8bd5", + "state": "OPEN", + "milestone": "M4 - Platform Power", + "labels": [], + "createdAt": "2026-05-14T09:24:39Z", + "closedAt": null + }, + { + "number": 541, + "title": "[QA] \u901a\u77e5\u4e2d\u5fc3\u529f\u80fd\u6d4b\u8bd5", + "state": "OPEN", + "milestone": null, + "labels": [], + "createdAt": "2026-05-14T09:24:42Z", + "closedAt": null + }, + { + "number": 542, + "title": "[QA] \u7528\u6237\u4fa7 skill \u7ba1\u7406\u3001\u7248\u672c\u3001\u6743\u9650\u3001\u5ba1\u8ba1\u4e0e GitHub \u540c\u6b65\u529f\u80fd\u6d4b\u8bd5", + "state": "OPEN", + "milestone": null, + "labels": [], + "createdAt": "2026-05-14T09:24:45Z", + "closedAt": null + }, + { + "number": 543, + "title": "[QA] \u7ba1\u7406\u5458 Dashboard\u3001\u7528\u6237\u3001\u914d\u989d\u4e0e\u5151\u6362\u7801\u529f\u80fd\u6d4b\u8bd5", + "state": "OPEN", + "milestone": null, + "labels": [], + "createdAt": "2026-05-14T09:24:49Z", + "closedAt": null + }, + { + "number": 544, + "title": "[QA] \u7ba1\u7406\u5458 skill \u7ba1\u7406\u3001\u516c\u544a\u4e0e\u5e73\u53f0\u914d\u7f6e\u529f\u80fd\u6d4b\u8bd5", + "state": "OPEN", + "milestone": null, + "labels": [], + "createdAt": "2026-05-14T09:24:52Z", + "closedAt": null + }, + { + "number": 545, + "title": "[QA] CLI\u3001Agent \u4e0e NyxID proxy \u529f\u80fd\u6d4b\u8bd5", + "state": "OPEN", + "milestone": null, + "labels": [], + "createdAt": "2026-05-14T09:24:55Z", + "closedAt": null + }, + { + "number": 546, + "title": "[QA] \u5b89\u5168\u3001\u6743\u9650\u4e0e\u654f\u611f\u4fe1\u606f\u5904\u7406\u6d4b\u8bd5", + "state": "OPEN", + "milestone": "M4 - Platform Power", + "labels": [], + "createdAt": "2026-05-14T09:24:58Z", + "closedAt": null + }, + { + "number": 547, + "title": "[Misc] Skill package preview + chat drawers \u2014 flatten layout, pin actions, fix navbar overlap", + "state": "CLOSED", + "milestone": null, + "labels": [ + "web" + ], + "createdAt": "2026-05-14T09:40:49Z", + "closedAt": "2026-05-14T09:51:53Z" + }, + { + "number": 549, + "title": "[Misc] Redemption-code note masking \u2014 replace ambiguous ellipsis with **** so users don't think text is truncated", + "state": "CLOSED", + "milestone": null, + "labels": [ + "dx", + "api" + ], + "createdAt": "2026-05-14T10:04:28Z", + "closedAt": "2026-05-14T10:10:18Z" + }, + { + "number": 551, + "title": "[Misc] Playground Package drawer absorbs Skill drawer; gen-page pulses on new iterations; drawer-width / scroll polish", + "state": "CLOSED", + "milestone": null, + "labels": [ + "web" + ], + "createdAt": "2026-05-14T10:14:36Z", + "closedAt": "2026-05-14T10:26:23Z" + }, + { + "number": 553, + "title": "[Feature] Pin launch-celebration content to top of /news page", + "state": "CLOSED", + "milestone": null, + "labels": [ + "web" + ], + "createdAt": "2026-05-14T10:27:08Z", + "closedAt": "2026-05-14T10:31:37Z" + }, + { + "number": 555, + "title": "[CI/CD] Cut release v0.8.0 (admin broadcasts + launch-celebration popup + drawer polish)", + "state": "CLOSED", + "milestone": null, + "labels": [ + "infra" + ], + "createdAt": "2026-05-14T14:28:41Z", + "closedAt": "2026-05-14T14:33:29Z" + }, + { + "number": 560, + "title": "[Docs] Refresh ornn-agent-manual-cli skill to v1.2 against develop API", + "state": "CLOSED", + "milestone": null, + "labels": [ + "documentation", + "dx", + "api" + ], + "createdAt": "2026-05-14T15:24:35Z", + "closedAt": "2026-05-14T15:27:05Z" + }, + { + "number": 562, + "title": "[Bug] [Playground] nyxid LIST CAPABILITIES response is delayed and follow-up command is not executed", + "state": "CLOSED", + "milestone": null, + "labels": [ + "bug" + ], + "createdAt": "2026-05-15T02:28:40Z", + "closedAt": "2026-05-15T03:05:25Z" + }, + { + "number": 563, + "title": "[Bug] [Permissions] Non-owner account can access and run another account's private skill through Playground URL", + "state": "OPEN", + "milestone": null, + "labels": [ + "bug" + ], + "createdAt": "2026-05-15T02:28:40Z", + "closedAt": null + }, + { + "number": 564, + "title": "[Bug] [Playground] Missing skill still opens an interactive Playground page after API returns 404", + "state": "OPEN", + "milestone": null, + "labels": [ + "bug" + ], + "createdAt": "2026-05-15T06:39:37Z", + "closedAt": null + }, + { + "number": 565, + "title": "[Bug] [Skill Edit] Owner updating an existing skill package is blocked by CORS", + "state": "OPEN", + "milestone": null, + "labels": [ + "bug" + ], + "createdAt": "2026-05-15T08:00:48Z", + "closedAt": null + }, + { + "number": 566, + "title": "[Bug] [Registry] Anonymous users cannot load public and system skills because public Registry APIs return 401", + "state": "OPEN", + "milestone": null, + "labels": [ + "bug" + ], + "createdAt": "2026-05-15T08:24:11Z", + "closedAt": null + }, + { + "number": 567, + "title": "Enforce skill visibility checks on JSON package endpoint", + "state": "OPEN", + "milestone": null, + "labels": [], + "createdAt": "2026-05-15T09:03:39Z", + "closedAt": null + }, + { + "number": 572, + "title": "[Docs] Surface Ornn official website link in README", + "state": "CLOSED", + "milestone": null, + "labels": [ + "documentation" + ], + "createdAt": "2026-05-18T04:33:10Z", + "closedAt": "2026-05-18T04:41:00Z" + } + ] +} \ No newline at end of file diff --git a/regions.json b/regions.json index a88c2c5..4b453d6 100644 --- a/regions.json +++ b/regions.json @@ -786,7 +786,7 @@ }, "deps": [ "NyxID-MCP-Wrap", - "Ornn-Skill-Lifecycle-Core" + "Ornn-M1-Skill-Lifecycle-Core" ], "gh_query": "is:issue is:open repo:ChronoAIProject/NyxID skill install in:title" }, @@ -815,418 +815,6 @@ "NyxID-Skill-Install-CLI" ] }, - "Ornn-API-V1-Refactor": { - "label": { - "en": "API v1 Refactor (Epic 0-4)", - "zh": "API v1 重构 (Epic 0-4)" - }, - "desc": { - "en": "Foundation refactor: convention freeze, architecture teardown, /api/v1 cut (breaking external contract), frontend modernization, ops/testing/observability. Refactor milestone fully closed (#64-#72, 8 issues).", - "zh": "基座重构: 约定冻结, 架构拆解, /api/v1 切分 (对外契约 breaking), 前端现代化, 运维/测试/观测。Refactor milestone 已全 closed (#64-#72, 8 个 issue)" - }, - "closure": "bridged", - "formal": "checked", - "product": "ornn", - "milestone": "Refactor", - "owner": "chronoai-shining", - "issue_count": 0, - "focus": false, - "archived": false, - "promoted_at": { - "scoped": "2026-03-15", - "public": "2026-04-23", - "bridged": "2026-04-23" - }, - "deps": [], - "gh_query": "is:issue is:open repo:ChronoAIProject/Ornn label:phase:1" - }, - "Ornn-Skill-Lifecycle-Core": { - "label": { - "en": "Skill Lifecycle Core", - "zh": "Skill 全生命周期核心" - }, - "desc": { - "en": "Agent-facing API surface: search / pull / install / execute / build / upload / share. End-to-end lifecycle (#24), MCP-native discovery (#28), skill versioning + history (#25, #181, #183), sandboxed execution. M1 22/22 closed, shipped in v0.2.0.", - "zh": "面向 agent 的 API 全面: 搜索/拉取/安装/执行/构建/上传/分享。端到端生命周期 (#24), MCP 原生发现 (#28), 版本化与历史 (#25, #181, #183), sandbox 执行。M1 22/22 closed, v0.2.0 上线" - }, - "closure": "bridged", - "formal": "checked", - "product": "ornn", - "milestone": "M1", - "owner": "chronoai-shining", - "issue_count": 0, - "focus": false, - "archived": false, - "promoted_at": { - "seed": "2026-02-03", - "obligation": "2026-02-10", - "scoped": "2026-03-01", - "public": "2026-04-23", - "bridged": "2026-04-23" - }, - "deps": [ - "Ornn-API-V1-Refactor" - ], - "gh_query": "is:issue is:open repo:ChronoAIProject/Ornn milestone:\"M1 - Foundation\"" - }, - "Ornn-Build-Pipeline": { - "label": { - "en": "Skill Build Pipeline", - "zh": "Skill 构建流水线" - }, - "desc": { - "en": "Generate skills from OpenAPI specs (#41), from source repos (#42), generation wizard with reference selection (#45). TypeScript + Python SDK (#54, #110). M2 9/9 closed.", - "zh": "从 OpenAPI spec 生成 skill (#41), 从源码仓库生成 (#42), 带参考引用的生成向导 (#45)。TypeScript + Python SDK (#54, #110)。M2 9/9 closed" - }, - "closure": "bridged", - "formal": "checked", - "product": "ornn", - "milestone": "M2", - "owner": "chronoai-shining", - "issue_count": 0, - "focus": false, - "archived": false, - "promoted_at": { - "seed": "2026-02-15", - "obligation": "2026-03-01", - "scoped": "2026-03-20", - "public": "2026-04-23", - "bridged": "2026-04-23" - }, - "deps": [ - "Ornn-Skill-Lifecycle-Core" - ], - "gh_query": "is:issue is:open repo:ChronoAIProject/Ornn milestone:\"M2 - Build Experience\"" - }, - "Ornn-GitHub-Sync": { - "label": { - "en": "GitHub Sync (v0.5.0)", - "zh": "GitHub 同步 (v0.5.0)" - }, - "desc": { - "en": "v0.5.0 marquee: single GitHub URL link + dry-run preview + manual sync (#234). Pull-from-GitHub baseline (#57) + frontend re-sync UI (#159).", - "zh": "v0.5.0 主打: 单一 GitHub URL link + dry-run 预览 + 手动 sync (#234)。GitHub pull 基础 (#57) + 前端 re-sync UI (#159)" - }, - "closure": "bridged", - "formal": "checked", - "product": "ornn", - "milestone": "v0.5.0", - "owner": "chronoai-shining", - "issue_count": 0, - "focus": false, - "archived": false, - "promoted_at": { - "obligation": "2026-04-10", - "scoped": "2026-04-20", - "public": "2026-04-30", - "bridged": "2026-04-30" - }, - "deps": [ - "Ornn-Build-Pipeline" - ], - "gh_query": "is:issue is:open repo:ChronoAIProject/Ornn github in:title" - }, - "Ornn-Audit-System": { - "label": { - "en": "Skill Audit System", - "zh": "Skill 审核系统" - }, - "desc": { - "en": "LLM-based quality & security audit (#32), waiver/justification flow (#33, #96), audit-as-label pivot — share is unconditional, audit is a label (#197). Per-version audit history (#181, #188). M3 31/32 closed; lone open #106 is NyxID permission cleanup.", - "zh": "基于 LLM 的质量与安全审核 (#32), waiver/justification 流程 (#33, #96), audit-as-label 转向 — 分享无门槛, 审核作为标签 (#197)。Per-version 审核历史 (#181, #188)。M3 31/32 closed, 仅余 #106 NyxID 权限清理" - }, - "closure": "bridged", - "formal": "checked", - "product": "ornn", - "milestone": "M3", - "owner": "chronoai-shining", - "issue_count": 1, - "focus": false, - "archived": false, - "promoted_at": { - "seed": "2026-02-15", - "obligation": "2026-03-05", - "scoped": "2026-03-25", - "public": "2026-04-23", - "bridged": "2026-04-30" - }, - "deps": [ - "Ornn-Skill-Lifecycle-Core" - ], - "gh_query": "is:issue is:open repo:ChronoAIProject/Ornn milestone:\"M3 - Trust & Quality\"" - }, - "Ornn-AgentSeal-Trust": { - "label": { - "en": "AgentSeal Third-party Trust", - "zh": "AgentSeal 第三方审计" - }, - "desc": { - "en": "Third-party security scan on every published skill: 225+ adversarial probes, six-stage detection pipeline, SARIF output. Differentiated GTM: 'every public Ornn skill is AgentSeal-scanned' (#253).", - "zh": "对每个 public skill 跑第三方安全扫描: 225+ adversarial probes, 六阶段检测, SARIF 输出。差异化 GTM 卖点: 'every public Ornn skill is AgentSeal-scanned' (#253)" - }, - "closure": "bridged", - "formal": "checked", - "product": "ornn", - "milestone": "Go-Live-Prep", - "owner": "chronoai-shining", - "issue_count": 0, - "focus": false, - "archived": false, - "promoted_at": { - "obligation": "2026-04-15", - "scoped": "2026-04-22", - "public": "2026-04-30", - "bridged": "2026-04-30" - }, - "deps": [ - "Ornn-Audit-System" - ], - "gh_query": "is:issue is:open repo:ChronoAIProject/Ornn AgentSeal in:title" - }, - "Ornn-Analytics-PostHog": { - "label": { - "en": "Analytics (PostHog)", - "zh": "数据分析 (PostHog)" - }, - "desc": { - "en": "PostHog-only platform analytics — DB-driven telemetry, custom audit infra removed (#271). Frontend pageview tracking + caller-type header with cookie-free consent (#246). Admin audit + analytics dashboard (#247). PostHog integration (#252).", - "zh": "全站统一到 PostHog — DB 驱动遥测, 移除自家 audit 基础设施 (#271)。前端浏览追踪 + caller-type header + cookie-free consent (#246)。Admin 审核 + 分析 dashboard (#247)。PostHog 集成 (#252)" - }, - "closure": "bridged", - "formal": "checked", - "product": "ornn", - "milestone": "Go-Live-Prep", - "owner": "chronoai-shining", - "issue_count": 0, - "focus": false, - "archived": false, - "promoted_at": { - "obligation": "2026-04-12", - "scoped": "2026-04-20", - "public": "2026-04-30", - "bridged": "2026-04-30" - }, - "deps": [ - "Ornn-Skill-Lifecycle-Core" - ], - "gh_query": "is:issue is:open repo:ChronoAIProject/Ornn PostHog in:title" - }, - "Ornn-Quota-Admin": { - "label": { - "en": "Quota & Admin Controls", - "zh": "配额与 admin 控制" - }, - "desc": { - "en": "Per-user playground / skill-gen quota with admin-granted beta credits (#250). Admin model selection from Chrono LLM catalog + per-call user picker (#251). Per-provider model management (#270). Quota redesign + admin panel restructure (#268).", - "zh": "per-user playground / skill-gen 配额 + admin 发 beta credits (#250)。Admin 从 Chrono LLM 目录选模型 + 调用时用户切换 (#251)。Per-provider 模型管理 (#270)。配额重做 + admin 面板重构 (#268)" - }, - "closure": "bridged", - "formal": "checked", - "product": "ornn", - "milestone": "Go-Live-Prep", - "owner": "chronoai-shining", - "issue_count": 0, - "focus": false, - "archived": false, - "promoted_at": { - "obligation": "2026-04-10", - "scoped": "2026-04-18", - "public": "2026-04-30", - "bridged": "2026-04-30" - }, - "deps": [], - "gh_query": "is:issue is:open repo:ChronoAIProject/Ornn quota in:title" - }, - "Ornn-NyxID-Integration": { - "label": { - "en": "NyxID Integration", - "zh": "NyxID 集成" - }, - "desc": { - "en": "NyxID OAuth + service-registry + v0.4 breaking env-var split (SA vs OAuth user creds) + system-skills auto-generation from NyxID service catalog (#43, #44). Open bugs: #220 service slug mismatch, #218 share/audit leak, #106 permission catalog flip.", - "zh": "NyxID OAuth + service-registry + v0.4 breaking env 拆分 (SA 服务凭证 vs OAuth 用户凭证) + 从 NyxID 服务目录自动生成 system-skills (#43, #44)。未修 bug: #220 service slug 错位, #218 share/audit 泄漏, #106 权限 catalog flip" - }, - "closure": "bridged", - "formal": "checked", - "product": "ornn", - "milestone": "Go-Live-Prep", - "owner": "chronoai-shining", - "issue_count": 4, - "focus": false, - "archived": false, - "promoted_at": { - "seed": "2026-02-08", - "obligation": "2026-02-20", - "scoped": "2026-03-10", - "public": "2026-04-23", - "bridged": "2026-04-30" - }, - "deps": [ - "NyxID-OAuth-flow" - ], - "gh_query": "is:issue is:open repo:ChronoAIProject/Ornn NyxID in:title" - }, - "Ornn-Web-Frontend": { - "label": { - "en": "Ornn Web Frontend", - "zh": "Ornn Web 前端" - }, - "desc": { - "en": "ornn.chrono-ai.fun — developer touch-point for the agent API: skill detail, docs, admin, landing. NOT a marketplace (positioning #199). Editorial Forge UI migration Phases A-F (#201-#213), landing redesign (#221), Forge Workshop v3 (#232), full i18n zh/en parity (#343-#348).", - "zh": "ornn.chrono-ai.fun — agent API 的 developer 触点: skill 详情 + docs + admin + landing。不是 marketplace (定位见 #199)。Editorial Forge UI 迁移 A-F 阶段 (#201-#213), landing 重做 (#221), Forge Workshop v3 (#232), 全量 i18n zh/en 对等 (#343-#348)" - }, - "closure": "bridged", - "formal": "checked", - "product": "ornn", - "milestone": "Go-Live-Prep", - "owner": "chronoai-shining", - "issue_count": 0, - "focus": false, - "archived": false, - "promoted_at": { - "obligation": "2026-03-01", - "scoped": "2026-03-15", - "public": "2026-04-23", - "bridged": "2026-04-30" - }, - "deps": [], - "gh_query": "is:issue is:open repo:ChronoAIProject/Ornn label:i18n" - }, - "Ornn-Platform-Power": { - "label": { - "en": "Platform Power (M4)", - "zh": "平台力 (M4)" - }, - "desc": { - "en": "Q2 attack target: skills that compose into workflows. Skill chaining (#35), webhook & event system for skill lifecycle (#36), templates & starter kits (#37). 0 closed / 3 open — pre-implementation.", - "zh": "Q2 攻坚目标: 把 skill 组合成 workflow。Skill chaining (#35), webhook & event 系统 (#36), 模板 & starter kit (#37)。0 closed / 3 open, 尚未实现" - }, - "closure": "obligation", - "formal": "none", - "product": "ornn", - "milestone": "M4", - "owner": "chronoai-shining", - "issue_count": 3, - "focus": true, - "archived": false, - "promoted_at": { - "seed": "2026-02-15", - "obligation": "2026-04-30" - }, - "deps": [ - "Ornn-Skill-Lifecycle-Core" - ], - "gh_query": "is:issue is:open repo:ChronoAIProject/Ornn milestone:\"M4 - Platform Power\"" - }, - "Ornn-Code-Review-Hardening": { - "label": { - "en": "Code Review Hardening (5 tracks)", - "zh": "代码审计收尾 (5 条轨道)" - }, - "desc": { - "en": "36 findings from automated code review (2026-05-13), split across 5 sub-milestones: Security (5, #438-#442, due 2026-05-22), Vulnerability (5, #443-#447, due 2026-05-29), Coding Standards (7, #448-#454, due 2026-06-05), Industry Standards (10, #456-#465, due 2026-06-12 — RFC 7807 / cursor pagination / integrity hash / dist-tags / Idempotency-Key), OSS Readiness (9, #466-#474, due 2026-06-19 — docker-compose / examples / SDK npm+PyPI publish / public demo). Launch gate, parallel to QA — both must pass to unblock Marketing. Industry Standards + OSS Readiness specifically gate Show HN credibility.", - "zh": "2026-05-13 一轮自动代码审计产出的 36 个 finding, 拆 5 个子 milestone: Security (5, #438-#442, due 2026-05-22), Vulnerability (5, #443-#447, due 2026-05-29), Coding Standards (7, #448-#454, due 2026-06-05), Industry Standards (10, #456-#465, due 2026-06-12 — RFC 7807 / cursor 分页 / integrity hash / dist-tags / Idempotency-Key), OSS Readiness (9, #466-#474, due 2026-06-19 — docker-compose / examples / SDK 上 npm+PyPI / 公开 demo)。Launch gate, 与 QA 并行 — 两个都过才能解锁 Marketing。Industry Standards + OSS Readiness 直接决定 Show HN 的可信度" - }, - "closure": "obligation", - "formal": "none", - "product": "ornn", - "milestone": "Code-Review", - "owner": "chronoai-shining", - "issue_count": 36, - "focus": true, - "archived": false, - "promoted_at": { - "obligation": "2026-05-13" - }, - "deps": [ - "Ornn-Skill-Lifecycle-Core", - "Ornn-Build-Pipeline", - "Ornn-Web-Frontend" - ] - }, - "Ornn-Launch-Marketing": { - "label": { - "en": "Launch Marketing Playbook", - "zh": "Launch 推广 Playbook" - }, - "desc": { - "en": "Ornn public-launch marketing playbook (private repo ChronoAIProject/Ornn-Marketing, created 2026-05-15). 10-channel coordinated push: HN Show HN, Product Hunt (3 categories), Reddit r/LocalLLaMA + r/mcp + r/AI_Agents, GitHub Awesome Lists ×3, X thread, Anthropic Discord, 即刻, V2EX. Status: pre-launch — 0 posts, D-Day not set, all account audits ⬜. Launch gift: 400 free GPT-5.5 conversations for first 500 sign-ups, NyxID invite NYX-2XXJI08A. Blocked by: account warmup (HN ≥6mo+karma, Reddit ≥30d+karma, V2EX/即刻 history), Ornn stars ≥50 (Awesome Lists prereq), QA + Code Review hardening green. Account warmup is the only non-compressible calendar item.", - "zh": "Ornn 公开发布推广 playbook (私仓 ChronoAIProject/Ornn-Marketing, 2026-05-15 建)。10 渠道协同: HN Show HN, Product Hunt (3 category), Reddit r/LocalLLaMA + r/mcp + r/AI_Agents, GitHub Awesome Lists ×3, X thread, Anthropic Discord, 即刻, V2EX。状态: pre-launch — 0 posts, D-Day 未定, 所有账号 audit ⬜。Launch 福利: 前 500 名注册赠 400 次免费 GPT-5.5 对话, NyxID 邀请码 NYX-2XXJI08A。阻塞: 账号 warmup (HN ≥6mo+karma, Reddit ≥30d+karma, V2EX/即刻 历史), Ornn stars ≥50 (Awesome Lists 前置), QA + Code Review 收尾全绿。账号 warmup 是唯一不可压缩的日历时间" - }, - "closure": "seed", - "formal": "sop", - "product": "ornn", - "milestone": "Launch", - "owner": "chronoai-shining", - "issue_count": 0, - "focus": true, - "archived": false, - "promoted_at": { - "seed": "2026-05-15" - }, - "deps": [ - "Ornn-QA-PreLaunch", - "Ornn-Code-Review-Hardening", - "Ornn-Web-Frontend" - ] - }, - "Ornn-QA-PreLaunch": { - "label": { - "en": "QA Pre-Launch Gate", - "zh": "QA 上线准出" - }, - "desc": { - "en": "Pre-launch functional QA umbrella (#534, started 2026-05-14): 12 module-level test trackers (#535-#546) covering login/permissions, skill creation+GitHub import, format validation, playground+sandbox, security, registry+detail, owner mgmt, admin dashboard+quota+codes, CLI/agent/NyxID proxy, notifications, admin skill mgmt+config, static pages. Explicit go-live exit criteria written into the umbrella. Bugs discovered (e.g. #563-#567) become standalone issues outside this umbrella. Parallel to (not part of) the 5 Review · * code-audit tracks — same gate level, different axis (functional UI vs code-level).", - "zh": "上线前功能 QA 总章 (#534, 2026-05-14 启动): 12 个模块测试跟踪 (#535-#546), 覆盖登录+权限 / Skill 创建+GitHub 导入 / 包格式校验 / Playground+sandbox / 安全权限 / Registry+详情页 / Owner 管理 / Admin Dashboard+配额+兑换码 / CLI+Agent+NyxID proxy / 通知 / Admin 配置 / 静态页面。总章里写了明确「上线准出标准」。发现的 bug (如 #563-#567) 独立成 issue, 不挂在本总章下。与 5 条 Review · * 代码审计轨道并行 — 同 gate 级别, 不同维度 (功能 UI vs 代码层)" - }, - "closure": "obligation", - "formal": "sop", - "product": "ornn", - "milestone": "QA", - "owner": "chronoai-shining", - "issue_count": 13, - "focus": true, - "archived": false, - "promoted_at": { - "obligation": "2026-05-14" - }, - "deps": [ - "Ornn-Skill-Lifecycle-Core", - "Ornn-Build-Pipeline", - "Ornn-Audit-System", - "Ornn-AgentSeal-Trust", - "Ornn-Analytics-PostHog", - "Ornn-Quota-Admin", - "Ornn-NyxID-Integration", - "Ornn-Web-Frontend" - ], - "gh_query": "is:issue is:open repo:ChronoAIProject/Ornn \"[QA]\" in:title" - }, - "Ornn-Community-Engagement": { - "label": { - "en": "Community Engagement", - "zh": "Community 社区互动" - }, - "desc": { - "en": "User-facing social layer on the skill registry: skill ratings, text reviews, likes / upvotes, per-skill comment threads, author reputation, activity feed. Replaces the abandoned billing/marketplace direction. Concept seed in #3 ('Skill Audit & Community' — audit half shipped in M3, 'ratings & reviews' half deferred). GitHub Discussions enabled at repo level (#377, 6 categories live) but in-product social signals are net-new. Post-launch — needs real external users to be meaningful.", - "zh": "Skill registry 上的社区互动层: skill 评分 / 文字评价 / 点赞 / 每个 skill 的讨论 / 作者声誉 / 活动 feed。替代已放弃的 billing/marketplace 方向。概念种子在 #3 ('Skill Audit & Community' — audit 一半已 ship 在 M3, 'ratings & reviews' 一半推迟)。GitHub Discussions 已开 (#377, 6 个 category), 但站内 social signal 完全新建。post-launch 才有意义 — 需要真实外部用户才能跑得起来" - }, - "closure": "seed", - "formal": "none", - "product": "ornn", - "milestone": "Community", - "owner": "chronoai-shining", - "issue_count": 0, - "focus": false, - "archived": false, - "promoted_at": {}, - "deps": [ - "Ornn-Skill-Lifecycle-Core", - "Ornn-Web-Frontend", - "Ornn-NyxID-Integration", - "Ornn-Launch-Marketing" - ] - }, "Sisyphus-V3-Branch": { "label": { "en": "Sisyphus v3 Branch (active)", @@ -1505,6 +1093,356 @@ }, "deps": [], "gh_query": "is:issue is:open repo:aevatarAI/godgpt affiliate in:title" + }, + "Ornn-M0-Engineering-Foundation": { + "label": { + "en": "M0 — Engineering Foundation & Infra", + "zh": "M0 — 工程地基与基础设施" + }, + "desc": { + "en": "Engineering foundation that the rest of the product stands on: convention freeze, /api/v1 contract, architecture teardown, nginx + runtime-config for ornn-web, K8s deploy + CD, env-var hygiene, MinIO/ingress, changeset-release pipeline, Dependabot + bun-audit CI, Vite upgrades, repo-health metadata. **Outcome**: a codebase + delivery pipeline that scales beyond one author.\n\n\n**GitHub issues** — [M0 — Engineering Foundation & Infra](https://github.com/ChronoAIProject/Ornn/milestone/14) · 1 open / 32 closed\n\n_Open:_\n- [#399](https://github.com/ChronoAIProject/Ornn/issues/399) [Docs] Skill manuals reference removed endpoints — refresh `api-reference.md` against current API\n\n_Closed (most recent first):_\n- [#555](https://github.com/ChronoAIProject/Ornn/issues/555) ~~[CI/CD] Cut release v0.8.0 (admin broadcasts + launch-celebration popup + drawer polish)~~\n- [#519](https://github.com/ChronoAIProject/Ornn/issues/519) ~~[Misc] LaunchCelebrationPopup — explain the NyxID SSO flow next to the invite code~~\n- [#495](https://github.com/ChronoAIProject/Ornn/issues/495) ~~[CI/CD] Cut release v0.7.2 (bilingual announcements + contact page polish)~~\n- [#486](https://github.com/ChronoAIProject/Ornn/issues/486) ~~[CI/CD] Cut release v0.7.1 (web copy polish)~~\n- [#477](https://github.com/ChronoAIProject/Ornn/issues/477) ~~[CI/CD] Curate release notes for 2026-05-13 cut~~\n- [#435](https://github.com/ChronoAIProject/Ornn/issues/435) ~~[CI/CD] Restructure release notes — fixed template + per-release dated files~~\n- [#433](https://github.com/ChronoAIProject/Ornn/issues/433) ~~[CI/CD] Gate develop → main PRs on a properly-filled release-notes-next.md~~\n- [#431](https://github.com/ChronoAIProject/Ornn/issues/431) ~~[CI/CD] Release notes from in-repo file (Fixed / New Feature / Changed)~~\n- [#429](https://github.com/ChronoAIProject/Ornn/issues/429) ~~[CI/CD] changeset-release: GitHub Release body exceeds 125 000-char limit on big releases (v0.6.0 hit it)~~\n- [#402](https://github.com/ChronoAIProject/Ornn/issues/402) ~~[CI/CD] Whitelist Dependabot in require-review + exempt from changeset-check~~\n- [#400](https://github.com/ChronoAIProject/Ornn/issues/400) ~~[CI/CD] Upgrade vite 6 → 8 and @vitejs/plugin-react 4 → 6~~\n- [#387](https://github.com/ChronoAIProject/Ornn/issues/387) ~~[CI/CD] Wire bun audit gate to block high/critical advisories on PR~~\n- [#383](https://github.com/ChronoAIProject/Ornn/issues/383) ~~[CI/CD] Add Dependabot config + bun audit CI gate for supply-chain baseline~~\n- [#371](https://github.com/ChronoAIProject/Ornn/issues/371) ~~[Misc] PAT permission smoke test — safe to ignore~~\n- [#354](https://github.com/ChronoAIProject/Ornn/issues/354) ~~[Misc] Repo organization: move SDKs into sdk/, ALL-CAPS docs/ filenames, CLAUDE.md doc index~~\n- [#349](https://github.com/ChronoAIProject/Ornn/issues/349) ~~[Docs] Align README with CLAUDE.md, drop .ornn-skills, reorganize markdown layout~~\n- [#296](https://github.com/ChronoAIProject/Ornn/issues/296) ~~[Bug] ornn-web crashloops on first deploy — 15-derive-nyxid-api-host.envsh shipped non-executable~~\n- [#294](https://github.com/ChronoAIProject/Ornn/issues/294) ~~[Chore] Restructure .env.sample.ornn into sections; move NyxID SA creds to admin settings; consolidate ornn-web URLs to base+path~~\n- [#287](https://github.com/ChronoAIProject/Ornn/issues/287) ~~[Chore] Audit + clean up env-var surface — drop stale config keys, align names~~\n- [#273](https://github.com/ChronoAIProject/Ornn/issues/273) ~~[Docs] CLAUDE.md — codify commit-size rule (small self-contained > one big)~~\n- [#264](https://github.com/ChronoAIProject/Ornn/issues/264) ~~[Feature] Playground chat — message entrance animation + strengthen PR-issue linkage rule in CLAUDE.md~~\n- [#237](https://github.com/ChronoAIProject/Ornn/issues/237) ~~[CI/CD] changeset-release bot — replace default GITHUB_TOKEN with PAT/App token so bot-opened PRs trigger required workflows~~\n- [#217](https://github.com/ChronoAIProject/Ornn/issues/217) ~~[Bug] /health, /livez, /readyz, /api/v1/openapi.json not routed correctly — nginx/proxy intercepts them~~\n- [#199](https://github.com/ChronoAIProject/Ornn/issues/199) ~~[Docs] Encode \"agent-API not marketplace\" positioning into CLAUDE.md + landing page + docs index~~\n- [#167](https://github.com/ChronoAIProject/Ornn/issues/167) ~~[Infra] Local minio ingress + browser-reachable presigned URLs~~\n- _… and 7 more closed_\n", + "zh": "工程地基, 后面所有产品工作都站在这上面: 约定冻结 / /api/v1 契约 / 架构拆解 / ornn-web nginx + runtime config / K8s 部署 + CD / 环境变量整顿 / MinIO+ingress / changeset-release 流水线 / Dependabot + bun-audit CI / Vite 升级 / 仓库 health metadata。**产出**: 代码库 + 交付管线能撑过单人作者阶段\n\n\n**GitHub issues** — [M0 — Engineering Foundation & Infra](https://github.com/ChronoAIProject/Ornn/milestone/14) · 1 进行中 / 32 已关闭\n\n_进行中:_\n- [#399](https://github.com/ChronoAIProject/Ornn/issues/399) [Docs] Skill manuals reference removed endpoints — refresh `api-reference.md` against current API\n\n_已关闭 (most recent first):_\n- [#555](https://github.com/ChronoAIProject/Ornn/issues/555) ~~[CI/CD] Cut release v0.8.0 (admin broadcasts + launch-celebration popup + drawer polish)~~\n- [#519](https://github.com/ChronoAIProject/Ornn/issues/519) ~~[Misc] LaunchCelebrationPopup — explain the NyxID SSO flow next to the invite code~~\n- [#495](https://github.com/ChronoAIProject/Ornn/issues/495) ~~[CI/CD] Cut release v0.7.2 (bilingual announcements + contact page polish)~~\n- [#486](https://github.com/ChronoAIProject/Ornn/issues/486) ~~[CI/CD] Cut release v0.7.1 (web copy polish)~~\n- [#477](https://github.com/ChronoAIProject/Ornn/issues/477) ~~[CI/CD] Curate release notes for 2026-05-13 cut~~\n- [#435](https://github.com/ChronoAIProject/Ornn/issues/435) ~~[CI/CD] Restructure release notes — fixed template + per-release dated files~~\n- [#433](https://github.com/ChronoAIProject/Ornn/issues/433) ~~[CI/CD] Gate develop → main PRs on a properly-filled release-notes-next.md~~\n- [#431](https://github.com/ChronoAIProject/Ornn/issues/431) ~~[CI/CD] Release notes from in-repo file (Fixed / New Feature / Changed)~~\n- [#429](https://github.com/ChronoAIProject/Ornn/issues/429) ~~[CI/CD] changeset-release: GitHub Release body exceeds 125 000-char limit on big releases (v0.6.0 hit it)~~\n- [#402](https://github.com/ChronoAIProject/Ornn/issues/402) ~~[CI/CD] Whitelist Dependabot in require-review + exempt from changeset-check~~\n- [#400](https://github.com/ChronoAIProject/Ornn/issues/400) ~~[CI/CD] Upgrade vite 6 → 8 and @vitejs/plugin-react 4 → 6~~\n- [#387](https://github.com/ChronoAIProject/Ornn/issues/387) ~~[CI/CD] Wire bun audit gate to block high/critical advisories on PR~~\n- [#383](https://github.com/ChronoAIProject/Ornn/issues/383) ~~[CI/CD] Add Dependabot config + bun audit CI gate for supply-chain baseline~~\n- [#371](https://github.com/ChronoAIProject/Ornn/issues/371) ~~[Misc] PAT permission smoke test — safe to ignore~~\n- [#354](https://github.com/ChronoAIProject/Ornn/issues/354) ~~[Misc] Repo organization: move SDKs into sdk/, ALL-CAPS docs/ filenames, CLAUDE.md doc index~~\n- [#349](https://github.com/ChronoAIProject/Ornn/issues/349) ~~[Docs] Align README with CLAUDE.md, drop .ornn-skills, reorganize markdown layout~~\n- [#296](https://github.com/ChronoAIProject/Ornn/issues/296) ~~[Bug] ornn-web crashloops on first deploy — 15-derive-nyxid-api-host.envsh shipped non-executable~~\n- [#294](https://github.com/ChronoAIProject/Ornn/issues/294) ~~[Chore] Restructure .env.sample.ornn into sections; move NyxID SA creds to admin settings; consolidate ornn-web URLs to base+path~~\n- [#287](https://github.com/ChronoAIProject/Ornn/issues/287) ~~[Chore] Audit + clean up env-var surface — drop stale config keys, align names~~\n- [#273](https://github.com/ChronoAIProject/Ornn/issues/273) ~~[Docs] CLAUDE.md — codify commit-size rule (small self-contained > one big)~~\n- [#264](https://github.com/ChronoAIProject/Ornn/issues/264) ~~[Feature] Playground chat — message entrance animation + strengthen PR-issue linkage rule in CLAUDE.md~~\n- [#237](https://github.com/ChronoAIProject/Ornn/issues/237) ~~[CI/CD] changeset-release bot — replace default GITHUB_TOKEN with PAT/App token so bot-opened PRs trigger required workflows~~\n- [#217](https://github.com/ChronoAIProject/Ornn/issues/217) ~~[Bug] /health, /livez, /readyz, /api/v1/openapi.json not routed correctly — nginx/proxy intercepts them~~\n- [#199](https://github.com/ChronoAIProject/Ornn/issues/199) ~~[Docs] Encode \"agent-API not marketplace\" positioning into CLAUDE.md + landing page + docs index~~\n- [#167](https://github.com/ChronoAIProject/Ornn/issues/167) ~~[Infra] Local minio ingress + browser-reachable presigned URLs~~\n- _… and 7 more closed_\n" + }, + "milestone_ref": { + "repo": "ChronoAIProject/Ornn", + "milestone": "M0 — Engineering Foundation & Infra" + }, + "closure": "mature", + "formal": "checked", + "product": "ornn", + "milestone": "M0", + "owner": "chronoai-shining", + "issue_count": 1, + "focus": false, + "archived": false, + "promoted_at": { + "mature": "2026-04-23" + }, + "deps": [], + "gh_query": "is:issue is:open repo:ChronoAIProject/Ornn milestone:\"M0 — Engineering Foundation & Infra\"" + }, + "Ornn-M1-Skill-Lifecycle-Core": { + "label": { + "en": "M1 — Skill Lifecycle Core", + "zh": "M1 — Skill 全生命周期核心" + }, + "desc": { + "en": "Agent-facing skill lifecycle: search → pull → install → execute → build → upload → share. MCP-native discovery, versioning + version history, sandboxed execution (Playground), local dev with hot reload, NyxID-services pages, system-skills auto-generation, organization-scope visibility. **Outcome**: any AI agent can do the full lifecycle through one API surface.\n\n\n**GitHub issues** — [M1 — Skill Lifecycle Core](https://github.com/ChronoAIProject/Ornn/milestone/15) · 7 open / 29 closed\n\n_Open:_\n- [#565](https://github.com/ChronoAIProject/Ornn/issues/565) [Bug] [Skill Edit] Owner updating an existing skill package is blocked by CORS\n- [#564](https://github.com/ChronoAIProject/Ornn/issues/564) [Bug] [Playground] Missing skill still opens an interactive Playground page after API returns 404\n- [#531](https://github.com/ChronoAIProject/Ornn/issues/531) [Bug] [Playground Sandbox] Installed CLI state is not preserved across tool calls\n- [#530](https://github.com/ChronoAIProject/Ornn/issues/530) [Bug] [Playground Sandbox] nyxid skill tool execution returns 500 internal_error\n- [#529](https://github.com/ChronoAIProject/Ornn/issues/529) [Bug] [GitHub Import] Skip validation still fails on Ornn frontmatter validation\n- [#528](https://github.com/ChronoAIProject/Ornn/issues/528) [Bug] [Skill Creation] Saving AI-generated or guided skills fails with CORS error\n- [#243](https://github.com/ChronoAIProject/Ornn/issues/243) [Feature] Service-binding agent prompt — encourage agents to promote repeated service operations into a reusable Ornn skill bound to that service\n\n_Closed (most recent first):_\n- [#562](https://github.com/ChronoAIProject/Ornn/issues/562) ~~[Bug] [Playground] nyxid LIST CAPABILITIES response is delayed and follow-up command is not executed~~\n- [#72](https://github.com/ChronoAIProject/Ornn/issues/72) ~~[CI/CD] Epic 4: Ops, testing, observability~~\n- [#71](https://github.com/ChronoAIProject/Ornn/issues/71) ~~[Feature] Epic 3: Frontend modernization~~\n- [#70](https://github.com/ChronoAIProject/Ornn/issues/70) ~~[Feature] Epic 2 prep: NyxID permission catalog rollout (cross-team)~~\n- [#69](https://github.com/ChronoAIProject/Ornn/issues/69) ~~[Feature] Epic 2 prep: Reserved-verb DB audit~~\n- [#68](https://github.com/ChronoAIProject/Ornn/issues/68) ~~[Feature] Epic 2: /api/v1/ cut (breaking external contract)~~\n- [#67](https://github.com/ChronoAIProject/Ornn/issues/67) ~~Epic 1 [first step]: Topic domain teardown~~\n- [#66](https://github.com/ChronoAIProject/Ornn/issues/66) ~~Epic 1: Architecture refactor (no external API change)~~\n- [#65](https://github.com/ChronoAIProject/Ornn/issues/65) ~~Epic 0: Convention freeze (foundations)~~\n- [#64](https://github.com/ChronoAIProject/Ornn/issues/64) ~~[Feature] API endpoint standardization & refactor (prep for Ornn Manual v1)~~\n- [#56](https://github.com/ChronoAIProject/Ornn/issues/56) ~~Skill Topics: group skills under named topics, with API CRUD~~\n- [#44](https://github.com/ChronoAIProject/Ornn/issues/44) ~~[M1] NyxID Services pages: My Services + Admin Services with skill generation~~\n- [#43](https://github.com/ChronoAIProject/Ornn/issues/43) ~~[M1] System Skills: auto-generate skills from NyxID service catalog~~\n- [#40](https://github.com/ChronoAIProject/Ornn/issues/40) ~~[Docs] Move docs to frontend static build, remove /api/docs backend routes~~\n- [#28](https://github.com/ChronoAIProject/Ornn/issues/28) ~~[M1] MCP-native skill discovery~~\n- [#27](https://github.com/ChronoAIProject/Ornn/issues/27) ~~[M1] Local dev server with hot-reload for skill authoring~~\n- [#25](https://github.com/ChronoAIProject/Ornn/issues/25) ~~[M1] Skill versioning & version history~~\n- [#24](https://github.com/ChronoAIProject/Ornn/issues/24) ~~[Feature] End-to-end skill lifecycle: build -> search -> pull -> execute~~\n- [#23](https://github.com/ChronoAIProject/Ornn/issues/23) ~~[M1] API route refactor: merge /api/web + /api/agent into unified /api~~\n- [#12](https://github.com/ChronoAIProject/Ornn/issues/12) ~~feat: daily-briefing skill — 移植 /daily 逻辑为 Ornn skill~~\n- [#11](https://github.com/ChronoAIProject/Ornn/issues/11) ~~feat: Skill Registry API — supply skill definitions + metadata to Aevatar~~\n- [#9](https://github.com/ChronoAIProject/Ornn/issues/9) ~~[CI/CD] CI/CD pipeline — 自动测试 + 部署~~\n- [#8](https://github.com/ChronoAIProject/Ornn/issues/8) ~~feat: Organization scope skills — 支持公司/团队级共享 skills~~\n- [#7](https://github.com/ChronoAIProject/Ornn/issues/7) ~~Skill page should provide a copyable install URL for LLMs~~\n- [#6](https://github.com/ChronoAIProject/Ornn/issues/6) ~~[Bug] Ornn authoring is not usable from the Nyx CLI / proxy path and the required auth boundary is unclear~~\n- _… and 4 more closed_\n", + "zh": "面向 agent 的 skill 全生命周期: 搜索 → 拉取 → 安装 → 执行 → 构建 → 上传 → 分享。MCP 原生发现 / 版本化 / 版本历史 / sandbox 执行 (Playground) / 本地热重载 / NyxID services 页 / system skills 自动生成 / 组织级可见性。**产出**: 任何 AI agent 都能通过一个 API surface 完成全生命周期\n\n\n**GitHub issues** — [M1 — Skill Lifecycle Core](https://github.com/ChronoAIProject/Ornn/milestone/15) · 7 进行中 / 29 已关闭\n\n_进行中:_\n- [#565](https://github.com/ChronoAIProject/Ornn/issues/565) [Bug] [Skill Edit] Owner updating an existing skill package is blocked by CORS\n- [#564](https://github.com/ChronoAIProject/Ornn/issues/564) [Bug] [Playground] Missing skill still opens an interactive Playground page after API returns 404\n- [#531](https://github.com/ChronoAIProject/Ornn/issues/531) [Bug] [Playground Sandbox] Installed CLI state is not preserved across tool calls\n- [#530](https://github.com/ChronoAIProject/Ornn/issues/530) [Bug] [Playground Sandbox] nyxid skill tool execution returns 500 internal_error\n- [#529](https://github.com/ChronoAIProject/Ornn/issues/529) [Bug] [GitHub Import] Skip validation still fails on Ornn frontmatter validation\n- [#528](https://github.com/ChronoAIProject/Ornn/issues/528) [Bug] [Skill Creation] Saving AI-generated or guided skills fails with CORS error\n- [#243](https://github.com/ChronoAIProject/Ornn/issues/243) [Feature] Service-binding agent prompt — encourage agents to promote repeated service operations into a reusable Ornn skill bound to that service\n\n_已关闭 (most recent first):_\n- [#562](https://github.com/ChronoAIProject/Ornn/issues/562) ~~[Bug] [Playground] nyxid LIST CAPABILITIES response is delayed and follow-up command is not executed~~\n- [#72](https://github.com/ChronoAIProject/Ornn/issues/72) ~~[CI/CD] Epic 4: Ops, testing, observability~~\n- [#71](https://github.com/ChronoAIProject/Ornn/issues/71) ~~[Feature] Epic 3: Frontend modernization~~\n- [#70](https://github.com/ChronoAIProject/Ornn/issues/70) ~~[Feature] Epic 2 prep: NyxID permission catalog rollout (cross-team)~~\n- [#69](https://github.com/ChronoAIProject/Ornn/issues/69) ~~[Feature] Epic 2 prep: Reserved-verb DB audit~~\n- [#68](https://github.com/ChronoAIProject/Ornn/issues/68) ~~[Feature] Epic 2: /api/v1/ cut (breaking external contract)~~\n- [#67](https://github.com/ChronoAIProject/Ornn/issues/67) ~~Epic 1 [first step]: Topic domain teardown~~\n- [#66](https://github.com/ChronoAIProject/Ornn/issues/66) ~~Epic 1: Architecture refactor (no external API change)~~\n- [#65](https://github.com/ChronoAIProject/Ornn/issues/65) ~~Epic 0: Convention freeze (foundations)~~\n- [#64](https://github.com/ChronoAIProject/Ornn/issues/64) ~~[Feature] API endpoint standardization & refactor (prep for Ornn Manual v1)~~\n- [#56](https://github.com/ChronoAIProject/Ornn/issues/56) ~~Skill Topics: group skills under named topics, with API CRUD~~\n- [#44](https://github.com/ChronoAIProject/Ornn/issues/44) ~~[M1] NyxID Services pages: My Services + Admin Services with skill generation~~\n- [#43](https://github.com/ChronoAIProject/Ornn/issues/43) ~~[M1] System Skills: auto-generate skills from NyxID service catalog~~\n- [#40](https://github.com/ChronoAIProject/Ornn/issues/40) ~~[Docs] Move docs to frontend static build, remove /api/docs backend routes~~\n- [#28](https://github.com/ChronoAIProject/Ornn/issues/28) ~~[M1] MCP-native skill discovery~~\n- [#27](https://github.com/ChronoAIProject/Ornn/issues/27) ~~[M1] Local dev server with hot-reload for skill authoring~~\n- [#25](https://github.com/ChronoAIProject/Ornn/issues/25) ~~[M1] Skill versioning & version history~~\n- [#24](https://github.com/ChronoAIProject/Ornn/issues/24) ~~[Feature] End-to-end skill lifecycle: build -> search -> pull -> execute~~\n- [#23](https://github.com/ChronoAIProject/Ornn/issues/23) ~~[M1] API route refactor: merge /api/web + /api/agent into unified /api~~\n- [#12](https://github.com/ChronoAIProject/Ornn/issues/12) ~~feat: daily-briefing skill — 移植 /daily 逻辑为 Ornn skill~~\n- [#11](https://github.com/ChronoAIProject/Ornn/issues/11) ~~feat: Skill Registry API — supply skill definitions + metadata to Aevatar~~\n- [#9](https://github.com/ChronoAIProject/Ornn/issues/9) ~~[CI/CD] CI/CD pipeline — 自动测试 + 部署~~\n- [#8](https://github.com/ChronoAIProject/Ornn/issues/8) ~~feat: Organization scope skills — 支持公司/团队级共享 skills~~\n- [#7](https://github.com/ChronoAIProject/Ornn/issues/7) ~~Skill page should provide a copyable install URL for LLMs~~\n- [#6](https://github.com/ChronoAIProject/Ornn/issues/6) ~~[Bug] Ornn authoring is not usable from the Nyx CLI / proxy path and the required auth boundary is unclear~~\n- _… and 4 more closed_\n" + }, + "milestone_ref": { + "repo": "ChronoAIProject/Ornn", + "milestone": "M1 — Skill Lifecycle Core" + }, + "closure": "mature", + "formal": "checked", + "product": "ornn", + "milestone": "M1", + "owner": "chronoai-shining", + "issue_count": 7, + "focus": false, + "archived": false, + "promoted_at": { + "bridged": "2026-04-23", + "mature": "2026-05-01" + }, + "deps": [ + "Ornn-M0-Engineering-Foundation" + ], + "gh_query": "is:issue is:open repo:ChronoAIProject/Ornn milestone:\"M1 — Skill Lifecycle Core\"" + }, + "Ornn-M2-Build-Experience": { + "label": { + "en": "M2 — Build Experience", + "zh": "M2 — 构建体验" + }, + "desc": { + "en": "Generate skills from nothing or from any API spec. Dual-mode build (local + remote LLM), OpenAPI-to-skill, generation wizard with reference selection, GitHub-folder import (pull skills from a repo path), TypeScript SDK, Python SDK, testcontainers-backed integration tests. **Outcome**: skill authoring takes minutes; first-class support for \"import existing API\".\n\n\n**GitHub issues** — [M2 — Build Experience](https://github.com/ChronoAIProject/Ornn/milestone/16) · 0 open / 10 closed\n\n_Closed (most recent first):_\n- [#110](https://github.com/ChronoAIProject/Ornn/issues/110) ~~[Feature] Ornn Python SDK~~\n- [#102](https://github.com/ChronoAIProject/Ornn/issues/102) ~~[CI/CD] Integration test layer with testcontainers-backed Mongo~~\n- [#57](https://github.com/ChronoAIProject/Ornn/issues/57) ~~[Feature] Pull skills from GitHub: one-way sync from a GitHub repo/path into Ornn~~\n- [#54](https://github.com/ChronoAIProject/Ornn/issues/54) ~~[M2] Ship TypeScript and Python SDKs for skill operations~~\n- [#45](https://github.com/ChronoAIProject/Ornn/issues/45) ~~[M2] Skill generation wizard with reference selection and progress UI~~\n- [#42](https://github.com/ChronoAIProject/Ornn/issues/42) ~~[Feature] Generate skills from source code repos~~\n- [#41](https://github.com/ChronoAIProject/Ornn/issues/41) ~~[M2] Generate skills from OpenAPI specs~~\n- [#31](https://github.com/ChronoAIProject/Ornn/issues/31) ~~[Feature] Ornn SDK: TypeScript + Python client libraries~~\n- [#30](https://github.com/ChronoAIProject/Ornn/issues/30) ~~[Feature] REST API skill generation from OpenAPI specs / source code~~\n- [#29](https://github.com/ChronoAIProject/Ornn/issues/29) ~~[Feature] Dual-mode skill build: local boundaries + remote generation~~\n", + "zh": "从 0 生成 skill 或从任何 API spec 生成 skill。双模构建 (本地 + 远程 LLM) / OpenAPI 转 skill / 带参考引用的生成向导 / GitHub 文件夹导入 / TypeScript SDK / Python SDK / testcontainers 驱动的集成测试。**产出**: skill 编写从小时级降到分钟级, 头等支持\"导入已有 API\"\n\n\n**GitHub issues** — [M2 — Build Experience](https://github.com/ChronoAIProject/Ornn/milestone/16) · 0 进行中 / 10 已关闭\n\n_已关闭 (most recent first):_\n- [#110](https://github.com/ChronoAIProject/Ornn/issues/110) ~~[Feature] Ornn Python SDK~~\n- [#102](https://github.com/ChronoAIProject/Ornn/issues/102) ~~[CI/CD] Integration test layer with testcontainers-backed Mongo~~\n- [#57](https://github.com/ChronoAIProject/Ornn/issues/57) ~~[Feature] Pull skills from GitHub: one-way sync from a GitHub repo/path into Ornn~~\n- [#54](https://github.com/ChronoAIProject/Ornn/issues/54) ~~[M2] Ship TypeScript and Python SDKs for skill operations~~\n- [#45](https://github.com/ChronoAIProject/Ornn/issues/45) ~~[M2] Skill generation wizard with reference selection and progress UI~~\n- [#42](https://github.com/ChronoAIProject/Ornn/issues/42) ~~[Feature] Generate skills from source code repos~~\n- [#41](https://github.com/ChronoAIProject/Ornn/issues/41) ~~[M2] Generate skills from OpenAPI specs~~\n- [#31](https://github.com/ChronoAIProject/Ornn/issues/31) ~~[Feature] Ornn SDK: TypeScript + Python client libraries~~\n- [#30](https://github.com/ChronoAIProject/Ornn/issues/30) ~~[Feature] REST API skill generation from OpenAPI specs / source code~~\n- [#29](https://github.com/ChronoAIProject/Ornn/issues/29) ~~[Feature] Dual-mode skill build: local boundaries + remote generation~~\n" + }, + "milestone_ref": { + "repo": "ChronoAIProject/Ornn", + "milestone": "M2 — Build Experience" + }, + "closure": "mature", + "formal": "checked", + "product": "ornn", + "milestone": "M2", + "owner": "chronoai-shining", + "issue_count": 0, + "focus": false, + "archived": false, + "promoted_at": { + "bridged": "2026-04-23", + "mature": "2026-05-01" + }, + "deps": [ + "Ornn-M1-Skill-Lifecycle-Core" + ], + "gh_query": "is:issue is:open repo:ChronoAIProject/Ornn milestone:\"M2 — Build Experience\"" + }, + "Ornn-M3-Trust-Quality": { + "label": { + "en": "M3 — Trust & Quality", + "zh": "M3 — 信任与质量" + }, + "desc": { + "en": "LLM-based skill audit + waiver flow + per-version audit history + share workflows + in-product notifications + analytics dashboards. Audit-as-label pivot (share is unconditional, audit is a badge). Frontend UIs for audit/shares/notifications/analytics/github-sync. **Outcome**: every published skill carries trust + usage signals users can see and act on.\n\n\n**GitHub issues** — [M3 — Trust & Quality](https://github.com/ChronoAIProject/Ornn/milestone/17) · 3 open / 33 closed\n\n_Open:_\n- [#566](https://github.com/ChronoAIProject/Ornn/issues/566) [Bug] [Registry] Anonymous users cannot load public and system skills because public Registry APIs return 401\n- [#254](https://github.com/ChronoAIProject/Ornn/issues/254) [Bug] backfill-skill-author-display-names.ts uses $last for activity labels — same root cause as #238 runtime aggregator\n- [#106](https://github.com/ChronoAIProject/Ornn/issues/106) [Feature] NyxID permission catalog flip — post-NyxID-rename\n\n_Closed (most recent first):_\n- [#271](https://github.com/ChronoAIProject/Ornn/issues/271) ~~[Feature] PostHog-only platform analytics — wire DB-driven telemetry, remove custom audit infrastructure~~\n- [#247](https://github.com/ChronoAIProject/Ornn/issues/247) ~~[Feature] Admin audit + analytics dashboard — pageviews, API audit, caller-type breakdown~~\n- [#246](https://github.com/ChronoAIProject/Ornn/issues/246) ~~[Feature] Frontend pageview tracking + caller-type header — cookie-free analytics with consent~~\n- [#244](https://github.com/ChronoAIProject/Ornn/issues/244) ~~[Feature] Skill auditing — Gen Agent Trust Hub integration~~\n- [#218](https://github.com/ChronoAIProject/Ornn/issues/218) ~~[Bug] Legacy share/audit-gated data leaks through /notifications and /admin/activities after PR #198~~\n- [#197](https://github.com/ChronoAIProject/Ornn/issues/197) ~~[Feature] Pivot share/audit relationship — share is unconditional, audit is a label~~\n- [#188](https://github.com/ChronoAIProject/Ornn/issues/188) ~~[Feature] Per-version audit badges + share semantics (scheme B)~~\n- [#187](https://github.com/ChronoAIProject/Ornn/issues/187) ~~[Feature] SkillDetailPage layout rework + usage charts with time range~~\n- [#186](https://github.com/ChronoAIProject/Ornn/issues/186) ~~[Bug] Reviewer cannot approve or reject a share request from the review page~~\n- [#185](https://github.com/ChronoAIProject/Ornn/issues/185) ~~[Bug] Review queue page missing top-left back nav~~\n- [#184](https://github.com/ChronoAIProject/Ornn/issues/184) ~~[Bug] My sharing requests page missing top-left back nav~~\n- [#183](https://github.com/ChronoAIProject/Ornn/issues/183) ~~[Feature] Delete non-latest skill versions~~\n- [#182](https://github.com/ChronoAIProject/Ornn/issues/182) ~~[Feature] Skill JSON pull tracking + time-bucket aggregation~~\n- [#181](https://github.com/ChronoAIProject/Ornn/issues/181) ~~[Feature] Per-version audit history + analytics filter~~\n- [#172](https://github.com/ChronoAIProject/Ornn/issues/172) ~~[Feature] Fold audit-gated share initiation into PermissionsModal (single entry point)~~\n- [#161](https://github.com/ChronoAIProject/Ornn/issues/161) ~~[Feature] Frontend UI for skill analytics (per-skill card on SkillDetailPage)~~\n- [#160](https://github.com/ChronoAIProject/Ornn/issues/160) ~~[Feature] Frontend UI for audit-gated sharing workflow (share modal + justification + review queue + admin review)~~\n- [#159](https://github.com/ChronoAIProject/Ornn/issues/159) ~~[Feature] Frontend UI for GitHub skill import + 'Refresh from GitHub' re-sync~~\n- [#158](https://github.com/ChronoAIProject/Ornn/issues/158) ~~[Feature] Frontend UI for skill audit findings (SkillDetailPage banner + admin rerun)~~\n- [#157](https://github.com/ChronoAIProject/Ornn/issues/157) ~~[Feature] Frontend UI for in-product notifications (bell + /notifications page + unread badge + mark-read)~~\n- [#156](https://github.com/ChronoAIProject/Ornn/issues/156) ~~[Feature] Phase-3 frontend catch-up — audit / shares / notifications / analytics / github-sync UI~~\n- [#104](https://github.com/ChronoAIProject/Ornn/issues/104) ~~[Feature] Resource-grouped page layout~~\n- [#103](https://github.com/ChronoAIProject/Ornn/issues/103) ~~[Feature] RR7 data router migration~~\n- [#98](https://github.com/ChronoAIProject/Ornn/issues/98) ~~[Feature] In-Ornn notification center for audit + share-review events~~\n- [#97](https://github.com/ChronoAIProject/Ornn/issues/97) ~~[Feature] Target-based review routing for failed-audit shares (org admin / recipient / Ornn admin)~~\n- _… and 8 more closed_\n", + "zh": "LLM 驱动的 skill 审核 + waiver 流程 + per-version 审核历史 + 分享工作流 + 站内通知 + 分析 dashboard。Audit-as-label 转向 (分享无门槛, 审核是 badge)。审核/分享/通知/分析/github-sync 的前端 UI。**产出**: 每个 public skill 都带 trust + usage 信号, 用户可见可决策\n\n\n**GitHub issues** — [M3 — Trust & Quality](https://github.com/ChronoAIProject/Ornn/milestone/17) · 3 进行中 / 33 已关闭\n\n_进行中:_\n- [#566](https://github.com/ChronoAIProject/Ornn/issues/566) [Bug] [Registry] Anonymous users cannot load public and system skills because public Registry APIs return 401\n- [#254](https://github.com/ChronoAIProject/Ornn/issues/254) [Bug] backfill-skill-author-display-names.ts uses $last for activity labels — same root cause as #238 runtime aggregator\n- [#106](https://github.com/ChronoAIProject/Ornn/issues/106) [Feature] NyxID permission catalog flip — post-NyxID-rename\n\n_已关闭 (most recent first):_\n- [#271](https://github.com/ChronoAIProject/Ornn/issues/271) ~~[Feature] PostHog-only platform analytics — wire DB-driven telemetry, remove custom audit infrastructure~~\n- [#247](https://github.com/ChronoAIProject/Ornn/issues/247) ~~[Feature] Admin audit + analytics dashboard — pageviews, API audit, caller-type breakdown~~\n- [#246](https://github.com/ChronoAIProject/Ornn/issues/246) ~~[Feature] Frontend pageview tracking + caller-type header — cookie-free analytics with consent~~\n- [#244](https://github.com/ChronoAIProject/Ornn/issues/244) ~~[Feature] Skill auditing — Gen Agent Trust Hub integration~~\n- [#218](https://github.com/ChronoAIProject/Ornn/issues/218) ~~[Bug] Legacy share/audit-gated data leaks through /notifications and /admin/activities after PR #198~~\n- [#197](https://github.com/ChronoAIProject/Ornn/issues/197) ~~[Feature] Pivot share/audit relationship — share is unconditional, audit is a label~~\n- [#188](https://github.com/ChronoAIProject/Ornn/issues/188) ~~[Feature] Per-version audit badges + share semantics (scheme B)~~\n- [#187](https://github.com/ChronoAIProject/Ornn/issues/187) ~~[Feature] SkillDetailPage layout rework + usage charts with time range~~\n- [#186](https://github.com/ChronoAIProject/Ornn/issues/186) ~~[Bug] Reviewer cannot approve or reject a share request from the review page~~\n- [#185](https://github.com/ChronoAIProject/Ornn/issues/185) ~~[Bug] Review queue page missing top-left back nav~~\n- [#184](https://github.com/ChronoAIProject/Ornn/issues/184) ~~[Bug] My sharing requests page missing top-left back nav~~\n- [#183](https://github.com/ChronoAIProject/Ornn/issues/183) ~~[Feature] Delete non-latest skill versions~~\n- [#182](https://github.com/ChronoAIProject/Ornn/issues/182) ~~[Feature] Skill JSON pull tracking + time-bucket aggregation~~\n- [#181](https://github.com/ChronoAIProject/Ornn/issues/181) ~~[Feature] Per-version audit history + analytics filter~~\n- [#172](https://github.com/ChronoAIProject/Ornn/issues/172) ~~[Feature] Fold audit-gated share initiation into PermissionsModal (single entry point)~~\n- [#161](https://github.com/ChronoAIProject/Ornn/issues/161) ~~[Feature] Frontend UI for skill analytics (per-skill card on SkillDetailPage)~~\n- [#160](https://github.com/ChronoAIProject/Ornn/issues/160) ~~[Feature] Frontend UI for audit-gated sharing workflow (share modal + justification + review queue + admin review)~~\n- [#159](https://github.com/ChronoAIProject/Ornn/issues/159) ~~[Feature] Frontend UI for GitHub skill import + 'Refresh from GitHub' re-sync~~\n- [#158](https://github.com/ChronoAIProject/Ornn/issues/158) ~~[Feature] Frontend UI for skill audit findings (SkillDetailPage banner + admin rerun)~~\n- [#157](https://github.com/ChronoAIProject/Ornn/issues/157) ~~[Feature] Frontend UI for in-product notifications (bell + /notifications page + unread badge + mark-read)~~\n- [#156](https://github.com/ChronoAIProject/Ornn/issues/156) ~~[Feature] Phase-3 frontend catch-up — audit / shares / notifications / analytics / github-sync UI~~\n- [#104](https://github.com/ChronoAIProject/Ornn/issues/104) ~~[Feature] Resource-grouped page layout~~\n- [#103](https://github.com/ChronoAIProject/Ornn/issues/103) ~~[Feature] RR7 data router migration~~\n- [#98](https://github.com/ChronoAIProject/Ornn/issues/98) ~~[Feature] In-Ornn notification center for audit + share-review events~~\n- [#97](https://github.com/ChronoAIProject/Ornn/issues/97) ~~[Feature] Target-based review routing for failed-audit shares (org admin / recipient / Ornn admin)~~\n- _… and 8 more closed_\n" + }, + "milestone_ref": { + "repo": "ChronoAIProject/Ornn", + "milestone": "M3 — Trust & Quality" + }, + "closure": "bridged", + "formal": "checked", + "product": "ornn", + "milestone": "M3", + "owner": "chronoai-shining", + "issue_count": 3, + "focus": false, + "archived": false, + "promoted_at": { + "bridged": "2026-04-30" + }, + "deps": [ + "Ornn-M1-Skill-Lifecycle-Core" + ], + "gh_query": "is:issue is:open repo:ChronoAIProject/Ornn milestone:\"M3 — Trust & Quality\"" + }, + "Ornn-M4-Go-Live-Prep": { + "label": { + "en": "M4 — Go Live Prep", + "zh": "M4 — 上线准备" + }, + "desc": { + "en": "Make Ornn publicly usable. Per-user quota with admin redemption codes, admin model selection from Chrono LLM catalog, AgentSeal security scan on every public skill, PostHog analytics, GitHub auto-mirror of public skills to `ornn-skills`, unified agent manuals (CLI + HTTP), full i18n (zh + en parity), Editorial Forge UI migration, landing/legal/contact/News pages, launch-celebration popup, admin broadcasts, release engineering for v0.4 → v0.8. **Outcome**: a launch-ready hosted instance at ornn.chrono-ai.fun.\n\n\n**GitHub issues** — [M4 — Go Live Prep](https://github.com/ChronoAIProject/Ornn/milestone/18) · 6 open / 106 closed\n\n_Open:_\n- [#507](https://github.com/ChronoAIProject/Ornn/issues/507) [Bug] Recipients tooltip on BroadcastsPage unreadable for many recipients\n- [#506](https://github.com/ChronoAIProject/Ornn/issues/506) [Misc] Decide whether admins can be broadcast recipients (UserEmailPicker role scope)\n- [#505](https://github.com/ChronoAIProject/Ornn/issues/505) [Feature] Admin user-id-to-email lookup endpoint for picker resolution\n- [#286](https://github.com/ChronoAIProject/Ornn/issues/286) [Misc] Migrate residual neon-input class to semantic input tokens\n- [#220](https://github.com/ChronoAIProject/Ornn/issues/220) [Bug] NyxID service registry: 'ornn' slug had wrong upstream + identity-mode mismatch with 'ornn-api' slug\n- [#22](https://github.com/ChronoAIProject/Ornn/issues/22) [Misc] Owner 自主目标: 定义 Ornn O1 路径 + 开发者触达计划\n\n_Closed (most recent first):_\n- [#572](https://github.com/ChronoAIProject/Ornn/issues/572) ~~[Docs] Surface Ornn official website link in README~~\n- [#560](https://github.com/ChronoAIProject/Ornn/issues/560) ~~[Docs] Refresh ornn-agent-manual-cli skill to v1.2 against develop API~~\n- [#553](https://github.com/ChronoAIProject/Ornn/issues/553) ~~[Feature] Pin launch-celebration content to top of /news page~~\n- [#551](https://github.com/ChronoAIProject/Ornn/issues/551) ~~[Misc] Playground Package drawer absorbs Skill drawer; gen-page pulses on new iterations; drawer-width / scroll polish~~\n- [#549](https://github.com/ChronoAIProject/Ornn/issues/549) ~~[Misc] Redemption-code note masking — replace ambiguous ellipsis with **** so users don't think text is truncated~~\n- [#547](https://github.com/ChronoAIProject/Ornn/issues/547) ~~[Misc] Skill package preview + chat drawers — flatten layout, pin actions, fix navbar overlap~~\n- [#532](https://github.com/ChronoAIProject/Ornn/issues/532) ~~[Bug] Quota credit notifications can't be opened — dead clicks on /notifications and bell~~\n- [#526](https://github.com/ChronoAIProject/Ornn/issues/526) ~~[Misc] LaunchCelebrationPopup — polish (offer-tile flow + caption consistency)~~\n- [#524](https://github.com/ChronoAIProject/Ornn/issues/524) ~~[Misc] LaunchCelebrationPopup — add fulfillment note (24h delivery, where to redeem, support link)~~\n- [#522](https://github.com/ChronoAIProject/Ornn/issues/522) ~~[Bug] Playground / skill-gen rail tab labels render upside-down for CJK~~\n- [#517](https://github.com/ChronoAIProject/Ornn/issues/517) ~~[Bug] LaunchCelebrationPopup — letterpress plate paints OVER card surface, breaks light mode~~\n- [#515](https://github.com/ChronoAIProject/Ornn/issues/515) ~~[Bug] LaunchCelebrationPopup — light-theme broken, design not launch-worthy~~\n- [#513](https://github.com/ChronoAIProject/Ornn/issues/513) ~~[Bug] LaunchCelebrationPopup — low contrast on ember surface, GitHub link invisible~~\n- [#511](https://github.com/ChronoAIProject/Ornn/issues/511) ~~[Feature] Landing-page launch-celebration popup (hardcoded, every-visit)~~\n- [#509](https://github.com/ChronoAIProject/Ornn/issues/509) ~~[Bug] Clicking broadcast notification triggers update-depth loop (React error #185)~~\n- [#503](https://github.com/ChronoAIProject/Ornn/issues/503) ~~[Bug] Playground + Generative skill builder — i18n gaps in hero, starters, drawer, quota chip, model picker~~\n- [#502](https://github.com/ChronoAIProject/Ornn/issues/502) ~~[Feature] Targeted broadcasts + click-to-popup markdown viewer~~\n- [#500](https://github.com/ChronoAIProject/Ornn/issues/500) ~~[Feature] Admin broadcast notifications — author/edit/delete inbox messages for all users~~\n- [#493](https://github.com/ChronoAIProject/Ornn/issues/493) ~~[Feature] Bilingual announcements (EN + ZH)~~\n- [#491](https://github.com/ChronoAIProject/Ornn/issues/491) ~~[Bug] Contact page — Discussion category cards inconsistent height in same row~~\n- [#484](https://github.com/ChronoAIProject/Ornn/issues/484) ~~[Misc] Contact page — route between Discussions, Issues/PRs, and support email~~\n- [#482](https://github.com/ChronoAIProject/Ornn/issues/482) ~~[Misc] Cookie consent banner — drop PostHog vendor name from body copy~~\n- [#475](https://github.com/ChronoAIProject/Ornn/issues/475) ~~[Feature] Surface last-run status of the scheduled mirror reconcile~~\n- [#437](https://github.com/ChronoAIProject/Ornn/issues/437) ~~[Feature] In-process mirror reconcile scheduler with admin-configurable schedule~~\n- [#418](https://github.com/ChronoAIProject/Ornn/issues/418) ~~[Bug] Install card stretches too wide on desktop — cap its max-width~~\n- _… and 81 more closed_\n", + "zh": "让 Ornn 对外可用。per-user 配额 + admin 兑换码 / admin 从 Chrono LLM 目录选模型 / 每个 public skill 都过 AgentSeal 安全扫描 / PostHog 分析 / public skill 自动镜像到 `ornn-skills` 仓库 / 统一 agent manual (CLI + HTTP) / 完整 i18n (zh+en 对等) / Editorial Forge UI 迁移 / 落地+法务+联系+News 页 / launch celebration popup / admin 广播 / v0.4 → v0.8 的发布工程。**产出**: ornn.chrono-ai.fun 上一个 launch-ready 的托管实例\n\n\n**GitHub issues** — [M4 — Go Live Prep](https://github.com/ChronoAIProject/Ornn/milestone/18) · 6 进行中 / 106 已关闭\n\n_进行中:_\n- [#507](https://github.com/ChronoAIProject/Ornn/issues/507) [Bug] Recipients tooltip on BroadcastsPage unreadable for many recipients\n- [#506](https://github.com/ChronoAIProject/Ornn/issues/506) [Misc] Decide whether admins can be broadcast recipients (UserEmailPicker role scope)\n- [#505](https://github.com/ChronoAIProject/Ornn/issues/505) [Feature] Admin user-id-to-email lookup endpoint for picker resolution\n- [#286](https://github.com/ChronoAIProject/Ornn/issues/286) [Misc] Migrate residual neon-input class to semantic input tokens\n- [#220](https://github.com/ChronoAIProject/Ornn/issues/220) [Bug] NyxID service registry: 'ornn' slug had wrong upstream + identity-mode mismatch with 'ornn-api' slug\n- [#22](https://github.com/ChronoAIProject/Ornn/issues/22) [Misc] Owner 自主目标: 定义 Ornn O1 路径 + 开发者触达计划\n\n_已关闭 (most recent first):_\n- [#572](https://github.com/ChronoAIProject/Ornn/issues/572) ~~[Docs] Surface Ornn official website link in README~~\n- [#560](https://github.com/ChronoAIProject/Ornn/issues/560) ~~[Docs] Refresh ornn-agent-manual-cli skill to v1.2 against develop API~~\n- [#553](https://github.com/ChronoAIProject/Ornn/issues/553) ~~[Feature] Pin launch-celebration content to top of /news page~~\n- [#551](https://github.com/ChronoAIProject/Ornn/issues/551) ~~[Misc] Playground Package drawer absorbs Skill drawer; gen-page pulses on new iterations; drawer-width / scroll polish~~\n- [#549](https://github.com/ChronoAIProject/Ornn/issues/549) ~~[Misc] Redemption-code note masking — replace ambiguous ellipsis with **** so users don't think text is truncated~~\n- [#547](https://github.com/ChronoAIProject/Ornn/issues/547) ~~[Misc] Skill package preview + chat drawers — flatten layout, pin actions, fix navbar overlap~~\n- [#532](https://github.com/ChronoAIProject/Ornn/issues/532) ~~[Bug] Quota credit notifications can't be opened — dead clicks on /notifications and bell~~\n- [#526](https://github.com/ChronoAIProject/Ornn/issues/526) ~~[Misc] LaunchCelebrationPopup — polish (offer-tile flow + caption consistency)~~\n- [#524](https://github.com/ChronoAIProject/Ornn/issues/524) ~~[Misc] LaunchCelebrationPopup — add fulfillment note (24h delivery, where to redeem, support link)~~\n- [#522](https://github.com/ChronoAIProject/Ornn/issues/522) ~~[Bug] Playground / skill-gen rail tab labels render upside-down for CJK~~\n- [#517](https://github.com/ChronoAIProject/Ornn/issues/517) ~~[Bug] LaunchCelebrationPopup — letterpress plate paints OVER card surface, breaks light mode~~\n- [#515](https://github.com/ChronoAIProject/Ornn/issues/515) ~~[Bug] LaunchCelebrationPopup — light-theme broken, design not launch-worthy~~\n- [#513](https://github.com/ChronoAIProject/Ornn/issues/513) ~~[Bug] LaunchCelebrationPopup — low contrast on ember surface, GitHub link invisible~~\n- [#511](https://github.com/ChronoAIProject/Ornn/issues/511) ~~[Feature] Landing-page launch-celebration popup (hardcoded, every-visit)~~\n- [#509](https://github.com/ChronoAIProject/Ornn/issues/509) ~~[Bug] Clicking broadcast notification triggers update-depth loop (React error #185)~~\n- [#503](https://github.com/ChronoAIProject/Ornn/issues/503) ~~[Bug] Playground + Generative skill builder — i18n gaps in hero, starters, drawer, quota chip, model picker~~\n- [#502](https://github.com/ChronoAIProject/Ornn/issues/502) ~~[Feature] Targeted broadcasts + click-to-popup markdown viewer~~\n- [#500](https://github.com/ChronoAIProject/Ornn/issues/500) ~~[Feature] Admin broadcast notifications — author/edit/delete inbox messages for all users~~\n- [#493](https://github.com/ChronoAIProject/Ornn/issues/493) ~~[Feature] Bilingual announcements (EN + ZH)~~\n- [#491](https://github.com/ChronoAIProject/Ornn/issues/491) ~~[Bug] Contact page — Discussion category cards inconsistent height in same row~~\n- [#484](https://github.com/ChronoAIProject/Ornn/issues/484) ~~[Misc] Contact page — route between Discussions, Issues/PRs, and support email~~\n- [#482](https://github.com/ChronoAIProject/Ornn/issues/482) ~~[Misc] Cookie consent banner — drop PostHog vendor name from body copy~~\n- [#475](https://github.com/ChronoAIProject/Ornn/issues/475) ~~[Feature] Surface last-run status of the scheduled mirror reconcile~~\n- [#437](https://github.com/ChronoAIProject/Ornn/issues/437) ~~[Feature] In-process mirror reconcile scheduler with admin-configurable schedule~~\n- [#418](https://github.com/ChronoAIProject/Ornn/issues/418) ~~[Bug] Install card stretches too wide on desktop — cap its max-width~~\n- _… and 81 more closed_\n" + }, + "milestone_ref": { + "repo": "ChronoAIProject/Ornn", + "milestone": "M4 — Go Live Prep" + }, + "closure": "mature", + "formal": "audited", + "product": "ornn", + "milestone": "M4", + "owner": "chronoai-shining", + "issue_count": 6, + "focus": false, + "archived": false, + "promoted_at": { + "bridged": "2026-05-13", + "mature": "2026-05-14" + }, + "deps": [ + "Ornn-M1-Skill-Lifecycle-Core", + "Ornn-M3-Trust-Quality" + ], + "gh_query": "is:issue is:open repo:ChronoAIProject/Ornn milestone:\"M4 — Go Live Prep\"" + }, + "Ornn-M5-QA-Pre-Launch": { + "label": { + "en": "M5 — QA Pre-Launch Gate", + "zh": "M5 — QA 上线准出" + }, + "desc": { + "en": "Manual functional QA against ornn.chrono-ai.fun before public launch. Twelve module-level test trackers (login+permissions, skill creation+GitHub import, format validation, playground+sandbox, security checks, registry+detail, owner skill mgmt, admin dashboard+quota+codes, CLI+agent+NyxID proxy, notifications, admin skill mgmt+config, static pages). Explicit go-live exit criteria. Discovered bugs become standalone issues filed against the feature milestone they affect. **Outcome**: green checklist confirming every user-facing flow works end-to-end.\n\n\n**GitHub issues** — [M5 — QA Pre-Launch Gate](https://github.com/ChronoAIProject/Ornn/milestone/19) · 13 open / 0 closed\n\n_Open:_\n- [#546](https://github.com/ChronoAIProject/Ornn/issues/546) [QA] 安全、权限与敏感信息处理测试\n- [#545](https://github.com/ChronoAIProject/Ornn/issues/545) [QA] CLI、Agent 与 NyxID proxy 功能测试\n- [#544](https://github.com/ChronoAIProject/Ornn/issues/544) [QA] 管理员 skill 管理、公告与平台配置功能测试\n- [#543](https://github.com/ChronoAIProject/Ornn/issues/543) [QA] 管理员 Dashboard、用户、配额与兑换码功能测试\n- [#542](https://github.com/ChronoAIProject/Ornn/issues/542) [QA] 用户侧 skill 管理、版本、权限、审计与 GitHub 同步功能测试\n- [#541](https://github.com/ChronoAIProject/Ornn/issues/541) [QA] 通知中心功能测试\n- [#540](https://github.com/ChronoAIProject/Ornn/issues/540) [QA] Playground 与 sandbox 功能测试\n- [#539](https://github.com/ChronoAIProject/Ornn/issues/539) [QA] Skill 包类型与格式校验功能测试\n- [#538](https://github.com/ChronoAIProject/Ornn/issues/538) [QA] Skill 创建与 GitHub 导入功能测试\n- [#537](https://github.com/ChronoAIProject/Ornn/issues/537) [QA] Skill Registry 与详情页功能测试\n- [#536](https://github.com/ChronoAIProject/Ornn/issues/536) [QA] 静态页面与公开导航功能测试\n- [#535](https://github.com/ChronoAIProject/Ornn/issues/535) [QA] 登录与权限控制功能测试\n- [#534](https://github.com/ChronoAIProject/Ornn/issues/534) [QA] Ornn 功能测试进度跟踪\n\n", + "zh": "上线前对 ornn.chrono-ai.fun 跑功能 QA。12 个模块测试 (登录+权限, skill 创建+GitHub 导入, 格式校验, playground+sandbox, 安全检查, registry+详情, owner 管理, admin Dashboard+配额+兑换码, CLI+agent+NyxID proxy, 通知, admin 配置, 静态页面)。有明确上线准出标准。发现 bug 独立成 issue, 挂到对应 feature milestone 上。**产出**: 所有面向用户的流程都跑通的 green checklist\n\n\n**GitHub issues** — [M5 — QA Pre-Launch Gate](https://github.com/ChronoAIProject/Ornn/milestone/19) · 13 进行中 / 0 已关闭\n\n_进行中:_\n- [#546](https://github.com/ChronoAIProject/Ornn/issues/546) [QA] 安全、权限与敏感信息处理测试\n- [#545](https://github.com/ChronoAIProject/Ornn/issues/545) [QA] CLI、Agent 与 NyxID proxy 功能测试\n- [#544](https://github.com/ChronoAIProject/Ornn/issues/544) [QA] 管理员 skill 管理、公告与平台配置功能测试\n- [#543](https://github.com/ChronoAIProject/Ornn/issues/543) [QA] 管理员 Dashboard、用户、配额与兑换码功能测试\n- [#542](https://github.com/ChronoAIProject/Ornn/issues/542) [QA] 用户侧 skill 管理、版本、权限、审计与 GitHub 同步功能测试\n- [#541](https://github.com/ChronoAIProject/Ornn/issues/541) [QA] 通知中心功能测试\n- [#540](https://github.com/ChronoAIProject/Ornn/issues/540) [QA] Playground 与 sandbox 功能测试\n- [#539](https://github.com/ChronoAIProject/Ornn/issues/539) [QA] Skill 包类型与格式校验功能测试\n- [#538](https://github.com/ChronoAIProject/Ornn/issues/538) [QA] Skill 创建与 GitHub 导入功能测试\n- [#537](https://github.com/ChronoAIProject/Ornn/issues/537) [QA] Skill Registry 与详情页功能测试\n- [#536](https://github.com/ChronoAIProject/Ornn/issues/536) [QA] 静态页面与公开导航功能测试\n- [#535](https://github.com/ChronoAIProject/Ornn/issues/535) [QA] 登录与权限控制功能测试\n- [#534](https://github.com/ChronoAIProject/Ornn/issues/534) [QA] Ornn 功能测试进度跟踪\n\n" + }, + "milestone_ref": { + "repo": "ChronoAIProject/Ornn", + "milestone": "M5 — QA Pre-Launch Gate" + }, + "closure": "obligation", + "formal": "sop", + "product": "ornn", + "milestone": "M5", + "owner": "chronoai-shining", + "issue_count": 13, + "focus": true, + "archived": false, + "promoted_at": { + "obligation": "2026-05-14" + }, + "deps": [ + "Ornn-M4-Go-Live-Prep" + ], + "gh_query": "is:issue is:open repo:ChronoAIProject/Ornn milestone:\"M5 — QA Pre-Launch Gate\"" + }, + "Ornn-M6-Code-Review-Hardening": { + "label": { + "en": "M6 — Code Review Hardening", + "zh": "M6 — 代码审计收尾" + }, + "desc": { + "en": "Resolve all findings from the 2026-05-13 automated code-review pass across five axes: Security (auth/secrets/SSRF/sandbox), Vulnerability (dep audit, ZIP slip, regex DoS, Zod-less LLM parsing), Coding Standards (TS strictness, god-file decomposition, test coverage), Industry Standards (RFC 7807, cursor pagination, integrity hash, dist-tags, Idempotency-Key), OSS Readiness (docker-compose, examples/, SDK npm+PyPI publish, public demo). **Outcome**: 36 findings closed; project clears the \"is this safe to point HN at?\" bar.\n\n\n**GitHub issues** — [M6 — Code Review Hardening](https://github.com/ChronoAIProject/Ornn/milestone/20) · 38 open / 0 closed\n\n_Open:_\n- [#567](https://github.com/ChronoAIProject/Ornn/issues/567) Enforce skill visibility checks on JSON package endpoint\n- [#563](https://github.com/ChronoAIProject/Ornn/issues/563) [Bug] [Permissions] Non-owner account can access and run another account's private skill through Playground URL\n- [#474](https://github.com/ChronoAIProject/Ornn/issues/474) [Docs] API stability commitment + breaking-change & deprecation policy\n- [#473](https://github.com/ChronoAIProject/Ornn/issues/473) [Bug] SDK publish status — TS SDK has private:true, clarify npm/PyPI publication strategy\n- [#472](https://github.com/ChronoAIProject/Ornn/issues/472) [Docs] Positioning / comparison table vs MCP servers + Smithery + npm in README\n- [#471](https://github.com/ChronoAIProject/Ornn/issues/471) [CI/CD] Codecov integration + coverage badge + stated coverage target\n- [#470](https://github.com/ChronoAIProject/Ornn/issues/470) [Docs] SDK quickstart (5-line copy-paste) in main README\n- [#469](https://github.com/ChronoAIProject/Ornn/issues/469) [Docs] examples/ directory with 2-3 minimal starter skills (TS + Python)\n- [#468](https://github.com/ChronoAIProject/Ornn/issues/468) [Misc] Add npm/PyPI keywords + GitHub repo topics for discoverability\n- [#467](https://github.com/ChronoAIProject/Ornn/issues/467) [Feature] Public hosted demo / playground for try-before-install\n- [#466](https://github.com/ChronoAIProject/Ornn/issues/466) [Feature] docker-compose.yml for one-command local dev — replace K8s-only onboarding\n- [#465](https://github.com/ChronoAIProject/Ornn/issues/465) [Feature] SDK ergonomics — auto-pagination iterator + exponential-backoff retry wrapper\n- [#464](https://github.com/ChronoAIProject/Ornn/issues/464) [Feature] Publish versioned JSON Schema for SKILL.md frontmatter\n- [#463](https://github.com/ChronoAIProject/Ornn/issues/463) [Feature] Dist-tags (latest / stable / next) for skill version resolution\n- [#462](https://github.com/ChronoAIProject/Ornn/issues/462) [CI/CD] OpenAPI contract tests — assert every route appears in spec with declared errors\n- [#461](https://github.com/ChronoAIProject/Ornn/issues/461) [Feature] Surface integrity hash (sha256-base64) on skill version manifest like npm\n- [#460](https://github.com/ChronoAIProject/Ornn/issues/460) [Feature] RFC 9239 rate-limit response headers (RateLimit-Limit/Remaining/Retry-After)\n- [#459](https://github.com/ChronoAIProject/Ornn/issues/459) [Feature] Idempotency-Key middleware (24h cache) per CONVENTIONS.md §3.4\n- [#458](https://github.com/ChronoAIProject/Ornn/issues/458) [Bug] POST create endpoints return 200 OK without Location header (should be 201 Created)\n- [#457](https://github.com/ChronoAIProject/Ornn/issues/457) [Feature] Cursor-based pagination for list endpoints (drop offset page/pageSize/total)\n- [#456](https://github.com/ChronoAIProject/Ornn/issues/456) [Bug] Error responses violate RFC 7807 — implementation uses { data, error } envelope instead of problem+json\n- [#454](https://github.com/ChronoAIProject/Ornn/issues/454) [Feature] Backfill unit tests for 7 untested domain services + 8 repositories\n- [#453](https://github.com/ChronoAIProject/Ornn/issues/453) [Misc] Decompose god-files: SkillDetailPage (1133L), DocsPage (857L), PlaygroundPage (802L)\n- [#452](https://github.com/ChronoAIProject/Ornn/issues/452) [Misc] Replace hardcoded hex colors in landing pages with design tokens\n- [#451](https://github.com/ChronoAIProject/Ornn/issues/451) [Bug] Array index as React key in skeleton/grid components — list reorder bugs\n- [#450](https://github.com/ChronoAIProject/Ornn/issues/450) [Misc] Enable stricter TS flags: noUncheckedIndexedAccess, noImplicitOverride, exactOptionalPropertyTypes\n- [#449](https://github.com/ChronoAIProject/Ornn/issues/449) [Misc] Type playground chat events with Zod discriminated union (drop \"as any\")\n- [#448](https://github.com/ChronoAIProject/Ornn/issues/448) [Misc] Eliminate \"as any\" on MongoDB _id — introduce toObjectId(guid) helper\n- [#447](https://github.com/ChronoAIProject/Ornn/issues/447) [Misc] Migration scripts — replace Number(env) with validated parseInt + fail-fast\n- [#446](https://github.com/ChronoAIProject/Ornn/issues/446) [Misc] Admin search MongoDB regex — add maxTimeMS + ensure name/description indexes\n- [#445](https://github.com/ChronoAIProject/Ornn/issues/445) [CI/CD] Lock + audit Python SDK dependencies (lockfile + pip-audit in CI)\n- [#444](https://github.com/ChronoAIProject/Ornn/issues/444) [Bug] LLM re-ranker output parsed without Zod schema (cast as Array)\n- [#443](https://github.com/ChronoAIProject/Ornn/issues/443) [Misc] ZIP validator — add total-uncompressed-size cap + explicit zip-slip check\n- [#442](https://github.com/ChronoAIProject/Ornn/issues/442) [Bug] AgentSeal subprocess: validate python/script paths at boot + unref child after kill\n- [#441](https://github.com/ChronoAIProject/Ornn/issues/441) [Misc] Validate GitHub App private key shape on mirror config write\n- [#440](https://github.com/ChronoAIProject/Ornn/issues/440) [Misc] Tighten Mermaid SVG rendering — replace dangerouslySetInnerHTML with iframe sandbox\n- [#439](https://github.com/ChronoAIProject/Ornn/issues/439) [Feature] Rate limiting on /skill-search (semantic mode) + auth/upload endpoints\n- [#438](https://github.com/ChronoAIProject/Ornn/issues/438) [Bug] Some routes bypass validateBody middleware — raw c.req.json() reads break RFC 7807 errors\n\n", + "zh": "解决 2026-05-13 一轮自动代码审计的所有 finding, 5 个维度: Security (auth/secrets/SSRF/sandbox), Vulnerability (依赖审计 / ZIP slip / regex DoS / Zod 缺失), Coding Standards (TS 严格 / god-file 拆分 / 测试覆盖), Industry Standards (RFC 7807 / cursor 分页 / integrity hash / dist-tags / Idempotency-Key), OSS Readiness (docker-compose / examples / SDK 上 npm+PyPI / 公开 demo)。**产出**: 36 个 finding 全部关闭, 项目过得了 \"敢拿去 HN show\" 这关\n\n\n**GitHub issues** — [M6 — Code Review Hardening](https://github.com/ChronoAIProject/Ornn/milestone/20) · 38 进行中 / 0 已关闭\n\n_进行中:_\n- [#567](https://github.com/ChronoAIProject/Ornn/issues/567) Enforce skill visibility checks on JSON package endpoint\n- [#563](https://github.com/ChronoAIProject/Ornn/issues/563) [Bug] [Permissions] Non-owner account can access and run another account's private skill through Playground URL\n- [#474](https://github.com/ChronoAIProject/Ornn/issues/474) [Docs] API stability commitment + breaking-change & deprecation policy\n- [#473](https://github.com/ChronoAIProject/Ornn/issues/473) [Bug] SDK publish status — TS SDK has private:true, clarify npm/PyPI publication strategy\n- [#472](https://github.com/ChronoAIProject/Ornn/issues/472) [Docs] Positioning / comparison table vs MCP servers + Smithery + npm in README\n- [#471](https://github.com/ChronoAIProject/Ornn/issues/471) [CI/CD] Codecov integration + coverage badge + stated coverage target\n- [#470](https://github.com/ChronoAIProject/Ornn/issues/470) [Docs] SDK quickstart (5-line copy-paste) in main README\n- [#469](https://github.com/ChronoAIProject/Ornn/issues/469) [Docs] examples/ directory with 2-3 minimal starter skills (TS + Python)\n- [#468](https://github.com/ChronoAIProject/Ornn/issues/468) [Misc] Add npm/PyPI keywords + GitHub repo topics for discoverability\n- [#467](https://github.com/ChronoAIProject/Ornn/issues/467) [Feature] Public hosted demo / playground for try-before-install\n- [#466](https://github.com/ChronoAIProject/Ornn/issues/466) [Feature] docker-compose.yml for one-command local dev — replace K8s-only onboarding\n- [#465](https://github.com/ChronoAIProject/Ornn/issues/465) [Feature] SDK ergonomics — auto-pagination iterator + exponential-backoff retry wrapper\n- [#464](https://github.com/ChronoAIProject/Ornn/issues/464) [Feature] Publish versioned JSON Schema for SKILL.md frontmatter\n- [#463](https://github.com/ChronoAIProject/Ornn/issues/463) [Feature] Dist-tags (latest / stable / next) for skill version resolution\n- [#462](https://github.com/ChronoAIProject/Ornn/issues/462) [CI/CD] OpenAPI contract tests — assert every route appears in spec with declared errors\n- [#461](https://github.com/ChronoAIProject/Ornn/issues/461) [Feature] Surface integrity hash (sha256-base64) on skill version manifest like npm\n- [#460](https://github.com/ChronoAIProject/Ornn/issues/460) [Feature] RFC 9239 rate-limit response headers (RateLimit-Limit/Remaining/Retry-After)\n- [#459](https://github.com/ChronoAIProject/Ornn/issues/459) [Feature] Idempotency-Key middleware (24h cache) per CONVENTIONS.md §3.4\n- [#458](https://github.com/ChronoAIProject/Ornn/issues/458) [Bug] POST create endpoints return 200 OK without Location header (should be 201 Created)\n- [#457](https://github.com/ChronoAIProject/Ornn/issues/457) [Feature] Cursor-based pagination for list endpoints (drop offset page/pageSize/total)\n- [#456](https://github.com/ChronoAIProject/Ornn/issues/456) [Bug] Error responses violate RFC 7807 — implementation uses { data, error } envelope instead of problem+json\n- [#454](https://github.com/ChronoAIProject/Ornn/issues/454) [Feature] Backfill unit tests for 7 untested domain services + 8 repositories\n- [#453](https://github.com/ChronoAIProject/Ornn/issues/453) [Misc] Decompose god-files: SkillDetailPage (1133L), DocsPage (857L), PlaygroundPage (802L)\n- [#452](https://github.com/ChronoAIProject/Ornn/issues/452) [Misc] Replace hardcoded hex colors in landing pages with design tokens\n- [#451](https://github.com/ChronoAIProject/Ornn/issues/451) [Bug] Array index as React key in skeleton/grid components — list reorder bugs\n- [#450](https://github.com/ChronoAIProject/Ornn/issues/450) [Misc] Enable stricter TS flags: noUncheckedIndexedAccess, noImplicitOverride, exactOptionalPropertyTypes\n- [#449](https://github.com/ChronoAIProject/Ornn/issues/449) [Misc] Type playground chat events with Zod discriminated union (drop \"as any\")\n- [#448](https://github.com/ChronoAIProject/Ornn/issues/448) [Misc] Eliminate \"as any\" on MongoDB _id — introduce toObjectId(guid) helper\n- [#447](https://github.com/ChronoAIProject/Ornn/issues/447) [Misc] Migration scripts — replace Number(env) with validated parseInt + fail-fast\n- [#446](https://github.com/ChronoAIProject/Ornn/issues/446) [Misc] Admin search MongoDB regex — add maxTimeMS + ensure name/description indexes\n- [#445](https://github.com/ChronoAIProject/Ornn/issues/445) [CI/CD] Lock + audit Python SDK dependencies (lockfile + pip-audit in CI)\n- [#444](https://github.com/ChronoAIProject/Ornn/issues/444) [Bug] LLM re-ranker output parsed without Zod schema (cast as Array)\n- [#443](https://github.com/ChronoAIProject/Ornn/issues/443) [Misc] ZIP validator — add total-uncompressed-size cap + explicit zip-slip check\n- [#442](https://github.com/ChronoAIProject/Ornn/issues/442) [Bug] AgentSeal subprocess: validate python/script paths at boot + unref child after kill\n- [#441](https://github.com/ChronoAIProject/Ornn/issues/441) [Misc] Validate GitHub App private key shape on mirror config write\n- [#440](https://github.com/ChronoAIProject/Ornn/issues/440) [Misc] Tighten Mermaid SVG rendering — replace dangerouslySetInnerHTML with iframe sandbox\n- [#439](https://github.com/ChronoAIProject/Ornn/issues/439) [Feature] Rate limiting on /skill-search (semantic mode) + auth/upload endpoints\n- [#438](https://github.com/ChronoAIProject/Ornn/issues/438) [Bug] Some routes bypass validateBody middleware — raw c.req.json() reads break RFC 7807 errors\n\n" + }, + "milestone_ref": { + "repo": "ChronoAIProject/Ornn", + "milestone": "M6 — Code Review Hardening" + }, + "closure": "obligation", + "formal": "checked", + "product": "ornn", + "milestone": "M6", + "owner": "chronoai-shining", + "issue_count": 38, + "focus": true, + "archived": false, + "promoted_at": { + "obligation": "2026-05-13" + }, + "deps": [ + "Ornn-M4-Go-Live-Prep" + ], + "gh_query": "is:issue is:open repo:ChronoAIProject/Ornn milestone:\"M6 — Code Review Hardening\"" + }, + "Ornn-M7-Platform-Power": { + "label": { + "en": "M7 — Platform Power", + "zh": "M7 — 平台力" + }, + "desc": { + "en": "Skills compose into workflows. Skill chaining (declarative pipelines), webhook + event system for skill-lifecycle events, templates & starter kits for common patterns. Deferred behind QA + Code Review hardening — comes after the launch gate. **Outcome**: a skill is no longer a leaf; it is a composable building block.\n\n\n**GitHub issues** — [M7 — Platform Power](https://github.com/ChronoAIProject/Ornn/milestone/21) · 3 open / 0 closed\n\n_Open:_\n- [#37](https://github.com/ChronoAIProject/Ornn/issues/37) [Feature] Skill templates & starter kits\n- [#36](https://github.com/ChronoAIProject/Ornn/issues/36) [Feature] Webhook & event system for skill lifecycle\n- [#35](https://github.com/ChronoAIProject/Ornn/issues/35) [Feature] Skill composition & chaining\n\n", + "zh": "Skill 能组合成 workflow。Skill chaining (声明式 pipeline) / webhook + event 系统 (skill 生命周期事件) / 模板 & starter kit。排在 QA + Code Review 收尾之后, 在 launch gate 之后才启动。**产出**: skill 不再是叶子节点, 是可组合的积木\n\n\n**GitHub issues** — [M7 — Platform Power](https://github.com/ChronoAIProject/Ornn/milestone/21) · 3 进行中 / 0 已关闭\n\n_进行中:_\n- [#37](https://github.com/ChronoAIProject/Ornn/issues/37) [Feature] Skill templates & starter kits\n- [#36](https://github.com/ChronoAIProject/Ornn/issues/36) [Feature] Webhook & event system for skill lifecycle\n- [#35](https://github.com/ChronoAIProject/Ornn/issues/35) [Feature] Skill composition & chaining\n\n" + }, + "milestone_ref": { + "repo": "ChronoAIProject/Ornn", + "milestone": "M7 — Platform Power" + }, + "closure": "seed", + "formal": "none", + "product": "ornn", + "milestone": "M7", + "owner": "chronoai-shining", + "issue_count": 3, + "focus": false, + "archived": false, + "promoted_at": { + "seed": "2026-04-14" + }, + "deps": [ + "Ornn-M5-QA-Pre-Launch", + "Ornn-M6-Code-Review-Hardening" + ], + "gh_query": "is:issue is:open repo:ChronoAIProject/Ornn milestone:\"M7 — Platform Power\"" + }, + "Ornn-M8-Community-Engagement": { + "label": { + "en": "M8 — Community Engagement", + "zh": "M8 — 社区互动" + }, + "desc": { + "en": "Social engagement layer on the skill registry: in-product skill ratings, text reviews, likes/upvotes, per-skill discussion threads, author reputation/profile, activity feed. Replaces the abandoned marketplace direction (#38 billing / #39 curated archived here as historical). Activates after launch when there are real external users. **Outcome**: skill discovery driven by community signal, not just admin curation.\n\n\n**GitHub issues** — [M8 — Community Engagement](https://github.com/ChronoAIProject/Ornn/milestone/22) · 0 open / 2 closed\n\n_Closed (most recent first):_\n- [#39](https://github.com/ChronoAIProject/Ornn/issues/39) ~~[Feature] Featured & curated skill collections~~\n- [#38](https://github.com/ChronoAIProject/Ornn/issues/38) ~~[Feature] Usage-based billing & author revenue share~~\n", + "zh": "Skill registry 上的社区互动层: 站内 skill 评分 / 文字评价 / 点赞 / per-skill 讨论 / 作者 reputation / 活动 feed。替代已放弃的 marketplace 方向 (#38 billing / #39 curated 作为历史归档在此)。launch 之后有真实外部用户才能跑起来。**产出**: skill 发现由社区信号驱动, 不只靠 admin curation\n\n\n**GitHub issues** — [M8 — Community Engagement](https://github.com/ChronoAIProject/Ornn/milestone/22) · 0 进行中 / 2 已关闭\n\n_已关闭 (most recent first):_\n- [#39](https://github.com/ChronoAIProject/Ornn/issues/39) ~~[Feature] Featured & curated skill collections~~\n- [#38](https://github.com/ChronoAIProject/Ornn/issues/38) ~~[Feature] Usage-based billing & author revenue share~~\n" + }, + "milestone_ref": { + "repo": "ChronoAIProject/Ornn", + "milestone": "M8 — Community Engagement" + }, + "closure": "seed", + "formal": "none", + "product": "ornn", + "milestone": "M8", + "owner": "chronoai-shining", + "issue_count": 0, + "focus": false, + "archived": false, + "promoted_at": { + "seed": "2026-05-18" + }, + "deps": [ + "Ornn-Marketing-L1-Launch" + ], + "gh_query": "is:issue is:open repo:ChronoAIProject/Ornn milestone:\"M8 — Community Engagement\"" + }, + "Ornn-Marketing-L0-Prelaunch-Warmup": { + "label": { + "en": "L0 — Pre-flight & Warmup", + "zh": "L0 — 上线前准备 & 账号 warmup" + }, + "desc": { + "en": "Pre-launch preparation (T-14 → T-7). Account audits across HN/PH/Reddit/X/Discord/即刻/V2EX, channel-specific warmup to clear age+karma+history filters, PH Hunter contact, GitHub stars ≥50 push (Awesome Lists prereq), Awesome List forks + PR drafts. Account warmup is the only non-compressible calendar item — D-Day cannot ship until all checks here are ✅. **Outcome**: every channel's preconditions in marketing.md are met before D-Day.\n\n\n**GitHub issues** — [L0 — Pre-flight & Warmup](https://github.com/ChronoAIProject/Ornn-Marketing/milestone/1) · 9 open / 0 closed\n\n_Open:_\n- [#20](https://github.com/ChronoAIProject/Ornn-Marketing/issues/20) [Prep] Fork 3 Awesome Lists + draft PR diffs\n- [#19](https://github.com/ChronoAIProject/Ornn-Marketing/issues/19) [Prep] Push Ornn GitHub stars to ≥ 50 (Awesome Lists prereq)\n- [#18](https://github.com/ChronoAIProject/Ornn-Marketing/issues/18) [Warmup] V2EX + 即刻 — daily presence\n- [#17](https://github.com/ChronoAIProject/Ornn-Marketing/issues/17) [Warmup] Reddit ×3 subs — 5 comments each / 7 days\n- [#16](https://github.com/ChronoAIProject/Ornn-Marketing/issues/16) [Warmup] HN — 10 substantive comments / 7 days\n- [#15](https://github.com/ChronoAIProject/Ornn-Marketing/issues/15) [Audit] X / Discord / 即刻 / V2EX accounts\n- [#14](https://github.com/ChronoAIProject/Ornn-Marketing/issues/14) [Audit] Reddit account + 3 sub histories\n- [#13](https://github.com/ChronoAIProject/Ornn-Marketing/issues/13) [Audit] Product Hunt maker + contact Hunter\n- [#12](https://github.com/ChronoAIProject/Ornn-Marketing/issues/12) [Audit] HN account readiness\n\n", + "zh": "Launch 前准备 (T-14 → T-7)。HN/PH/Reddit/X/Discord/即刻/V2EX 账号审计 / 每个渠道独立 warmup 过年龄+karma+历史过滤 / PH Hunter 联系 / GitHub stars 推到 ≥50 (Awesome Lists 前置) / Awesome List fork + PR draft。账号 warmup 是唯一不可压缩的日历时间, 所有 ✅ 之前 D-Day 发不了。**产出**: marketing.md 里每个渠道的前置条件都满足\n\n\n**GitHub issues** — [L0 — Pre-flight & Warmup](https://github.com/ChronoAIProject/Ornn-Marketing/milestone/1) · 9 进行中 / 0 已关闭\n\n_进行中:_\n- [#20](https://github.com/ChronoAIProject/Ornn-Marketing/issues/20) [Prep] Fork 3 Awesome Lists + draft PR diffs\n- [#19](https://github.com/ChronoAIProject/Ornn-Marketing/issues/19) [Prep] Push Ornn GitHub stars to ≥ 50 (Awesome Lists prereq)\n- [#18](https://github.com/ChronoAIProject/Ornn-Marketing/issues/18) [Warmup] V2EX + 即刻 — daily presence\n- [#17](https://github.com/ChronoAIProject/Ornn-Marketing/issues/17) [Warmup] Reddit ×3 subs — 5 comments each / 7 days\n- [#16](https://github.com/ChronoAIProject/Ornn-Marketing/issues/16) [Warmup] HN — 10 substantive comments / 7 days\n- [#15](https://github.com/ChronoAIProject/Ornn-Marketing/issues/15) [Audit] X / Discord / 即刻 / V2EX accounts\n- [#14](https://github.com/ChronoAIProject/Ornn-Marketing/issues/14) [Audit] Reddit account + 3 sub histories\n- [#13](https://github.com/ChronoAIProject/Ornn-Marketing/issues/13) [Audit] Product Hunt maker + contact Hunter\n- [#12](https://github.com/ChronoAIProject/Ornn-Marketing/issues/12) [Audit] HN account readiness\n\n" + }, + "milestone_ref": { + "repo": "ChronoAIProject/Ornn-Marketing", + "milestone": "L0 — Pre-flight & Warmup" + }, + "closure": "obligation", + "formal": "sop", + "product": "ornn", + "milestone": "L0", + "owner": "chronoai-shining", + "issue_count": 9, + "focus": true, + "archived": false, + "promoted_at": { + "obligation": "2026-05-18" + }, + "deps": [ + "Ornn-M4-Go-Live-Prep" + ] + }, + "Ornn-Marketing-L1-Launch": { + "label": { + "en": "L1 — D-Day Launch", + "zh": "L1 — D-Day 发布" + }, + "desc": { + "en": "Single coordinated launch day across 10 channels per marketing.md §1–§10. Each channel has a hard time window (HN Tue/Wed/Thu 09:00 ET, PH 00:01 PT). All copy is channel-specific (HN engineer-tone, PH gift-hook, Reddit problem-first, V2EX 求拍砖, 即刻 茶水间, Discord community). Same-day Awesome List PRs go in. **Outcome**: 10 launch posts live, first 90-min monitoring done on every primary channel.\n\n\n**GitHub issues** — [L1 — D-Day Launch](https://github.com/ChronoAIProject/Ornn-Marketing/milestone/2) · 10 open / 0 closed\n\n_Open:_\n- [#30](https://github.com/ChronoAIProject/Ornn-Marketing/issues/30) [Launch] Submit 3 Awesome List PRs\n- [#29](https://github.com/ChronoAIProject/Ornn-Marketing/issues/29) [Launch] X thread + Discord + 即刻 + V2EX\n- [#28](https://github.com/ChronoAIProject/Ornn-Marketing/issues/28) [Launch] Reddit ×3 subs — sequential posting (NOT cross-post)\n- [#27](https://github.com/ChronoAIProject/Ornn-Marketing/issues/27) [Launch] Product Hunt — 00:01 PT Hunter post + 24h maker response\n- [#26](https://github.com/ChronoAIProject/Ornn-Marketing/issues/26) [Launch] HN Show HN — submit + 90-min monitor\n- [#25](https://github.com/ChronoAIProject/Ornn-Marketing/issues/25) [Copy] Discord / 即刻 / V2EX posts\n- [#24](https://github.com/ChronoAIProject/Ornn-Marketing/issues/24) [Copy] X launch thread — 10 tweets + 3 quote-tweet plans\n- [#23](https://github.com/ChronoAIProject/Ornn-Marketing/issues/23) [Copy] Reddit ×3 subs — channel-specific drafts\n- [#22](https://github.com/ChronoAIProject/Ornn-Marketing/issues/22) [Copy] Product Hunt — tagline + description + 4 images\n- [#21](https://github.com/ChronoAIProject/Ornn-Marketing/issues/21) [Copy] HN Show HN — title + first-comment story\n\n", + "zh": "marketing.md §1–§10 描述的单日 10 渠道协同发布。每个渠道有硬时间窗口 (HN 周二/三/四 09:00 ET, PH 00:01 PT)。文案逐渠道差异化 (HN 工程师腔, PH 福利钩子, Reddit 痛点先行, V2EX 求拍砖, 即刻 茶水间, Discord 社区)。同日提交 Awesome List PR。**产出**: 10 个 launch 帖全上线, 主要渠道前 90 分钟在线 monitor 完成\n\n\n**GitHub issues** — [L1 — D-Day Launch](https://github.com/ChronoAIProject/Ornn-Marketing/milestone/2) · 10 进行中 / 0 已关闭\n\n_进行中:_\n- [#30](https://github.com/ChronoAIProject/Ornn-Marketing/issues/30) [Launch] Submit 3 Awesome List PRs\n- [#29](https://github.com/ChronoAIProject/Ornn-Marketing/issues/29) [Launch] X thread + Discord + 即刻 + V2EX\n- [#28](https://github.com/ChronoAIProject/Ornn-Marketing/issues/28) [Launch] Reddit ×3 subs — sequential posting (NOT cross-post)\n- [#27](https://github.com/ChronoAIProject/Ornn-Marketing/issues/27) [Launch] Product Hunt — 00:01 PT Hunter post + 24h maker response\n- [#26](https://github.com/ChronoAIProject/Ornn-Marketing/issues/26) [Launch] HN Show HN — submit + 90-min monitor\n- [#25](https://github.com/ChronoAIProject/Ornn-Marketing/issues/25) [Copy] Discord / 即刻 / V2EX posts\n- [#24](https://github.com/ChronoAIProject/Ornn-Marketing/issues/24) [Copy] X launch thread — 10 tweets + 3 quote-tweet plans\n- [#23](https://github.com/ChronoAIProject/Ornn-Marketing/issues/23) [Copy] Reddit ×3 subs — channel-specific drafts\n- [#22](https://github.com/ChronoAIProject/Ornn-Marketing/issues/22) [Copy] Product Hunt — tagline + description + 4 images\n- [#21](https://github.com/ChronoAIProject/Ornn-Marketing/issues/21) [Copy] HN Show HN — title + first-comment story\n\n" + }, + "milestone_ref": { + "repo": "ChronoAIProject/Ornn-Marketing", + "milestone": "L1 — D-Day Launch" + }, + "closure": "seed", + "formal": "sop", + "product": "ornn", + "milestone": "L1", + "owner": "chronoai-shining", + "issue_count": 10, + "focus": true, + "archived": false, + "promoted_at": { + "seed": "2026-05-18" + }, + "deps": [ + "Ornn-Marketing-L0-Prelaunch-Warmup", + "Ornn-M5-QA-Pre-Launch", + "Ornn-M6-Code-Review-Hardening" + ] + }, + "Ornn-Marketing-L2-Postlaunch": { + "label": { + "en": "L2 — Post-Launch Followup", + "zh": "L2 — 上线后跟进" + }, + "desc": { + "en": "Long-tail engagement D+1 → D+30. HN T+24h boomerang comment, Reddit weekly self-promotion threads, X 3 quote-tweets at milestones (24h / 7d / 30d), DM PH upvoters thank-you, D+7 retro, D+30 outcome post. **Outcome**: launch momentum extended into sustained discovery; learnings captured for the next push.\n\n\n**GitHub issues** — [L2 — Post-Launch Followup](https://github.com/ChronoAIProject/Ornn-Marketing/milestone/3) · 6 open / 0 closed\n\n_Open:_\n- [#36](https://github.com/ChronoAIProject/Ornn-Marketing/issues/36) [Followup] D+30 outcome + learnings post\n- [#35](https://github.com/ChronoAIProject/Ornn-Marketing/issues/35) [Followup] D+7 retro post\n- [#34](https://github.com/ChronoAIProject/Ornn-Marketing/issues/34) [Followup] DM PH upvoters thank-you (T+0 → T+24h)\n- [#33](https://github.com/ChronoAIProject/Ornn-Marketing/issues/33) [Followup] X 3 milestone quote-tweets (T+24h / T+7d / T+30d)\n- [#32](https://github.com/ChronoAIProject/Ornn-Marketing/issues/32) [Followup] Reddit weekly self-promotion thread participation\n- [#31](https://github.com/ChronoAIProject/Ornn-Marketing/issues/31) [Followup] HN T+24h boomerang comment\n\n", + "zh": "D+1 → D+30 的长尾运营。HN T+24h boomerang 评论 / Reddit 每周自推 thread / X 3 个里程碑 quote-tweet (24h / 7d / 30d) / DM PH upvoter thank-you / D+7 retro / D+30 outcome post。**产出**: launch 势能延伸为持续 discovery, 学到的东西沉淀为公开 artifact 给下一波\n\n\n**GitHub issues** — [L2 — Post-Launch Followup](https://github.com/ChronoAIProject/Ornn-Marketing/milestone/3) · 6 进行中 / 0 已关闭\n\n_进行中:_\n- [#36](https://github.com/ChronoAIProject/Ornn-Marketing/issues/36) [Followup] D+30 outcome + learnings post\n- [#35](https://github.com/ChronoAIProject/Ornn-Marketing/issues/35) [Followup] D+7 retro post\n- [#34](https://github.com/ChronoAIProject/Ornn-Marketing/issues/34) [Followup] DM PH upvoters thank-you (T+0 → T+24h)\n- [#33](https://github.com/ChronoAIProject/Ornn-Marketing/issues/33) [Followup] X 3 milestone quote-tweets (T+24h / T+7d / T+30d)\n- [#32](https://github.com/ChronoAIProject/Ornn-Marketing/issues/32) [Followup] Reddit weekly self-promotion thread participation\n- [#31](https://github.com/ChronoAIProject/Ornn-Marketing/issues/31) [Followup] HN T+24h boomerang comment\n\n" + }, + "milestone_ref": { + "repo": "ChronoAIProject/Ornn-Marketing", + "milestone": "L2 — Post-Launch Followup" + }, + "closure": "seed", + "formal": "sop", + "product": "ornn", + "milestone": "L2", + "owner": "chronoai-shining", + "issue_count": 6, + "focus": false, + "archived": false, + "promoted_at": { + "seed": "2026-05-18" + }, + "deps": [ + "Ornn-Marketing-L1-Launch" + ] } } } diff --git a/tools/sync_milestone_issues.py b/tools/sync_milestone_issues.py new file mode 100755 index 0000000..a788b17 --- /dev/null +++ b/tools/sync_milestone_issues.py @@ -0,0 +1,191 @@ +#!/usr/bin/env python3 +"""Sync GitHub milestone issues into the matching region's description. + +For every region with a `milestone_ref` field, fetch all issues in that +milestone (open + closed) and replace the content between the +`` and `` markers +in both `desc.en` and `desc.zh`. + +milestone_ref schema: + "milestone_ref": { + "repo": "ChronoAIProject/Ornn", + "milestone": "M0 — Engineering Foundation & Infra" + } + +Usage: + python3 tools/sync_milestone_issues.py # update regions.json in place + python3 tools/sync_milestone_issues.py --check # exit 1 if any region would change (CI) + python3 tools/sync_milestone_issues.py --region # sync just one region + +Requires `gh` CLI authenticated with access to all referenced repos +(including private ones — needs a PAT/GH App in CI for cross-repo or private repo access). +""" +from __future__ import annotations + +import argparse +import json +import re +import subprocess +import sys +from pathlib import Path + +REPO_ROOT = Path(__file__).parent.parent +REGIONS_FILE = REPO_ROOT / "regions.json" + +AUTO_START = "" +AUTO_END = "" +AUTO_BLOCK_RE = re.compile( + re.escape(AUTO_START) + r".*?" + re.escape(AUTO_END), + re.DOTALL, +) + + +def fetch_milestone_issues(repo: str, milestone_title: str) -> tuple[list, int | None]: + """Return (issues, milestone_number). Issues sorted: open first, then closed, both by number desc.""" + ms_raw = subprocess.check_output( + ["gh", "api", f"repos/{repo}/milestones?state=all", "--paginate", + "-q", ".[] | {number, title, state, description, html_url}"], + text=True, + ) + milestones = [json.loads(line) for line in ms_raw.strip().split("\n") if line.strip()] + matched = next((m for m in milestones if m["title"] == milestone_title), None) + if not matched: + print(f" WARN: milestone '{milestone_title}' not found in {repo}", file=sys.stderr) + return [], None + + ms_num = matched["number"] + issues_raw = subprocess.check_output( + ["gh", "issue", "list", "--repo", repo, + "--milestone", milestone_title, "--state", "all", "--limit", "500", + "--json", "number,title,state,url"], + text=True, + ) + issues = json.loads(issues_raw) + issues.sort(key=lambda i: (i["state"] != "OPEN", -i["number"])) + return issues, ms_num + + +def format_block(repo: str, milestone_title: str, ms_num: int | None, issues: list, lang: str) -> str: + """Render the auto-sync block content (between markers).""" + if ms_num is None: + return "_Milestone not found on GitHub — check `milestone_ref.milestone` value._" + + ms_url = f"https://github.com/{repo}/milestone/{ms_num}" + open_n = sum(1 for i in issues if i["state"] == "OPEN") + closed_n = sum(1 for i in issues if i["state"] == "CLOSED") + + if lang == "zh": + header = ( + f"**GitHub issues** — [{milestone_title}]({ms_url}) · " + f"{open_n} 进行中 / {closed_n} 已关闭" + ) + open_label = "进行中" + closed_label = "已关闭" + else: + header = ( + f"**GitHub issues** — [{milestone_title}]({ms_url}) · " + f"{open_n} open / {closed_n} closed" + ) + open_label = "Open" + closed_label = "Closed" + + lines = [header, ""] + open_issues = [i for i in issues if i["state"] == "OPEN"] + closed_issues = [i for i in issues if i["state"] == "CLOSED"] + + if open_issues: + lines.append(f"_{open_label}:_") + for i in open_issues: + t = i["title"].replace("|", "\\|") + lines.append(f"- [#{i['number']}]({i['url']}) {t}") + lines.append("") + + if closed_issues: + lines.append(f"_{closed_label} (most recent first):_") + # Cap closed at 25 to keep desc manageable; surface a "+N more" indicator + cap = 25 + for i in closed_issues[:cap]: + t = i["title"].replace("|", "\\|") + lines.append(f"- [#{i['number']}]({i['url']}) ~~{t}~~") + if len(closed_issues) > cap: + lines.append(f"- _… and {len(closed_issues) - cap} more closed_") + + return "\n".join(lines) + + +def replace_block(text: str, new_inner: str) -> str: + new_block = f"{AUTO_START}\n{new_inner}\n{AUTO_END}" + if AUTO_BLOCK_RE.search(text): + return AUTO_BLOCK_RE.sub(new_block, text) + # No marker block — append one + return text.rstrip() + "\n\n" + new_block + + +def sync_region(region: dict, key: str) -> bool: + """Update region's desc in place. Return True if changed.""" + ref = region.get("milestone_ref") + if not ref: + return False + repo = ref["repo"] + title = ref["milestone"] + issues, ms_num = fetch_milestone_issues(repo, title) + + changed = False + for lang in ("en", "zh"): + desc = region.get("desc", {}).get(lang, "") + new_inner = format_block(repo, title, ms_num, issues, lang) + new_desc = replace_block(desc, new_inner) + if new_desc != desc: + region.setdefault("desc", {})[lang] = new_desc + changed = True + + # Update issue_count to actual open count + if ms_num is not None: + open_n = sum(1 for i in issues if i["state"] == "OPEN") + if region.get("issue_count") != open_n: + region["issue_count"] = open_n + changed = True + + return changed + + +def main(): + p = argparse.ArgumentParser() + p.add_argument("--check", action="store_true", help="exit 1 if anything would change") + p.add_argument("--region", help="sync only this region key") + args = p.parse_args() + + data = json.loads(REGIONS_FILE.read_text()) + regions = data["regions"] + + targets = [args.region] if args.region else [k for k, r in regions.items() if r.get("milestone_ref")] + if not targets: + print("no regions with milestone_ref found") + return + + print(f"syncing {len(targets)} regions...") + any_changed = False + for key in targets: + if key not in regions: + print(f" SKIP: {key} not in regions.json") + continue + changed = sync_region(regions[key], key) + marker = "✓ changed" if changed else " no-op " + print(f" {marker} {key}") + any_changed = any_changed or changed + + if not any_changed: + print("\nno changes") + return + + if args.check: + print("\nCHECK mode: regions.json is out of date") + sys.exit(1) + + # Write back, preserving Unicode + 2-space indent (matches existing file style) + REGIONS_FILE.write_text(json.dumps(data, indent=2, ensure_ascii=False) + "\n") + print("\nregions.json updated") + + +if __name__ == "__main__": + main() diff --git a/tools/upstream-trigger-sample.yml b/tools/upstream-trigger-sample.yml new file mode 100644 index 0000000..0d5cab0 --- /dev/null +++ b/tools/upstream-trigger-sample.yml @@ -0,0 +1,33 @@ +# Sample workflow file. Drop into the source repos (ChronoAIProject/Ornn, +# ChronoAIProject/Ornn-Marketing) as `.github/workflows/notify-region-map.yml`. +# +# Whenever an issue is opened/edited/closed/labeled/milestoned, this fires a +# repository_dispatch into ChronoAIProject/region-map, which triggers the +# sync-milestone-issues workflow there. Result: region-map updates within +# ~1 minute of any issue change, instead of waiting for the hourly cron. +# +# Requires repo secret REGION_MAP_DISPATCH_PAT — a PAT with `repo` scope on +# ChronoAIProject/region-map. Generate at https://github.com/settings/tokens +# (fine-grained: needs "Contents: write" on region-map; classic: `repo`). + +name: Notify region-map of issue change + +on: + issues: + types: [opened, edited, closed, reopened, milestoned, demilestoned, labeled, unlabeled] + milestone: + types: [created, closed, opened, edited, deleted] + +jobs: + dispatch: + runs-on: ubuntu-latest + steps: + - name: Trigger region-map sync + env: + GH_TOKEN: ${{ secrets.REGION_MAP_DISPATCH_PAT }} + run: | + gh api -X POST repos/ChronoAIProject/region-map/dispatches \ + -f event_type=milestone-issues-sync \ + -f 'client_payload[source_repo]=${{ github.repository }}' \ + -f 'client_payload[event]=${{ github.event_name }}' \ + -f 'client_payload[issue_or_milestone]=${{ github.event.issue.number || github.event.milestone.number }}' From db29462972ab6510f7b1ce03604debe8951bec91 Mon Sep 17 00:00:00 2001 From: Wang Shining Date: Mon, 18 May 2026 15:01:10 +0800 Subject: [PATCH 3/5] =?UTF-8?q?data:=20drop=20event-driven=20sync=20path?= =?UTF-8?q?=20=E2=80=94=20hourly=20cron=20+=20manual=20is=20enough?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Owner doesn't need near-real-time updates; hourly latency is fine. - Remove tools/upstream-trigger-sample.yml (the sample workflow that would have lived in upstream Ornn / Ornn-Marketing repos) - Remove repository_dispatch trigger from sync-milestone-issues.yml (it would have received those upstream events) Sync now runs on: hourly cron (:05) + workflow_dispatch only. Co-Authored-By: Claude Opus 4.7 (1M context) --- .github/workflows/sync-milestone-issues.yml | 17 +++++------ tools/upstream-trigger-sample.yml | 33 --------------------- 2 files changed, 7 insertions(+), 43 deletions(-) delete mode 100644 tools/upstream-trigger-sample.yml diff --git a/.github/workflows/sync-milestone-issues.yml b/.github/workflows/sync-milestone-issues.yml index 4c19af6..9fc2b79 100644 --- a/.github/workflows/sync-milestone-issues.yml +++ b/.github/workflows/sync-milestone-issues.yml @@ -6,23 +6,20 @@ name: Sync milestone issues into region desc # # Triggers: # - Hourly cron — picks up new issues / closures with ≤1h lag -# - workflow_dispatch — manual "sync now" -# - repository_dispatch with type=milestone-issues-sync -# — receive from upstream repos via gh workflow run on issue events -# (set up in Ornn / Ornn-Marketing repos to call this) +# - workflow_dispatch — manual "sync now" from Actions tab # # Cross-repo / private-repo access: -# GITHUB_TOKEN is scoped to THIS repo only. For ChronoAIProject/Ornn-Marketing -# (private) we need a PAT. Store it as repo secret CROSS_REPO_PAT with -# `repo` scope. Fallback to default token if absent (will warn on private -# repos but still work for public ones). +# GITHUB_TOKEN is scoped to THIS repo only. Reading PUBLIC upstream repos +# (ChronoAIProject/Ornn) needs no auth — token works as-is. +# Reading PRIVATE upstream repos (ChronoAIProject/Ornn-Marketing) requires +# a PAT with `repo` scope stored as repo secret CROSS_REPO_PAT. +# If CROSS_REPO_PAT is absent, sync of private-repo regions logs a WARN +# and the rest of the regions still update. on: schedule: - cron: "5 * * * *" # hourly at :05 workflow_dispatch: - repository_dispatch: - types: [milestone-issues-sync] permissions: contents: write # need write so we can commit + push diff --git a/tools/upstream-trigger-sample.yml b/tools/upstream-trigger-sample.yml deleted file mode 100644 index 0d5cab0..0000000 --- a/tools/upstream-trigger-sample.yml +++ /dev/null @@ -1,33 +0,0 @@ -# Sample workflow file. Drop into the source repos (ChronoAIProject/Ornn, -# ChronoAIProject/Ornn-Marketing) as `.github/workflows/notify-region-map.yml`. -# -# Whenever an issue is opened/edited/closed/labeled/milestoned, this fires a -# repository_dispatch into ChronoAIProject/region-map, which triggers the -# sync-milestone-issues workflow there. Result: region-map updates within -# ~1 minute of any issue change, instead of waiting for the hourly cron. -# -# Requires repo secret REGION_MAP_DISPATCH_PAT — a PAT with `repo` scope on -# ChronoAIProject/region-map. Generate at https://github.com/settings/tokens -# (fine-grained: needs "Contents: write" on region-map; classic: `repo`). - -name: Notify region-map of issue change - -on: - issues: - types: [opened, edited, closed, reopened, milestoned, demilestoned, labeled, unlabeled] - milestone: - types: [created, closed, opened, edited, deleted] - -jobs: - dispatch: - runs-on: ubuntu-latest - steps: - - name: Trigger region-map sync - env: - GH_TOKEN: ${{ secrets.REGION_MAP_DISPATCH_PAT }} - run: | - gh api -X POST repos/ChronoAIProject/region-map/dispatches \ - -f event_type=milestone-issues-sync \ - -f 'client_payload[source_repo]=${{ github.repository }}' \ - -f 'client_payload[event]=${{ github.event_name }}' \ - -f 'client_payload[issue_or_milestone]=${{ github.event.issue.number || github.event.milestone.number }}' From fc274c19e50aaa20ef064d6345362b7618d10d0a Mon Sep 17 00:00:00 2001 From: Wang Shining Date: Mon, 18 May 2026 15:17:06 +0800 Subject: [PATCH 4/5] =?UTF-8?q?viz:=20per-issue=20compound=20nodes=20for?= =?UTF-8?q?=20Ornn=20=E2=80=94=20every=20issue=20visible=20in=20the=20map?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Each Ornn milestone region becomes a cytoscape compound parent containing its OPEN issues as child nodes. Issue→issue dependencies extracted from issue body (Depends/Blocks/Tracks/checklist items) become edges within / across the milestone bubbles. Only regions with milestone_ref (Ornn) get this treatment — other products' regions render unchanged. ## Sync script (tools/sync_milestone_issues.py) Extract dependencies from issue body via regex: - "Depends on #N" / "Depends-on: #N" → blocked_by[N] - "Blocks #N" / "Blocks: #N" → blocks[N] - "Tracks #N" / "Tracks: #N" → tracks[N] - "Tracked by #N" / "Tracked-by: #N" → tracked_by[N] - Checklist items "- [ ] #N" / "- [x] #N" → tracks[N] Write a new artifact ornn-issues.json (alongside regions.json) with the per-region structured issue map + extracted deps. 308 issues across 12 regions; 20 carry at least one extracted dep, 35 tracks edges (mostly umbrella → checklist children like #534 → #535–#546), 18 blocked_by, 3 blocks. regions.json AUTO_GH_ISSUES side-panel rendering is unchanged. ## Viz (visualization.qmd) - New script tag: cytoscape-expand-collapse@4.1.1 - loadData() also fetches ornn-issues.json (tolerates absence) - buildCytoscapeElements(): - Each region still emits its node + milestone-level dep edges - If the region has issues, every OPEN issue emits a child node with parent: (makes the region a compound parent in cytoscape) - Issue→issue edges added for deps where both endpoints are OPEN - Style additions: - node[?is_issue]: small blue ellipse, label "#N" - node:parent: dashed outline + low-opacity tinted fill when expanded - edge[edge_type='blocks']: red solid arrow - edge[edge_type='tracks']: dashed grey tee arrow - renderCy() inits expand-collapse, immediately collapses every compound so the default view matches the old milestone-only layout - Click handler: issue nodes route to showIssueDetail (new), region nodes still route to showNodeDetail - showIssueDetail(): renders issue title + state badge + labels + deps + "Open on GitHub" link. Dep numbers are clickable → jumpToIssue() which expands the parent (if needed) and centers on the target issue - highlightSubgraph(): updated isKept() helper so issue children of a highlighted region don't fade ## Workflow sync-milestone-issues.yml also stages ornn-issues.json on commit. ## What I couldn't test locally quarto isn't installed in this sandbox. JS structure validates (stack-based brace check is balanced). publish.yml will auto-deploy on push, so the live preview can be eyeballed at chronoaiproject.github.io/region-map/visualization.html within ~1 min. Co-Authored-By: Claude Opus 4.7 (1M context) --- .github/workflows/sync-milestone-issues.yml | 7 +- ornn-issues.json | 4997 +++++++++++++++++++ tools/sync_milestone_issues.py | 156 +- visualization.qmd | 289 +- 4 files changed, 5417 insertions(+), 32 deletions(-) create mode 100644 ornn-issues.json diff --git a/.github/workflows/sync-milestone-issues.yml b/.github/workflows/sync-milestone-issues.yml index 9fc2b79..b3eff86 100644 --- a/.github/workflows/sync-milestone-issues.yml +++ b/.github/workflows/sync-milestone-issues.yml @@ -51,14 +51,15 @@ jobs: - name: Commit and push if changed run: | - if [[ -z "$(git status --porcelain regions.json)" ]]; then + CHANGED=$(git status --porcelain regions.json ornn-issues.json) + if [[ -z "$CHANGED" ]]; then echo "no changes to commit" exit 0 fi git config user.name "github-actions[bot]" git config user.email "41898282+github-actions[bot]@users.noreply.github.com" - git add regions.json - git commit -m "auto: sync milestone issues into region desc + git add regions.json ornn-issues.json + git commit -m "auto: sync milestone issues into region desc + issue graph Triggered by: ${{ github.event_name }} Run: ${{ github.run_id }}" diff --git a/ornn-issues.json b/ornn-issues.json new file mode 100644 index 0000000..3d5733d --- /dev/null +++ b/ornn-issues.json @@ -0,0 +1,4997 @@ +{ + "synced_at": "2026-05-18T07:09:35.872296Z", + "regions": { + "Ornn-M0-Engineering-Foundation": { + "milestone": { + "title": "M0 — Engineering Foundation & Infra", + "number": 14, + "url": "https://github.com/ChronoAIProject/Ornn/milestone/14", + "repo": "ChronoAIProject/Ornn" + }, + "issues": { + "399": { + "number": 399, + "title": "[Docs] Skill manuals reference removed endpoints — refresh `api-reference.md` against current API", + "state": "OPEN", + "url": "https://github.com/ChronoAIProject/Ornn/issues/399", + "labels": [ + "documentation", + "dx", + "api" + ], + "deps": { + "blocked_by": [], + "blocks": [], + "tracks": [], + "tracked_by": [] + } + }, + "555": { + "number": 555, + "title": "[CI/CD] Cut release v0.8.0 (admin broadcasts + launch-celebration popup + drawer polish)", + "state": "CLOSED", + "url": "https://github.com/ChronoAIProject/Ornn/issues/555", + "labels": [ + "infra" + ], + "deps": { + "blocked_by": [], + "blocks": [], + "tracks": [], + "tracked_by": [] + } + }, + "519": { + "number": 519, + "title": "[Misc] LaunchCelebrationPopup — explain the NyxID SSO flow next to the invite code", + "state": "CLOSED", + "url": "https://github.com/ChronoAIProject/Ornn/issues/519", + "labels": [ + "dx" + ], + "deps": { + "blocked_by": [], + "blocks": [], + "tracks": [], + "tracked_by": [] + } + }, + "495": { + "number": 495, + "title": "[CI/CD] Cut release v0.7.2 (bilingual announcements + contact page polish)", + "state": "CLOSED", + "url": "https://github.com/ChronoAIProject/Ornn/issues/495", + "labels": [ + "infra" + ], + "deps": { + "blocked_by": [], + "blocks": [], + "tracks": [], + "tracked_by": [] + } + }, + "486": { + "number": 486, + "title": "[CI/CD] Cut release v0.7.1 (web copy polish)", + "state": "CLOSED", + "url": "https://github.com/ChronoAIProject/Ornn/issues/486", + "labels": [ + "infra" + ], + "deps": { + "blocked_by": [], + "blocks": [], + "tracks": [], + "tracked_by": [] + } + }, + "477": { + "number": 477, + "title": "[CI/CD] Curate release notes for 2026-05-13 cut", + "state": "CLOSED", + "url": "https://github.com/ChronoAIProject/Ornn/issues/477", + "labels": [ + "infra" + ], + "deps": { + "blocked_by": [], + "blocks": [], + "tracks": [], + "tracked_by": [] + } + }, + "435": { + "number": 435, + "title": "[CI/CD] Restructure release notes — fixed template + per-release dated files", + "state": "CLOSED", + "url": "https://github.com/ChronoAIProject/Ornn/issues/435", + "labels": [ + "dx", + "infra" + ], + "deps": { + "blocked_by": [], + "blocks": [], + "tracks": [], + "tracked_by": [] + } + }, + "433": { + "number": 433, + "title": "[CI/CD] Gate develop → main PRs on a properly-filled release-notes-next.md", + "state": "CLOSED", + "url": "https://github.com/ChronoAIProject/Ornn/issues/433", + "labels": [ + "dx", + "infra" + ], + "deps": { + "blocked_by": [], + "blocks": [], + "tracks": [], + "tracked_by": [] + } + }, + "431": { + "number": 431, + "title": "[CI/CD] Release notes from in-repo file (Fixed / New Feature / Changed)", + "state": "CLOSED", + "url": "https://github.com/ChronoAIProject/Ornn/issues/431", + "labels": [ + "dx", + "infra" + ], + "deps": { + "blocked_by": [], + "blocks": [], + "tracks": [], + "tracked_by": [] + } + }, + "429": { + "number": 429, + "title": "[CI/CD] changeset-release: GitHub Release body exceeds 125 000-char limit on big releases (v0.6.0 hit it)", + "state": "CLOSED", + "url": "https://github.com/ChronoAIProject/Ornn/issues/429", + "labels": [ + "bug", + "infra" + ], + "deps": { + "blocked_by": [], + "blocks": [], + "tracks": [], + "tracked_by": [] + } + }, + "402": { + "number": 402, + "title": "[CI/CD] Whitelist Dependabot in require-review + exempt from changeset-check", + "state": "CLOSED", + "url": "https://github.com/ChronoAIProject/Ornn/issues/402", + "labels": [ + "dx", + "infra" + ], + "deps": { + "blocked_by": [], + "blocks": [], + "tracks": [], + "tracked_by": [] + } + }, + "400": { + "number": 400, + "title": "[CI/CD] Upgrade vite 6 → 8 and @vitejs/plugin-react 4 → 6", + "state": "CLOSED", + "url": "https://github.com/ChronoAIProject/Ornn/issues/400", + "labels": [ + "dx", + "infra" + ], + "deps": { + "blocked_by": [], + "blocks": [], + "tracks": [], + "tracked_by": [] + } + }, + "387": { + "number": 387, + "title": "[CI/CD] Wire bun audit gate to block high/critical advisories on PR", + "state": "CLOSED", + "url": "https://github.com/ChronoAIProject/Ornn/issues/387", + "labels": [ + "infra", + "security" + ], + "deps": { + "blocked_by": [], + "blocks": [], + "tracks": [], + "tracked_by": [] + } + }, + "383": { + "number": 383, + "title": "[CI/CD] Add Dependabot config + bun audit CI gate for supply-chain baseline", + "state": "CLOSED", + "url": "https://github.com/ChronoAIProject/Ornn/issues/383", + "labels": [ + "infra", + "security" + ], + "deps": { + "blocked_by": [], + "blocks": [], + "tracks": [], + "tracked_by": [] + } + }, + "371": { + "number": 371, + "title": "[Misc] PAT permission smoke test — safe to ignore", + "state": "CLOSED", + "url": "https://github.com/ChronoAIProject/Ornn/issues/371", + "labels": [ + "dx" + ], + "deps": { + "blocked_by": [], + "blocks": [], + "tracks": [], + "tracked_by": [] + } + }, + "354": { + "number": 354, + "title": "[Misc] Repo organization: move SDKs into sdk/, ALL-CAPS docs/ filenames, CLAUDE.md doc index", + "state": "CLOSED", + "url": "https://github.com/ChronoAIProject/Ornn/issues/354", + "labels": [ + "documentation" + ], + "deps": { + "blocked_by": [], + "blocks": [], + "tracks": [], + "tracked_by": [] + } + }, + "349": { + "number": 349, + "title": "[Docs] Align README with CLAUDE.md, drop .ornn-skills, reorganize markdown layout", + "state": "CLOSED", + "url": "https://github.com/ChronoAIProject/Ornn/issues/349", + "labels": [ + "documentation" + ], + "deps": { + "blocked_by": [], + "blocks": [], + "tracks": [], + "tracked_by": [] + } + }, + "296": { + "number": 296, + "title": "[Bug] ornn-web crashloops on first deploy — 15-derive-nyxid-api-host.envsh shipped non-executable", + "state": "CLOSED", + "url": "https://github.com/ChronoAIProject/Ornn/issues/296", + "labels": [ + "bug", + "infra" + ], + "deps": { + "blocked_by": [], + "blocks": [], + "tracks": [], + "tracked_by": [] + } + }, + "294": { + "number": 294, + "title": "[Chore] Restructure .env.sample.ornn into sections; move NyxID SA creds to admin settings; consolidate ornn-web URLs to base+path", + "state": "CLOSED", + "url": "https://github.com/ChronoAIProject/Ornn/issues/294", + "labels": [ + "dx", + "infra" + ], + "deps": { + "blocked_by": [], + "blocks": [], + "tracks": [], + "tracked_by": [] + } + }, + "287": { + "number": 287, + "title": "[Chore] Audit + clean up env-var surface — drop stale config keys, align names", + "state": "CLOSED", + "url": "https://github.com/ChronoAIProject/Ornn/issues/287", + "labels": [ + "dx" + ], + "deps": { + "blocked_by": [], + "blocks": [], + "tracks": [], + "tracked_by": [] + } + }, + "273": { + "number": 273, + "title": "[Docs] CLAUDE.md — codify commit-size rule (small self-contained > one big)", + "state": "CLOSED", + "url": "https://github.com/ChronoAIProject/Ornn/issues/273", + "labels": [ + "dx" + ], + "deps": { + "blocked_by": [], + "blocks": [], + "tracks": [], + "tracked_by": [] + } + }, + "264": { + "number": 264, + "title": "[Feature] Playground chat — message entrance animation + strengthen PR-issue linkage rule in CLAUDE.md", + "state": "CLOSED", + "url": "https://github.com/ChronoAIProject/Ornn/issues/264", + "labels": [ + "documentation", + "enhancement" + ], + "deps": { + "blocked_by": [], + "blocks": [], + "tracks": [], + "tracked_by": [] + } + }, + "237": { + "number": 237, + "title": "[CI/CD] changeset-release bot — replace default GITHUB_TOKEN with PAT/App token so bot-opened PRs trigger required workflows", + "state": "CLOSED", + "url": "https://github.com/ChronoAIProject/Ornn/issues/237", + "labels": [ + "dx" + ], + "deps": { + "blocked_by": [], + "blocks": [], + "tracks": [], + "tracked_by": [] + } + }, + "217": { + "number": 217, + "title": "[Bug] /health, /livez, /readyz, /api/v1/openapi.json not routed correctly — nginx/proxy intercepts them", + "state": "CLOSED", + "url": "https://github.com/ChronoAIProject/Ornn/issues/217", + "labels": [ + "bug", + "api" + ], + "deps": { + "blocked_by": [], + "blocks": [], + "tracks": [], + "tracked_by": [] + } + }, + "199": { + "number": 199, + "title": "[Docs] Encode \"agent-API not marketplace\" positioning into CLAUDE.md + landing page + docs index", + "state": "CLOSED", + "url": "https://github.com/ChronoAIProject/Ornn/issues/199", + "labels": [ + "dx" + ], + "deps": { + "blocked_by": [], + "blocks": [], + "tracks": [], + "tracked_by": [] + } + }, + "167": { + "number": 167, + "title": "[Infra] Local minio ingress + browser-reachable presigned URLs", + "state": "CLOSED", + "url": "https://github.com/ChronoAIProject/Ornn/issues/167", + "labels": [ + "bug", + "infra" + ], + "deps": { + "blocked_by": [], + "blocks": [], + "tracks": [], + "tracked_by": [] + } + }, + "122": { + "number": 122, + "title": "[Bug] ornn-web ConfigMap reuses ornn-api's NYXID_TOKEN_URL / NYXID_CLIENT_ID (wrong values in browser)", + "state": "CLOSED", + "url": "https://github.com/ChronoAIProject/Ornn/issues/122", + "labels": [ + "bug", + "infra" + ], + "deps": { + "blocked_by": [], + "blocks": [], + "tracks": [], + "tracked_by": [] + } + }, + "119": { + "number": 119, + "title": "[Misc] ornn-web nginx.conf.template: drop dead /api/v1/openapi.json bypass", + "state": "CLOSED", + "url": "https://github.com/ChronoAIProject/Ornn/issues/119", + "labels": [ + "dx", + "infra" + ], + "deps": { + "blocked_by": [], + "blocks": [], + "tracks": [], + "tracked_by": [] + } + }, + "116": { + "number": 116, + "title": "[Feature] ornn-web: make config runtime-driven (nginx upstreams + Vite env via ConfigMap)", + "state": "CLOSED", + "url": "https://github.com/ChronoAIProject/Ornn/issues/116", + "labels": [ + "enhancement", + "dx", + "infra" + ], + "deps": { + "blocked_by": [], + "blocks": [], + "tracks": [], + "tracked_by": [] + } + }, + "112": { + "number": 112, + "title": "[Bug] ornn-web nginx fails to start with \"host not found in upstream 'minio'\" on clusters without MinIO", + "state": "CLOSED", + "url": "https://github.com/ChronoAIProject/Ornn/issues/112", + "labels": [ + "bug", + "infra" + ], + "deps": { + "blocked_by": [], + "blocks": [], + "tracks": [], + "tracked_by": [] + } + }, + "105": { + "number": 105, + "title": "[CI/CD] CD to k8s cluster + rollback + deploy notifications", + "state": "CLOSED", + "url": "https://github.com/ChronoAIProject/Ornn/issues/105", + "labels": [ + "infra" + ], + "deps": { + "blocked_by": [], + "blocks": [], + "tracks": [], + "tracked_by": [] + } + }, + "83": { + "number": 83, + "title": "[Docs] Require new work to branch from latest develop", + "state": "CLOSED", + "url": "https://github.com/ChronoAIProject/Ornn/issues/83", + "labels": [ + "documentation" + ], + "deps": { + "blocked_by": [], + "blocks": [], + "tracks": [], + "tracked_by": [] + } + }, + "79": { + "number": 79, + "title": "[Docs] Add GitHub issue management rules to CLAUDE.md", + "state": "CLOSED", + "url": "https://github.com/ChronoAIProject/Ornn/issues/79", + "labels": [ + "documentation" + ], + "deps": { + "blocked_by": [], + "blocks": [], + "tracks": [], + "tracked_by": [] + } + } + } + }, + "Ornn-M1-Skill-Lifecycle-Core": { + "milestone": { + "title": "M1 — Skill Lifecycle Core", + "number": 15, + "url": "https://github.com/ChronoAIProject/Ornn/milestone/15", + "repo": "ChronoAIProject/Ornn" + }, + "issues": { + "565": { + "number": 565, + "title": "[Bug] [Skill Edit] Owner updating an existing skill package is blocked by CORS", + "state": "OPEN", + "url": "https://github.com/ChronoAIProject/Ornn/issues/565", + "labels": [ + "bug" + ], + "deps": { + "blocked_by": [], + "blocks": [], + "tracks": [], + "tracked_by": [] + } + }, + "564": { + "number": 564, + "title": "[Bug] [Playground] Missing skill still opens an interactive Playground page after API returns 404", + "state": "OPEN", + "url": "https://github.com/ChronoAIProject/Ornn/issues/564", + "labels": [ + "bug" + ], + "deps": { + "blocked_by": [], + "blocks": [], + "tracks": [], + "tracked_by": [] + } + }, + "531": { + "number": 531, + "title": "[Bug] [Playground Sandbox] Installed CLI state is not preserved across tool calls", + "state": "OPEN", + "url": "https://github.com/ChronoAIProject/Ornn/issues/531", + "labels": [ + "bug" + ], + "deps": { + "blocked_by": [], + "blocks": [], + "tracks": [], + "tracked_by": [] + } + }, + "530": { + "number": 530, + "title": "[Bug] [Playground Sandbox] nyxid skill tool execution returns 500 internal_error", + "state": "OPEN", + "url": "https://github.com/ChronoAIProject/Ornn/issues/530", + "labels": [ + "bug" + ], + "deps": { + "blocked_by": [], + "blocks": [], + "tracks": [], + "tracked_by": [] + } + }, + "529": { + "number": 529, + "title": "[Bug] [GitHub Import] Skip validation still fails on Ornn frontmatter validation", + "state": "OPEN", + "url": "https://github.com/ChronoAIProject/Ornn/issues/529", + "labels": [ + "bug" + ], + "deps": { + "blocked_by": [], + "blocks": [], + "tracks": [], + "tracked_by": [] + } + }, + "528": { + "number": 528, + "title": "[Bug] [Skill Creation] Saving AI-generated or guided skills fails with CORS error", + "state": "OPEN", + "url": "https://github.com/ChronoAIProject/Ornn/issues/528", + "labels": [ + "bug" + ], + "deps": { + "blocked_by": [], + "blocks": [], + "tracks": [], + "tracked_by": [] + } + }, + "243": { + "number": 243, + "title": "[Feature] Service-binding agent prompt — encourage agents to promote repeated service operations into a reusable Ornn skill bound to that service", + "state": "OPEN", + "url": "https://github.com/ChronoAIProject/Ornn/issues/243", + "labels": [ + "dx" + ], + "deps": { + "blocked_by": [], + "blocks": [], + "tracks": [ + 242 + ], + "tracked_by": [] + } + }, + "562": { + "number": 562, + "title": "[Bug] [Playground] nyxid LIST CAPABILITIES response is delayed and follow-up command is not executed", + "state": "CLOSED", + "url": "https://github.com/ChronoAIProject/Ornn/issues/562", + "labels": [ + "bug" + ], + "deps": { + "blocked_by": [], + "blocks": [], + "tracks": [], + "tracked_by": [] + } + }, + "72": { + "number": 72, + "title": "[CI/CD] Epic 4: Ops, testing, observability", + "state": "CLOSED", + "url": "https://github.com/ChronoAIProject/Ornn/issues/72", + "labels": [ + "phase:1", + "infra" + ], + "deps": { + "blocked_by": [], + "blocks": [], + "tracks": [], + "tracked_by": [] + } + }, + "71": { + "number": 71, + "title": "[Feature] Epic 3: Frontend modernization", + "state": "CLOSED", + "url": "https://github.com/ChronoAIProject/Ornn/issues/71", + "labels": [ + "phase:1", + "dx" + ], + "deps": { + "blocked_by": [], + "blocks": [], + "tracks": [], + "tracked_by": [] + } + }, + "70": { + "number": 70, + "title": "[Feature] Epic 2 prep: NyxID permission catalog rollout (cross-team)", + "state": "CLOSED", + "url": "https://github.com/ChronoAIProject/Ornn/issues/70", + "labels": [ + "phase:1", + "security" + ], + "deps": { + "blocked_by": [], + "blocks": [], + "tracks": [], + "tracked_by": [] + } + }, + "69": { + "number": 69, + "title": "[Feature] Epic 2 prep: Reserved-verb DB audit", + "state": "CLOSED", + "url": "https://github.com/ChronoAIProject/Ornn/issues/69", + "labels": [ + "phase:1", + "api" + ], + "deps": { + "blocked_by": [], + "blocks": [], + "tracks": [], + "tracked_by": [] + } + }, + "68": { + "number": 68, + "title": "[Feature] Epic 2: /api/v1/ cut (breaking external contract)", + "state": "CLOSED", + "url": "https://github.com/ChronoAIProject/Ornn/issues/68", + "labels": [ + "phase:1", + "api" + ], + "deps": { + "blocked_by": [], + "blocks": [], + "tracks": [], + "tracked_by": [] + } + }, + "67": { + "number": 67, + "title": "Epic 1 [first step]: Topic domain teardown", + "state": "CLOSED", + "url": "https://github.com/ChronoAIProject/Ornn/issues/67", + "labels": [], + "deps": { + "blocked_by": [], + "blocks": [], + "tracks": [], + "tracked_by": [] + } + }, + "66": { + "number": 66, + "title": "Epic 1: Architecture refactor (no external API change)", + "state": "CLOSED", + "url": "https://github.com/ChronoAIProject/Ornn/issues/66", + "labels": [], + "deps": { + "blocked_by": [], + "blocks": [], + "tracks": [], + "tracked_by": [] + } + }, + "65": { + "number": 65, + "title": "Epic 0: Convention freeze (foundations)", + "state": "CLOSED", + "url": "https://github.com/ChronoAIProject/Ornn/issues/65", + "labels": [], + "deps": { + "blocked_by": [], + "blocks": [], + "tracks": [], + "tracked_by": [] + } + }, + "64": { + "number": 64, + "title": "[Feature] API endpoint standardization & refactor (prep for Ornn Manual v1)", + "state": "CLOSED", + "url": "https://github.com/ChronoAIProject/Ornn/issues/64", + "labels": [ + "phase:1", + "api" + ], + "deps": { + "blocked_by": [], + "blocks": [], + "tracks": [ + 65, + 66, + 67, + 68, + 69, + 70, + 71, + 72 + ], + "tracked_by": [] + } + }, + "56": { + "number": 56, + "title": "Skill Topics: group skills under named topics, with API CRUD", + "state": "CLOSED", + "url": "https://github.com/ChronoAIProject/Ornn/issues/56", + "labels": [ + "enhancement", + "api" + ], + "deps": { + "blocked_by": [], + "blocks": [], + "tracks": [], + "tracked_by": [] + } + }, + "44": { + "number": 44, + "title": "[M1] NyxID Services pages: My Services + Admin Services with skill generation", + "state": "CLOSED", + "url": "https://github.com/ChronoAIProject/Ornn/issues/44", + "labels": [ + "phase:1", + "dx" + ], + "deps": { + "blocked_by": [], + "blocks": [], + "tracks": [], + "tracked_by": [] + } + }, + "43": { + "number": 43, + "title": "[M1] System Skills: auto-generate skills from NyxID service catalog", + "state": "CLOSED", + "url": "https://github.com/ChronoAIProject/Ornn/issues/43", + "labels": [ + "phase:1", + "dx", + "api" + ], + "deps": { + "blocked_by": [ + 23, + 41 + ], + "blocks": [], + "tracks": [], + "tracked_by": [] + } + }, + "40": { + "number": 40, + "title": "[Docs] Move docs to frontend static build, remove /api/docs backend routes", + "state": "CLOSED", + "url": "https://github.com/ChronoAIProject/Ornn/issues/40", + "labels": [ + "phase:1", + "dx" + ], + "deps": { + "blocked_by": [], + "blocks": [], + "tracks": [], + "tracked_by": [] + } + }, + "28": { + "number": 28, + "title": "[M1] MCP-native skill discovery", + "state": "CLOSED", + "url": "https://github.com/ChronoAIProject/Ornn/issues/28", + "labels": [ + "phase:1", + "dx" + ], + "deps": { + "blocked_by": [], + "blocks": [], + "tracks": [], + "tracked_by": [] + } + }, + "27": { + "number": 27, + "title": "[M1] Local dev server with hot-reload for skill authoring", + "state": "CLOSED", + "url": "https://github.com/ChronoAIProject/Ornn/issues/27", + "labels": [ + "phase:1", + "dx" + ], + "deps": { + "blocked_by": [], + "blocks": [], + "tracks": [], + "tracked_by": [] + } + }, + "25": { + "number": 25, + "title": "[M1] Skill versioning & version history", + "state": "CLOSED", + "url": "https://github.com/ChronoAIProject/Ornn/issues/25", + "labels": [ + "phase:1", + "api" + ], + "deps": { + "blocked_by": [], + "blocks": [], + "tracks": [], + "tracked_by": [] + } + }, + "24": { + "number": 24, + "title": "[Feature] End-to-end skill lifecycle: build -> search -> pull -> execute", + "state": "CLOSED", + "url": "https://github.com/ChronoAIProject/Ornn/issues/24", + "labels": [ + "phase:1", + "api" + ], + "deps": { + "blocked_by": [], + "blocks": [], + "tracks": [], + "tracked_by": [] + } + }, + "23": { + "number": 23, + "title": "[M1] API route refactor: merge /api/web + /api/agent into unified /api", + "state": "CLOSED", + "url": "https://github.com/ChronoAIProject/Ornn/issues/23", + "labels": [ + "phase:1", + "api" + ], + "deps": { + "blocked_by": [], + "blocks": [], + "tracks": [], + "tracked_by": [] + } + }, + "12": { + "number": 12, + "title": "feat: daily-briefing skill — 移植 /daily 逻辑为 Ornn skill", + "state": "CLOSED", + "url": "https://github.com/ChronoAIProject/Ornn/issues/12", + "labels": [], + "deps": { + "blocked_by": [], + "blocks": [], + "tracks": [], + "tracked_by": [] + } + }, + "11": { + "number": 11, + "title": "feat: Skill Registry API — supply skill definitions + metadata to Aevatar", + "state": "CLOSED", + "url": "https://github.com/ChronoAIProject/Ornn/issues/11", + "labels": [], + "deps": { + "blocked_by": [], + "blocks": [], + "tracks": [], + "tracked_by": [] + } + }, + "9": { + "number": 9, + "title": "[CI/CD] CI/CD pipeline — 自动测试 + 部署", + "state": "CLOSED", + "url": "https://github.com/ChronoAIProject/Ornn/issues/9", + "labels": [ + "phase:1", + "infra" + ], + "deps": { + "blocked_by": [], + "blocks": [], + "tracks": [], + "tracked_by": [] + } + }, + "8": { + "number": 8, + "title": "feat: Organization scope skills — 支持公司/团队级共享 skills", + "state": "CLOSED", + "url": "https://github.com/ChronoAIProject/Ornn/issues/8", + "labels": [ + "phase:5" + ], + "deps": { + "blocked_by": [], + "blocks": [], + "tracks": [], + "tracked_by": [] + } + }, + "7": { + "number": 7, + "title": "Skill page should provide a copyable install URL for LLMs", + "state": "CLOSED", + "url": "https://github.com/ChronoAIProject/Ornn/issues/7", + "labels": [ + "phase:1", + "dx" + ], + "deps": { + "blocked_by": [], + "blocks": [], + "tracks": [], + "tracked_by": [] + } + }, + "6": { + "number": 6, + "title": "[Bug] Ornn authoring is not usable from the Nyx CLI / proxy path and the required auth boundary is unclear", + "state": "CLOSED", + "url": "https://github.com/ChronoAIProject/Ornn/issues/6", + "labels": [ + "bug", + "phase:1" + ], + "deps": { + "blocked_by": [], + "blocks": [], + "tracks": [], + "tracked_by": [] + } + }, + "5": { + "number": 5, + "title": "Skill upload issue", + "state": "CLOSED", + "url": "https://github.com/ChronoAIProject/Ornn/issues/5", + "labels": [ + "bug", + "phase:1" + ], + "deps": { + "blocked_by": [], + "blocks": [], + "tracks": [], + "tracked_by": [] + } + }, + "4": { + "number": 4, + "title": "Skill-Only API", + "state": "CLOSED", + "url": "https://github.com/ChronoAIProject/Ornn/issues/4", + "labels": [ + "enhancement", + "phase:1", + "api" + ], + "deps": { + "blocked_by": [], + "blocks": [], + "tracks": [], + "tracked_by": [] + } + }, + "2": { + "number": 2, + "title": "[Bug] skill_build does not validate unknown model and may silently fallback", + "state": "CLOSED", + "url": "https://github.com/ChronoAIProject/Ornn/issues/2", + "labels": [], + "deps": { + "blocked_by": [], + "blocks": [], + "tracks": [], + "tracked_by": [] + } + }, + "1": { + "number": 1, + "title": "[Bug] Inconsistent skill_build validation: invalid messages payloads bypass validation and error semantics are mixed", + "state": "CLOSED", + "url": "https://github.com/ChronoAIProject/Ornn/issues/1", + "labels": [], + "deps": { + "blocked_by": [], + "blocks": [], + "tracks": [], + "tracked_by": [] + } + } + } + }, + "Ornn-M2-Build-Experience": { + "milestone": { + "title": "M2 — Build Experience", + "number": 16, + "url": "https://github.com/ChronoAIProject/Ornn/milestone/16", + "repo": "ChronoAIProject/Ornn" + }, + "issues": { + "110": { + "number": 110, + "title": "[Feature] Ornn Python SDK", + "state": "CLOSED", + "url": "https://github.com/ChronoAIProject/Ornn/issues/110", + "labels": [ + "phase:2", + "dx" + ], + "deps": { + "blocked_by": [], + "blocks": [], + "tracks": [], + "tracked_by": [] + } + }, + "102": { + "number": 102, + "title": "[CI/CD] Integration test layer with testcontainers-backed Mongo", + "state": "CLOSED", + "url": "https://github.com/ChronoAIProject/Ornn/issues/102", + "labels": [ + "phase:2", + "infra" + ], + "deps": { + "blocked_by": [], + "blocks": [], + "tracks": [], + "tracked_by": [] + } + }, + "57": { + "number": 57, + "title": "[Feature] Pull skills from GitHub: one-way sync from a GitHub repo/path into Ornn", + "state": "CLOSED", + "url": "https://github.com/ChronoAIProject/Ornn/issues/57", + "labels": [ + "enhancement", + "dx", + "api" + ], + "deps": { + "blocked_by": [], + "blocks": [], + "tracks": [], + "tracked_by": [] + } + }, + "54": { + "number": 54, + "title": "[M2] Ship TypeScript and Python SDKs for skill operations", + "state": "CLOSED", + "url": "https://github.com/ChronoAIProject/Ornn/issues/54", + "labels": [ + "enhancement", + "phase:2", + "dx", + "api" + ], + "deps": { + "blocked_by": [], + "blocks": [], + "tracks": [], + "tracked_by": [] + } + }, + "45": { + "number": 45, + "title": "[M2] Skill generation wizard with reference selection and progress UI", + "state": "CLOSED", + "url": "https://github.com/ChronoAIProject/Ornn/issues/45", + "labels": [ + "phase:2", + "dx", + "api" + ], + "deps": { + "blocked_by": [ + 41, + 43 + ], + "blocks": [], + "tracks": [], + "tracked_by": [] + } + }, + "42": { + "number": 42, + "title": "[Feature] Generate skills from source code repos", + "state": "CLOSED", + "url": "https://github.com/ChronoAIProject/Ornn/issues/42", + "labels": [ + "phase:2", + "api" + ], + "deps": { + "blocked_by": [], + "blocks": [], + "tracks": [], + "tracked_by": [] + } + }, + "41": { + "number": 41, + "title": "[M2] Generate skills from OpenAPI specs", + "state": "CLOSED", + "url": "https://github.com/ChronoAIProject/Ornn/issues/41", + "labels": [ + "phase:2", + "api" + ], + "deps": { + "blocked_by": [], + "blocks": [], + "tracks": [], + "tracked_by": [] + } + }, + "31": { + "number": 31, + "title": "[Feature] Ornn SDK: TypeScript + Python client libraries", + "state": "CLOSED", + "url": "https://github.com/ChronoAIProject/Ornn/issues/31", + "labels": [ + "phase:2", + "dx" + ], + "deps": { + "blocked_by": [], + "blocks": [], + "tracks": [], + "tracked_by": [] + } + }, + "30": { + "number": 30, + "title": "[Feature] REST API skill generation from OpenAPI specs / source code", + "state": "CLOSED", + "url": "https://github.com/ChronoAIProject/Ornn/issues/30", + "labels": [ + "phase:2", + "api" + ], + "deps": { + "blocked_by": [], + "blocks": [], + "tracks": [], + "tracked_by": [] + } + }, + "29": { + "number": 29, + "title": "[Feature] Dual-mode skill build: local boundaries + remote generation", + "state": "CLOSED", + "url": "https://github.com/ChronoAIProject/Ornn/issues/29", + "labels": [ + "phase:2", + "api" + ], + "deps": { + "blocked_by": [], + "blocks": [], + "tracks": [], + "tracked_by": [] + } + } + } + }, + "Ornn-M3-Trust-Quality": { + "milestone": { + "title": "M3 — Trust & Quality", + "number": 17, + "url": "https://github.com/ChronoAIProject/Ornn/milestone/17", + "repo": "ChronoAIProject/Ornn" + }, + "issues": { + "566": { + "number": 566, + "title": "[Bug] [Registry] Anonymous users cannot load public and system skills because public Registry APIs return 401", + "state": "OPEN", + "url": "https://github.com/ChronoAIProject/Ornn/issues/566", + "labels": [ + "bug" + ], + "deps": { + "blocked_by": [], + "blocks": [], + "tracks": [], + "tracked_by": [] + } + }, + "254": { + "number": 254, + "title": "[Bug] backfill-skill-author-display-names.ts uses $last for activity labels — same root cause as #238 runtime aggregator", + "state": "OPEN", + "url": "https://github.com/ChronoAIProject/Ornn/issues/254", + "labels": [ + "bug", + "api" + ], + "deps": { + "blocked_by": [], + "blocks": [], + "tracks": [], + "tracked_by": [] + } + }, + "106": { + "number": 106, + "title": "[Feature] NyxID permission catalog flip — post-NyxID-rename", + "state": "OPEN", + "url": "https://github.com/ChronoAIProject/Ornn/issues/106", + "labels": [ + "security" + ], + "deps": { + "blocked_by": [], + "blocks": [], + "tracks": [], + "tracked_by": [] + } + }, + "271": { + "number": 271, + "title": "[Feature] PostHog-only platform analytics — wire DB-driven telemetry, remove custom audit infrastructure", + "state": "CLOSED", + "url": "https://github.com/ChronoAIProject/Ornn/issues/271", + "labels": [ + "phase:3", + "dx", + "api", + "infra" + ], + "deps": { + "blocked_by": [], + "blocks": [], + "tracks": [], + "tracked_by": [] + } + }, + "247": { + "number": 247, + "title": "[Feature] Admin audit + analytics dashboard — pageviews, API audit, caller-type breakdown", + "state": "CLOSED", + "url": "https://github.com/ChronoAIProject/Ornn/issues/247", + "labels": [ + "dx", + "api" + ], + "deps": { + "blocked_by": [ + 245, + 246 + ], + "blocks": [], + "tracks": [ + 245 + ], + "tracked_by": [] + } + }, + "246": { + "number": 246, + "title": "[Feature] Frontend pageview tracking + caller-type header — cookie-free analytics with consent", + "state": "CLOSED", + "url": "https://github.com/ChronoAIProject/Ornn/issues/246", + "labels": [ + "dx", + "api" + ], + "deps": { + "blocked_by": [ + 245 + ], + "blocks": [], + "tracks": [ + 245 + ], + "tracked_by": [] + } + }, + "244": { + "number": 244, + "title": "[Feature] Skill auditing — Gen Agent Trust Hub integration", + "state": "CLOSED", + "url": "https://github.com/ChronoAIProject/Ornn/issues/244", + "labels": [ + "api", + "security" + ], + "deps": { + "blocked_by": [], + "blocks": [], + "tracks": [ + 98, + 158, + 181 + ], + "tracked_by": [] + } + }, + "218": { + "number": 218, + "title": "[Bug] Legacy share/audit-gated data leaks through /notifications and /admin/activities after PR #198", + "state": "CLOSED", + "url": "https://github.com/ChronoAIProject/Ornn/issues/218", + "labels": [ + "bug", + "api" + ], + "deps": { + "blocked_by": [], + "blocks": [], + "tracks": [], + "tracked_by": [] + } + }, + "197": { + "number": 197, + "title": "[Feature] Pivot share/audit relationship — share is unconditional, audit is a label", + "state": "CLOSED", + "url": "https://github.com/ChronoAIProject/Ornn/issues/197", + "labels": [ + "api" + ], + "deps": { + "blocked_by": [], + "blocks": [], + "tracks": [], + "tracked_by": [] + } + }, + "188": { + "number": 188, + "title": "[Feature] Per-version audit badges + share semantics (scheme B)", + "state": "CLOSED", + "url": "https://github.com/ChronoAIProject/Ornn/issues/188", + "labels": [ + "phase:3", + "api" + ], + "deps": { + "blocked_by": [ + 181 + ], + "blocks": [], + "tracks": [], + "tracked_by": [] + } + }, + "187": { + "number": 187, + "title": "[Feature] SkillDetailPage layout rework + usage charts with time range", + "state": "CLOSED", + "url": "https://github.com/ChronoAIProject/Ornn/issues/187", + "labels": [ + "phase:3" + ], + "deps": { + "blocked_by": [ + 181, + 182 + ], + "blocks": [], + "tracks": [ + 181, + 182 + ], + "tracked_by": [] + } + }, + "186": { + "number": 186, + "title": "[Bug] Reviewer cannot approve or reject a share request from the review page", + "state": "CLOSED", + "url": "https://github.com/ChronoAIProject/Ornn/issues/186", + "labels": [ + "bug", + "phase:3", + "api" + ], + "deps": { + "blocked_by": [], + "blocks": [], + "tracks": [], + "tracked_by": [] + } + }, + "185": { + "number": 185, + "title": "[Bug] Review queue page missing top-left back nav", + "state": "CLOSED", + "url": "https://github.com/ChronoAIProject/Ornn/issues/185", + "labels": [ + "phase:3" + ], + "deps": { + "blocked_by": [], + "blocks": [], + "tracks": [], + "tracked_by": [] + } + }, + "184": { + "number": 184, + "title": "[Bug] My sharing requests page missing top-left back nav", + "state": "CLOSED", + "url": "https://github.com/ChronoAIProject/Ornn/issues/184", + "labels": [ + "phase:3" + ], + "deps": { + "blocked_by": [], + "blocks": [], + "tracks": [], + "tracked_by": [] + } + }, + "183": { + "number": 183, + "title": "[Feature] Delete non-latest skill versions", + "state": "CLOSED", + "url": "https://github.com/ChronoAIProject/Ornn/issues/183", + "labels": [ + "phase:3", + "api" + ], + "deps": { + "blocked_by": [], + "blocks": [], + "tracks": [], + "tracked_by": [] + } + }, + "182": { + "number": 182, + "title": "[Feature] Skill JSON pull tracking + time-bucket aggregation", + "state": "CLOSED", + "url": "https://github.com/ChronoAIProject/Ornn/issues/182", + "labels": [ + "phase:3", + "api" + ], + "deps": { + "blocked_by": [], + "blocks": [], + "tracks": [], + "tracked_by": [] + } + }, + "181": { + "number": 181, + "title": "[Feature] Per-version audit history + analytics filter", + "state": "CLOSED", + "url": "https://github.com/ChronoAIProject/Ornn/issues/181", + "labels": [ + "phase:3", + "api" + ], + "deps": { + "blocked_by": [], + "blocks": [], + "tracks": [], + "tracked_by": [] + } + }, + "172": { + "number": 172, + "title": "[Feature] Fold audit-gated share initiation into PermissionsModal (single entry point)", + "state": "CLOSED", + "url": "https://github.com/ChronoAIProject/Ornn/issues/172", + "labels": [ + "enhancement", + "phase:3", + "dx" + ], + "deps": { + "blocked_by": [], + "blocks": [], + "tracks": [], + "tracked_by": [] + } + }, + "161": { + "number": 161, + "title": "[Feature] Frontend UI for skill analytics (per-skill card on SkillDetailPage)", + "state": "CLOSED", + "url": "https://github.com/ChronoAIProject/Ornn/issues/161", + "labels": [ + "enhancement", + "phase:3", + "dx" + ], + "deps": { + "blocked_by": [], + "blocks": [], + "tracks": [], + "tracked_by": [] + } + }, + "160": { + "number": 160, + "title": "[Feature] Frontend UI for audit-gated sharing workflow (share modal + justification + review queue + admin review)", + "state": "CLOSED", + "url": "https://github.com/ChronoAIProject/Ornn/issues/160", + "labels": [ + "enhancement", + "phase:3", + "dx", + "security" + ], + "deps": { + "blocked_by": [], + "blocks": [], + "tracks": [], + "tracked_by": [] + } + }, + "159": { + "number": 159, + "title": "[Feature] Frontend UI for GitHub skill import + 'Refresh from GitHub' re-sync", + "state": "CLOSED", + "url": "https://github.com/ChronoAIProject/Ornn/issues/159", + "labels": [ + "enhancement", + "phase:3", + "dx" + ], + "deps": { + "blocked_by": [], + "blocks": [], + "tracks": [], + "tracked_by": [] + } + }, + "158": { + "number": 158, + "title": "[Feature] Frontend UI for skill audit findings (SkillDetailPage banner + admin rerun)", + "state": "CLOSED", + "url": "https://github.com/ChronoAIProject/Ornn/issues/158", + "labels": [ + "enhancement", + "phase:3", + "dx", + "security" + ], + "deps": { + "blocked_by": [], + "blocks": [], + "tracks": [], + "tracked_by": [] + } + }, + "157": { + "number": 157, + "title": "[Feature] Frontend UI for in-product notifications (bell + /notifications page + unread badge + mark-read)", + "state": "CLOSED", + "url": "https://github.com/ChronoAIProject/Ornn/issues/157", + "labels": [ + "enhancement", + "phase:3", + "dx" + ], + "deps": { + "blocked_by": [], + "blocks": [], + "tracks": [], + "tracked_by": [] + } + }, + "156": { + "number": 156, + "title": "[Feature] Phase-3 frontend catch-up — audit / shares / notifications / analytics / github-sync UI", + "state": "CLOSED", + "url": "https://github.com/ChronoAIProject/Ornn/issues/156", + "labels": [ + "enhancement", + "phase:3", + "dx" + ], + "deps": { + "blocked_by": [], + "blocks": [], + "tracks": [ + 157, + 158, + 159, + 160, + 161 + ], + "tracked_by": [] + } + }, + "104": { + "number": 104, + "title": "[Feature] Resource-grouped page layout", + "state": "CLOSED", + "url": "https://github.com/ChronoAIProject/Ornn/issues/104", + "labels": [ + "dx" + ], + "deps": { + "blocked_by": [], + "blocks": [], + "tracks": [], + "tracked_by": [] + } + }, + "103": { + "number": 103, + "title": "[Feature] RR7 data router migration", + "state": "CLOSED", + "url": "https://github.com/ChronoAIProject/Ornn/issues/103", + "labels": [ + "dx" + ], + "deps": { + "blocked_by": [], + "blocks": [], + "tracks": [], + "tracked_by": [] + } + }, + "98": { + "number": 98, + "title": "[Feature] In-Ornn notification center for audit + share-review events", + "state": "CLOSED", + "url": "https://github.com/ChronoAIProject/Ornn/issues/98", + "labels": [ + "enhancement", + "phase:3", + "dx", + "api" + ], + "deps": { + "blocked_by": [], + "blocks": [ + 96, + 97 + ], + "tracks": [], + "tracked_by": [] + } + }, + "97": { + "number": 97, + "title": "[Feature] Target-based review routing for failed-audit shares (org admin / recipient / Ornn admin)", + "state": "CLOSED", + "url": "https://github.com/ChronoAIProject/Ornn/issues/97", + "labels": [ + "enhancement", + "phase:3", + "api", + "security" + ], + "deps": { + "blocked_by": [ + 96, + 98 + ], + "blocks": [], + "tracks": [], + "tracked_by": [] + } + }, + "96": { + "number": 96, + "title": "[Feature] Owner justification flow on failed audit for share", + "state": "CLOSED", + "url": "https://github.com/ChronoAIProject/Ornn/issues/96", + "labels": [ + "enhancement", + "phase:3", + "dx", + "security" + ], + "deps": { + "blocked_by": [ + 95, + 98 + ], + "blocks": [ + 97 + ], + "tracks": [], + "tracked_by": [] + } + }, + "95": { + "number": 95, + "title": "[Feature] Move audit trigger from publish to share; private skills exempt", + "state": "CLOSED", + "url": "https://github.com/ChronoAIProject/Ornn/issues/95", + "labels": [ + "enhancement", + "phase:3", + "api", + "security" + ], + "deps": { + "blocked_by": [ + 32 + ], + "blocks": [], + "tracks": [], + "tracked_by": [] + } + }, + "94": { + "number": 94, + "title": "[Feature] Auditing-gated skill sharing: private skills skip audit; shared skills require green audit or reviewed justification", + "state": "CLOSED", + "url": "https://github.com/ChronoAIProject/Ornn/issues/94", + "labels": [ + "enhancement", + "phase:3", + "security" + ], + "deps": { + "blocked_by": [ + 32 + ], + "blocks": [], + "tracks": [], + "tracked_by": [] + } + }, + "34": { + "number": 34, + "title": "[Feature] Skill analytics & observability dashboard", + "state": "CLOSED", + "url": "https://github.com/ChronoAIProject/Ornn/issues/34", + "labels": [ + "phase:3", + "dx" + ], + "deps": { + "blocked_by": [], + "blocks": [], + "tracks": [], + "tracked_by": [] + } + }, + "33": { + "number": 33, + "title": "[Feature] Skill activation waiver system", + "state": "CLOSED", + "url": "https://github.com/ChronoAIProject/Ornn/issues/33", + "labels": [ + "phase:3", + "security" + ], + "deps": { + "blocked_by": [], + "blocks": [], + "tracks": [], + "tracked_by": [] + } + }, + "32": { + "number": 32, + "title": "[Feature] LLM-based quality & security audit with multi-dimensional scoring", + "state": "CLOSED", + "url": "https://github.com/ChronoAIProject/Ornn/issues/32", + "labels": [ + "phase:3", + "security" + ], + "deps": { + "blocked_by": [], + "blocks": [], + "tracks": [], + "tracked_by": [] + } + }, + "26": { + "number": 26, + "title": "[Feature] Skill diff & changelog on version updates", + "state": "CLOSED", + "url": "https://github.com/ChronoAIProject/Ornn/issues/26", + "labels": [ + "phase:3", + "dx" + ], + "deps": { + "blocked_by": [ + 25 + ], + "blocks": [], + "tracks": [], + "tracked_by": [] + } + }, + "3": { + "number": 3, + "title": "[Feature] Skill Audit & Community", + "state": "CLOSED", + "url": "https://github.com/ChronoAIProject/Ornn/issues/3", + "labels": [ + "enhancement", + "phase:3", + "security" + ], + "deps": { + "blocked_by": [], + "blocks": [], + "tracks": [], + "tracked_by": [] + } + } + } + }, + "Ornn-M4-Go-Live-Prep": { + "milestone": { + "title": "M4 — Go Live Prep", + "number": 18, + "url": "https://github.com/ChronoAIProject/Ornn/milestone/18", + "repo": "ChronoAIProject/Ornn" + }, + "issues": { + "507": { + "number": 507, + "title": "[Bug] Recipients tooltip on BroadcastsPage unreadable for many recipients", + "state": "OPEN", + "url": "https://github.com/ChronoAIProject/Ornn/issues/507", + "labels": [ + "bug", + "web" + ], + "deps": { + "blocked_by": [], + "blocks": [], + "tracks": [], + "tracked_by": [] + } + }, + "506": { + "number": 506, + "title": "[Misc] Decide whether admins can be broadcast recipients (UserEmailPicker role scope)", + "state": "OPEN", + "url": "https://github.com/ChronoAIProject/Ornn/issues/506", + "labels": [ + "question", + "web" + ], + "deps": { + "blocked_by": [], + "blocks": [], + "tracks": [], + "tracked_by": [] + } + }, + "505": { + "number": 505, + "title": "[Feature] Admin user-id-to-email lookup endpoint for picker resolution", + "state": "OPEN", + "url": "https://github.com/ChronoAIProject/Ornn/issues/505", + "labels": [ + "enhancement", + "api", + "web" + ], + "deps": { + "blocked_by": [], + "blocks": [], + "tracks": [], + "tracked_by": [] + } + }, + "286": { + "number": 286, + "title": "[Misc] Migrate residual neon-input class to semantic input tokens", + "state": "OPEN", + "url": "https://github.com/ChronoAIProject/Ornn/issues/286", + "labels": [ + "dx" + ], + "deps": { + "blocked_by": [], + "blocks": [], + "tracks": [], + "tracked_by": [] + } + }, + "220": { + "number": 220, + "title": "[Bug] NyxID service registry: 'ornn' slug had wrong upstream + identity-mode mismatch with 'ornn-api' slug", + "state": "OPEN", + "url": "https://github.com/ChronoAIProject/Ornn/issues/220", + "labels": [ + "bug", + "infra", + "security" + ], + "deps": { + "blocked_by": [], + "blocks": [], + "tracks": [], + "tracked_by": [] + } + }, + "22": { + "number": 22, + "title": "[Misc] Owner 自主目标: 定义 Ornn O1 路径 + 开发者触达计划", + "state": "OPEN", + "url": "https://github.com/ChronoAIProject/Ornn/issues/22", + "labels": [ + "phase:1", + "dx" + ], + "deps": { + "blocked_by": [], + "blocks": [], + "tracks": [], + "tracked_by": [] + } + }, + "572": { + "number": 572, + "title": "[Docs] Surface Ornn official website link in README", + "state": "CLOSED", + "url": "https://github.com/ChronoAIProject/Ornn/issues/572", + "labels": [ + "documentation" + ], + "deps": { + "blocked_by": [], + "blocks": [], + "tracks": [], + "tracked_by": [] + } + }, + "560": { + "number": 560, + "title": "[Docs] Refresh ornn-agent-manual-cli skill to v1.2 against develop API", + "state": "CLOSED", + "url": "https://github.com/ChronoAIProject/Ornn/issues/560", + "labels": [ + "documentation", + "dx", + "api" + ], + "deps": { + "blocked_by": [], + "blocks": [], + "tracks": [], + "tracked_by": [] + } + }, + "553": { + "number": 553, + "title": "[Feature] Pin launch-celebration content to top of /news page", + "state": "CLOSED", + "url": "https://github.com/ChronoAIProject/Ornn/issues/553", + "labels": [ + "web" + ], + "deps": { + "blocked_by": [], + "blocks": [], + "tracks": [], + "tracked_by": [] + } + }, + "551": { + "number": 551, + "title": "[Misc] Playground Package drawer absorbs Skill drawer; gen-page pulses on new iterations; drawer-width / scroll polish", + "state": "CLOSED", + "url": "https://github.com/ChronoAIProject/Ornn/issues/551", + "labels": [ + "web" + ], + "deps": { + "blocked_by": [], + "blocks": [], + "tracks": [], + "tracked_by": [] + } + }, + "549": { + "number": 549, + "title": "[Misc] Redemption-code note masking — replace ambiguous ellipsis with **** so users don't think text is truncated", + "state": "CLOSED", + "url": "https://github.com/ChronoAIProject/Ornn/issues/549", + "labels": [ + "dx", + "api" + ], + "deps": { + "blocked_by": [], + "blocks": [], + "tracks": [], + "tracked_by": [] + } + }, + "547": { + "number": 547, + "title": "[Misc] Skill package preview + chat drawers — flatten layout, pin actions, fix navbar overlap", + "state": "CLOSED", + "url": "https://github.com/ChronoAIProject/Ornn/issues/547", + "labels": [ + "web" + ], + "deps": { + "blocked_by": [], + "blocks": [], + "tracks": [], + "tracked_by": [] + } + }, + "532": { + "number": 532, + "title": "[Bug] Quota credit notifications can't be opened — dead clicks on /notifications and bell", + "state": "CLOSED", + "url": "https://github.com/ChronoAIProject/Ornn/issues/532", + "labels": [ + "bug", + "web" + ], + "deps": { + "blocked_by": [], + "blocks": [], + "tracks": [], + "tracked_by": [] + } + }, + "526": { + "number": 526, + "title": "[Misc] LaunchCelebrationPopup — polish (offer-tile flow + caption consistency)", + "state": "CLOSED", + "url": "https://github.com/ChronoAIProject/Ornn/issues/526", + "labels": [ + "dx" + ], + "deps": { + "blocked_by": [], + "blocks": [], + "tracks": [], + "tracked_by": [] + } + }, + "524": { + "number": 524, + "title": "[Misc] LaunchCelebrationPopup — add fulfillment note (24h delivery, where to redeem, support link)", + "state": "CLOSED", + "url": "https://github.com/ChronoAIProject/Ornn/issues/524", + "labels": [ + "dx" + ], + "deps": { + "blocked_by": [], + "blocks": [], + "tracks": [], + "tracked_by": [] + } + }, + "522": { + "number": 522, + "title": "[Bug] Playground / skill-gen rail tab labels render upside-down for CJK", + "state": "CLOSED", + "url": "https://github.com/ChronoAIProject/Ornn/issues/522", + "labels": [ + "bug", + "web" + ], + "deps": { + "blocked_by": [], + "blocks": [], + "tracks": [], + "tracked_by": [] + } + }, + "517": { + "number": 517, + "title": "[Bug] LaunchCelebrationPopup — letterpress plate paints OVER card surface, breaks light mode", + "state": "CLOSED", + "url": "https://github.com/ChronoAIProject/Ornn/issues/517", + "labels": [ + "bug", + "web" + ], + "deps": { + "blocked_by": [], + "blocks": [], + "tracks": [], + "tracked_by": [] + } + }, + "515": { + "number": 515, + "title": "[Bug] LaunchCelebrationPopup — light-theme broken, design not launch-worthy", + "state": "CLOSED", + "url": "https://github.com/ChronoAIProject/Ornn/issues/515", + "labels": [ + "bug", + "web" + ], + "deps": { + "blocked_by": [], + "blocks": [], + "tracks": [], + "tracked_by": [] + } + }, + "513": { + "number": 513, + "title": "[Bug] LaunchCelebrationPopup — low contrast on ember surface, GitHub link invisible", + "state": "CLOSED", + "url": "https://github.com/ChronoAIProject/Ornn/issues/513", + "labels": [ + "bug", + "web" + ], + "deps": { + "blocked_by": [], + "blocks": [], + "tracks": [], + "tracked_by": [] + } + }, + "511": { + "number": 511, + "title": "[Feature] Landing-page launch-celebration popup (hardcoded, every-visit)", + "state": "CLOSED", + "url": "https://github.com/ChronoAIProject/Ornn/issues/511", + "labels": [ + "enhancement", + "web" + ], + "deps": { + "blocked_by": [], + "blocks": [], + "tracks": [], + "tracked_by": [] + } + }, + "509": { + "number": 509, + "title": "[Bug] Clicking broadcast notification triggers update-depth loop (React error #185)", + "state": "CLOSED", + "url": "https://github.com/ChronoAIProject/Ornn/issues/509", + "labels": [ + "bug", + "web" + ], + "deps": { + "blocked_by": [], + "blocks": [], + "tracks": [], + "tracked_by": [] + } + }, + "503": { + "number": 503, + "title": "[Bug] Playground + Generative skill builder — i18n gaps in hero, starters, drawer, quota chip, model picker", + "state": "CLOSED", + "url": "https://github.com/ChronoAIProject/Ornn/issues/503", + "labels": [ + "bug", + "i18n", + "web" + ], + "deps": { + "blocked_by": [], + "blocks": [], + "tracks": [], + "tracked_by": [] + } + }, + "502": { + "number": 502, + "title": "[Feature] Targeted broadcasts + click-to-popup markdown viewer", + "state": "CLOSED", + "url": "https://github.com/ChronoAIProject/Ornn/issues/502", + "labels": [ + "enhancement", + "api", + "i18n", + "web" + ], + "deps": { + "blocked_by": [], + "blocks": [], + "tracks": [ + 500 + ], + "tracked_by": [] + } + }, + "500": { + "number": 500, + "title": "[Feature] Admin broadcast notifications — author/edit/delete inbox messages for all users", + "state": "CLOSED", + "url": "https://github.com/ChronoAIProject/Ornn/issues/500", + "labels": [ + "enhancement", + "api", + "i18n", + "web" + ], + "deps": { + "blocked_by": [], + "blocks": [], + "tracks": [], + "tracked_by": [] + } + }, + "493": { + "number": 493, + "title": "[Feature] Bilingual announcements (EN + ZH)", + "state": "CLOSED", + "url": "https://github.com/ChronoAIProject/Ornn/issues/493", + "labels": [ + "dx", + "api" + ], + "deps": { + "blocked_by": [], + "blocks": [], + "tracks": [], + "tracked_by": [] + } + }, + "491": { + "number": 491, + "title": "[Bug] Contact page — Discussion category cards inconsistent height in same row", + "state": "CLOSED", + "url": "https://github.com/ChronoAIProject/Ornn/issues/491", + "labels": [ + "dx" + ], + "deps": { + "blocked_by": [], + "blocks": [], + "tracks": [], + "tracked_by": [] + } + }, + "484": { + "number": 484, + "title": "[Misc] Contact page — route between Discussions, Issues/PRs, and support email", + "state": "CLOSED", + "url": "https://github.com/ChronoAIProject/Ornn/issues/484", + "labels": [ + "dx" + ], + "deps": { + "blocked_by": [], + "blocks": [], + "tracks": [], + "tracked_by": [] + } + }, + "482": { + "number": 482, + "title": "[Misc] Cookie consent banner — drop PostHog vendor name from body copy", + "state": "CLOSED", + "url": "https://github.com/ChronoAIProject/Ornn/issues/482", + "labels": [ + "dx" + ], + "deps": { + "blocked_by": [], + "blocks": [], + "tracks": [], + "tracked_by": [] + } + }, + "475": { + "number": 475, + "title": "[Feature] Surface last-run status of the scheduled mirror reconcile", + "state": "CLOSED", + "url": "https://github.com/ChronoAIProject/Ornn/issues/475", + "labels": [ + "dx", + "api" + ], + "deps": { + "blocked_by": [], + "blocks": [], + "tracks": [], + "tracked_by": [] + } + }, + "437": { + "number": 437, + "title": "[Feature] In-process mirror reconcile scheduler with admin-configurable schedule", + "state": "CLOSED", + "url": "https://github.com/ChronoAIProject/Ornn/issues/437", + "labels": [ + "dx", + "api", + "infra" + ], + "deps": { + "blocked_by": [], + "blocks": [], + "tracks": [], + "tracked_by": [] + } + }, + "418": { + "number": 418, + "title": "[Bug] Install card stretches too wide on desktop — cap its max-width", + "state": "CLOSED", + "url": "https://github.com/ChronoAIProject/Ornn/issues/418", + "labels": [ + "bug", + "dx" + ], + "deps": { + "blocked_by": [], + "blocks": [], + "tracks": [], + "tracked_by": [] + } + }, + "416": { + "number": 416, + "title": "[Bug] Install card — Via npx has giant empty space, COPY button looks disconnected on Via prompt", + "state": "CLOSED", + "url": "https://github.com/ChronoAIProject/Ornn/issues/416", + "labels": [ + "bug", + "dx" + ], + "deps": { + "blocked_by": [], + "blocks": [], + "tracks": [], + "tracked_by": [] + } + }, + "414": { + "number": 414, + "title": "[Bug] Install card — Via prompt is too tall, card height changes when switching tabs", + "state": "CLOSED", + "url": "https://github.com/ChronoAIProject/Ornn/issues/414", + "labels": [ + "bug", + "dx" + ], + "deps": { + "blocked_by": [], + "blocks": [], + "tracks": [], + "tracked_by": [] + } + }, + "413": { + "number": 413, + "title": "[Bug] Install card hidden for unauthenticated viewers — should follow skill visibility", + "state": "CLOSED", + "url": "https://github.com/ChronoAIProject/Ornn/issues/413", + "labels": [ + "bug", + "dx" + ], + "deps": { + "blocked_by": [], + "blocks": [], + "tracks": [], + "tracked_by": [] + } + }, + "411": { + "number": 411, + "title": "[Feature] Skill detail — fold install-to-agent prompt + npx into one tabbed Install card", + "state": "CLOSED", + "url": "https://github.com/ChronoAIProject/Ornn/issues/411", + "labels": [ + "dx", + "i18n" + ], + "deps": { + "blocked_by": [], + "blocks": [], + "tracks": [], + "tracked_by": [] + } + }, + "381": { + "number": 381, + "title": "[Bug] UploadSkillPage (Build entry) is not responsive — content clipped on common laptop sizes", + "state": "CLOSED", + "url": "https://github.com/ChronoAIProject/Ornn/issues/381", + "labels": [ + "bug", + "dx", + "i18n" + ], + "deps": { + "blocked_by": [], + "blocks": [], + "tracks": [], + "tracked_by": [] + } + }, + "379": { + "number": 379, + "title": "[Bug] User menu — NyxID 'My Services' and 'Admin Services' links point to wrong URLs", + "state": "CLOSED", + "url": "https://github.com/ChronoAIProject/Ornn/issues/379", + "labels": [ + "bug", + "dx" + ], + "deps": { + "blocked_by": [], + "blocks": [], + "tracks": [], + "tracked_by": [] + } + }, + "377": { + "number": 377, + "title": "[Misc] OSS repo-health setup: community files, issue/PR templates, discoverability metadata", + "state": "CLOSED", + "url": "https://github.com/ChronoAIProject/Ornn/issues/377", + "labels": [ + "documentation", + "dx" + ], + "deps": { + "blocked_by": [], + "blocks": [], + "tracks": [], + "tracked_by": [] + } + }, + "375": { + "number": 375, + "title": "[Misc] Consolidate LandingNav into unified Navbar + reorder items", + "state": "CLOSED", + "url": "https://github.com/ChronoAIProject/Ornn/issues/375", + "labels": [ + "enhancement", + "dx" + ], + "deps": { + "blocked_by": [], + "blocks": [], + "tracks": [], + "tracked_by": [] + } + }, + "373": { + "number": 373, + "title": "[Feature] i18n the PostHog cookie-consent banner", + "state": "CLOSED", + "url": "https://github.com/ChronoAIProject/Ornn/issues/373", + "labels": [ + "dx" + ], + "deps": { + "blocked_by": [], + "blocks": [], + "tracks": [], + "tracked_by": [] + } + }, + "369": { + "number": 369, + "title": "[Docs] Rewrite README: trim header, drop developer-internals sections, add agent-onboarding flow", + "state": "CLOSED", + "url": "https://github.com/ChronoAIProject/Ornn/issues/369", + "labels": [ + "documentation" + ], + "deps": { + "blocked_by": [], + "blocks": [], + "tracks": [ + 365 + ], + "tracked_by": [] + } + }, + "367": { + "number": 367, + "title": "[Misc] Replace favicon with the Forge gear (transparent background)", + "state": "CLOSED", + "url": "https://github.com/ChronoAIProject/Ornn/issues/367", + "labels": [ + "documentation", + "enhancement" + ], + "deps": { + "blocked_by": [], + "blocks": [], + "tracks": [], + "tracked_by": [] + } + }, + "365": { + "number": 365, + "title": "[Bug] README logo washes out on GitHub light mode — wordmark hardcoded to dark-theme parchment", + "state": "CLOSED", + "url": "https://github.com/ChronoAIProject/Ornn/issues/365", + "labels": [ + "bug", + "documentation" + ], + "deps": { + "blocked_by": [], + "blocks": [], + "tracks": [], + "tracked_by": [] + } + }, + "363": { + "number": 363, + "title": "[Bug] Extract shared UserMenuItems to stop Navbar/LandingNav dropdown drift", + "state": "CLOSED", + "url": "https://github.com/ChronoAIProject/Ornn/issues/363", + "labels": [ + "bug", + "enhancement", + "dx" + ], + "deps": { + "blocked_by": [], + "blocks": [], + "tracks": [], + "tracked_by": [] + } + }, + "361": { + "number": 361, + "title": "[Bug] i18n + nav coverage gaps: Redeem code, admin Dashboard, LandingNav News", + "state": "CLOSED", + "url": "https://github.com/ChronoAIProject/Ornn/issues/361", + "labels": [ + "bug", + "i18n" + ], + "deps": { + "blocked_by": [], + "blocks": [], + "tracks": [], + "tracked_by": [] + } + }, + "359": { + "number": 359, + "title": "[Bug] Replace browser native alert/confirm dialogs with Ornn ConfirmDialog component", + "state": "CLOSED", + "url": "https://github.com/ChronoAIProject/Ornn/issues/359", + "labels": [ + "bug", + "enhancement", + "dx" + ], + "deps": { + "blocked_by": [], + "blocks": [], + "tracks": [], + "tracked_by": [] + } + }, + "357": { + "number": 357, + "title": "[Feature] News page listing all released announcements", + "state": "CLOSED", + "url": "https://github.com/ChronoAIProject/Ornn/issues/357", + "labels": [ + "enhancement", + "api" + ], + "deps": { + "blocked_by": [], + "blocks": [], + "tracks": [], + "tracked_by": [] + } + }, + "355": { + "number": 355, + "title": "[Bug] Admin pages missing top Navbar (no theme/language switcher, no main nav)", + "state": "CLOSED", + "url": "https://github.com/ChronoAIProject/Ornn/issues/355", + "labels": [ + "bug" + ], + "deps": { + "blocked_by": [], + "blocks": [], + "tracks": [], + "tracked_by": [] + } + }, + "352": { + "number": 352, + "title": "[Misc] Drop unused ornn-web/public/ assets + align README logo with frontend Logo.tsx", + "state": "CLOSED", + "url": "https://github.com/ChronoAIProject/Ornn/issues/352", + "labels": [ + "documentation" + ], + "deps": { + "blocked_by": [], + "blocks": [], + "tracks": [], + "tracked_by": [] + } + }, + "348": { + "number": 348, + "title": "[Misc] i18n coverage — review 11 suspicious zh==en values (P2)", + "state": "CLOSED", + "url": "https://github.com/ChronoAIProject/Ornn/issues/348", + "labels": [ + "dx", + "i18n" + ], + "deps": { + "blocked_by": [], + "blocks": [], + "tracks": [], + "tracked_by": [] + } + }, + "347": { + "number": 347, + "title": "[Feature] i18n coverage — services/utils error-code refactor (P2, structural)", + "state": "CLOSED", + "url": "https://github.com/ChronoAIProject/Ornn/issues/347", + "labels": [ + "dx", + "api", + "i18n" + ], + "deps": { + "blocked_by": [], + "blocks": [], + "tracks": [], + "tracked_by": [] + } + }, + "346": { + "number": 346, + "title": "[Feature] i18n coverage — aria-label sweep across landing, layout, admin (P1)", + "state": "CLOSED", + "url": "https://github.com/ChronoAIProject/Ornn/issues/346", + "labels": [ + "dx", + "i18n" + ], + "deps": { + "blocked_by": [], + "blocks": [], + "tracks": [], + "tracked_by": [] + } + }, + "345": { + "number": 345, + "title": "[Feature] i18n coverage — form, skill, settings, user, editor components (P1)", + "state": "CLOSED", + "url": "https://github.com/ChronoAIProject/Ornn/issues/345", + "labels": [ + "dx", + "i18n" + ], + "deps": { + "blocked_by": [], + "blocks": [], + "tracks": [], + "tracked_by": [] + } + }, + "344": { + "number": 344, + "title": "[Feature] i18n coverage — shared controls + drawer Close (P0)", + "state": "CLOSED", + "url": "https://github.com/ChronoAIProject/Ornn/issues/344", + "labels": [ + "dx", + "i18n" + ], + "deps": { + "blocked_by": [], + "blocks": [], + "tracks": [], + "tracked_by": [] + } + }, + "343": { + "number": 343, + "title": "[Feature] i18n coverage — pages/admin/* (P0)", + "state": "CLOSED", + "url": "https://github.com/ChronoAIProject/Ornn/issues/343", + "labels": [ + "dx", + "i18n" + ], + "deps": { + "blocked_by": [], + "blocks": [], + "tracks": [], + "tracked_by": [] + } + }, + "341": { + "number": 341, + "title": "[Bug] SkillDetailPage main grid grows infinitely with long content — fix to viewport-relative frame with per-column scroll", + "state": "CLOSED", + "url": "https://github.com/ChronoAIProject/Ornn/issues/341", + "labels": [ + "bug", + "dx" + ], + "deps": { + "blocked_by": [], + "blocks": [], + "tracks": [], + "tracked_by": [] + } + }, + "339": { + "number": 339, + "title": "[Chore] i18n cleanup pre-v0.6.0 — drop workshop/forge framing + t()-ify ServiceDetailPage + AnnouncementsPage", + "state": "CLOSED", + "url": "https://github.com/ChronoAIProject/Ornn/issues/339", + "labels": [ + "dx" + ], + "deps": { + "blocked_by": [], + "blocks": [], + "tracks": [], + "tracked_by": [] + } + }, + "335": { + "number": 335, + "title": "[Bug] Settings export still includes provider 'models' array — drop entirely", + "state": "CLOSED", + "url": "https://github.com/ChronoAIProject/Ornn/issues/335", + "labels": [ + "bug", + "dx" + ], + "deps": { + "blocked_by": [], + "blocks": [], + "tracks": [], + "tracked_by": [] + } + }, + "333": { + "number": 333, + "title": "[Chore] Landing — remove the 'NOW FORGING · v 0.9.3' stamp", + "state": "CLOSED", + "url": "https://github.com/ChronoAIProject/Ornn/issues/333", + "labels": [ + "dx" + ], + "deps": { + "blocked_by": [], + "blocks": [], + "tracks": [], + "tracked_by": [] + } + }, + "330": { + "number": 330, + "title": "[Bug] Admin settings Export/Import broken — both directions", + "state": "CLOSED", + "url": "https://github.com/ChronoAIProject/Ornn/issues/330", + "labels": [ + "bug", + "api" + ], + "deps": { + "blocked_by": [], + "blocks": [], + "tracks": [], + "tracked_by": [] + } + }, + "328": { + "number": 328, + "title": "[Chore] Manually re-apply v0.5.0 sync onto develop after stale sync PR closed", + "state": "CLOSED", + "url": "https://github.com/ChronoAIProject/Ornn/issues/328", + "labels": [ + "dx", + "infra" + ], + "deps": { + "blocked_by": [], + "blocks": [], + "tracks": [], + "tracked_by": [] + } + }, + "326": { + "number": 326, + "title": "[Chore] Reposition Ornn as end-to-end skill life-cycle manager + drop redundant footer link columns", + "state": "CLOSED", + "url": "https://github.com/ChronoAIProject/Ornn/issues/326", + "labels": [ + "dx" + ], + "deps": { + "blocked_by": [], + "blocks": [], + "tracks": [], + "tracked_by": [] + } + }, + "324": { + "number": 324, + "title": "[Feature] Landing — trim to hero + reposition copy as skill life-cycle manager", + "state": "CLOSED", + "url": "https://github.com/ChronoAIProject/Ornn/issues/324", + "labels": [ + "dx" + ], + "deps": { + "blocked_by": [], + "blocks": [], + "tracks": [], + "tracked_by": [] + } + }, + "322": { + "number": 322, + "title": "[Chore] Consolidate legal-page email contacts to support@chrono-ai.fun", + "state": "CLOSED", + "url": "https://github.com/ChronoAIProject/Ornn/issues/322", + "labels": [ + "dx" + ], + "deps": { + "blocked_by": [], + "blocks": [], + "tracks": [], + "tracked_by": [] + } + }, + "320": { + "number": 320, + "title": "[Feature] Legal pages — Privacy / ToS / AUP for launch + contact-page trim", + "state": "CLOSED", + "url": "https://github.com/ChronoAIProject/Ornn/issues/320", + "labels": [ + "dx" + ], + "deps": { + "blocked_by": [], + "blocks": [], + "tracks": [], + "tracked_by": [] + } + }, + "318": { + "number": 318, + "title": "[Feature] SPA stale-bundle self-recovery — auto-reload when a new ornn-web is deployed", + "state": "CLOSED", + "url": "https://github.com/ChronoAIProject/Ornn/issues/318", + "labels": [ + "dx", + "infra" + ], + "deps": { + "blocked_by": [], + "blocks": [], + "tracks": [], + "tracked_by": [] + } + }, + "316": { + "number": 316, + "title": "[Bug] Username sometimes shows as UUID after browser restart — id_token-light backfill never re-runs on rehydrate", + "state": "CLOSED", + "url": "https://github.com/ChronoAIProject/Ornn/issues/316", + "labels": [ + "bug" + ], + "deps": { + "blocked_by": [], + "blocks": [], + "tracks": [], + "tracked_by": [] + } + }, + "314": { + "number": 314, + "title": "[Chore] api.request — capture userAgent / query keys / request+response bytes for richer observability", + "state": "CLOSED", + "url": "https://github.com/ChronoAIProject/Ornn/issues/314", + "labels": [ + "dx" + ], + "deps": { + "blocked_by": [], + "blocks": [], + "tracks": [], + "tracked_by": [] + } + }, + "312": { + "number": 312, + "title": "[Feature] Restyle landing announcement popup as ember-stamp card", + "state": "CLOSED", + "url": "https://github.com/ChronoAIProject/Ornn/issues/312", + "labels": [ + "enhancement" + ], + "deps": { + "blocked_by": [], + "blocks": [], + "tracks": [], + "tracked_by": [] + } + }, + "310": { + "number": 310, + "title": "[Bug] Redeem code form unreachable — SettingsPage not mounted in router", + "state": "CLOSED", + "url": "https://github.com/ChronoAIProject/Ornn/issues/310", + "labels": [ + "bug" + ], + "deps": { + "blocked_by": [], + "blocks": [], + "tracks": [], + "tracked_by": [] + } + }, + "307": { + "number": 307, + "title": "[Feature] Landing-page announcement popup (admin-managed)", + "state": "CLOSED", + "url": "https://github.com/ChronoAIProject/Ornn/issues/307", + "labels": [ + "enhancement", + "api" + ], + "deps": { + "blocked_by": [], + "blocks": [], + "tracks": [], + "tracked_by": [] + } + }, + "306": { + "number": 306, + "title": "[Feature] Admin-issued redeem codes for quota grants", + "state": "CLOSED", + "url": "https://github.com/ChronoAIProject/Ornn/issues/306", + "labels": [ + "enhancement", + "api" + ], + "deps": { + "blocked_by": [], + "blocks": [], + "tracks": [], + "tracked_by": [] + } + }, + "304": { + "number": 304, + "title": "[Chore] PostHog hardening — respect DNT + mask all session-replay text", + "state": "CLOSED", + "url": "https://github.com/ChronoAIProject/Ornn/issues/304", + "labels": [ + "dx" + ], + "deps": { + "blocked_by": [], + "blocks": [], + "tracks": [], + "tracked_by": [] + } + }, + "302": { + "number": 302, + "title": "[Chore] Admin settings reorganization — fold quota into surfaces, services into NyxID, rename telemetry/extras", + "state": "CLOSED", + "url": "https://github.com/ChronoAIProject/Ornn/issues/302", + "labels": [ + "dx" + ], + "deps": { + "blocked_by": [], + "blocks": [], + "tracks": [], + "tracked_by": [] + } + }, + "300": { + "number": 300, + "title": "[Bug] Playground model dropdown clipped — open upward when bottom is tight", + "state": "CLOSED", + "url": "https://github.com/ChronoAIProject/Ornn/issues/300", + "labels": [ + "bug", + "dx" + ], + "deps": { + "blocked_by": [], + "blocks": [], + "tracks": [], + "tracked_by": [] + } + }, + "298": { + "number": 298, + "title": "[Bug] ornn-web /api/v1/* proxy_pass broken in dev — wrong architecture: SPA should hit NyxID proxy directly", + "state": "CLOSED", + "url": "https://github.com/ChronoAIProject/Ornn/issues/298", + "labels": [ + "bug", + "infra" + ], + "deps": { + "blocked_by": [], + "blocks": [], + "tracks": [], + "tracked_by": [] + } + }, + "292": { + "number": 292, + "title": "[Chore] Delete admin Categories / Tags / Auditing / Activities pages — fold redundant link into Dashboard", + "state": "CLOSED", + "url": "https://github.com/ChronoAIProject/Ornn/issues/292", + "labels": [ + "dx" + ], + "deps": { + "blocked_by": [], + "blocks": [], + "tracks": [], + "tracked_by": [] + } + }, + "290": { + "number": 290, + "title": "[Bug] /admin/users 500s with ZodError on sort param — frontend sends key:dir, backend wants two params", + "state": "CLOSED", + "url": "https://github.com/ChronoAIProject/Ornn/issues/290", + "labels": [ + "dx" + ], + "deps": { + "blocked_by": [], + "blocks": [], + "tracks": [], + "tracked_by": [] + } + }, + "284": { + "number": 284, + "title": "[Bug] Extras section name regex rejects uppercase — can't add 'NyxID'", + "state": "CLOSED", + "url": "https://github.com/ChronoAIProject/Ornn/issues/284", + "labels": [ + "dx" + ], + "deps": { + "blocked_by": [], + "blocks": [], + "tracks": [], + "tracked_by": [] + } + }, + "283": { + "number": 283, + "title": "[Misc] Pre-production UI audit + fixes", + "state": "CLOSED", + "url": "https://github.com/ChronoAIProject/Ornn/issues/283", + "labels": [ + "enhancement", + "dx" + ], + "deps": { + "blocked_by": [], + "blocks": [], + "tracks": [], + "tracked_by": [] + } + }, + "281": { + "number": 281, + "title": "[Bug] Replace browser-native window.confirm in UnsavedChangesGuard with styled Modal", + "state": "CLOSED", + "url": "https://github.com/ChronoAIProject/Ornn/issues/281", + "labels": [ + "dx" + ], + "deps": { + "blocked_by": [], + "blocks": [], + "tracks": [], + "tracked_by": [] + } + }, + "279": { + "number": 279, + "title": "[Bug] Extras section — baseUrl rejects empty string in admin form (frontend-only)", + "state": "CLOSED", + "url": "https://github.com/ChronoAIProject/Ornn/issues/279", + "labels": [ + "dx" + ], + "deps": { + "blocked_by": [], + "blocks": [], + "tracks": [], + "tracked_by": [] + } + }, + "278": { + "number": 278, + "title": "[Feature] Embed contact page into the frontend", + "state": "CLOSED", + "url": "https://github.com/ChronoAIProject/Ornn/issues/278", + "labels": [ + "enhancement", + "dx" + ], + "deps": { + "blocked_by": [], + "blocks": [], + "tracks": [], + "tracked_by": [] + } + }, + "275": { + "number": 275, + "title": "[Feature] Move NyxID frontend link config from admin settings to ornn-web runtime config", + "state": "CLOSED", + "url": "https://github.com/ChronoAIProject/Ornn/issues/275", + "labels": [ + "dx" + ], + "deps": { + "blocked_by": [], + "blocks": [], + "tracks": [], + "tracked_by": [] + } + }, + "270": { + "number": 270, + "title": "[Feature] Fold model catalog into LLM Provider settings (per-provider model management)", + "state": "CLOSED", + "url": "https://github.com/ChronoAIProject/Ornn/issues/270", + "labels": [ + "dx" + ], + "deps": { + "blocked_by": [], + "blocks": [], + "tracks": [], + "tracked_by": [] + } + }, + "268": { + "number": 268, + "title": "[Feature] Quota redesign + admin panel restructure + centralized settings", + "state": "CLOSED", + "url": "https://github.com/ChronoAIProject/Ornn/issues/268", + "labels": [ + "enhancement", + "dx", + "api" + ], + "deps": { + "blocked_by": [], + "blocks": [], + "tracks": [], + "tracked_by": [] + } + }, + "266": { + "number": 266, + "title": "[Feature] Apply Playground UI/UX design principles to Generative Skill creation page", + "state": "CLOSED", + "url": "https://github.com/ChronoAIProject/Ornn/issues/266", + "labels": [ + "documentation", + "enhancement" + ], + "deps": { + "blocked_by": [], + "blocks": [], + "tracks": [], + "tracked_by": [] + } + }, + "253": { + "number": 253, + "title": "[Feature] AgentSeal integration — security trust score on every published skill", + "state": "CLOSED", + "url": "https://github.com/ChronoAIProject/Ornn/issues/253", + "labels": [ + "api", + "security" + ], + "deps": { + "blocked_by": [], + "blocks": [], + "tracks": [], + "tracked_by": [] + } + }, + "252": { + "number": 252, + "title": "[Feature] PostHog integration — platform-wide product analytics", + "state": "CLOSED", + "url": "https://github.com/ChronoAIProject/Ornn/issues/252", + "labels": [ + "dx", + "api" + ], + "deps": { + "blocked_by": [], + "blocks": [], + "tracks": [], + "tracked_by": [] + } + }, + "251": { + "number": 251, + "title": "[Feature] Admin model selection (Chrono LLM catalog) + per-call user picker", + "state": "CLOSED", + "url": "https://github.com/ChronoAIProject/Ornn/issues/251", + "labels": [ + "dx", + "api" + ], + "deps": { + "blocked_by": [], + "blocks": [], + "tracks": [], + "tracked_by": [] + } + }, + "250": { + "number": 250, + "title": "[Feature] Per-user playground & skill-gen quota with admin-granted beta credits", + "state": "CLOSED", + "url": "https://github.com/ChronoAIProject/Ornn/issues/250", + "labels": [ + "dx", + "api" + ], + "deps": { + "blocked_by": [], + "blocks": [], + "tracks": [], + "tracked_by": [] + } + }, + "248": { + "number": 248, + "title": "[Feature] Auto-mirror public + system skills to ChronoAIProject/ornn-skills GitHub repo for npx skills compatibility", + "state": "CLOSED", + "url": "https://github.com/ChronoAIProject/Ornn/issues/248", + "labels": [ + "dx" + ], + "deps": { + "blocked_by": [], + "blocks": [], + "tracks": [], + "tracked_by": [] + } + }, + "245": { + "number": 245, + "title": "[Feature] Universal API audit middleware — all-route capture with redaction, caller-type detect, MongoDB + MinIO storage", + "state": "CLOSED", + "url": "https://github.com/ChronoAIProject/Ornn/issues/245", + "labels": [ + "api", + "security" + ], + "deps": { + "blocked_by": [], + "blocks": [], + "tracks": [], + "tracked_by": [] + } + }, + "242": { + "number": 242, + "title": "[Feature] Unified agent manual — fold NyxID + NyxID CLI into the Ornn agent manual as one skill", + "state": "CLOSED", + "url": "https://github.com/ChronoAIProject/Ornn/issues/242", + "labels": [ + "dx" + ], + "deps": { + "blocked_by": [ + 248 + ], + "blocks": [], + "tracks": [], + "tracked_by": [] + } + }, + "240": { + "number": 240, + "title": "[Feature] Featured-skill tag pills, nav active highlighter wash, skill-detail layout flow", + "state": "CLOSED", + "url": "https://github.com/ChronoAIProject/Ornn/issues/240", + "labels": [ + "dx" + ], + "deps": { + "blocked_by": [], + "blocks": [], + "tracks": [], + "tracked_by": [] + } + }, + "238": { + "number": 238, + "title": "[Bug] Admin user list + permissions-modal show empty email/displayName for users with non-empty activity history", + "state": "CLOSED", + "url": "https://github.com/ChronoAIProject/Ornn/issues/238", + "labels": [ + "dx" + ], + "deps": { + "blocked_by": [], + "blocks": [], + "tracks": [], + "tracked_by": [] + } + }, + "232": { + "number": 232, + "title": "[Feature] Forge Workshop v3 migration — app-shell visual alignment + landing-nav avatar dropdown", + "state": "CLOSED", + "url": "https://github.com/ChronoAIProject/Ornn/issues/232", + "labels": [ + "dx" + ], + "deps": { + "blocked_by": [], + "blocks": [], + "tracks": [], + "tracked_by": [] + } + }, + "229": { + "number": 229, + "title": "[Bug] /me/nyxid-services returns binary-garbage id for chrono-sandbox service", + "state": "CLOSED", + "url": "https://github.com/ChronoAIProject/Ornn/issues/229", + "labels": [ + "bug", + "api" + ], + "deps": { + "blocked_by": [], + "blocks": [], + "tracks": [], + "tracked_by": [] + } + }, + "226": { + "number": 226, + "title": "[Feature] Frontend: surface delete-non-latest-version in the UI", + "state": "CLOSED", + "url": "https://github.com/ChronoAIProject/Ornn/issues/226", + "labels": [ + "dx" + ], + "deps": { + "blocked_by": [], + "blocks": [], + "tracks": [], + "tracked_by": [] + } + }, + "225": { + "number": 225, + "title": "[Feature] Frontend: surface skill version diff in the UI", + "state": "CLOSED", + "url": "https://github.com/ChronoAIProject/Ornn/issues/225", + "labels": [ + "dx" + ], + "deps": { + "blocked_by": [], + "blocks": [], + "tracks": [], + "tracked_by": [] + } + }, + "223": { + "number": 223, + "title": "[Feature] System skills + registry redesign + NyxID-service ties", + "state": "CLOSED", + "url": "https://github.com/ChronoAIProject/Ornn/issues/223", + "labels": [ + "dx", + "api" + ], + "deps": { + "blocked_by": [], + "blocks": [], + "tracks": [], + "tracked_by": [] + } + }, + "221": { + "number": 221, + "title": "[Feature] Landing page redesign — editorial forge expression", + "state": "CLOSED", + "url": "https://github.com/ChronoAIProject/Ornn/issues/221", + "labels": [ + "dx" + ], + "deps": { + "blocked_by": [], + "blocks": [], + "tracks": [], + "tracked_by": [] + } + }, + "219": { + "number": 219, + "title": "[Bug] /admin/stats response shape doesn't match docs/api.md", + "state": "CLOSED", + "url": "https://github.com/ChronoAIProject/Ornn/issues/219", + "labels": [ + "bug", + "api" + ], + "deps": { + "blocked_by": [], + "blocks": [], + "tracks": [], + "tracked_by": [] + } + }, + "215": { + "number": 215, + "title": "[Docs] Restructure docs site (About / Quick Start / Technical References) + per-domain API reference + copy-as-skill agent manual", + "state": "CLOSED", + "url": "https://github.com/ChronoAIProject/Ornn/issues/215", + "labels": [ + "dx" + ], + "deps": { + "blocked_by": [], + "blocks": [], + "tracks": [], + "tracked_by": [] + } + }, + "213": { + "number": 213, + "title": "[Feature] Editorial Forge migration — Phase F: remaining pages sweep", + "state": "CLOSED", + "url": "https://github.com/ChronoAIProject/Ornn/issues/213", + "labels": [ + "dx" + ], + "deps": { + "blocked_by": [], + "blocks": [], + "tracks": [], + "tracked_by": [] + } + }, + "211": { + "number": 211, + "title": "[Feature] Editorial Forge migration — Phase E: registry / my-skills / audit history / edit", + "state": "CLOSED", + "url": "https://github.com/ChronoAIProject/Ornn/issues/211", + "labels": [ + "dx" + ], + "deps": { + "blocked_by": [], + "blocks": [], + "tracks": [], + "tracked_by": [] + } + }, + "209": { + "number": 209, + "title": "[Feature] Editorial Forge migration — Phase D: Landing + Docs", + "state": "CLOSED", + "url": "https://github.com/ChronoAIProject/Ornn/issues/209", + "labels": [ + "dx" + ], + "deps": { + "blocked_by": [], + "blocks": [], + "tracks": [], + "tracked_by": [] + } + }, + "207": { + "number": 207, + "title": "[Feature] Editorial Forge migration — Phase C: auth + 404 pages", + "state": "CLOSED", + "url": "https://github.com/ChronoAIProject/Ornn/issues/207", + "labels": [ + "dx" + ], + "deps": { + "blocked_by": [], + "blocks": [], + "tracks": [], + "tracked_by": [] + } + }, + "205": { + "number": 205, + "title": "[Feature] Editorial Forge migration — Phase B: global chrome + token remap", + "state": "CLOSED", + "url": "https://github.com/ChronoAIProject/Ornn/issues/205", + "labels": [ + "dx" + ], + "deps": { + "blocked_by": [], + "blocks": [], + "tracks": [], + "tracked_by": [] + } + }, + "203": { + "number": 203, + "title": "[Feature] Editorial Forge migration — Phase A: shared UI primitives", + "state": "CLOSED", + "url": "https://github.com/ChronoAIProject/Ornn/issues/203", + "labels": [ + "dx" + ], + "deps": { + "blocked_by": [], + "blocks": [], + "tracks": [], + "tracked_by": [] + } + }, + "201": { + "number": 201, + "title": "[Feature] Skill Detail Page redesign — Editorial Forge wireframe v1", + "state": "CLOSED", + "url": "https://github.com/ChronoAIProject/Ornn/issues/201", + "labels": [ + "dx" + ], + "deps": { + "blocked_by": [], + "blocks": [], + "tracks": [], + "tracked_by": [] + } + }, + "154": { + "number": 154, + "title": "[Docs] Consolidate docs site: add Agent Manual, merge Tech References, drop Version Roadmap/FAQs", + "state": "CLOSED", + "url": "https://github.com/ChronoAIProject/Ornn/issues/154", + "labels": [ + "documentation", + "dx" + ], + "deps": { + "blocked_by": [], + "blocks": [], + "tracks": [], + "tracked_by": [] + } + } + } + }, + "Ornn-M5-QA-Pre-Launch": { + "milestone": { + "title": "M5 — QA Pre-Launch Gate", + "number": 19, + "url": "https://github.com/ChronoAIProject/Ornn/milestone/19", + "repo": "ChronoAIProject/Ornn" + }, + "issues": { + "546": { + "number": 546, + "title": "[QA] 安全、权限与敏感信息处理测试", + "state": "OPEN", + "url": "https://github.com/ChronoAIProject/Ornn/issues/546", + "labels": [], + "deps": { + "blocked_by": [], + "blocks": [], + "tracks": [], + "tracked_by": [] + } + }, + "545": { + "number": 545, + "title": "[QA] CLI、Agent 与 NyxID proxy 功能测试", + "state": "OPEN", + "url": "https://github.com/ChronoAIProject/Ornn/issues/545", + "labels": [], + "deps": { + "blocked_by": [], + "blocks": [], + "tracks": [], + "tracked_by": [] + } + }, + "544": { + "number": 544, + "title": "[QA] 管理员 skill 管理、公告与平台配置功能测试", + "state": "OPEN", + "url": "https://github.com/ChronoAIProject/Ornn/issues/544", + "labels": [], + "deps": { + "blocked_by": [], + "blocks": [], + "tracks": [], + "tracked_by": [] + } + }, + "543": { + "number": 543, + "title": "[QA] 管理员 Dashboard、用户、配额与兑换码功能测试", + "state": "OPEN", + "url": "https://github.com/ChronoAIProject/Ornn/issues/543", + "labels": [], + "deps": { + "blocked_by": [], + "blocks": [], + "tracks": [], + "tracked_by": [] + } + }, + "542": { + "number": 542, + "title": "[QA] 用户侧 skill 管理、版本、权限、审计与 GitHub 同步功能测试", + "state": "OPEN", + "url": "https://github.com/ChronoAIProject/Ornn/issues/542", + "labels": [], + "deps": { + "blocked_by": [], + "blocks": [], + "tracks": [], + "tracked_by": [] + } + }, + "541": { + "number": 541, + "title": "[QA] 通知中心功能测试", + "state": "OPEN", + "url": "https://github.com/ChronoAIProject/Ornn/issues/541", + "labels": [], + "deps": { + "blocked_by": [], + "blocks": [], + "tracks": [], + "tracked_by": [] + } + }, + "540": { + "number": 540, + "title": "[QA] Playground 与 sandbox 功能测试", + "state": "OPEN", + "url": "https://github.com/ChronoAIProject/Ornn/issues/540", + "labels": [], + "deps": { + "blocked_by": [], + "blocks": [], + "tracks": [], + "tracked_by": [] + } + }, + "539": { + "number": 539, + "title": "[QA] Skill 包类型与格式校验功能测试", + "state": "OPEN", + "url": "https://github.com/ChronoAIProject/Ornn/issues/539", + "labels": [], + "deps": { + "blocked_by": [], + "blocks": [], + "tracks": [], + "tracked_by": [] + } + }, + "538": { + "number": 538, + "title": "[QA] Skill 创建与 GitHub 导入功能测试", + "state": "OPEN", + "url": "https://github.com/ChronoAIProject/Ornn/issues/538", + "labels": [], + "deps": { + "blocked_by": [], + "blocks": [], + "tracks": [], + "tracked_by": [] + } + }, + "537": { + "number": 537, + "title": "[QA] Skill Registry 与详情页功能测试", + "state": "OPEN", + "url": "https://github.com/ChronoAIProject/Ornn/issues/537", + "labels": [], + "deps": { + "blocked_by": [], + "blocks": [], + "tracks": [], + "tracked_by": [] + } + }, + "536": { + "number": 536, + "title": "[QA] 静态页面与公开导航功能测试", + "state": "OPEN", + "url": "https://github.com/ChronoAIProject/Ornn/issues/536", + "labels": [], + "deps": { + "blocked_by": [], + "blocks": [], + "tracks": [], + "tracked_by": [] + } + }, + "535": { + "number": 535, + "title": "[QA] 登录与权限控制功能测试", + "state": "OPEN", + "url": "https://github.com/ChronoAIProject/Ornn/issues/535", + "labels": [], + "deps": { + "blocked_by": [], + "blocks": [], + "tracks": [], + "tracked_by": [] + } + }, + "534": { + "number": 534, + "title": "[QA] Ornn 功能测试进度跟踪", + "state": "OPEN", + "url": "https://github.com/ChronoAIProject/Ornn/issues/534", + "labels": [], + "deps": { + "blocked_by": [], + "blocks": [], + "tracks": [ + 535, + 536, + 537, + 538, + 539, + 540, + 541, + 542, + 543, + 544, + 545, + 546 + ], + "tracked_by": [] + } + } + } + }, + "Ornn-M6-Code-Review-Hardening": { + "milestone": { + "title": "M6 — Code Review Hardening", + "number": 20, + "url": "https://github.com/ChronoAIProject/Ornn/milestone/20", + "repo": "ChronoAIProject/Ornn" + }, + "issues": { + "567": { + "number": 567, + "title": "Enforce skill visibility checks on JSON package endpoint", + "state": "OPEN", + "url": "https://github.com/ChronoAIProject/Ornn/issues/567", + "labels": [], + "deps": { + "blocked_by": [], + "blocks": [], + "tracks": [], + "tracked_by": [] + } + }, + "563": { + "number": 563, + "title": "[Bug] [Permissions] Non-owner account can access and run another account's private skill through Playground URL", + "state": "OPEN", + "url": "https://github.com/ChronoAIProject/Ornn/issues/563", + "labels": [ + "bug" + ], + "deps": { + "blocked_by": [], + "blocks": [], + "tracks": [], + "tracked_by": [] + } + }, + "474": { + "number": 474, + "title": "[Docs] API stability commitment + breaking-change & deprecation policy", + "state": "OPEN", + "url": "https://github.com/ChronoAIProject/Ornn/issues/474", + "labels": [ + "documentation", + "api", + "review:auto" + ], + "deps": { + "blocked_by": [], + "blocks": [], + "tracks": [], + "tracked_by": [] + } + }, + "473": { + "number": 473, + "title": "[Bug] SDK publish status — TS SDK has private:true, clarify npm/PyPI publication strategy", + "state": "OPEN", + "url": "https://github.com/ChronoAIProject/Ornn/issues/473", + "labels": [ + "bug", + "dx", + "sdk", + "review:auto" + ], + "deps": { + "blocked_by": [], + "blocks": [], + "tracks": [], + "tracked_by": [] + } + }, + "472": { + "number": 472, + "title": "[Docs] Positioning / comparison table vs MCP servers + Smithery + npm in README", + "state": "OPEN", + "url": "https://github.com/ChronoAIProject/Ornn/issues/472", + "labels": [ + "documentation", + "review:auto" + ], + "deps": { + "blocked_by": [], + "blocks": [], + "tracks": [], + "tracked_by": [] + } + }, + "471": { + "number": 471, + "title": "[CI/CD] Codecov integration + coverage badge + stated coverage target", + "state": "OPEN", + "url": "https://github.com/ChronoAIProject/Ornn/issues/471", + "labels": [ + "dx", + "ci", + "review:auto" + ], + "deps": { + "blocked_by": [], + "blocks": [], + "tracks": [], + "tracked_by": [] + } + }, + "470": { + "number": 470, + "title": "[Docs] SDK quickstart (5-line copy-paste) in main README", + "state": "OPEN", + "url": "https://github.com/ChronoAIProject/Ornn/issues/470", + "labels": [ + "documentation", + "sdk", + "review:auto" + ], + "deps": { + "blocked_by": [], + "blocks": [], + "tracks": [], + "tracked_by": [] + } + }, + "469": { + "number": 469, + "title": "[Docs] examples/ directory with 2-3 minimal starter skills (TS + Python)", + "state": "OPEN", + "url": "https://github.com/ChronoAIProject/Ornn/issues/469", + "labels": [ + "documentation", + "dx", + "review:auto" + ], + "deps": { + "blocked_by": [], + "blocks": [], + "tracks": [], + "tracked_by": [] + } + }, + "468": { + "number": 468, + "title": "[Misc] Add npm/PyPI keywords + GitHub repo topics for discoverability", + "state": "OPEN", + "url": "https://github.com/ChronoAIProject/Ornn/issues/468", + "labels": [ + "dx", + "sdk", + "review:auto" + ], + "deps": { + "blocked_by": [], + "blocks": [], + "tracks": [], + "tracked_by": [] + } + }, + "467": { + "number": 467, + "title": "[Feature] Public hosted demo / playground for try-before-install", + "state": "OPEN", + "url": "https://github.com/ChronoAIProject/Ornn/issues/467", + "labels": [ + "dx", + "infra", + "review:auto" + ], + "deps": { + "blocked_by": [], + "blocks": [], + "tracks": [], + "tracked_by": [] + } + }, + "466": { + "number": 466, + "title": "[Feature] docker-compose.yml for one-command local dev — replace K8s-only onboarding", + "state": "OPEN", + "url": "https://github.com/ChronoAIProject/Ornn/issues/466", + "labels": [ + "dx", + "infra", + "review:auto" + ], + "deps": { + "blocked_by": [], + "blocks": [], + "tracks": [], + "tracked_by": [] + } + }, + "465": { + "number": 465, + "title": "[Feature] SDK ergonomics — auto-pagination iterator + exponential-backoff retry wrapper", + "state": "OPEN", + "url": "https://github.com/ChronoAIProject/Ornn/issues/465", + "labels": [ + "dx", + "sdk", + "review:auto" + ], + "deps": { + "blocked_by": [], + "blocks": [], + "tracks": [], + "tracked_by": [] + } + }, + "464": { + "number": 464, + "title": "[Feature] Publish versioned JSON Schema for SKILL.md frontmatter", + "state": "OPEN", + "url": "https://github.com/ChronoAIProject/Ornn/issues/464", + "labels": [ + "documentation", + "dx", + "api", + "review:auto" + ], + "deps": { + "blocked_by": [], + "blocks": [], + "tracks": [], + "tracked_by": [] + } + }, + "463": { + "number": 463, + "title": "[Feature] Dist-tags (latest / stable / next) for skill version resolution", + "state": "OPEN", + "url": "https://github.com/ChronoAIProject/Ornn/issues/463", + "labels": [ + "api", + "review:auto" + ], + "deps": { + "blocked_by": [], + "blocks": [], + "tracks": [], + "tracked_by": [] + } + }, + "462": { + "number": 462, + "title": "[CI/CD] OpenAPI contract tests — assert every route appears in spec with declared errors", + "state": "OPEN", + "url": "https://github.com/ChronoAIProject/Ornn/issues/462", + "labels": [ + "dx", + "api", + "ci", + "review:auto" + ], + "deps": { + "blocked_by": [], + "blocks": [], + "tracks": [], + "tracked_by": [] + } + }, + "461": { + "number": 461, + "title": "[Feature] Surface integrity hash (sha256-base64) on skill version manifest like npm", + "state": "OPEN", + "url": "https://github.com/ChronoAIProject/Ornn/issues/461", + "labels": [ + "api", + "security", + "review:auto" + ], + "deps": { + "blocked_by": [], + "blocks": [], + "tracks": [], + "tracked_by": [] + } + }, + "460": { + "number": 460, + "title": "[Feature] RFC 9239 rate-limit response headers (RateLimit-Limit/Remaining/Retry-After)", + "state": "OPEN", + "url": "https://github.com/ChronoAIProject/Ornn/issues/460", + "labels": [ + "api", + "review:auto" + ], + "deps": { + "blocked_by": [], + "blocks": [], + "tracks": [], + "tracked_by": [] + } + }, + "459": { + "number": 459, + "title": "[Feature] Idempotency-Key middleware (24h cache) per CONVENTIONS.md §3.4", + "state": "OPEN", + "url": "https://github.com/ChronoAIProject/Ornn/issues/459", + "labels": [ + "api", + "review:auto" + ], + "deps": { + "blocked_by": [], + "blocks": [], + "tracks": [], + "tracked_by": [] + } + }, + "458": { + "number": 458, + "title": "[Bug] POST create endpoints return 200 OK without Location header (should be 201 Created)", + "state": "OPEN", + "url": "https://github.com/ChronoAIProject/Ornn/issues/458", + "labels": [ + "bug", + "api", + "review:auto" + ], + "deps": { + "blocked_by": [], + "blocks": [], + "tracks": [], + "tracked_by": [] + } + }, + "457": { + "number": 457, + "title": "[Feature] Cursor-based pagination for list endpoints (drop offset page/pageSize/total)", + "state": "OPEN", + "url": "https://github.com/ChronoAIProject/Ornn/issues/457", + "labels": [ + "api", + "review:auto" + ], + "deps": { + "blocked_by": [], + "blocks": [], + "tracks": [], + "tracked_by": [] + } + }, + "456": { + "number": 456, + "title": "[Bug] Error responses violate RFC 7807 — implementation uses { data, error } envelope instead of problem+json", + "state": "OPEN", + "url": "https://github.com/ChronoAIProject/Ornn/issues/456", + "labels": [ + "bug", + "api", + "review:auto" + ], + "deps": { + "blocked_by": [], + "blocks": [], + "tracks": [], + "tracked_by": [] + } + }, + "454": { + "number": 454, + "title": "[Feature] Backfill unit tests for 7 untested domain services + 8 repositories", + "state": "OPEN", + "url": "https://github.com/ChronoAIProject/Ornn/issues/454", + "labels": [ + "dx", + "api", + "review:auto" + ], + "deps": { + "blocked_by": [], + "blocks": [], + "tracks": [], + "tracked_by": [] + } + }, + "453": { + "number": 453, + "title": "[Misc] Decompose god-files: SkillDetailPage (1133L), DocsPage (857L), PlaygroundPage (802L)", + "state": "OPEN", + "url": "https://github.com/ChronoAIProject/Ornn/issues/453", + "labels": [ + "dx", + "web", + "review:auto" + ], + "deps": { + "blocked_by": [], + "blocks": [], + "tracks": [], + "tracked_by": [] + } + }, + "452": { + "number": 452, + "title": "[Misc] Replace hardcoded hex colors in landing pages with design tokens", + "state": "OPEN", + "url": "https://github.com/ChronoAIProject/Ornn/issues/452", + "labels": [ + "documentation", + "dx", + "web", + "review:auto" + ], + "deps": { + "blocked_by": [], + "blocks": [], + "tracks": [], + "tracked_by": [] + } + }, + "451": { + "number": 451, + "title": "[Bug] Array index as React key in skeleton/grid components — list reorder bugs", + "state": "OPEN", + "url": "https://github.com/ChronoAIProject/Ornn/issues/451", + "labels": [ + "bug", + "dx", + "web", + "review:auto" + ], + "deps": { + "blocked_by": [], + "blocks": [], + "tracks": [], + "tracked_by": [] + } + }, + "450": { + "number": 450, + "title": "[Misc] Enable stricter TS flags: noUncheckedIndexedAccess, noImplicitOverride, exactOptionalPropertyTypes", + "state": "OPEN", + "url": "https://github.com/ChronoAIProject/Ornn/issues/450", + "labels": [ + "dx", + "review:auto" + ], + "deps": { + "blocked_by": [], + "blocks": [], + "tracks": [], + "tracked_by": [] + } + }, + "449": { + "number": 449, + "title": "[Misc] Type playground chat events with Zod discriminated union (drop \"as any\")", + "state": "OPEN", + "url": "https://github.com/ChronoAIProject/Ornn/issues/449", + "labels": [ + "dx", + "api", + "review:auto" + ], + "deps": { + "blocked_by": [], + "blocks": [], + "tracks": [], + "tracked_by": [] + } + }, + "448": { + "number": 448, + "title": "[Misc] Eliminate \"as any\" on MongoDB _id — introduce toObjectId(guid) helper", + "state": "OPEN", + "url": "https://github.com/ChronoAIProject/Ornn/issues/448", + "labels": [ + "dx", + "api", + "review:auto" + ], + "deps": { + "blocked_by": [], + "blocks": [], + "tracks": [], + "tracked_by": [] + } + }, + "447": { + "number": 447, + "title": "[Misc] Migration scripts — replace Number(env) with validated parseInt + fail-fast", + "state": "OPEN", + "url": "https://github.com/ChronoAIProject/Ornn/issues/447", + "labels": [ + "dx", + "infra", + "review:auto" + ], + "deps": { + "blocked_by": [], + "blocks": [], + "tracks": [], + "tracked_by": [] + } + }, + "446": { + "number": 446, + "title": "[Misc] Admin search MongoDB regex — add maxTimeMS + ensure name/description indexes", + "state": "OPEN", + "url": "https://github.com/ChronoAIProject/Ornn/issues/446", + "labels": [ + "api", + "perf", + "review:auto" + ], + "deps": { + "blocked_by": [], + "blocks": [], + "tracks": [], + "tracked_by": [] + } + }, + "445": { + "number": 445, + "title": "[CI/CD] Lock + audit Python SDK dependencies (lockfile + pip-audit in CI)", + "state": "OPEN", + "url": "https://github.com/ChronoAIProject/Ornn/issues/445", + "labels": [ + "infra", + "security", + "ci", + "sdk", + "review:auto" + ], + "deps": { + "blocked_by": [], + "blocks": [], + "tracks": [], + "tracked_by": [] + } + }, + "444": { + "number": 444, + "title": "[Bug] LLM re-ranker output parsed without Zod schema (cast as Array)", + "state": "OPEN", + "url": "https://github.com/ChronoAIProject/Ornn/issues/444", + "labels": [ + "bug", + "api", + "security", + "review:auto" + ], + "deps": { + "blocked_by": [], + "blocks": [], + "tracks": [], + "tracked_by": [] + } + }, + "443": { + "number": 443, + "title": "[Misc] ZIP validator — add total-uncompressed-size cap + explicit zip-slip check", + "state": "OPEN", + "url": "https://github.com/ChronoAIProject/Ornn/issues/443", + "labels": [ + "security", + "web", + "review:auto" + ], + "deps": { + "blocked_by": [], + "blocks": [], + "tracks": [], + "tracked_by": [] + } + }, + "442": { + "number": 442, + "title": "[Bug] AgentSeal subprocess: validate python/script paths at boot + unref child after kill", + "state": "OPEN", + "url": "https://github.com/ChronoAIProject/Ornn/issues/442", + "labels": [ + "bug", + "infra", + "security", + "review:auto" + ], + "deps": { + "blocked_by": [], + "blocks": [], + "tracks": [], + "tracked_by": [] + } + }, + "441": { + "number": 441, + "title": "[Misc] Validate GitHub App private key shape on mirror config write", + "state": "OPEN", + "url": "https://github.com/ChronoAIProject/Ornn/issues/441", + "labels": [ + "api", + "security", + "review:auto" + ], + "deps": { + "blocked_by": [], + "blocks": [], + "tracks": [], + "tracked_by": [] + } + }, + "440": { + "number": 440, + "title": "[Misc] Tighten Mermaid SVG rendering — replace dangerouslySetInnerHTML with iframe sandbox", + "state": "OPEN", + "url": "https://github.com/ChronoAIProject/Ornn/issues/440", + "labels": [ + "security", + "web", + "review:auto" + ], + "deps": { + "blocked_by": [], + "blocks": [], + "tracks": [], + "tracked_by": [] + } + }, + "439": { + "number": 439, + "title": "[Feature] Rate limiting on /skill-search (semantic mode) + auth/upload endpoints", + "state": "OPEN", + "url": "https://github.com/ChronoAIProject/Ornn/issues/439", + "labels": [ + "api", + "security", + "perf", + "review:auto" + ], + "deps": { + "blocked_by": [], + "blocks": [], + "tracks": [], + "tracked_by": [] + } + }, + "438": { + "number": 438, + "title": "[Bug] Some routes bypass validateBody middleware — raw c.req.json() reads break RFC 7807 errors", + "state": "OPEN", + "url": "https://github.com/ChronoAIProject/Ornn/issues/438", + "labels": [ + "bug", + "api", + "security", + "review:auto" + ], + "deps": { + "blocked_by": [], + "blocks": [], + "tracks": [], + "tracked_by": [] + } + } + } + }, + "Ornn-M7-Platform-Power": { + "milestone": { + "title": "M7 — Platform Power", + "number": 21, + "url": "https://github.com/ChronoAIProject/Ornn/milestone/21", + "repo": "ChronoAIProject/Ornn" + }, + "issues": { + "37": { + "number": 37, + "title": "[Feature] Skill templates & starter kits", + "state": "OPEN", + "url": "https://github.com/ChronoAIProject/Ornn/issues/37", + "labels": [ + "phase:4", + "dx" + ], + "deps": { + "blocked_by": [], + "blocks": [], + "tracks": [], + "tracked_by": [] + } + }, + "36": { + "number": 36, + "title": "[Feature] Webhook & event system for skill lifecycle", + "state": "OPEN", + "url": "https://github.com/ChronoAIProject/Ornn/issues/36", + "labels": [ + "phase:4", + "api" + ], + "deps": { + "blocked_by": [], + "blocks": [], + "tracks": [], + "tracked_by": [] + } + }, + "35": { + "number": 35, + "title": "[Feature] Skill composition & chaining", + "state": "OPEN", + "url": "https://github.com/ChronoAIProject/Ornn/issues/35", + "labels": [ + "phase:4", + "api" + ], + "deps": { + "blocked_by": [], + "blocks": [], + "tracks": [], + "tracked_by": [] + } + } + } + }, + "Ornn-M8-Community-Engagement": { + "milestone": { + "title": "M8 — Community Engagement", + "number": 22, + "url": "https://github.com/ChronoAIProject/Ornn/milestone/22", + "repo": "ChronoAIProject/Ornn" + }, + "issues": { + "39": { + "number": 39, + "title": "[Feature] Featured & curated skill collections", + "state": "CLOSED", + "url": "https://github.com/ChronoAIProject/Ornn/issues/39", + "labels": [ + "phase:5", + "dx" + ], + "deps": { + "blocked_by": [], + "blocks": [], + "tracks": [], + "tracked_by": [] + } + }, + "38": { + "number": 38, + "title": "[Feature] Usage-based billing & author revenue share", + "state": "CLOSED", + "url": "https://github.com/ChronoAIProject/Ornn/issues/38", + "labels": [ + "phase:5" + ], + "deps": { + "blocked_by": [], + "blocks": [], + "tracks": [], + "tracked_by": [] + } + } + } + }, + "Ornn-Marketing-L0-Prelaunch-Warmup": { + "milestone": { + "title": "L0 — Pre-flight & Warmup", + "number": 1, + "url": "https://github.com/ChronoAIProject/Ornn-Marketing/milestone/1", + "repo": "ChronoAIProject/Ornn-Marketing" + }, + "issues": { + "20": { + "number": 20, + "title": "[Prep] Fork 3 Awesome Lists + draft PR diffs", + "state": "OPEN", + "url": "https://github.com/ChronoAIProject/Ornn-Marketing/issues/20", + "labels": [], + "deps": { + "blocked_by": [], + "blocks": [], + "tracks": [], + "tracked_by": [] + } + }, + "19": { + "number": 19, + "title": "[Prep] Push Ornn GitHub stars to ≥ 50 (Awesome Lists prereq)", + "state": "OPEN", + "url": "https://github.com/ChronoAIProject/Ornn-Marketing/issues/19", + "labels": [], + "deps": { + "blocked_by": [], + "blocks": [], + "tracks": [], + "tracked_by": [] + } + }, + "18": { + "number": 18, + "title": "[Warmup] V2EX + 即刻 — daily presence", + "state": "OPEN", + "url": "https://github.com/ChronoAIProject/Ornn-Marketing/issues/18", + "labels": [], + "deps": { + "blocked_by": [], + "blocks": [], + "tracks": [], + "tracked_by": [] + } + }, + "17": { + "number": 17, + "title": "[Warmup] Reddit ×3 subs — 5 comments each / 7 days", + "state": "OPEN", + "url": "https://github.com/ChronoAIProject/Ornn-Marketing/issues/17", + "labels": [], + "deps": { + "blocked_by": [], + "blocks": [], + "tracks": [], + "tracked_by": [] + } + }, + "16": { + "number": 16, + "title": "[Warmup] HN — 10 substantive comments / 7 days", + "state": "OPEN", + "url": "https://github.com/ChronoAIProject/Ornn-Marketing/issues/16", + "labels": [], + "deps": { + "blocked_by": [], + "blocks": [], + "tracks": [], + "tracked_by": [] + } + }, + "15": { + "number": 15, + "title": "[Audit] X / Discord / 即刻 / V2EX accounts", + "state": "OPEN", + "url": "https://github.com/ChronoAIProject/Ornn-Marketing/issues/15", + "labels": [], + "deps": { + "blocked_by": [], + "blocks": [], + "tracks": [], + "tracked_by": [] + } + }, + "14": { + "number": 14, + "title": "[Audit] Reddit account + 3 sub histories", + "state": "OPEN", + "url": "https://github.com/ChronoAIProject/Ornn-Marketing/issues/14", + "labels": [], + "deps": { + "blocked_by": [], + "blocks": [], + "tracks": [], + "tracked_by": [] + } + }, + "13": { + "number": 13, + "title": "[Audit] Product Hunt maker + contact Hunter", + "state": "OPEN", + "url": "https://github.com/ChronoAIProject/Ornn-Marketing/issues/13", + "labels": [], + "deps": { + "blocked_by": [], + "blocks": [], + "tracks": [], + "tracked_by": [] + } + }, + "12": { + "number": 12, + "title": "[Audit] HN account readiness", + "state": "OPEN", + "url": "https://github.com/ChronoAIProject/Ornn-Marketing/issues/12", + "labels": [], + "deps": { + "blocked_by": [], + "blocks": [], + "tracks": [], + "tracked_by": [] + } + } + } + }, + "Ornn-Marketing-L1-Launch": { + "milestone": { + "title": "L1 — D-Day Launch", + "number": 2, + "url": "https://github.com/ChronoAIProject/Ornn-Marketing/milestone/2", + "repo": "ChronoAIProject/Ornn-Marketing" + }, + "issues": { + "30": { + "number": 30, + "title": "[Launch] Submit 3 Awesome List PRs", + "state": "OPEN", + "url": "https://github.com/ChronoAIProject/Ornn-Marketing/issues/30", + "labels": [], + "deps": { + "blocked_by": [], + "blocks": [], + "tracks": [], + "tracked_by": [] + } + }, + "29": { + "number": 29, + "title": "[Launch] X thread + Discord + 即刻 + V2EX", + "state": "OPEN", + "url": "https://github.com/ChronoAIProject/Ornn-Marketing/issues/29", + "labels": [], + "deps": { + "blocked_by": [], + "blocks": [], + "tracks": [], + "tracked_by": [] + } + }, + "28": { + "number": 28, + "title": "[Launch] Reddit ×3 subs — sequential posting (NOT cross-post)", + "state": "OPEN", + "url": "https://github.com/ChronoAIProject/Ornn-Marketing/issues/28", + "labels": [], + "deps": { + "blocked_by": [], + "blocks": [], + "tracks": [], + "tracked_by": [] + } + }, + "27": { + "number": 27, + "title": "[Launch] Product Hunt — 00:01 PT Hunter post + 24h maker response", + "state": "OPEN", + "url": "https://github.com/ChronoAIProject/Ornn-Marketing/issues/27", + "labels": [], + "deps": { + "blocked_by": [], + "blocks": [], + "tracks": [], + "tracked_by": [] + } + }, + "26": { + "number": 26, + "title": "[Launch] HN Show HN — submit + 90-min monitor", + "state": "OPEN", + "url": "https://github.com/ChronoAIProject/Ornn-Marketing/issues/26", + "labels": [], + "deps": { + "blocked_by": [], + "blocks": [], + "tracks": [], + "tracked_by": [] + } + }, + "25": { + "number": 25, + "title": "[Copy] Discord / 即刻 / V2EX posts", + "state": "OPEN", + "url": "https://github.com/ChronoAIProject/Ornn-Marketing/issues/25", + "labels": [], + "deps": { + "blocked_by": [], + "blocks": [], + "tracks": [], + "tracked_by": [] + } + }, + "24": { + "number": 24, + "title": "[Copy] X launch thread — 10 tweets + 3 quote-tweet plans", + "state": "OPEN", + "url": "https://github.com/ChronoAIProject/Ornn-Marketing/issues/24", + "labels": [], + "deps": { + "blocked_by": [], + "blocks": [], + "tracks": [], + "tracked_by": [] + } + }, + "23": { + "number": 23, + "title": "[Copy] Reddit ×3 subs — channel-specific drafts", + "state": "OPEN", + "url": "https://github.com/ChronoAIProject/Ornn-Marketing/issues/23", + "labels": [], + "deps": { + "blocked_by": [], + "blocks": [], + "tracks": [], + "tracked_by": [] + } + }, + "22": { + "number": 22, + "title": "[Copy] Product Hunt — tagline + description + 4 images", + "state": "OPEN", + "url": "https://github.com/ChronoAIProject/Ornn-Marketing/issues/22", + "labels": [], + "deps": { + "blocked_by": [], + "blocks": [], + "tracks": [], + "tracked_by": [] + } + }, + "21": { + "number": 21, + "title": "[Copy] HN Show HN — title + first-comment story", + "state": "OPEN", + "url": "https://github.com/ChronoAIProject/Ornn-Marketing/issues/21", + "labels": [], + "deps": { + "blocked_by": [], + "blocks": [], + "tracks": [], + "tracked_by": [] + } + } + } + }, + "Ornn-Marketing-L2-Postlaunch": { + "milestone": { + "title": "L2 — Post-Launch Followup", + "number": 3, + "url": "https://github.com/ChronoAIProject/Ornn-Marketing/milestone/3", + "repo": "ChronoAIProject/Ornn-Marketing" + }, + "issues": { + "36": { + "number": 36, + "title": "[Followup] D+30 outcome + learnings post", + "state": "OPEN", + "url": "https://github.com/ChronoAIProject/Ornn-Marketing/issues/36", + "labels": [], + "deps": { + "blocked_by": [], + "blocks": [], + "tracks": [], + "tracked_by": [] + } + }, + "35": { + "number": 35, + "title": "[Followup] D+7 retro post", + "state": "OPEN", + "url": "https://github.com/ChronoAIProject/Ornn-Marketing/issues/35", + "labels": [], + "deps": { + "blocked_by": [], + "blocks": [], + "tracks": [], + "tracked_by": [] + } + }, + "34": { + "number": 34, + "title": "[Followup] DM PH upvoters thank-you (T+0 → T+24h)", + "state": "OPEN", + "url": "https://github.com/ChronoAIProject/Ornn-Marketing/issues/34", + "labels": [], + "deps": { + "blocked_by": [], + "blocks": [], + "tracks": [], + "tracked_by": [] + } + }, + "33": { + "number": 33, + "title": "[Followup] X 3 milestone quote-tweets (T+24h / T+7d / T+30d)", + "state": "OPEN", + "url": "https://github.com/ChronoAIProject/Ornn-Marketing/issues/33", + "labels": [], + "deps": { + "blocked_by": [], + "blocks": [], + "tracks": [], + "tracked_by": [] + } + }, + "32": { + "number": 32, + "title": "[Followup] Reddit weekly self-promotion thread participation", + "state": "OPEN", + "url": "https://github.com/ChronoAIProject/Ornn-Marketing/issues/32", + "labels": [], + "deps": { + "blocked_by": [], + "blocks": [], + "tracks": [], + "tracked_by": [] + } + }, + "31": { + "number": 31, + "title": "[Followup] HN T+24h boomerang comment", + "state": "OPEN", + "url": "https://github.com/ChronoAIProject/Ornn-Marketing/issues/31", + "labels": [], + "deps": { + "blocked_by": [], + "blocks": [], + "tracks": [], + "tracked_by": [] + } + } + } + } + } +} diff --git a/tools/sync_milestone_issues.py b/tools/sync_milestone_issues.py index a788b17..be578d8 100755 --- a/tools/sync_milestone_issues.py +++ b/tools/sync_milestone_issues.py @@ -2,9 +2,13 @@ """Sync GitHub milestone issues into the matching region's description. For every region with a `milestone_ref` field, fetch all issues in that -milestone (open + closed) and replace the content between the -`` and `` markers -in both `desc.en` and `desc.zh`. +milestone (open + closed) and: + 1. Replace the content between the `` + and `` markers in `desc.{en,zh}` with a + human-readable issue list (for the side panel). + 2. Write a structured JSON file `ornn-issues.json` at repo root with + per-region issues + extracted dependencies (for the compound-node + visualization). milestone_ref schema: "milestone_ref": { @@ -12,9 +16,17 @@ "milestone": "M0 — Engineering Foundation & Infra" } +Dependency extraction from issue body (case-insensitive): + - "Depends on #N" / "Depends-on: #N" → blocked_by[N] + - "Blocks #N" / "Blocks: #N" → blocks[N] + - "Tracks #N" / "Tracks: #N" → tracks[N] + - "Tracked by #N" / "Tracked-by: #N" → tracked_by[N] + - Checklist items "- [ ] #N" / "- [x] #N" → tracks[N] + - Plain "#N" mentions are NOT captured (too noisy for the viz) + Usage: - python3 tools/sync_milestone_issues.py # update regions.json in place - python3 tools/sync_milestone_issues.py --check # exit 1 if any region would change (CI) + python3 tools/sync_milestone_issues.py # update regions.json + ornn-issues.json + python3 tools/sync_milestone_issues.py --check # exit 1 if any change needed (CI) python3 tools/sync_milestone_issues.py --region # sync just one region Requires `gh` CLI authenticated with access to all referenced repos @@ -23,6 +35,7 @@ from __future__ import annotations import argparse +import datetime import json import re import subprocess @@ -31,6 +44,7 @@ REPO_ROOT = Path(__file__).parent.parent REGIONS_FILE = REPO_ROOT / "regions.json" +ISSUES_FILE = REPO_ROOT / "ornn-issues.json" AUTO_START = "" AUTO_END = "" @@ -39,9 +53,48 @@ re.DOTALL, ) +# Dependency extraction patterns +DEP_PATTERNS = { + "blocked_by": [ + re.compile(r"(?im)\bdepends?[\s\-_:]+on\s*#(\d+)"), + re.compile(r"(?im)\bblocked[\s\-_:]+by\s*#(\d+)"), + ], + "blocks": [ + re.compile(r"(?im)\bblocks\s*#(\d+)"), + re.compile(r"(?im)\bblocks:\s*#(\d+)"), + ], + "tracks": [ + re.compile(r"(?im)\btracks\s*#(\d+)"), + re.compile(r"(?im)\btracks:\s*#(\d+)"), + ], + "tracked_by": [ + re.compile(r"(?im)\btracked[\s\-_:]+by\s*#(\d+)"), + ], +} +# Checklist items in body imply "tracks": the parent issue tracks the child +CHECKLIST_RE = re.compile(r"^\s*[-*]\s*\[[ xX]\][^\n]*?#(\d+)", re.MULTILINE) + + +def extract_deps(body: str | None) -> dict: + """Return dict with keys blocks / blocked_by / tracks / tracked_by, values: sorted list of ints.""" + deps = {k: set() for k in DEP_PATTERNS} + if not body: + return {k: [] for k in deps} + for kind, patterns in DEP_PATTERNS.items(): + for pat in patterns: + for m in pat.finditer(body): + deps[kind].add(int(m.group(1))) + # Checklist items → tracks + for m in CHECKLIST_RE.finditer(body): + deps["tracks"].add(int(m.group(1))) + return {k: sorted(v) for k, v in deps.items()} + def fetch_milestone_issues(repo: str, milestone_title: str) -> tuple[list, int | None]: - """Return (issues, milestone_number). Issues sorted: open first, then closed, both by number desc.""" + """Return (issues, milestone_number). Issues include body for dep extraction. + + Sorted: open first, then closed, both by number desc. + """ ms_raw = subprocess.check_output( ["gh", "api", f"repos/{repo}/milestones?state=all", "--paginate", "-q", ".[] | {number, title, state, description, html_url}"], @@ -57,10 +110,16 @@ def fetch_milestone_issues(repo: str, milestone_title: str) -> tuple[list, int | issues_raw = subprocess.check_output( ["gh", "issue", "list", "--repo", repo, "--milestone", milestone_title, "--state", "all", "--limit", "500", - "--json", "number,title,state,url"], + "--json", "number,title,state,url,body,labels"], text=True, ) issues = json.loads(issues_raw) + # Attach extracted deps to each issue + for i in issues: + i["deps"] = extract_deps(i.get("body")) + i["labels"] = [l["name"] for l in (i.get("labels") or [])] + # Drop body — we don't need it anymore + keeps JSON small + i.pop("body", None) issues.sort(key=lambda i: (i["state"] != "OPEN", -i["number"])) return issues, ms_num @@ -121,8 +180,8 @@ def replace_block(text: str, new_inner: str) -> str: return text.rstrip() + "\n\n" + new_block -def sync_region(region: dict, key: str) -> bool: - """Update region's desc in place. Return True if changed.""" +def sync_region(region: dict, key: str, issues_index: dict) -> bool: + """Update region's desc in place + populate issues_index entry. Return True if regions.json changed.""" ref = region.get("milestone_ref") if not ref: return False @@ -130,6 +189,28 @@ def sync_region(region: dict, key: str) -> bool: title = ref["milestone"] issues, ms_num = fetch_milestone_issues(repo, title) + # Populate structured issues index for the compound-node viz + if ms_num is not None: + ms_url = f"https://github.com/{repo}/milestone/{ms_num}" + issues_index[key] = { + "milestone": { + "title": title, + "number": ms_num, + "url": ms_url, + "repo": repo, + }, + "issues": { + str(i["number"]): { + "number": i["number"], + "title": i["title"], + "state": i["state"], + "url": i["url"], + "labels": i["labels"], + "deps": i["deps"], + } for i in issues + }, + } + changed = False for lang in ("en", "zh"): desc = region.get("desc", {}).get(lang, "") @@ -163,28 +244,63 @@ def main(): print("no regions with milestone_ref found") return + # Load existing issues index so single-region runs don't wipe other regions' data + if ISSUES_FILE.exists(): + try: + existing_index = json.loads(ISSUES_FILE.read_text()) + issues_index = existing_index.get("regions", {}) + except json.JSONDecodeError: + issues_index = {} + else: + issues_index = {} + print(f"syncing {len(targets)} regions...") - any_changed = False + any_regions_changed = False for key in targets: if key not in regions: print(f" SKIP: {key} not in regions.json") continue - changed = sync_region(regions[key], key) + changed = sync_region(regions[key], key, issues_index) marker = "✓ changed" if changed else " no-op " - print(f" {marker} {key}") - any_changed = any_changed or changed + n_issues = len(issues_index.get(key, {}).get("issues", {})) + print(f" {marker} {key} ({n_issues} issues)") + any_regions_changed = any_regions_changed or changed + + # Always write issues file (it captures every run's data) + new_index = { + "synced_at": datetime.datetime.utcnow().isoformat() + "Z", + "regions": issues_index, + } + + # Compare to existing + issues_file_changed = True + if ISSUES_FILE.exists(): + try: + old = json.loads(ISSUES_FILE.read_text()) + # Compare excluding synced_at (which always changes) + if old.get("regions") == new_index["regions"]: + issues_file_changed = False + except json.JSONDecodeError: + pass - if not any_changed: + if args.check: + if any_regions_changed or issues_file_changed: + print("\nCHECK mode: outputs are out of date") + sys.exit(1) print("\nno changes") return - if args.check: - print("\nCHECK mode: regions.json is out of date") - sys.exit(1) + if any_regions_changed: + REGIONS_FILE.write_text(json.dumps(data, indent=2, ensure_ascii=False) + "\n") + print("regions.json updated") + else: + print("regions.json no-op") - # Write back, preserving Unicode + 2-space indent (matches existing file style) - REGIONS_FILE.write_text(json.dumps(data, indent=2, ensure_ascii=False) + "\n") - print("\nregions.json updated") + if issues_file_changed: + ISSUES_FILE.write_text(json.dumps(new_index, indent=2, ensure_ascii=False) + "\n") + print("ornn-issues.json updated") + else: + print("ornn-issues.json no-op") if __name__ == "__main__": diff --git a/visualization.qmd b/visualization.qmd index 5002b38..1e5af6b 100644 --- a/visualization.qmd +++ b/visualization.qmd @@ -211,6 +211,7 @@ format: +