Registro público
Informe de salud del softwareesquema 0.27.0 · métricas 1.13.0 · 2026-07-28 07:17 UTC

HazelnutParadise / syralit

A Go-native, Streamlit-inspired framework for data apps, dashboards, and AI tools.

Go · JavaScriptMIT★ 2 estrellas⑂ 0 forksdesde jun 2026Ver en GitHub ↗

HazelnutParadise/syralit tiene un índice de salud de 47 sobre 100, lo que lo sitúa en la banda En riesgo. Su puntuación más alta es AI Readiness (73/100) y la más baja, Community & Adoption (24/100). Se actualizó por última vez hace 9 días. Una sola persona concentra la mayor parte del trabajo reciente.

47
global / 100
En riesgo

Índice de salud del software

Las métricas se agrupan en categorías ponderadas sobre una escala de 1 a 100. El resultado global parte de su media; cuando la evidencia pública activa la Política de Jurisdicciones de Alto Riesgo, la calificación se ajusta y recibe el límite 49 (En riesgo). Preparación para IA queda fuera.

47
Excelente85-100Ejemplar; cumple prácticamente todos los criterios evaluados
Bueno70-84Saludable; carencias menores
Moderado50-69Aceptable con carencias notables; se recomienda revisión
En riesgo30-49Debilidades significativas; su adopción exige cautela
Crítico1-29Problemas graves (proyecto abandonado, un solo mantenedor, sin higiene)
VitalidadComunidad yAdopciónSostenibilidady GobernanzaCalidad deIngenieríaSeguridadPreparaciónpara IA

Perfil de puntuación

Cada eje es una categoría. La forma importa más que la media: un proyecto sano llena toda la figura, mientras que un perfil de picos y cráteres indica que la fortaleza en una dimensión enmascara el riesgo en otra.

Titularidad

榛果繽紛樂Organización
2 seguidores39 repositorios públicosdesde ago 2024

Este repositorio está respaldado por una organización: una custodia compartida y responsable que puede sobrevivir a cualquier mantenedor individual.

Ecosistemas de paquetes

RegistroPaqueteVersiónDescargas / mesVersionesÚltima publicación
Gogithub.com/HazelnutParadise/syralitv0.8.0-9hace 9 días

Métricas por categoría

Vitalidad

¿Está vivo el proyecto: se escribe código y se publican versiones?

70Bueno · 22% del índice global
Cómo se puntúa
28.8/36Recencia de push — último push hace 9 días
2.8/36Cadencia de commits — 4/52 semanas con commits
18/18Volumen de commits — 153 commits en el último año
0/10OpenSSF Scorecard: Maintained — project was created within the last 90 days. Please review its contents carefully
Datos de entrada utilizados
commits_last_year153
human_commit_share1
days_since_last_push9
active_weeks_last_year4
Cómo se puntúa
27/27Publica versiones — 9 versiones publicadas
36/36Recencia de las versiones — última versión hace 9 días
27/27Cadencia de publicación — una versión cada ~3,5 días
0/10OpenSSF Scorecard: Signed-Releases — sin datos
Datos de entrada utilizados
releases_count9
latest_release_tagv0.8.0
releases_from_tagsno
days_since_latest_release9
mean_days_between_releases3,5
Excluidos de la puntuación (sin datos o no aplicable): OpenSSF Scorecard: Signed-Releases. Los pesos restantes se han renormalizado.

Comunidad y Adopción

¿Tiene el proyecto usuarios, descargas, atención y unas condiciones acogedoras para quienes contribuyen?

24Crítico · 18% del índice global
Cómo se puntúa
0/60Estrellas — 2 estrellas
0/25Forks — 0 forks
0/15Observadores — 0 observadores
Datos de entrada utilizados
forks0
stars2
watchers0
growth_stateunverified
growth_factor_pct100
growth_unverified_reasonno_history
Cómo se puntúa
22.5/22.5README
22.5/22.5Licencia — licencia reconocida (MIT)
0/18Guía CONTRIBUTING
0/13.5Código de conducta
0/7.2Plantilla de issues
0/6.3Plantilla de PR
Datos de entrada utilizados
has_readme
has_license
has_contributingno
has_issue_templateno
has_code_of_conductno
has_pull_request_templateno

Sostenibilidad y Gobernanza

¿Sobrevivirá el proyecto a sus personas: factor bus, capacidad de respuesta, quién lo respalda y mantenimiento del paquete?

37En riesgo · 24% del índice global
Cómo se puntúa
9/54Factor bus — la mitad de los commits recae en 1 contribuyente(s)
0/22.5Distribución de commits — el principal contribuyente firma el 100% de los commits
1.4/13.5Amplitud de contribuyentes — 1 contribuyentes
6/10OpenSSF Scorecard: Contributors — project has 2 contributing companies or organizations -- score normalized to 6
Datos de entrada utilizados
bus_factor1
contributors_sampled1
top_contributor_share1
Cómo se puntúa
0/46.8Resolución de issues — sin issues o sin datos
0/38.3Aceptación de PR — sin PR decididos o sin datos
0/15OpenSSF Scorecard: Code-Review — Found 0/30 approved changesets -- score normalized to 0
Datos de entrada utilizados
merged_prs0
open_issues0
closed_issues0
issue_closed_ratio
closed_unmerged_prs0
Excluidos de la puntuación (sin datos o no aplicable): Resolución de issues, Aceptación de PR. Los pesos restantes se han renormalizado.
Cómo se puntúa
30/30Respaldo de la propiedad — propiedad de una organización
0/20Dominio verificado
3.4/25Alcance del propietario — 2 seguidores de HazelnutParadise
15.6/25Trayectoria — 39 repos públicos, cuenta de ~1 años
Datos de entrada utilizados
followers2
owner_typeOrganization
is_verified
owner_loginHazelnutParadise
public_repos39
account_age_days710
Cómo se puntúa
25/25Publicado y resoluble — 1 paquete(s) en go
35/35Recencia de publicación — última publicación hace 9 días
20/20Historial de versiones — 9 versiones en el registro
20/20No obsoleto — activo, ni obsoleto ni retirado
Datos de entrada utilizados
packagesgithub.com/HazelnutParadise/syralit
ecosystemsgo
any_deprecatedno
min_days_since_publish9

Calidad de Ingeniería

¿Existen unas prácticas mínimas de ingeniería y documentación?

70Bueno · 20% del índice global
Cómo se puntúa
24/24Flujos de trabajo de CI — 1 flujo(s) de trabajo
24/24Pruebas presentes
0/16Configuración de linter
0/9.6Hooks de pre-commit
0/6.4.editorconfig
0/20OpenSSF Scorecard: CI-Tests — sin datos
Datos de entrada utilizados
has_ci
has_tests
has_editorconfigno
has_linter_configno
has_precommit_configno
Excluidos de la puntuación (sin datos o no aplicable): OpenSSF Scorecard: CI-Tests. Los pesos restantes se han renormalizado.

Documentación

85Excelente
Cómo se puntúa
30/30README
25/25Directorio de documentación
0/15Sitio de documentación / página del proyecto
10/10Descripción del repositorio
10/10Topics — 2 topics
10/10Wiki
Datos de entrada utilizados
topicsdata-visualization, insyra
has_wiki
homepage
has_readme
has_docs_dir
has_description

Seguridad

¿Son sólidas las prácticas visibles de seguridad y de cadena de suministro, sin exposición jurisdiccional de alto riesgo sin resolver?

30En riesgo · 16% del índice global
Cómo se puntúa
7.5/7.5Binary-Artifacts — no binaries found in the repo
0/7.5Branch-Protection — branch protection not enabled on development/release branches
0/2.5CI-Tests — sin datos
0/2.5CII-Best-Practices — no effort to earn an OpenSSF best practices badge detected
0/7.5Code-Review — Found 0/30 approved changesets -- score normalized to 0
1.5/2.5Contributors — project has 2 contributing companies or organizations -- score normalized to 6
10/10Dangerous-Workflow — no dangerous workflow patterns detected
0/7.5Dependency-Update-Tool — no update tool detected
0/5Fuzzing — project is not fuzzed
2.5/2.5Licencia — license file detected
0/7.5Maintained — project was created within the last 90 days. Please review its contents carefully
0/5Packaging — sin datos
0/5Pinned-Dependencies — dependency not pinned by hash detected -- score normalized to 0
0/5SAST — no SAST tool detected
0/5Security-Policy — security policy file not detected
0/7.5Signed-Releases — sin datos
0/7.5Token-Permissions — detected GitHub workflow tokens with excessive permissions
5.2/7.5Vulnerabilities — 3 existing vulnerabilities detected
Datos de entrada utilizados
sourceopenssf_scorecard
checks_evaluated15
scorecard_versionv5.5.0
checks_inconclusive3
scorecard_aggregate3
Excluidos de la puntuación (sin datos o no aplicable): ci_tests, packaging, signed_releases. Los pesos restantes se han renormalizado.

Preparación para IA

¿Hasta qué punto está el repositorio preparado para desarrollarse y mantenerse con agentes de codificación de IA? Es una insignia independiente y experimental — peso 0,0, de modo que se presenta por separado y no afecta a la puntuación de salud global.

73Bueno · 0% del índice global
Cómo se puntúa
45/45Instrucciones para agentes — AGENTS.md, CLAUDE.md
0/15Documentación legible por máquinas (llms.txt)
40/40Historial de commits legible — 84 de 100 commits humanos declaran su intención (asunto estructurado o cuerpo explicativo)
Datos de entrada utilizados
has_llms_txtno
legible_history_share0,84
agent_instruction_filesAGENTS.md, CLAUDE.md
agent_instruction_max_bytes6372
Cómo se puntúa
12.6/18Arranque con un solo comando — examples/desktop-demo/go.mod, examples/oidc-login/go.mod, go.mod (convención del toolchain, sin ejecutor de tareas)
22/22Pruebas automatizadas
0/11Configuración de lint / formato
11/11Verificación estática de tipos — Go (tipado estático)
10/10Entorno reproducible — lockfile
10/10Práctica demostrada con agentes — 67 de los últimos 100 commits con autoría o crédito de agente
0/8Mantenimiento automatizado — no se observan actualizaciones automáticas de dependencias
0/10OpenSSF Scorecard: Pinned-Dependencies — dependency not pinned by hash detected -- score normalized to 0
Datos de entrada utilizados
has_nixno
has_tests
lockfilesgo.sum
has_dockerfileno
typed_language
bootstrap_files
has_devcontainerno
has_linter_configno
typecheck_configs
agent_commit_share0,67
toolchain_manifestsexamples/desktop-demo/go.mod, examples/oidc-login/go.mod, go.mod, integrations/desktop/go.mod, integrations/oidc/go.mod, uitest/go.mod
dependency_bot_commit_share0
Cómo se puntúa
45/45Código verificable por tipos — Go (tipado estático)
52.6/55Tamaños de archivo manejables — 4/93 archivos fuente de más de 60 KB
Datos de entrada utilizados
primary_languageGo
largest_source_bytes1.024.695
source_files_sampled93
oversized_source_files4
Cómo se puntúa
0/40Esquema de API (OpenAPI/GraphQL/proto)
0/20Servidor MCP
40/40Ejemplos ejecutables — examples
Datos de entrada utilizados
example_dirsexamples
has_mcp_signalno
api_schema_files

Datos clave

2estrellas de GitHub
1contribuidores
153commits en los últimos 12 meses
9días desde el último push
9versiones publicadas
1factor bus
0issues abiertas
Goecosistemas de paquetes

Advertencias de recopilación de datos

  • Star history unavailable: GitHub GraphQL error: Resource not accessible by personal access token
  • GitHub dependency-graph SBOM unavailable (404); the dependency graph may be disabled for this repository

Más detalle

OpenSSF Scorecard 3.0 / 10
3.0agregado

Evaluación de seguridad independiente y agnóstica en cuanto a herramientas, procedente del proyecto de código abierto OpenSSF Scorecard. Cada comprobación premia una práctica de seguridad, no la herramienta de un proveedor concreto. Las comprobaciones que Scorecard no pudo determinar se marcan como n/d y se excluyen de la puntuación de seguridad (nunca se cuentan como cero).Scorecard v5.5.0 · 2026-07-28 07:17 UTC

10Binary-Artifactsno binaries found in the repo
0Branch-Protectionbranch protection not enabled on development/release branches
n/dCI-Testsno pull request found
0CII-Best-Practicesno effort to earn an OpenSSF best practices badge detected
0Code-ReviewFound 0/30 approved changesets -- score normalized to 0
6Contributorsproject has 2 contributing companies or organizations -- score normalized to 6
10Dangerous-Workflowno dangerous workflow patterns detected
0Dependency-Update-Toolno update tool detected
0Fuzzingproject is not fuzzed
10Licenselicense file detected
0Maintainedproject was created within the last 90 days. Please review its contents carefully
n/dPackagingpackaging workflow not detected
0Pinned-Dependenciesdependency not pinned by hash detected -- score normalized to 0
0SASTno SAST tool detected
0Security-Policysecurity policy file not detected
n/dSigned-Releasesno releases found
0Token-Permissionsdetected GitHub workflow tokens with excessive permissions
7Vulnerabilities3 existing vulnerabilities detected
Dependencias directas 10
RegistroPaqueteRestricción de versiónManifiesto
Gogithub.com/BurntSushi/tomlv1.6.0go.mod
Gogithub.com/HazelnutParadise/insyrav0.3.0go.mod
Gogithub.com/coder/websocketv1.8.15go.mod
Gogithub.com/fsnotify/fsnotifyv1.10.1go.mod
Gogithub.com/xuri/excelize/v2v2.11.0go.mod
Gogithub.com/yuin/goldmarkv1.8.2go.mod
Gogithub.com/HazelnutParadise/insyrav0.3.0uitest/go.mod
Gogithub.com/HazelnutParadise/syralitv0.0.0uitest/go.mod
Gogithub.com/chromedp/cdprotov0.0.0-20250403032234-65de8f5d025buitest/go.mod
Gogithub.com/chromedp/chromedpv0.13.6uitest/go.mod
Todas las dependencias no recopilado

No fue posible recopilar el conjunto de dependencias resuelto para este informe: GitHub dependency-graph SBOM unavailable (404); the dependency graph may be disabled for this repository

Informe JSON sin procesar legible por máquina
{
  "data": {
    "repo": {
      "topics": [
        "data-visualization",
        "insyra"
      ],
      "is_fork": false,
      "size_kb": 2102,
      "has_wiki": true,
      "homepage": null,
      "languages": {
        "Go": 496729,
        "CSS": 50896,
        "JavaScript": 132207
      },
      "pushed_at": "2026-07-18T13:04:53Z",
      "created_at": "2026-06-16T17:30:37Z",
      "owner_type": "Organization",
      "updated_at": "2026-07-18T13:04:58Z",
      "description": "A Go-native, Streamlit-inspired framework for data apps, dashboards, and AI tools.",
      "is_archived": false,
      "is_disabled": false,
      "license_spdx": "MIT",
      "default_branch": "main",
      "license_spdx_raw": "MIT",
      "primary_language": "Go",
      "significant_languages": [
        "Go",
        "JavaScript"
      ]
    },
    "owner": {
      "blog": "hazelnut-paradise.com",
      "name": "榛果繽紛樂",
      "type": "Organization",
      "login": "HazelnutParadise",
      "company": null,
      "location": "Taiwan",
      "followers": 2,
      "avatar_url": "https://avatars.githubusercontent.com/u/178628144?v=4",
      "created_at": "2024-08-17T03:34:30Z",
      "is_verified": null,
      "public_repos": 39,
      "account_age_days": 710
    },
    "license": {
      "state": "standard",
      "spdx_id": "MIT",
      "raw_spdx": "MIT",
      "file_present": true,
      "scorecard_found": true,
      "profile_has_license": true
    },
    "activity": {
      "releases": [
        {
          "tag": "v0.8.0",
          "kind": "minor",
          "published_at": "2026-07-18T13:05:04Z"
        },
        {
          "tag": "v0.7.0",
          "kind": "minor",
          "published_at": "2026-07-05T09:00:11Z"
        },
        {
          "tag": "v0.6.0",
          "kind": "minor",
          "published_at": "2026-07-05T02:37:33Z"
        },
        {
          "tag": "v0.5.0",
          "kind": "minor",
          "published_at": "2026-07-03T12:06:29Z"
        },
        {
          "tag": "v0.4.0",
          "kind": "minor",
          "published_at": "2026-07-02T10:17:35Z"
        },
        {
          "tag": "v0.3.0",
          "kind": "minor",
          "published_at": "2026-06-22T15:38:18Z"
        },
        {
          "tag": "v0.2.0",
          "kind": "minor",
          "published_at": "2026-06-22T05:28:49Z"
        },
        {
          "tag": "v0.1.1",
          "kind": "patch",
          "published_at": "2026-06-21T03:26:57Z"
        },
        {
          "tag": "v0.1.0",
          "kind": "minor",
          "published_at": "2026-06-20T18:23:35Z"
        }
      ],
      "recent_commits": [
        {
          "oid": "6edd163fbf2b0062c135c1aa6d54a503e06ec57d",
          "body": "Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Release v0.8.0: 桌面應用(Wails v3)",
          "author_name": "TimLai666",
          "author_login": "TimLai666",
          "committed_at": "2026-07-18T13:04:52Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "66203a4a04bf3c15c9014afa43d941bd634e73f8",
          "body": "Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "CHANGELOG 定版 0.8.0",
          "author_name": "TimLai666",
          "author_login": "TimLai666",
          "committed_at": "2026-07-18T13:04:43Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "96cf4ce17a3797180f8ec31961d01711a80816a0",
          "body": "Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "CLAUDE.md 補 desktop e2e 與獨立模組邊界說明",
          "author_name": "TimLai666",
          "author_login": "TimLai666",
          "committed_at": "2026-07-18T12:39:02Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "f4ffa85e3902de675e7a19701df103d570d24812",
          "body": "e2e_test.go(Windows 限定,SYRALIT_DESKTOP_E2E=1 閘門,平常 go test 不彈窗):\n- 生產模式:啟動、封鎖 403、artifact 端點 401/200(bearer 自帶認證穿過\n  封鎖)、視窗歸屬本進程、WM_CLOSE 優雅退出 exit 0。\n- dev 熱重載:臨時專案 + in-repo supervisor runner,視窗跨重建同\n  HWND/PID 存活且唯一,supervisor 死後 window host 自動退出。\n- fixtures 放 testdata/(e2eapp、devsup),./... 不會建到。\n[…]\nLOSE 太早會撞 WebView2 controller\n建立競態(80004004),改為就緒後再關;臨時專案 go.mod 沿用範例的完整\nrequire 區塊避免 go build 拒絕。\n\n本機實跑:兩條 e2e 各 6.1s / 10.3s 全過;無環境變數時正確 SKIP。\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Desktop e2e 測試套件:真視窗全流程驗證",
          "author_name": "TimLai666",
          "author_login": "TimLai666",
          "committed_at": "2026-07-18T11:54:33Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "b85f7334768a9ccd182054eacaa06c58b5e8035a",
          "body": "- 封鎖中介層:視窗 URL 帶每次啟動隨機 token,首個合法請求種\n  HttpOnly cookie;無憑證的本機瀏覽器一律 403。sydesktop.AllowBrowser()\n  可退出。\n- /api/ 前綴豁免(沿用 dev supervisor 的代理慣例):artifact 端點本就\n  強制自帶 authenticator,agent 連線不受影響。\n- app 進程設 SYRALIT_URL,spawn 的 agent 子進程可直接找到端點;\n  Config 明確指定 Port 時釘選埠號,供外部 agent 用穩定位址。\n\n實機驗證:視窗正常渲染(WS 帶 cookie)、無 token curl 403、\n錯誤 token 403、/api/ 穿過中介層(404 來自 mux 而非 403)。\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Desktop 預設鎖定視窗專用;/api/ 保留給 agent",
          "author_name": "TimLai666",
          "author_login": "TimLai666",
          "committed_at": "2026-07-18T11:42:35Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "a31503a21aba063a1e35d7ebe6665c8eeededcf8",
          "body": "sydesktop 在 dev-child 模式改為委派 sy.Run 服務 supervisor 內部位址,\n原生視窗交給分離的 window host 進程(同 binary 複本、只開窗模式),\n指向 supervisor 對外 URL——重建只換 child,視窗和前端連線不斷,\n狀態保留與 build error overlay 跟瀏覽器完全一致。\n\n- supervisor 對 child 新增 SYRALIT_URL(對外網址)與 SYRALIT_DEV_SESSION\n (session 唯一鍵)兩個環境變數。\n- window host 從 binary 複本執行,避免 Wi\n[…]\n失敗自動退出,不留殭屍視窗。\n- 舊 CLI(無 SYRALIT_URL)降級為純 headless dev child,不會壞。\n\n實機驗證:dev 視窗開啟、改檔後同一視窗(同 PID/HWND)即時更新、\n無重複視窗、supervisor 停止後視窗約 6 秒自動退出、無殘留進程。\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "syralit dev 熱重載接上桌面視窗",
          "author_name": "TimLai666",
          "author_login": "TimLai666",
          "committed_at": "2026-07-18T11:38:08Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "48b0e5e1a85a1e7c04c8098b171e11bf99559789",
          "body": "- 新獨立模組 sydesktop:App/Run 在 127.0.0.1 隨機埠起 sy.Handler,\n  開原生 webview 視窗指向它,關窗即 Shutdown。選項:WindowTitle、\n  WindowSize、MinSize、Frameless、Icon、Config。\n- 新範例 examples/desktop-demo(獨立模組),展示本機檔案直讀。\n- 核心修正:TextInput/TextArea/PasswordInput 補上 DefaultValue 初始值\n  (文件本來就承諾的通用選項),只在使用者未編輯前生效,可清空。\n- CI 新增 window\n[…]\n-latest 的 desktop job(Windows 上 Wails 純 Go 免系統依賴)。\n- SKILL.md、README、CHANGELOG 同步更新。\n\n實機驗證:Windows 視窗開啟、UI 完整渲染、本機目錄列表正常、\nWM_CLOSE 關窗後進程 exit 0。\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "桌面應用整合:integrations/desktop(Wails v3)",
          "author_name": "TimLai666",
          "author_login": "TimLai666",
          "committed_at": "2026-07-18T11:20:27Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "e7013fcac1a2853d25f44410082c680a138eaed7",
          "body": "CSV/JSON 整數欄改為 int64、quantile 改 R type-7(與 pandas 一致),\n整合層的型別轉換原本就涵蓋 int64,全部測試(含 uitest 瀏覽器測試)通過。\n主模組與 uitest、oidc 子模組同步 tidy。\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Insyra 升級至 v0.3.0",
          "author_name": "TimLai666",
          "author_login": "TimLai666",
          "committed_at": "2026-07-18T11:04:34Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "9551321590512fb5adc9b0c6c99993e187891cad",
          "body": null,
          "is_bot": false,
          "headline": "release: v0.7.0",
          "author_name": "TimLai666",
          "author_login": "TimLai666",
          "committed_at": "2026-07-05T08:59:28Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "1ed1f11d97e8163ca5b9ab4fd33f979beedeee75",
          "body": "- 新選項 sy.Formula()(隱含 Mono):ƒx 標記內嵌框內、accent 左邊條、\n  code 底色、focus-within accent 光圈——與一般文字輸入一眼區分\n- AddFormulaColumn 預設改用 Formula(),label 移除 ƒx 前綴(改由框內呈現,\n  預設文字維持英文)",
          "is_bot": false,
          "headline": "sy.Formula():公式列專屬外觀",
          "author_name": "TimLai666",
          "author_login": "TimLai666",
          "committed_at": "2026-07-05T08:55:03Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "ad7a7a0200f68b2cf7dff6645f7a5131ccaa3e1e",
          "body": "- 表格/資料表表頭移除 text-transform: uppercase——CCL 欄名比對分大小寫\n  (實測 [\"revenue\"] 靜默失敗),表頭必須顯示真實大小寫\n- AddFormulaColumn 在公式框下方顯示即時欄位對照\n  「Columns: A = Product · B = Revenue · C = Cost」(正確大小寫)\n- 匯出 syi.ComputeColumn(dt, name, formula):帶 timeout 防護的求值原語,\n  讓要自訂 label/版面/i18n 的人自行組 UI(內建編輯器 label 固定)",
          "is_bot": false,
          "headline": "公式欄 UX 修正:表頭真實大小寫、欄位對照、ComputeColumn 原語",
          "author_name": "TimLai666",
          "author_login": "TimLai666",
          "committed_at": "2026-07-05T08:48:22Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "4249b6fb93ab3f339943f33fa8d1dff8fc390405",
          "body": null,
          "is_bot": false,
          "headline": "AddFormulaColumn 的 key 參數補文件說明(widget key 前綴)",
          "author_name": "TimLai666",
          "author_login": "TimLai666",
          "committed_at": "2026-07-05T08:39:02Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "006a1d7130013e37232b5aa8b747bd586148ff1e",
          "body": "- FormulaColumn → AddFormulaColumn:回傳的是「附加了計算欄的新表」,\n  動詞開頭消除名稱誤導(未發佈 API,直接改名)\n- placeholder 與文件改示範正確的欄名語法 [\"Revenue\"] - [\"Cost\"]\n  (先前文件誤稱不支援欄名,已更正)\n- 新增 sy.Mono() 通用選項:TextInput 以 code 字型渲染(公式、識別字用),\n  公式輸入框套用並加 ƒx 標示",
          "is_bot": false,
          "headline": "CCL 公式欄改名 AddFormulaColumn + 公式編輯器外觀",
          "author_name": "TimLai666",
          "author_login": "TimLai666",
          "committed_at": "2026-07-05T08:36:20Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "15336b157c11fef600b5704bceb4345b696cd518",
          "body": null,
          "is_bot": false,
          "headline": "CI 納入 oidc 模組測試;CHANGELOG 定版 0.7.0",
          "author_name": "TimLai666",
          "author_login": "TimLai666",
          "committed_at": "2026-07-05T08:21:50Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "24cd7d5f75cd86192cbd8a97a8ee42a69fb2a850",
          "body": "- integrations/oidc(獨立模組,go-oidc/oauth2 依賴不進核心):\n  syoidc.Protect 包住 app handler,走 OIDC auth-code flow\n  (state + nonce 驗證、HMAC-SHA256 簽章身分 cookie、可設定公開路徑),\n  sy.User() 回傳驗證過的 claims;/auth/logout 登出\n- 核心新增 sy.SetUserResolver:連線建立時由 request context 解析使用者\n  (無依賴的擴充點,WS 與 SSE 皆接上)\n- 測試:cookie 簽章往返/竄改/過期、middleware 重導與放行、設定驗證、\n  核心 resolver 種入 sy.User() 的完整路徑\n- examples/oidc-login(獨立模組範例)\n- treediff_measure_test.go:量化全樹推送成本——1000 列表格 + 500 點圖表\n  = 53.5KB,單一按鍵重送全量;數據留作 tree diff 決策依據",
          "is_bot": false,
          "headline": "OIDC 單一登入 + UI tree 傳輸量測",
          "author_name": "TimLai666",
          "author_login": "TimLai666",
          "committed_at": "2026-07-05T08:20:02Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "4dca003478f9ab2399b746757cb0572929ef57f2",
          "body": "- 圖表框選:sy.RangeSelectable() 拖曳選 x 軸區間,ChartSelection 增加\n  Range/EndIndex/EndX;修正拖曳結束的 Chart.js click 覆蓋範圍選取的 bug\n  (suppressNextChartClick),document 層拖曳 handler 改全域單例,\n  避免 rerun 堆疊 stale listener\n- DataFrame 欄選取:SelectionMode(\"single-column\"/\"multi-column\"),\n  點表頭選欄、回傳欄索引,欄模式下停用排序\n- [i18n] 設定:內建 UI\n[…]\nChart、CumSumChart、PctChangeChart、\n  FormulaColumn(CCL 公式欄,goroutine + timeout 防護,複本上運算)\n- syralit new scaffold toml 補完整選項註解\n- uitest 新增框選拖曳(CDP 真實滑鼠序列)與 insyra 點圖過濾回歸;\n  修 flake(等 chart settled、點長條中段)",
          "is_bot": false,
          "headline": "第二批全面補強:框選、欄選取、i18n、insyra 時序/匯出/公式",
          "author_name": "TimLai666",
          "author_login": "TimLai666",
          "committed_at": "2026-07-05T08:07:22Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "f766b67e3c91d9377647cda684cb099035cf5443",
          "body": null,
          "is_bot": false,
          "headline": "README 加 insyra-interactive 範例截圖(亮/暗,含點擊過濾後狀態)",
          "author_name": "TimLai666",
          "author_login": "TimLai666",
          "committed_at": "2026-07-05T03:57:43Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "961bf6c02b5601314a0b57d4b92123640731b7ec",
          "body": "- UploadTable(無檔案時用內建示範資料)→ 欄位選擇 → sum/mean/count\n  聚合切換 → 可選取 GroupBy 圖 → 點擊下鑽(明細表、統計、Describe)\n- 防呆:群組欄與數值欄相同時提示並 sy.Stop()\n- README 加截圖(亮/暗)與範例列;瀏覽器實測下鑽數值正確\n  (East 4 列、mean 752.5 手驗)",
          "is_bot": false,
          "headline": "新增 data-studio 範例:完整上傳→探索工作流",
          "author_name": "TimLai666",
          "author_login": "TimLai666",
          "committed_at": "2026-07-05T03:52:21Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "816ee04ebd5193c0c0364f611c85a22b5cc16313",
          "body": "- DataTable 圖表升級:opts 透傳、xCol 真正作為軸標籤(原本被忽略)、\n  加 sy.Selectable() 後回傳 *sy.ChartSelection(簽名向後相容)\n- MultiLineChart/MultiBarChart/MultiAreaChart:yCols 為 nil 時自動取全部\n  數值欄,等同 st.line_chart(df)\n- GroupedBarChart/GroupedPieChart:insyra GroupBy + Aggregate 每組一根\n- FilterEquals/FilterBySelection:純資料 helper,n\n[…]\n\n- 新增 examples/insyra-interactive:點長條 → 過濾表格/統計 → URL 深連結,\n  含清除篩選;瀏覽器實測完整流程通過\n- 測試:x 標籤、多序列自動選欄、GroupBy 聚合值、選取過濾 round-trip、\n  FilterEquals 純函式語意、EditableDataTable 重建\n- SKILL.md/README/CHANGELOG 同步更新",
          "is_bot": false,
          "headline": "insyra 深度整合:點圖過濾 dashboard 組合",
          "author_name": "TimLai666",
          "author_login": "TimLai666",
          "committed_at": "2026-07-05T03:45:20Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "7050c4601c16f65b2c070f9131af09a95a63f34d",
          "body": null,
          "is_bot": false,
          "headline": "release: v0.6.0",
          "author_name": "TimLai666",
          "author_login": "TimLai666",
          "committed_at": "2026-07-05T02:29:30Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "94d8918ff22b91f56ee6dd768df678b4afba2ee6",
          "body": null,
          "is_bot": false,
          "headline": "CI 加入 uitest job;CHANGELOG 定版 0.6.0",
          "author_name": "TimLai666",
          "author_login": "TimLai666",
          "committed_at": "2026-07-05T02:26:30Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "d6c0ad2b6748a8d808e98b48b568d83d5fabec08",
          "body": "- 獨立 Go module,chromedp 重依賴不進核心 go.mod\n- headless Chrome 對 in-process app(httptest + sy.Handler)測真實渲染行為:\n  widget WebSocket round-trip、sidebar 收合與 toggle、toast 可見性與時長、\n  canvas 圖表點選(真實滑鼠事件)、多檔上傳、子路徑掛載\n- 無 Chrome 時自動 skip;六項測試全數通過\n- README/CLAUDE.md/CHANGELOG 補測試說明",
          "is_bot": false,
          "headline": "新增瀏覽器層級 UI 測試套件(uitest/)",
          "author_name": "TimLai666",
          "author_login": "TimLai666",
          "committed_at": "2026-07-04T18:27:18Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "89d3173fee27f6e156a6dd57d5f5cee33eb77ffd",
          "body": "sy-toast-show 原以 requestAnimationFrame 加上,但 rAF 在 hidden/背景分頁\n不會執行,toast 會在隱形狀態下直接過期。改用 setTimeout。",
          "is_bot": false,
          "headline": "修正 toast 在背景分頁永遠不顯示的問題",
          "author_name": "TimLai666",
          "author_login": "TimLai666",
          "committed_at": "2026-07-04T18:18:38Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "8c5a35c179245665a2b7d2ba3a0ba9083448ecaf",
          "body": "供 AI 代理的瀏覽器預覽工具啟動 examples/streamlit-parity 驗證用",
          "is_bot": false,
          "headline": "納入 .claude/launch.json(preview 伺服器啟動設定)",
          "author_name": "TimLai666",
          "author_login": "TimLai666",
          "committed_at": "2026-07-04T18:07:54Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "3332101fe85b9ac413ec9abfbfd561830b3e53a0",
          "body": "- 可選取圖表(ChartSelection)、Space/Bottom、SetQueryParam\n- DataFrame ColumnOrder/SelectionMode\n- Testing 章節改以 sy.AppTest 為主、RenderOnce 為輔\n- Beyond Streamlit 列入 sy.Handler 嵌入既有 HTTP server",
          "is_bot": false,
          "headline": "README 補齊近三輪新功能說明",
          "author_name": "TimLai666",
          "author_login": "TimLai666",
          "committed_at": "2026-07-04T18:04:25Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "b342df9000f8ad9b6df77dd0d3501dd7f6599d20",
          "body": "- 可選取圖表:Line/Bar/Area/Scatter/Pie 加 sy.Selectable() 後回傳\n  *ChartSelection(Series/Index/X/Value),Chart.js onClick 回傳點選資料點\n- sy.SetQueryParam:可寫入 URL query 參數,經 history.replaceState 更新網址列\n- 子路徑掛載修正:資產、WebSocket、SSE、msg 端點改依掛載前綴解析\n  (window.__SY_BASE,僅在有前綴時輸出),sy.Handler + StripPrefix 可用\n- DataFrame:sy\n[…]\n area_chart 與 json 儲存格型別\n- HTTPS:[server] ssl_cert_file / ssl_key_file(Config.SSLCertFile/KeyFile)\n- SpinnerWith + sy.ShowTime():顯示已耗時\n- 測試(含用 AppTest 驗證圖表選取與 query param)、文件、範例同步更新;\n  子路徑掛載與圖表選取均實測通過",
          "is_bot": false,
          "headline": "補齊參數級與部署級的 Streamlit 差異",
          "author_name": "TimLai666",
          "author_login": "TimLai666",
          "committed_at": "2026-07-04T16:25:40Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "540b16903cb2fff5cd0f6a808b1e01b03d939705",
          "body": "- sy.Space():垂直/水平留白(Height/Width 可調)\n- sy.Bottom(fn):釘在視窗底部的容器(聊天輸入釘底),主區自動保留 padding,\n  sidebar 展開/收合時左緣自動對齊\n- sy.DatetimeInput:日期+時間合一選擇器,回傳 \"YYYY-MM-DD HH:MM\"\n- sy.MenuButton(label, options):下拉選單按鈕,回傳被點選項(單次 rerun,\n  比照 Button 一次性語意,經 session.takeWidget 實作)\n- sy.Handler(cfg, fn):把 app 掛進既有 Go HT\n[…]\nOption(key):執行期讀取解析後的設定值\n- sy.AppTest:無頭測試框架(NewAppTest/Run/SetValue/Click/ClickLabel/\n  FindAll/FindByLabel/Texts/SwitchToPage),對應 st.testing.v1.AppTest\n- 範例與文件(README/SKILL.md/CHANGELOG)同步更新,瀏覽器實測互動",
          "is_bot": false,
          "headline": "補上最後一批 Streamlit 對應功能",
          "author_name": "TimLai666",
          "author_login": "TimLai666",
          "committed_at": "2026-07-04T15:59:56Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "03eb0f0e5d5be5df59b39914e4790da8b926e87d",
          "body": "- sy.PDF(src):內嵌 PDF 檢視器(瀏覽器原生渲染),支援 Height/Width\n- sy.FileUploaderMultiple:多檔上傳,回傳 []*UploadedFile\n- [server] max_upload_size_mb / Config.MaxUploadSizeMB:上傳大小上限\n  (預設 10MB),前端與 WebSocket read limit 同步生效\n- sy.InitialSidebarState(\"collapsed\"):sidebar 初始收合,浮動按鈕重開;\n  順帶修正行動版 toggle 掛在 #syralit-root 外導致\n[…]\nultiSelect 允許輸入自訂值\n- sy.StartTime/EndTime/Subtitles:音訊/影片播放區間(media fragment)與\n  WebVTT 字幕\n- sy.Toast 第四參數支援自訂顯示時長(如 \"8s\")\n- 新增 examples/streamlit-parity,經瀏覽器實測互動流程\n- 文件(README/SKILL.md/CHANGELOG)同步更新",
          "is_bot": false,
          "headline": "補齊剩餘 Streamlit 功能差異",
          "author_name": "TimLai666",
          "author_login": "TimLai666",
          "committed_at": "2026-07-04T15:48:17Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "2b868f2320b323ab5b6aba093474622da1e162d6",
          "body": "- Theme 重構:視覺欄位抽成內嵌 ThemeStyle,主區與 sidebar 共用同一組選項,\n  [theme.sidebar] 可覆寫任何顏色/字型/圓角設定\n- 新增 background_color、secondary_background_color、text_color、link_color、\n  link_underline、code_text_color、code_background_color、border_color、\n  dataframe_border_color、dataframe_header_background_color、button_radius、\n[…]\n 系列色)、\n  chart_sequential_colors、chart_diverging_colors(發佈到 window.__SY_THEME)\n- sidebar scope 會補發衍生變數(alias 與 color-mix),避免 CSS 自訂屬性\n  在 :root 展開後 scoped 覆寫失效\n- 附完整測試;README/SKILL.md/CHANGELOG/範例同步更新",
          "is_bot": false,
          "headline": "補齊 Streamlit theme 全部選項",
          "author_name": "TimLai666",
          "author_login": "TimLai666",
          "committed_at": "2026-07-04T15:22:16Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "ad12a9eae8e56c424c1205bbe37fb82f8fb03912",
          "body": "- Theme 新增 Font/HeadingFont/CodeFont:sans-serif/serif/monospace 關鍵字\n  對應內建 Source Sans 3 / Source Serif 4 / Source Code Pro(go:embed 內嵌\n  woff2、本地供應、無 CDN),其他值直接作為 CSS font-family 使用\n- 新增 BaseFontSize/BaseFontWeight、HeadingFontSizes/Weights(h1..h6 與\n  Title/Header/Subheader)、CodeFontSize/CodeFontWei\n[…]\nfont-heading / --sy-font-code 變數;\n  markdown pre/code 統一使用 code 字型;註冊字型 MIME(Windows 缺 .woff2)\n- 所有注入值皆經 CSS 跳脫驗證,附測試\n- 修正 README/SKILL.md 中不存在的 [theme] 鍵(primary_color 等)\n- 新增 examples/theme-fonts 範例",
          "is_bot": false,
          "headline": "新增完整字型 theming(對齊 Streamlit)",
          "author_name": "TimLai666",
          "author_login": "TimLai666",
          "committed_at": "2026-07-04T15:07:12Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "ce611d625ae2ec63f75a7020f10d9a62f28e653c",
          "body": null,
          "is_bot": false,
          "headline": "release: v0.5.0",
          "author_name": "TimLai666",
          "author_login": "TimLai666",
          "committed_at": "2026-07-03T12:05:45Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "3023d3b284fa1331d916de5a28f844f05e399612",
          "body": "…endpoint\n\nLive browser testing of examples/insyra-artifact surfaced two issues:\n\n- describe (and any row-named DataTable) rendered its values without labels\n  because To2DSlice drops row names. tableData now prepends the row names as a\n  leading label column, so describe shows count/mean/std/... ag\n[…]\nint to the example so the agent\nPOST/discovery path is demonstrable, and add regression tests for the in-place\nsort and the row-name rendering.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(insyra): surface DataTable row names; correct sort docs; example …",
          "author_name": "TimLai666",
          "author_login": "TimLai666",
          "committed_at": "2026-07-03T11:22:06Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "51aa7a690ae7a402c69ece0a7d60aaa5f338e978",
          "body": "…ties\n\nAdd RegisterArtifactComponentInfo so a custom component can publish discovery\nmetadata under components.capabilities. The insyra component reports its safe\nDSL vocabulary via syidsl.SafeCommandCatalog, which enumerates Insyra's command\nregistry filtered by the safe allowlist and returns each \n[…]\neps only a short stable starter. Tests\ncover the catalog excluding unsafe commands and the discovery response carrying\nthe insyra capabilities.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(artifact): live Insyra DSL command catalog in discovery capabili…",
          "author_name": "TimLai666",
          "author_login": "TimLai666",
          "committed_at": "2026-07-03T11:11:12Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "2de5591cebcbf1b7f86c5c95bc0b2792c6b0cb11",
          "body": "GET on the unified artifact API now returns a \"components\" object with \"builtin\"\nand \"custom\" arrays. An agent can check components.custom to tell whether an\nopt-in component like \"insyra\" is enabled before POSTing a spec that uses it,\ninstead of relying on out-of-band knowledge or a wholesale rejection.\n\nDocs (both skills, README, CHANGELOG) updated; test asserts discovery reports\nbuiltin and registered custom components.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(artifact): report supported components in discovery response",
          "author_name": "TimLai666",
          "author_login": "TimLai666",
          "committed_at": "2026-07-03T11:04:31Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "55e529f9cd8e21dae86727d83ac586c1c9b0c403",
          "body": "The insyra artifact component was listed but the skill did not teach the Insyra\nDSL command vocabulary, so an agent could only adapt the single example. Add a\nverified safe-DSL cheat-sheet (newdl/newdt/setcolnames/groupby/filter/sort/\naddcolccl/ccl/describe/stats), a pointer to the authoritative DSL\n[…]\nike-content rule, and a\nsecond (filter) example. Add a test that the documented JSON examples parse and\ncompile through the artifact component.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs(artifact-dsl): teach agents the insyra DSL script vocabulary",
          "author_name": "TimLai666",
          "author_login": "TimLai666",
          "committed_at": "2026-07-03T10:59:42Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "98e206a445717d91232acac8eb8df6bee25a6671",
          "body": "Add integrations/insyra/insyradsl. RunDSL runs an Insyra CLI DSL (.isr) script\nin an isolated, ephemeral environment, safe mode by default: a default-deny\nallowlist of pure in-memory compute commands, with load/save/db/fetch/run/env/\nplot rejected. syidsl.DSL is a Go widget that runs and auto-render\n[…]\n CLI dependency tree; core and base syinsyra users are unaffected.\n\nDocs (both skills, README, CHANGELOG) and examples/insyra-artifact updated.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat: Insyra DSL dynamic computation for widgets and artifacts",
          "author_name": "TimLai666",
          "author_login": "TimLai666",
          "committed_at": "2026-07-03T10:55:26Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "41bc21b59a594779b48871607a062a78c15bb6ac",
          "body": null,
          "is_bot": false,
          "headline": "ci: update official actions runtimes",
          "author_name": "TimLai666",
          "author_login": "TimLai666",
          "committed_at": "2026-07-02T10:15:52Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "d859e3795cde0d14548154bda17083bc7deb1594",
          "body": null,
          "is_bot": false,
          "headline": "release: prepare v0.4.0",
          "author_name": "TimLai666",
          "author_login": "TimLai666",
          "committed_at": "2026-07-02T10:14:32Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "c7efe21b44220d5d445f0efafa8b9883546d8dcb",
          "body": null,
          "is_bot": false,
          "headline": "修正 dev 模式 Artifact API 位址",
          "author_name": "TimLai666",
          "author_login": "TimLai666",
          "committed_at": "2026-07-01T11:51:49Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "d3eacb3667685aaa8217e6cfd93556b89f12d1cb",
          "body": null,
          "is_bot": false,
          "headline": "完善 Agent Artifact 發現與預覽流程",
          "author_name": "TimLai666",
          "author_login": "TimLai666",
          "committed_at": "2026-07-01T11:20:51Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "f457f9d2b055e6edbcd0e38e429aebb2f79ab222",
          "body": null,
          "is_bot": false,
          "headline": "擴充 artifact canvas 範例 app",
          "author_name": "TimLai666",
          "author_login": "TimLai666",
          "committed_at": "2026-06-24T13:57:12Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "f847ac2756118d0bfa989a0f12c225986d935f3f",
          "body": null,
          "is_bot": false,
          "headline": "補上 Artifact DSL 文件與專用 skill",
          "author_name": "TimLai666",
          "author_login": "TimLai666",
          "committed_at": "2026-06-24T13:11:00Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "5939c3ed080e4ddf7c6cf7e3f75fe4d2e2f98c23",
          "body": null,
          "is_bot": false,
          "headline": "新增 Agent Artifact Canvas",
          "author_name": "TimLai666",
          "author_login": "TimLai666",
          "committed_at": "2026-06-24T13:00:23Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "2b7b28b3d7cea91587ae52d8a6392f7321bf9304",
          "body": "After the next release (post-v0.3.0), development moves to a `dev` branch and\n`main` becomes release-only — merged from `dev` at release time and tagged.\nUntil that switch (no `dev` branch yet) work continues on `main`. The rule is\nself-checking via `git branch`.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs: define dev/main branch model",
          "author_name": "TimLai666",
          "author_login": "TimLai666",
          "committed_at": "2026-06-22T16:57:02Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "b0c4d6664c3926b44874066858b01701808557d0",
          "body": "SKILL.md was missing a few shipped APIs — add TimeSlider, the PillsMulti /\nSegmentedControlMulti multi-select variants, FeedbackStyle, Fragment RunEvery\n(server-driven live refresh), and sy.Context() (request headers/cookies/locale).\n\nCLAUDE.md: turn the soft \"keep docs in sync\" note into an explici\n[…]\ne SKILL.md, README,\nCHANGELOG (and an example when useful) in the same change, with a reminder to\nre-read SKILL.md before committing a feature.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs: sync skill with current API; make doc-updates a hard rule",
          "author_name": "TimLai666",
          "author_login": "TimLai666",
          "committed_at": "2026-06-22T16:53:33Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "a8da930f701fbe46417207c024bbab8eaf550b86",
          "body": "Surface AI-assisted development early — right after the getting-started steps —\ninstead of in the lower \"learn more\" cluster.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs: move Agent Skills up after Quick Start",
          "author_name": "TimLai666",
          "author_login": "TimLai666",
          "committed_at": "2026-06-22T16:06:02Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "d9de4d87e83ab394b305ead7b966ea853b17d477",
          "body": "Group sections by purpose: get started (Installation, Requirements, Quick\nStart, Screenshots) → positioning (Beyond Streamlit, moved up from the bottom)\n→ capabilities (Features, Common Options, Insyra) → config → build/ops (CLI,\nStatic, Testing) → learn (Examples, Agent Skills, Streamlit parity) → meta.\nRequirements moved next to Installation; no content changed.\n\nCo-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs: reorder README into a clearer flow",
          "author_name": "TimLai666",
          "author_login": "TimLai666",
          "committed_at": "2026-06-22T15:45:07Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "48fd3ad5219b160539c3d19ce2ea655d2a40e93f",
          "body": "Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs: cut v0.3.0 changelog",
          "author_name": "TimLai666",
          "author_login": "TimLai666",
          "committed_at": "2026-06-22T15:37:57Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "b8707e89b2be50cec4b3654a03f7f48085bbd864",
          "body": "A runnable demo of the themed scrollbars inside embedded Component iframes\n(vertical + horizontal, following light/dark). Listed in the README examples\ntable.\n\nCo-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs(examples): add embed-scroll example for themed iframe scrollbars",
          "author_name": "TimLai666",
          "author_login": "TimLai666",
          "committed_at": "2026-06-22T15:19:04Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "3a93b3503991e00d9dade93655dc24590ec73400",
          "body": "…Frame)\n\nEmbedded iframes are separate documents, so the page's themed scrollbars\n(runtime.css) never reached them — a scrolling Component (which is also how\neplot renders echarts charts) or same-origin IFrame showed the default OS\nscrollbar. injectScrollbarTheme() now injects a matching themed scro\n[…]\nss throws, caught).\n\nVerified live: the echarts chart iframe carries the injected style with the\ndark-theme color (#2a2f3a), matching the page.\n\nCo-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(runtime): themed scrollbars inside embedded iframes (Component/I…",
          "author_name": "TimLai666",
          "author_login": "TimLai666",
          "committed_at": "2026-06-22T14:55:08Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "3ffcb87dbe5a6bade1a09bf1018e02c0e4fec687",
          "body": "go-echarts renders a fixed 900x500, white-background, light-themed chart that\nlooked broken dropped into a dark Syralit page: clashing white box, horizontal\nscrollbar (canvas overflowed the iframe), clipped title, and unlabeled Sankey\nnodes. decorate() now post-processes the rendered HTML to:\n- fill\n[…]\non the dark insyra-charts example: iframe-width fit, no scroll,\ntransparent bg, light title (#e6e6e6), Sankey nodes labeled; no console errors.\n\nCo-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(eplot): make native charts fit the page and follow the theme",
          "author_name": "TimLai666",
          "author_login": "TimLai666",
          "committed_at": "2026-06-22T14:48:48Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "82cc0a5bb572014946c717208361aae9bce8d94f",
          "body": "…ggle/Checkbox default\n\n- syiplot.SetOffline(true) inlines the echarts JS (core + v4 + word-cloud\n  extension, bundled via go:embed under eplot/assets) into each chart's iframe,\n  so native charts render with no CDN — air-gapped, strict-CSP, or as a\n  `syralit build` single binary. Default stays CDN\n[…]\now defaults checked). Added a core test.\n- Vendored echarts assets marked binary via .gitattributes; docs updated\n  (README, skill, CHANGELOG).\n\nCo-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(eplot): offline echarts inlining + native-charts example; fix To…",
          "author_name": "TimLai666",
          "author_login": "TimLai666",
          "committed_at": "2026-06-22T11:54:29Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "a3e691bb4f5755caacbed9acddc9ca8ff7426468",
          "body": "… eplot)\n\nExtend the insyra-demo example with Statistical Analysis, Interactive\nTransforms, Upload Your Data, and Native go-echarts Charts sections; update\nREADME, the syralit-dev skill, STREAMLIT_PARITY, and CHANGELOG to cover the new\nsyi.Describe/Correlation/CorrelationMatrix/LinearRegression/TTes\n[…]\nics + describe table, FilterBuilder filtering\n(Sales>150 → 1 row), and both WordCloud and Sankey echarts rendering canvases;\nno console errors.\n\nCo-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs(insyra): document deeper integration (stats, upload, transforms,…",
          "author_name": "TimLai666",
          "author_login": "TimLai666",
          "committed_at": "2026-06-22T10:29:49Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "3ff93f4e17404478fe7eef3f662a4d2ad908670b",
          "body": "New opt-in subpackage integrations/insyra/eplot (package syiplot):\n- EChart(plot.Renderable) bridges any insyra/plot chart into the UI as an\n  interactive chart, rendered through Syralit's sandboxed Component iframe so\n  the echarts <script> actually executes. Unlocks chart types the built-in\n  Char\n[…]\ne adapter stay free of those deps\n(verified: go list -deps ./integrations/insyra shows no chromedp/go-echarts;\nthey appear only under ./eplot).\n\nCo-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(insyra): native go-echarts plotting via syi/eplot subpackage",
          "author_name": "TimLai666",
          "author_login": "TimLai666",
          "committed_at": "2026-06-22T10:22:59Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "896503050ac9380c0ef81c81c1af9c7451111e8d",
          "body": "…lder\n\nFilterBuilder renders column/operator/value controls and returns a filtered\nDataTable (non-destructive Clone). The cell-level insyra Filter is driven by a\nprecomputed per-row verdict so a single-column condition keeps/drops whole rows\ncorrectly. matchOp compares numerically when both sides pa\n[…]\nough. The runaway path is mitigated in code but deliberately not\nunit-tested (a spinning goroutine would destabilize the package test process).\n\nCo-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(insyra): interactive transforms — syi.FilterBuilder & syi.CCLBui…",
          "author_name": "TimLai666",
          "author_login": "TimLai666",
          "committed_at": "2026-06-22T10:18:46Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "62514dafee3c9b5e5edf82fc99042819865c5723",
          "body": "…SON)\n\nUploadTable renders a FileUploader and parses the upload into an Insyra\nDataTable by extension; ParseTable exposes the same for non-uploader sources.\nExcel is read in-memory via excelize.OpenReader (already a transitive insyra\ndep) using the active sheet — no temp files. Parquet is deliberate\n[…]\nery adapter user; use insyra/parquet\ndirectly if needed. Tests cover CSV, dynamically-generated XLSX, and the\nunsupported-extension error path.\n\nCo-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(insyra): syi.UploadTable — file upload to DataTable (CSV/Excel/J…",
          "author_name": "TimLai666",
          "author_login": "TimLai666",
          "committed_at": "2026-06-22T09:49:59Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "31b442c371da6674486b0be46fe17c3bce58f793",
          "body": "…LinearRegression/TTest)\n\nSurface Insyra's stats package directly in the Syralit UI:\n- Describe: full per-column summary table (count/mean/std/quartiles/…)\n- CorrelationMatrix: pairwise correlation matrix with variable row labels\n- Correlation: r + p as metrics (pearson/spearman/kendall)\n- LinearReg\n[…]\nmes as a leading column. Pulls in gonum (transitive via insyra/stats);\nonly compiled when the insyra integration is used. Tests cover all five.\n\nCo-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(insyra): statistical analysis helpers (syi.Describe/Correlation/…",
          "author_name": "TimLai666",
          "author_login": "TimLai666",
          "committed_at": "2026-06-22T09:46:23Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "16e39fb4797e7b037d862d55177e255bbf5b536f",
          "body": "go build ./... and go test ./... pass; the integrations/insyra adapter\ncompiles unchanged against the new version.\n\nCo-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "chore: bump insyra to v0.2.19",
          "author_name": "TimLai666",
          "author_login": "TimLai666",
          "committed_at": "2026-06-22T09:32:03Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "b2fd0c00c956b2cf1f6bc603b23823c0c35f0733",
          "body": "Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs: changelog for v0.2.0",
          "author_name": "TimLai666",
          "author_login": "TimLai666",
          "committed_at": "2026-06-22T05:28:23Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "8bb82069d16d0022aa73a90d6ea869c26e329ca2",
          "body": "When a WebSocket can't be established (e.g. a proxy that strips WS\nupgrades), the client transparently switches to a plain-HTTP transport:\nServer-Sent Events downstream (GET /_syralit/sse) + POST upstream\n(POST /_syralit/msg), correlated by a session id. No app code changes.\n\n- Abstracted the render\n[…]\nET sse -> session+patch, POST change ->\npushed update), race-clean; WS path still works in the browser (counter\nincrements, no console errors).\n\nCo-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat: automatic SSE transport fallback when WebSocket is blocked",
          "author_name": "TimLai666",
          "author_login": "TimLai666",
          "committed_at": "2026-06-21T18:36:29Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "aa6868d39f5c7632e81730ae847545c38d22b582",
          "body": "Every third-party library (Chart.js, Leaflet, KaTeX, highlight.js, viz,\nvega, plotly, bokeh, deck.gl, mapbox) now loads through a resolver that\nhonors sy.SetAssetURL(name, url) overrides. Point them at copies served\nfrom public/ and `syralit build` produces a single binary that runs with\nno CDN/inte\n[…]\nver falls back to the pinned CDN URL by default,\nso existing apps are unchanged.\n\nTest: SetAssetURL injects the override into the served index.\n\nCo-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat: SetAssetURL — self-host front-end libs for offline/air-gapped apps",
          "author_name": "TimLai666",
          "author_login": "TimLai666",
          "committed_at": "2026-06-21T18:17:53Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "910baea4decce4b545261bf271d7388a40895b68",
          "body": "App-wide state visible to every connected session — Streamlit state is\nper-session only, so this enables live multi-user features it can't.\n\n- Shared[T](key, def) returns a typed handle; Get/Set/Update. Set and\n  Update broadcast a rerun to all active sessions, so a change in one\n  browser live-push\n[…]\ns in README,\n  SKILL, parity doc.\n\nVerified: two-connection test (A clicks -> B receives the new value with\nno message of its own), race-clean.\n\nCo-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat: sy.Shared cross-session state (real-time collaboration)",
          "author_name": "TimLai666",
          "author_login": "TimLai666",
          "committed_at": "2026-06-21T18:09:37Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "c49887785f8358a1e38782c20a312f1b9b64d675",
          "body": "Go-native capability Streamlit can't match: run work in a goroutine and\nlet the page stay responsive while it runs.\n\n- sy.Task[T](key, fn) starts fn once per session/key in a goroutine and\n  returns a typed handle (Running/Done/Result/Err). On completion the\n  server pushes a rerun so the UI updates\n[…]\nage.\n\nVerified: race-clean test (task runs → server pushes result with no\nclient message); browser e2e (spinner → auto-pushed result after 3s).\n\nCo-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat: sy.Task background jobs with server-push (beyond Streamlit)",
          "author_name": "TimLai666",
          "author_login": "TimLai666",
          "committed_at": "2026-06-21T18:01:34Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "2caf42435d4a4a750e2684207a215bb206880c76",
          "body": null,
          "is_bot": false,
          "headline": "Add screenshots section to README",
          "author_name": "TimLai666",
          "author_login": "TimLai666",
          "committed_at": "2026-06-21T06:08:24Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "f7f4568b6a23175f738a678ea2a9f8001fcfb52b",
          "body": null,
          "is_bot": false,
          "headline": "Create AGENTS.md",
          "author_name": "TimLai666",
          "author_login": "TimLai666",
          "committed_at": "2026-06-21T05:40:09Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "c539c162a21f39b55e553af5a84d2b02c63d40da",
          "body": "Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs: changelog for v0.1.1",
          "author_name": "TimLai666",
          "author_login": "TimLai666",
          "committed_at": "2026-06-21T03:26:30Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "5bfa1834a7e9f433b376e11a9d00f4b25a409221",
          "body": "Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs: note ClearOnSubmit in README and skill form examples",
          "author_name": "TimLai666",
          "author_login": "TimLai666",
          "committed_at": "2026-06-21T03:22:13Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "e2217da82c8ef32d783f0d01858c35e2af964166",
          "body": "Form(key, fn, sy.ClearOnSubmit()) resets the form's inputs after a\nsuccessful submit (st.form clear_on_submit). The submit handler still\nsees the submitted values; the server blanks the form subtree in the\nsent UI tree and drops the stored values so later renders stay cleared.\nInputs reset to type d\n[…]\nvs Streamlit. Test asserts\nthe handler sees the value while the input renders cleared in the same\nresponse; demoed on mega-demo's contact form.\n\nCo-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat: form clear_on_submit",
          "author_name": "TimLai666",
          "author_login": "TimLai666",
          "committed_at": "2026-06-21T03:20:11Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "61fef8e645d9c9066b362ddc9e38348d509b8139",
          "body": "- Progress(value, text) shows an optional label above the bar (st.progress\n  text=)\n- Add docs/STREAMLIT_PARITY.md mapping the Streamlit API to Syralit and\n  listing the few intentional gaps; link it from the README\n\nCo-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat: progress text label; document Streamlit parity",
          "author_name": "TimLai666",
          "author_login": "TimLai666",
          "committed_at": "2026-06-21T02:40:39Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "71bfa61335c16a3e940b4c2ad2c7858b1f012771",
          "body": "sy.JSON now renders a real collapsible, color-coded tree (keys/strings/\nnumbers/bools/null) instead of a static formatted block — matching\nst.json. Fully expanded by default; sy.DefaultValue(false) starts\ncollapsed. Each object/array node toggles on click.\n\nVerified in browser: nested dependencies/features tree with disclosure\ntoggles and syntax colors.\n\nCo-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat: interactive collapsible JSON tree",
          "author_name": "TimLai666",
          "author_login": "TimLai666",
          "committed_at": "2026-06-21T02:36:43Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "951df85b6e13c8d6c2f42026c7945adf90e4db96",
          "body": "- Popover trigger honors Icon/ButtonType/UseContainerWidth/Disabled/Help\n- Metric supports Help tooltip\n\nTest via RenderOnce.\n\nCo-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat: popover icon/type/width/disabled/help, metric help tooltip",
          "author_name": "TimLai666",
          "author_login": "TimLai666",
          "committed_at": "2026-06-21T02:32:19Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "8f0059ad33db17e649c5ca8ade281bc2b15ffafe",
          "body": "…hing\n\n- Fragment(key, fn, sy.RunEvery(d)) re-runs a fragment on an interval for\n  live dashboards (st.fragment run_every). The client polls via a new\n  fragment_rerun message; the server re-runs just that fragment.\n- Fix a latent bug: appendStream and patchFragment referenced an\n  undefined `conten\n[…]\na RunEvery live clock advances on its own\n(10:28:30 -> 10:28:33). Test covers the run_every prop + fragment_rerun\n-> fragment_patch round-trip.\n\nCo-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat: fragment RunEvery auto-refresh; fix broken stream/fragment patc…",
          "author_name": "TimLai666",
          "author_login": "TimLai666",
          "committed_at": "2026-06-21T02:29:36Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "0d52a7340112682eafd7ca638a4701e01d3dea07",
          "body": "MapPoint gains Size (circle-marker radius) and Color; Map gains Zoom().\nPoints with size/color render as Leaflet circleMarkers; an explicit zoom\noverrides auto-fit. st.map(size=, color=, zoom=) parity.\n\nDemo + test.\n\nCo-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat: map zoom + sized/colored points",
          "author_name": "TimLai666",
          "author_login": "TimLai666",
          "committed_at": "2026-06-21T02:18:19Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "acd5fd8eee02257afc9edf64c3413688cdad6295",
          "body": "- Context() exposes the session's request: Headers, Cookies, Host, IP,\n  Locale (st.context equivalent), captured from the WebSocket upgrade\n- Write now renders numbers and bools as text instead of JSON\n\nTest connects with custom headers/cookies and asserts Context exposes them.\n\nCo-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat: sy.Context (request headers/cookies/locale), richer Write",
          "author_name": "TimLai666",
          "author_login": "TimLai666",
          "committed_at": "2026-06-21T02:14:47Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "5caa59a28fee05b21bc07939419969dec8692750",
          "body": "- PillsMulti / SegmentedControlMulti return []string (toggle multiple),\n  the selection_mode=\"multi\" equivalent\n- TimeSlider(label, minTime, maxTime) → \"HH:MM\", form-batched, Step in\n  minutes (default 15) — time-valued st.slider\n\nDemos in mega-demo; tests for multi round-trip + time slider default.\n\nCo-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat: multi-select pills/segmented, TimeSlider",
          "author_name": "TimLai666",
          "author_login": "TimLai666",
          "committed_at": "2026-06-21T02:10:34Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "2febf462e39c57e1af77cbbb93f870bdd1f45e1a",
          "body": "- Code: LineNumbers() adds a gutter, Wrap() soft-wraps long lines\n- ChatMessage: Avatar(emojiOrURL) for custom avatars (st.chat_message avatar)\n\nContainer already honored Height() for fixed-height scroll. Tests via\nRenderOnce.\n\nCo-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat: code line numbers/wrap, chat message avatars",
          "author_name": "TimLai666",
          "author_login": "TimLai666",
          "committed_at": "2026-06-21T02:04:23Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "e1dec5b1c931073593a055acbacdafcb43ee219f",
          "body": "…/muted\n\n- Image gains UseContainerWidth (full-width, st.image use_container_width)\n- Audio now honors options; Audio/Video support Autoplay/Loop/Muted\n\nTest via RenderOnce.\n\nCo-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat: media params — image container width, audio/video autoplay/loop…",
          "author_name": "TimLai666",
          "author_login": "TimLai666",
          "committed_at": "2026-06-21T02:00:26Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "04aac119e2f4322599a0b64f49798275838ca943",
          "body": "Native-chart parity with Streamlit:\n- Stacked() stacks bar/area series (scales x/y stacked)\n- Horizontal() renders horizontal bars (Chart.js indexAxis: y)\n- Colors([]string) overrides the series palette\n\nWired through chartProps; demoed in mega-demo's Bar tab; test for prop\nserialization.\n\nCo-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat: chart options — stacked, horizontal bars, custom colors",
          "author_name": "TimLai666",
          "author_login": "TimLai666",
          "committed_at": "2026-06-21T01:56:27Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "5a86ae1d02470113b24a9da94a919ff374b23164",
          "body": "st.column_config parity for DataFrame and DataEditor:\n- ColumnConfig gains Format (printf-style: \"$%.2f\", \"%d%%\"), Label\n  (header override), Help (header tooltip), Step (number editor), Color\n- New display-only column types bar_chart / line_chart render an inline\n  SVG sparkline from a []float64 ce\n[…]\nelectable table. Test for serialization.\n\nVerified via DOM: 4 sparkline polylines, \"$4200\"/\"100%\" formatted cells,\n\"6-wk trend\" label override.\n\nCo-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat: richer column_config — format, label, help, step, chart columns",
          "author_name": "TimLai666",
          "author_login": "TimLai666",
          "committed_at": "2026-06-21T01:52:22Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "c6fa22545595ba36115562c9f3972630faeff8dc",
          "body": "Streamlit-parity widget polish:\n- Feedback gains FeedbackStyle(\"stars\"|\"faces\"|\"thumbs\") — st.feedback\n- Button supports Help tooltips\n- Toast accepts a trailing icon arg: Toast(text, level, icon)\n- Expander supports a leading Icon\n\nDemo feedback styles in mega-demo; tests via RenderOnce.\n\nCo-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat: feedback stars/faces, button help, toast & expander icons",
          "author_name": "TimLai666",
          "author_login": "TimLai666",
          "committed_at": "2026-06-21T01:43:25Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "a36e2126933f98406e0f75111be9838b55a38eff",
          "body": "- Add RenderOnce(appFn) *Node and Node.Find(type) so widgets and\n  integrations can be unit-tested without starting a server\n- Add unit tests for the insyra adapter (List, ListMetrics, ListDescribe,\n  Histogram, Table/Metrics) — the package had none before\n- NaN-safe stats: ListMetrics / ListDescrib\n[…]\n- Drop the stale \"pre-release, add a replace directive\" note from the\n  scaffolded README; add CHANGELOG.md and a Testing section to the README\n\nCo-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat: RenderOnce test API, syi tests, NaN-safe stats; prep v0.1.0",
          "author_name": "TimLai666",
          "author_login": "TimLai666",
          "committed_at": "2026-06-20T18:19:58Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "943602afb392b902a2eeb6bddf703dbc98c2d546",
          "body": "- DataFrame row selection: sy.DataFrame(..., sy.Selectable()) renders a\n  checkbox column and returns the selected indices (into the original\n  rows); selection is stable across client-side sorting\n- DataFrame column_config: sy.ColConfig now also applies to DataFrame for\n  read-only typed display (l\n[…]\nls render\nanchors and progress cells render 8px accent bars (JS-measured); ListDescribe\nshows correct stats (mean 79.40, std 11.21, 50% 81.00).\n\nCo-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat: DataFrame selection + column_config, DateSlider, ListDescribe",
          "author_name": "TimLai666",
          "author_login": "TimLai666",
          "committed_at": "2026-06-20T18:10:00Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "65f111eba7537198d60ea474ae42b8ae8b237756",
          "body": null,
          "is_bot": false,
          "headline": "Update README.md",
          "author_name": "TimLai666",
          "author_login": "TimLai666",
          "committed_at": "2026-06-20T18:09:22Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "c8317a4b00f4215ff85d32a9fa4c8a3348a201bb",
          "body": "Streamlit-parity polish on existing inputs:\n- Metric border (st.metric border=True): sy.Metric(..., sy.Border())\n- Date bounds (st.date_input min_value/max_value): sy.MinDate / sy.MaxDate\n  on DateInput and DateRangeInput (native <input type=date> min/max)\n- RangeSlider and DateRangeInput now batch \n[…]\n\" notes.\n\nVerified in browser: dragging the budget range then Apply commits the\nbatched [2000,4000] value and renders bordered summary metrics.\n\nCo-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat: metric border, date bounds, form batching for range/date-range",
          "author_name": "TimLai666",
          "author_login": "TimLai666",
          "committed_at": "2026-06-20T17:47:14Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "cbce074d02bd752f9ae1d380f832f22928ac9c08",
          "body": ".sy-tabs-bar only set overflow-x:auto; per CSS that makes overflow-y\ncompute to auto, and the tabs' -2px bottom margin plus the reserved\nhorizontal scrollbar height triggered a vertical scrollbar. Pin\noverflow-y:hidden so the tab strip only ever scrolls horizontally.\n\nCo-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(ui): stop stray vertical scrollbar on the tabs bar",
          "author_name": "TimLai666",
          "author_login": "TimLai666",
          "committed_at": "2026-06-20T17:34:53Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "b617c3477b30633bc996bdfaed80fea378a474be",
          "body": "Mirror the DataTable helper set for single-series Insyra DataLists:\n- List / ListPreview          (single-column table)\n- EditableList                (editable single column -> []any)\n- ListMetrics                 (count / mean / min / max)\n- ListLineChart / ListBarChart / ListAreaChart  (value over\n[…]\nList showcase section.\n\nVerified in browser: List, ListMetrics, Histogram, Bar/Line all render;\nnamed-column charts work after the SetName fix.\n\nCo-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(insyra): add symmetric DataList helpers to syi",
          "author_name": "TimLai666",
          "author_login": "TimLai666",
          "committed_at": "2026-06-20T17:32:22Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "53ef156e207b54a07387478bff59d08792613c1a",
          "body": "- RangeSlider(label, min, max) returns (low, high) via a dual-handle\n  slider (two overlaid range inputs, filled band between thumbs)\n- DateRangeInput(label) returns (start, end) as a pair of date pickers\n- Both send their value as a [low, high] / [start, end] array on change\n  (immediate, not form-\n[…]\nnge, and\n  button-family styling\n\nVerified in browser: dragging the low handle 200 to 370 updates the\ndisplay and the Go-side value end to end.\n\nCo-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat: RangeSlider, DateRangeInput, button styling on link/download",
          "author_name": "TimLai666",
          "author_login": "TimLai666",
          "committed_at": "2026-06-20T17:22:55Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "21cd446d974979fa94aeeb9f2cd8c5f2d8e50355",
          "body": "- README: add CI / Go Reference / Go Report Card / Go version / License\n  badges, plus a GitHub Actions CI workflow (build + vet + test) so the\n  CI badge is meaningful\n- syralit new . scaffolds into the current directory (no wrapper folder);\n  module name is taken from the dir, refuses to clobber e\n[…]\nk)\n\nVerified end-to-end: built a binary, ran it from an empty directory, and\nconfirmed embedded public/ files are served. Added static_test.go.\n\nCo-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat: badges, in-place new, single-binary build with static embedding",
          "author_name": "TimLai666",
          "author_login": "TimLai666",
          "committed_at": "2026-06-20T17:04:54Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "2c1f8ecc058837beca7050d55dbf7121ab8aff20",
          "body": "- sy.Exception(err) renders a Go error in a styled monospace box\n  (equivalent to st.exception); nil renders nothing\n- Button options: Icon (label prefix), ButtonType (primary/secondary/\n  tertiary), UseContainerWidth (full-width) — matching st.button\n- Fix LinkButton: was using the unstyled .sy-btn\n[…]\no all of the above in mega-demo; add tests for Exception and\n  button variants\n\nVerified visually in light mode across Widgets and Forms pages.\n\nCo-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat: Streamlit-parity additions — Exception, button variants",
          "author_name": "TimLai666",
          "author_login": "TimLai666",
          "committed_at": "2026-06-20T16:49:14Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "1110eab0ce38fa59ea2bb4790c98fe60e99a4960",
          "body": "- Define --sy-primary / --sy-primary-alpha (aliased to --sy-accent);\n  they were referenced 10x but never defined, leaving SegmentedControl\n  and Pills active states as invisible white text on no background, and\n  breaking Feedback/Pagination/PageLink accent colors\n- Give .sy-button a right margin s\n[…]\nerence when\n  data-theme is unset) so the first click always produces a visible change\n\nVerified in light and dark mode across mega-demo pages.\n\nCo-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(ui): define --sy-primary, space buttons, style theme toggle",
          "author_name": "TimLai666",
          "author_login": "TimLai666",
          "committed_at": "2026-06-20T16:39:01Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "6f830c01e804e1ea6a74d225d863378b6d2b1e40",
          "body": "Rename Skills/ -> skills/ so the documented install command\n`npx skills add HazelnutParadise/syralit/skills` resolves on\ncase-sensitive GitHub paths. Update README with the npx install\nmethod and fix all path references in README and CLAUDE.md.\n\nCo-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs: add npx skills install method, lowercase skills/ dir",
          "author_name": "TimLai666",
          "author_login": "TimLai666",
          "committed_at": "2026-06-20T16:25:56Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "5df16ca3473e9faad9cd3a0dd048cbb594cb06ad",
          "body": "- Add CLAUDE.md with repo guidance, insyra-isolation rule, and a\n  standing instruction to keep insyra pinned to the latest version\n- Restructure agent skill into proper Agent Skill format:\n  Skills/syralit-dev/SKILL.md with name/description frontmatter\n- Add themed scrollbar styling (was using browser defaults) that\n  blends with the light/dark surface via --sy-* variables\n- Update README skill reference to the new path\n\nCo-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "chore: add CLAUDE.md, fix skill format, theme scrollbars",
          "author_name": "TimLai666",
          "author_login": "TimLai666",
          "committed_at": "2026-06-20T16:22:03Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "2a80ca774edac831fc8e01bfcbe1285304c00004",
          "body": "Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs: add mega-demo to examples table in README",
          "author_name": "TimLai666",
          "author_login": "TimLai666",
          "committed_at": "2026-06-20T16:16:24Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "cb6adf710e472b0c698b7fbae852e573766bb40b",
          "body": "10-page comprehensive demo covering every Syralit feature:\ndashboard, all widgets, built-in charts, external charts,\nlayout containers, forms/dialogs, data tables (all 11 column\ntypes), chat with streaming, maps/media/LaTeX, state/cache/fragment.\n\nCo-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat: add mega-demo example with all features",
          "author_name": "TimLai666",
          "author_login": "TimLai666",
          "committed_at": "2026-06-20T15:58:04Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "5191fb55af0b2943406dcff867edf245ece40c7e",
          "body": "- Add 4 new example apps: chatbot (streaming chat UI), form-app\n  (conference registration with validation), data-explorer (3-page\n  sales dashboard), auth-demo (LoginGate + role-based access)\n- Add Skills/syralit-dev.md agent skill with complete API reference\n- Rewrite README with structured tables, code samples, and full\n  feature documentation\n\nCo-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs: add examples, agent skills, and comprehensive README",
          "author_name": "TimLai666",
          "author_login": "TimLai666",
          "committed_at": "2026-06-20T11:41:18Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "00eda43166f49d95d68ae274200fcf77f8772493",
          "body": "Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs: add PydeckChart to README",
          "author_name": "TimLai666",
          "author_login": "TimLai666",
          "committed_at": "2026-06-20T11:13:04Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "56e83d8bbe25eb8dbc310541b3d57a18e2a618de",
          "body": "Go equivalent of st.pydeck_chart — accepts deck.gl JSON specs with\ninitialViewState and layers array. Rendered client-side using deck.gl\nand mapbox-gl-js CDN with lazy loading.\n\nThis completes the full Streamlit charting library parity:\n- LineChart, BarChart, AreaChart, ScatterChart, PieChart (Chart\n[…]\nart (Plotly.js)\n- PyplotChart (SVG/PNG image charts)\n- BokehChart (BokehJS)\n- PydeckChart (deck.gl)\n- GraphvizChart (viz.js)\n- Map (Leaflet.js)\n\nCo-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat: PydeckChart for deck.gl 3D map visualizations",
          "author_name": "TimLai666",
          "author_login": "TimLai666",
          "committed_at": "2026-06-20T11:12:48Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "2ce3750e2a6a56ff9a3a2af9f516e79d7f93fabc",
          "body": "Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs: update showcase and README with Vega-Lite and Plotly charts",
          "author_name": "TimLai666",
          "author_login": "TimLai666",
          "committed_at": "2026-06-20T11:09:21Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "ed6264c610c81413e5b85da028eb67060567f5b0",
          "body": "Port Streamlit's charting library wrappers to Syralit:\n\n- VegaLiteChart(spec) — renders Vega-Lite specs via CDN (vega-embed)\n  Go equivalent of st.altair_chart (Altair generates Vega-Lite JSON)\n- PlotlyChart(spec) — renders Plotly figure specs via Plotly.js CDN\n  Go equivalent of st.plotly_chart\n- P\n[…]\n\n  Go equivalent of st.bokeh_chart\n\nEach uses lazy CDN loading with queue pattern (same as Chart.js,\nKaTeX, Leaflet). Tests added for all four.\n\nCo-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat: VegaLiteChart, PlotlyChart, PyplotChart, BokehChart",
          "author_name": "TimLai666",
          "author_login": "TimLai666",
          "committed_at": "2026-06-20T11:08:12Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "f80a847478b9f62a6ba633327222c579a109362a",
          "body": "VerticalAlignment(\"top\"|\"center\"|\"bottom\") aligns column content\nvertically, matching Streamlit's st.columns(vertical_alignment=...).\n\nCo-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat: VerticalAlignment option for Columns",
          "author_name": "TimLai666",
          "author_login": "TimLai666",
          "committed_at": "2026-06-20T11:03:43Z",
          "body_truncated": false,
          "is_coding_agent": true
        }
      ],
      "releases_count": 9,
      "commits_last_year": 153,
      "latest_release_at": "2026-07-18T13:05:04Z",
      "latest_release_tag": "v0.8.0",
      "releases_from_tags": false,
      "days_since_last_push": 9,
      "active_weeks_last_year": 4,
      "days_since_latest_release": 9,
      "mean_days_between_releases": 3.5
    },
    "community": {
      "has_readme": true,
      "has_license": true,
      "has_description": true,
      "has_contributing": false,
      "health_percentage": 50,
      "has_issue_template": false,
      "has_code_of_conduct": false,
      "has_pull_request_template": false
    },
    "ecosystem": {
      "packages": [
        {
          "name": "github.com/HazelnutParadise/syralit",
          "exists": true,
          "license": null,
          "keywords": [],
          "ecosystem": "go",
          "matches_repo": true,
          "registry_url": "https://pkg.go.dev/github.com/HazelnutParadise/syralit",
          "is_deprecated": false,
          "latest_version": "v0.8.0",
          "repository_url": "https://github.com/HazelnutParadise/syralit",
          "versions_count": 9,
          "total_downloads": null,
          "dependents_count": null,
          "deprecation_note": null,
          "maintainers_count": null,
          "monthly_downloads": null,
          "first_published_at": null,
          "latest_published_at": "2026-07-18T13:04:52Z",
          "latest_version_yanked": null,
          "days_since_latest_publish": 9
        }
      ]
    },
    "popularity": {
      "forks": 0,
      "stars": 2,
      "watchers": 0,
      "fork_history": {
        "days": [],
        "complete": true,
        "collected": 0,
        "total_forks": 0
      },
      "star_history": null,
      "open_issues_and_prs": 0
    },
    "ai_readiness": {
      "has_nix": false,
      "example_dirs": [
        "examples"
      ],
      "has_llms_txt": false,
      "has_dockerfile": false,
      "has_mcp_signal": false,
      "bootstrap_files": [],
      "api_schema_files": [],
      "has_devcontainer": false,
      "typecheck_configs": [],
      "toolchain_manifests": [
        "examples/desktop-demo/go.mod",
        "examples/oidc-login/go.mod",
        "go.mod",
        "integrations/desktop/go.mod",
        "integrations/oidc/go.mod",
        "uitest/go.mod"
      ],
      "largest_source_bytes": 1024695,
      "source_files_sampled": 93,
      "oversized_source_files": 4,
      "agent_instruction_files": [
        "AGENTS.md",
        "CLAUDE.md"
      ],
      "agent_instruction_max_bytes": 6372
    },
    "dependencies": {
      "manifests": [
        "go.mod",
        "uitest/go.mod"
      ],
      "advisories": {
        "error": null,
        "scope": null,
        "source": null,
        "findings": [],
        "collected": false,
        "malicious": [],
        "truncated": false,
        "by_severity": {},
        "advisory_count": 0,
        "affected_count": 0,
        "assessed_count": 0,
        "malicious_count": 0,
        "assessed_package": null,
        "unassessed_count": 0,
        "direct_affected_count": 0
      },
      "ecosystems": [
        "go"
      ],
      "dependencies": [
        {
          "name": "github.com/BurntSushi/toml",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v1.6.0"
        },
        {
          "name": "github.com/HazelnutParadise/insyra",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v0.3.0"
        },
        {
          "name": "github.com/coder/websocket",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v1.8.15"
        },
        {
          "name": "github.com/fsnotify/fsnotify",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v1.10.1"
        },
        {
          "name": "github.com/xuri/excelize/v2",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v2.11.0"
        },
        {
          "name": "github.com/yuin/goldmark",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v1.8.2"
        },
        {
          "name": "github.com/HazelnutParadise/insyra",
          "manifest": "uitest/go.mod",
          "ecosystem": "go",
          "version_constraint": "v0.3.0"
        },
        {
          "name": "github.com/HazelnutParadise/syralit",
          "manifest": "uitest/go.mod",
          "ecosystem": "go",
          "version_constraint": "v0.0.0"
        },
        {
          "name": "github.com/chromedp/cdproto",
          "manifest": "uitest/go.mod",
          "ecosystem": "go",
          "version_constraint": "v0.0.0-20250403032234-65de8f5d025b"
        },
        {
          "name": "github.com/chromedp/chromedp",
          "manifest": "uitest/go.mod",
          "ecosystem": "go",
          "version_constraint": "v0.13.6"
        }
      ],
      "all_dependencies": {
        "error": "GitHub dependency-graph SBOM unavailable (404); the dependency graph may be disabled for this repository",
        "source": null,
        "packages": [],
        "collected": false,
        "truncated": false,
        "total_count": null,
        "direct_count": null,
        "indirect_count": null
      }
    },
    "maintainership": {
      "issues": {
        "open_prs": 0,
        "merged_prs": 0,
        "open_issues": 0,
        "closed_ratio": null,
        "closed_issues": 0,
        "closed_unmerged_prs": 0
      },
      "bus_factor": 1,
      "bot_contributors": 0,
      "top_contributors": [
        {
          "type": "User",
          "login": "TimLai666",
          "commits": 153,
          "avatar_url": "https://avatars.githubusercontent.com/u/43640816?v=4"
        }
      ],
      "contributors_sampled": 1,
      "top_contributor_share": 1
    },
    "quality_signals": {
      "has_ci": true,
      "has_tests": true,
      "ci_workflows": [
        "ci.yml"
      ],
      "has_docs_dir": true,
      "linter_configs": [],
      "has_editorconfig": false,
      "has_linter_config": false,
      "has_precommit_config": false
    },
    "security_signals": {
      "lockfiles": [
        "go.sum"
      ],
      "scorecard": {
        "checks": [
          {
            "name": "Binary-Artifacts",
            "score": 10,
            "reason": "no binaries found in the repo",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#binary-artifacts"
          },
          {
            "name": "Branch-Protection",
            "score": 0,
            "reason": "branch protection not enabled on development/release branches",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#branch-protection"
          },
          {
            "name": "CI-Tests",
            "score": null,
            "reason": "no pull request found",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#ci-tests"
          },
          {
            "name": "CII-Best-Practices",
            "score": 0,
            "reason": "no effort to earn an OpenSSF best practices badge detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#cii-best-practices"
          },
          {
            "name": "Code-Review",
            "score": 0,
            "reason": "Found 0/30 approved changesets -- score normalized to 0",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#code-review"
          },
          {
            "name": "Contributors",
            "score": 6,
            "reason": "project has 2 contributing companies or organizations -- score normalized to 6",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#contributors"
          },
          {
            "name": "Dangerous-Workflow",
            "score": 10,
            "reason": "no dangerous workflow patterns detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#dangerous-workflow"
          },
          {
            "name": "Dependency-Update-Tool",
            "score": 0,
            "reason": "no update tool detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#dependency-update-tool"
          },
          {
            "name": "Fuzzing",
            "score": 0,
            "reason": "project is not fuzzed",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#fuzzing"
          },
          {
            "name": "License",
            "score": 10,
            "reason": "license file detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#license"
          },
          {
            "name": "Maintained",
            "score": 0,
            "reason": "project was created within the last 90 days. Please review its contents carefully",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#maintained"
          },
          {
            "name": "Packaging",
            "score": null,
            "reason": "packaging workflow not detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#packaging"
          },
          {
            "name": "Pinned-Dependencies",
            "score": 0,
            "reason": "dependency not pinned by hash detected -- score normalized to 0",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#pinned-dependencies"
          },
          {
            "name": "SAST",
            "score": 0,
            "reason": "no SAST tool detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#sast"
          },
          {
            "name": "Security-Policy",
            "score": 0,
            "reason": "security policy file not detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#security-policy"
          },
          {
            "name": "Signed-Releases",
            "score": null,
            "reason": "no releases found",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#signed-releases"
          },
          {
            "name": "Token-Permissions",
            "score": 0,
            "reason": "detected GitHub workflow tokens with excessive permissions",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#token-permissions"
          },
          {
            "name": "Vulnerabilities",
            "score": 7,
            "reason": "3 existing vulnerabilities detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#vulnerabilities"
          }
        ],
        "commit": "6edd163fbf2b0062c135c1aa6d54a503e06ec57d",
        "ran_at": "2026-07-28T07:17:13Z",
        "aggregate_score": 3,
        "scorecard_version": "v5.5.0"
      },
      "has_codeql_workflow": false,
      "has_security_policy": false,
      "has_dependabot_config": false
    },
    "contribution_flow": {
      "collected": true,
      "ci_last_run_at": "2026-07-18T13:07:15Z",
      "oldest_open_prs": [],
      "last_merged_pr_at": null,
      "ci_last_conclusion": "SUCCESS",
      "oldest_open_issues": []
    }
  },
  "config": {
    "disabled_metrics": [],
    "disabled_categories": [],
    "disabled_components": {}
  },
  "source": {
    "url": "https://github.com/HazelnutParadise/syralit",
    "host": "github.com",
    "name": "syralit",
    "owner": "HazelnutParadise"
  },
  "metrics": {
    "overall": {
      "key": "overall",
      "band": "at_risk",
      "name": "Overall health",
      "note": null,
      "notes": [],
      "value": 47,
      "inputs": {
        "security": 30,
        "vitality": 70,
        "community": 24,
        "governance": 37,
        "engineering": 70
      },
      "components": []
    },
    "categories": [
      {
        "key": "vitality",
        "band": "good",
        "name": "Vitality",
        "value": 70,
        "weight": 0.22,
        "metrics": [
          {
            "key": "development_activity",
            "band": "moderate",
            "name": "Development activity",
            "note": null,
            "notes": [],
            "value": 50,
            "inputs": {
              "commits_last_year": 153,
              "human_commit_share": 1,
              "days_since_last_push": 9,
              "active_weeks_last_year": 4
            },
            "components": [
              {
                "key": "push_recency",
                "name": "Push recency",
                "detail": "last push 9 days ago",
                "points": 28.8,
                "status": "partial",
                "details": [
                  {
                    "code": "push_recency",
                    "params": {
                      "days": 9
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "commit_cadence",
                "name": "Commit cadence",
                "detail": "4/52 weeks with commits",
                "points": 2.8,
                "status": "partial",
                "details": [
                  {
                    "code": "commit_cadence_weeks",
                    "params": {
                      "weeks": 4
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "commit_volume",
                "name": "Commit volume",
                "detail": "153 commits in the last year",
                "points": 18,
                "status": "met",
                "details": [
                  {
                    "code": "commits_last_year",
                    "params": {
                      "count": 153
                    }
                  }
                ],
                "max_points": 18
              },
              {
                "key": "openssf_scorecard_maintained",
                "name": "OpenSSF Scorecard: Maintained",
                "detail": "project was created within the last 90 days. Please review its contents carefully",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 10
              }
            ]
          },
          {
            "key": "release_discipline",
            "band": "excellent",
            "name": "Release discipline",
            "note": "Excluded from scoring (no data or not applicable): OpenSSF Scorecard: Signed-Releases. Remaining weights renormalized.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "openssf_scorecard_signed_releases"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              }
            ],
            "value": 100,
            "inputs": {
              "releases_count": 9,
              "latest_release_tag": "v0.8.0",
              "releases_from_tags": false,
              "days_since_latest_release": 9,
              "mean_days_between_releases": 3.5
            },
            "components": [
              {
                "key": "ships_releases",
                "name": "Ships releases",
                "detail": "9 releases published",
                "points": 27,
                "status": "met",
                "details": [
                  {
                    "code": "releases_published",
                    "params": {
                      "count": 9
                    }
                  }
                ],
                "max_points": 27
              },
              {
                "key": "release_recency",
                "name": "Release recency",
                "detail": "latest release 9 days ago",
                "points": 36,
                "status": "met",
                "details": [
                  {
                    "code": "release_recency",
                    "params": {
                      "days": 9
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "release_cadence",
                "name": "Release cadence",
                "detail": "a release every ~3.5 days",
                "points": 27,
                "status": "met",
                "details": [
                  {
                    "code": "release_cadence",
                    "params": {
                      "gap": 3.5
                    }
                  }
                ],
                "max_points": 27
              },
              {
                "key": "openssf_scorecard_signed_releases",
                "name": "OpenSSF Scorecard: Signed-Releases",
                "detail": "no releases found",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_data",
                    "params": {}
                  }
                ],
                "max_points": 10
              }
            ]
          },
          {
            "key": "abandonment",
            "band": "excellent",
            "name": "Abandonment",
            "note": null,
            "notes": [],
            "value": 100,
            "inputs": {
              "cap": null,
              "state": "unverified",
              "guards": [],
              "signals": [],
              "red_flag": false,
              "multiplier_pct": 100,
              "declared_reason": null,
              "unverified_reason": "repository_too_young",
              "unanswered_open_prs": null,
              "unanswered_open_issues": null,
              "days_since_last_merged_pr": null,
              "days_since_last_human_commit": null,
              "days_since_last_human_commit_is_floor": false
            },
            "components": [
              {
                "key": "project_is_still_maintained",
                "name": "Project is still maintained",
                "detail": "maintenance record not established from the collected data",
                "points": 100,
                "status": "met",
                "details": [
                  {
                    "code": "abandonment_unverified",
                    "params": {}
                  }
                ],
                "max_points": 100
              }
            ]
          }
        ],
        "description": "Is the project alive — is code being written and are releases shipping?"
      },
      {
        "key": "community",
        "band": "critical",
        "name": "Community & Adoption",
        "value": 24,
        "weight": 0.18,
        "metrics": [
          {
            "key": "popularity",
            "band": "critical",
            "name": "Popularity & adoption",
            "note": null,
            "notes": [],
            "value": 1,
            "inputs": {
              "forks": 0,
              "stars": 2,
              "watchers": 0,
              "growth_state": "unverified",
              "growth_factor_pct": 100,
              "growth_unverified_reason": "no_history"
            },
            "components": [
              {
                "key": "stars",
                "name": "Stars",
                "detail": "2 stars",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "stars",
                    "params": {
                      "count": 2
                    }
                  }
                ],
                "max_points": 60
              },
              {
                "key": "forks",
                "name": "Forks",
                "detail": "0 forks",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "forks",
                    "params": {
                      "count": 0
                    }
                  }
                ],
                "max_points": 25
              },
              {
                "key": "watchers",
                "name": "Watchers",
                "detail": "0 watchers",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "watchers",
                    "params": {
                      "count": 0
                    }
                  }
                ],
                "max_points": 15
              }
            ]
          },
          {
            "key": "community_health",
            "band": "moderate",
            "name": "Community health",
            "note": null,
            "notes": [],
            "value": 50,
            "inputs": {
              "has_readme": true,
              "has_license": true,
              "has_contributing": false,
              "has_issue_template": false,
              "has_code_of_conduct": false,
              "has_pull_request_template": false
            },
            "components": [
              {
                "key": "readme",
                "name": "README",
                "detail": null,
                "points": 22.5,
                "status": "met",
                "details": [],
                "max_points": 22.5
              },
              {
                "key": "license",
                "name": "License",
                "detail": "recognized license (MIT)",
                "points": 22.5,
                "status": "met",
                "details": [
                  {
                    "code": "license_standard",
                    "params": {}
                  },
                  {
                    "code": "license_spdx",
                    "params": {
                      "spdx": "MIT"
                    }
                  }
                ],
                "max_points": 22.5
              },
              {
                "key": "contributing_guide",
                "name": "CONTRIBUTING guide",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 18
              },
              {
                "key": "code_of_conduct",
                "name": "Code of conduct",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 13.5
              },
              {
                "key": "issue_template",
                "name": "Issue template",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.2
              },
              {
                "key": "pr_template",
                "name": "PR template",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 6.3
              }
            ]
          }
        ],
        "description": "Does the project have users, downloads, attention, and a welcoming setup for contributors?"
      },
      {
        "key": "governance",
        "band": "at_risk",
        "name": "Sustainability & Governance",
        "value": 37,
        "weight": 0.24,
        "metrics": [
          {
            "key": "maintainer_resilience",
            "band": "critical",
            "name": "Maintainer resilience (bus factor)",
            "note": null,
            "notes": [],
            "value": 16,
            "inputs": {
              "bus_factor": 1,
              "contributors_sampled": 1,
              "top_contributor_share": 1
            },
            "components": [
              {
                "key": "bus_factor",
                "name": "Bus factor",
                "detail": "1 contributor(s) cover half of all commits",
                "points": 9,
                "status": "partial",
                "details": [
                  {
                    "code": "bus_factor",
                    "params": {
                      "count": 1
                    }
                  }
                ],
                "max_points": 54
              },
              {
                "key": "commit_distribution",
                "name": "Commit distribution",
                "detail": "top contributor authored 100% of commits",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "top_contributor_share",
                    "params": {
                      "share": 100
                    }
                  }
                ],
                "max_points": 22.5
              },
              {
                "key": "contributor_breadth",
                "name": "Contributor breadth",
                "detail": "1 contributors",
                "points": 1.4,
                "status": "partial",
                "details": [
                  {
                    "code": "contributors_sampled",
                    "params": {
                      "count": 1
                    }
                  }
                ],
                "max_points": 13.5
              },
              {
                "key": "openssf_scorecard_contributors",
                "name": "OpenSSF Scorecard: Contributors",
                "detail": "project has 2 contributing companies or organizations -- score normalized to 6",
                "points": 6,
                "status": "partial",
                "details": [],
                "max_points": 10
              }
            ]
          },
          {
            "key": "responsiveness",
            "band": "critical",
            "name": "Issue & PR responsiveness",
            "note": "Excluded from scoring (no data or not applicable): Issue resolution, PR acceptance. Remaining weights renormalized.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "issue_resolution",
                    "pr_acceptance"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              }
            ],
            "value": 1,
            "inputs": {
              "merged_prs": 0,
              "open_issues": 0,
              "closed_issues": 0,
              "issue_closed_ratio": null,
              "closed_unmerged_prs": 0
            },
            "components": [
              {
                "key": "issue_resolution",
                "name": "Issue resolution",
                "detail": "no issues or no data",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_issues_or_data",
                    "params": {}
                  }
                ],
                "max_points": 46.75
              },
              {
                "key": "pr_acceptance",
                "name": "PR acceptance",
                "detail": "no decided pull requests or no data",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_decided_prs_or_data",
                    "params": {}
                  }
                ],
                "max_points": 38.25
              },
              {
                "key": "openssf_scorecard_code_review",
                "name": "OpenSSF Scorecard: Code-Review",
                "detail": "Found 0/30 approved changesets -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 15
              }
            ]
          },
          {
            "key": "stewardship",
            "band": "at_risk",
            "name": "Ownership & stewardship",
            "note": null,
            "notes": [],
            "value": 49,
            "inputs": {
              "followers": 2,
              "owner_type": "Organization",
              "is_verified": null,
              "owner_login": "HazelnutParadise",
              "public_repos": 39,
              "account_age_days": 710
            },
            "components": [
              {
                "key": "ownership_backing",
                "name": "Ownership backing",
                "detail": "organization-owned",
                "points": 30,
                "status": "met",
                "details": [
                  {
                    "code": "owner_organization",
                    "params": {}
                  }
                ],
                "max_points": 30
              },
              {
                "key": "verified_domain",
                "name": "Verified domain",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 20
              },
              {
                "key": "owner_reach",
                "name": "Owner reach",
                "detail": "2 followers of HazelnutParadise",
                "points": 3.4,
                "status": "partial",
                "details": [
                  {
                    "code": "owner_followers",
                    "params": {
                      "count": 2,
                      "login": "HazelnutParadise"
                    }
                  }
                ],
                "max_points": 25
              },
              {
                "key": "track_record",
                "name": "Track record",
                "detail": "39 public repos, account ~1 yr old",
                "points": 15.6,
                "status": "partial",
                "details": [
                  {
                    "code": "public_repos",
                    "params": {
                      "count": 39
                    }
                  },
                  {
                    "code": "account_age_years",
                    "params": {
                      "years": 1
                    }
                  }
                ],
                "max_points": 25
              }
            ]
          },
          {
            "key": "package_maintenance",
            "band": "excellent",
            "name": "Package maintenance",
            "note": null,
            "notes": [],
            "value": 100,
            "inputs": {
              "packages": [
                "github.com/HazelnutParadise/syralit"
              ],
              "ecosystems": "go",
              "any_deprecated": false,
              "min_days_since_publish": 9
            },
            "components": [
              {
                "key": "published_resolvable",
                "name": "Published & resolvable",
                "detail": "1 package(s) on go",
                "points": 25,
                "status": "met",
                "details": [
                  {
                    "code": "packages_published",
                    "params": {
                      "count": 1,
                      "ecosystems": "go"
                    }
                  }
                ],
                "max_points": 25
              },
              {
                "key": "publish_recency",
                "name": "Publish recency",
                "detail": "latest publish 9 days ago",
                "points": 35,
                "status": "met",
                "details": [
                  {
                    "code": "publish_recency",
                    "params": {
                      "days": 9
                    }
                  }
                ],
                "max_points": 35
              },
              {
                "key": "version_history",
                "name": "Version history",
                "detail": "9 published versions",
                "points": 20,
                "status": "met",
                "details": [
                  {
                    "code": "published_versions",
                    "params": {
                      "count": 9
                    }
                  }
                ],
                "max_points": 20
              },
              {
                "key": "not_deprecated",
                "name": "Not deprecated",
                "detail": "active, not deprecated or yanked",
                "points": 20,
                "status": "met",
                "details": [
                  {
                    "code": "package_not_deprecated",
                    "params": {}
                  }
                ],
                "max_points": 20
              }
            ]
          }
        ],
        "description": "Will the project survive its people — bus factor, responsiveness, who backs it, and package upkeep?"
      },
      {
        "key": "engineering",
        "band": "good",
        "name": "Engineering Quality",
        "value": 70,
        "weight": 0.2,
        "metrics": [
          {
            "key": "engineering_practices",
            "band": "moderate",
            "name": "Engineering practices",
            "note": "Excluded from scoring (no data or not applicable): OpenSSF Scorecard: CI-Tests. Remaining weights renormalized.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "openssf_scorecard_ci_tests"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              }
            ],
            "value": 60,
            "inputs": {
              "has_ci": true,
              "has_tests": true,
              "has_editorconfig": false,
              "has_linter_config": false,
              "has_precommit_config": false
            },
            "components": [
              {
                "key": "ci_workflows",
                "name": "CI workflows",
                "detail": "1 workflow(s)",
                "points": 24,
                "status": "met",
                "details": [
                  {
                    "code": "ci_workflows",
                    "params": {
                      "count": 1
                    }
                  }
                ],
                "max_points": 24
              },
              {
                "key": "tests_present",
                "name": "Tests present",
                "detail": null,
                "points": 24,
                "status": "met",
                "details": [],
                "max_points": 24
              },
              {
                "key": "linter_config",
                "name": "Linter config",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 16
              },
              {
                "key": "pre_commit_hooks",
                "name": "Pre-commit hooks",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 9.6
              },
              {
                "key": "editorconfig",
                "name": ".editorconfig",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 6.4
              },
              {
                "key": "openssf_scorecard_ci_tests",
                "name": "OpenSSF Scorecard: CI-Tests",
                "detail": "no pull request found",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_data",
                    "params": {}
                  }
                ],
                "max_points": 20
              }
            ]
          },
          {
            "key": "documentation",
            "band": "excellent",
            "name": "Documentation",
            "note": null,
            "notes": [],
            "value": 85,
            "inputs": {
              "topics": [
                "data-visualization",
                "insyra"
              ],
              "has_wiki": true,
              "homepage": null,
              "has_readme": true,
              "has_docs_dir": true,
              "has_description": true
            },
            "components": [
              {
                "key": "readme",
                "name": "README",
                "detail": null,
                "points": 30,
                "status": "met",
                "details": [],
                "max_points": 30
              },
              {
                "key": "documentation_directory",
                "name": "Documentation directory",
                "detail": null,
                "points": 25,
                "status": "met",
                "details": [],
                "max_points": 25
              },
              {
                "key": "documentation_homepage_site",
                "name": "Documentation / homepage site",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 15
              },
              {
                "key": "repository_description",
                "name": "Repository description",
                "detail": null,
                "points": 10,
                "status": "met",
                "details": [],
                "max_points": 10
              },
              {
                "key": "topics",
                "name": "Topics",
                "detail": "2 topics",
                "points": 10,
                "status": "met",
                "details": [
                  {
                    "code": "topics_count",
                    "params": {
                      "count": 2
                    }
                  }
                ],
                "max_points": 10
              },
              {
                "key": "wiki",
                "name": "Wiki",
                "detail": null,
                "points": 10,
                "status": "met",
                "details": [],
                "max_points": 10
              }
            ]
          }
        ],
        "description": "Are baseline engineering and documentation practices in place?"
      },
      {
        "key": "security",
        "band": "at_risk",
        "name": "Security",
        "value": 30,
        "weight": 0.16,
        "metrics": [
          {
            "key": "security_posture",
            "band": "at_risk",
            "name": "Security posture",
            "note": "Excluded from scoring (no data or not applicable): CI-Tests, Packaging, Signed-Releases. Remaining weights renormalized.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "ci_tests",
                    "packaging",
                    "signed_releases"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              }
            ],
            "value": 30,
            "inputs": {
              "source": "openssf_scorecard",
              "checks_evaluated": 15,
              "scorecard_version": "v5.5.0",
              "checks_inconclusive": 3,
              "scorecard_aggregate": 3
            },
            "components": [
              {
                "key": "binary_artifacts",
                "name": "Binary-Artifacts",
                "detail": "no binaries found in the repo",
                "points": 7.5,
                "status": "met",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "branch_protection",
                "name": "Branch-Protection",
                "detail": "branch protection not enabled on development/release branches",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "ci_tests",
                "name": "CI-Tests",
                "detail": "no pull request found",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_data",
                    "params": {}
                  }
                ],
                "max_points": 2.5
              },
              {
                "key": "cii_best_practices",
                "name": "CII-Best-Practices",
                "detail": "no effort to earn an OpenSSF best practices badge detected",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 2.5
              },
              {
                "key": "code_review",
                "name": "Code-Review",
                "detail": "Found 0/30 approved changesets -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "contributors",
                "name": "Contributors",
                "detail": "project has 2 contributing companies or organizations -- score normalized to 6",
                "points": 1.5,
                "status": "partial",
                "details": [],
                "max_points": 2.5
              },
              {
                "key": "dangerous_workflow",
                "name": "Dangerous-Workflow",
                "detail": "no dangerous workflow patterns detected",
                "points": 10,
                "status": "met",
                "details": [],
                "max_points": 10
              },
              {
                "key": "dependency_update_tool",
                "name": "Dependency-Update-Tool",
                "detail": "no update tool detected",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "fuzzing",
                "name": "Fuzzing",
                "detail": "project is not fuzzed",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 5
              },
              {
                "key": "license",
                "name": "License",
                "detail": "license file detected",
                "points": 2.5,
                "status": "met",
                "details": [],
                "max_points": 2.5
              },
              {
                "key": "maintained",
                "name": "Maintained",
                "detail": "project was created within the last 90 days. Please review its contents carefully",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "packaging",
                "name": "Packaging",
                "detail": "packaging workflow not detected",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_data",
                    "params": {}
                  }
                ],
                "max_points": 5
              },
              {
                "key": "pinned_dependencies",
                "name": "Pinned-Dependencies",
                "detail": "dependency not pinned by hash detected -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 5
              },
              {
                "key": "sast",
                "name": "SAST",
                "detail": "no SAST tool detected",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 5
              },
              {
                "key": "security_policy",
                "name": "Security-Policy",
                "detail": "security policy file not detected",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 5
              },
              {
                "key": "signed_releases",
                "name": "Signed-Releases",
                "detail": "no releases found",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_data",
                    "params": {}
                  }
                ],
                "max_points": 7.5
              },
              {
                "key": "token_permissions",
                "name": "Token-Permissions",
                "detail": "detected GitHub workflow tokens with excessive permissions",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "vulnerabilities",
                "name": "Vulnerabilities",
                "detail": "3 existing vulnerabilities detected",
                "points": 5.2,
                "status": "partial",
                "details": [],
                "max_points": 7.5
              }
            ]
          },
          {
            "key": "high_risk_jurisdiction_exposure",
            "band": "excellent",
            "name": "High-Risk Jurisdiction Exposure",
            "note": "Only high-confidence self-published location evidence affects this multiplier. Ambiguous matches are review-only; country evidence is not proof of nationality, citizenship, legal registration, malicious intent, or sanctions status.",
            "notes": [
              {
                "code": "jurisdiction_evidence_limits",
                "params": {}
              }
            ],
            "value": 100,
            "inputs": {
              "meaning": "self-published location evidence; not nationality or citizenship",
              "red_flag": false,
              "exposures": [],
              "policy_countries": [
                "Russia",
                "Iran",
                "North Korea"
              ],
              "review_only_matches": 0,
              "assessed_self_published_locations": 4
            },
            "components": [
              {
                "key": "policy_exposure_multiplier",
                "name": "Policy exposure multiplier",
                "detail": "no confirmed policy-scope location match",
                "points": 100,
                "status": "met",
                "details": [
                  {
                    "code": "jurisdiction_no_match",
                    "params": {}
                  }
                ],
                "max_points": 100
              }
            ]
          }
        ],
        "description": "Are visible security and supply-chain practices strong, with no malicious dependency and no unresolved high-risk jurisdiction exposure?"
      },
      {
        "key": "ai_readiness",
        "band": "good",
        "name": "AI Readiness",
        "value": 73,
        "weight": 0,
        "metrics": [
          {
            "key": "ai_agent_context",
            "band": "excellent",
            "name": "Agent context & guidance",
            "note": null,
            "notes": [],
            "value": 85,
            "inputs": {
              "has_llms_txt": false,
              "legible_history_share": 0.84,
              "agent_instruction_files": [
                "AGENTS.md",
                "CLAUDE.md"
              ],
              "agent_instruction_max_bytes": 6372
            },
            "components": [
              {
                "key": "agent_instructions",
                "name": "Agent instructions",
                "detail": "AGENTS.md, CLAUDE.md",
                "points": 45,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": "AGENTS.md, CLAUDE.md"
                    }
                  }
                ],
                "max_points": 45
              },
              {
                "key": "machine_readable_docs_llms_txt",
                "name": "Machine-readable docs (llms.txt)",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 15
              },
              {
                "key": "legible_commit_history",
                "name": "Legible commit history",
                "detail": "84 of 100 human commits state their intent (structured subject or explanatory body)",
                "points": 40,
                "status": "met",
                "details": [
                  {
                    "code": "legible_history",
                    "params": {
                      "legible": 84,
                      "sampled": 100
                    }
                  }
                ],
                "max_points": 40
              }
            ]
          },
          {
            "key": "ai_verify_loop",
            "band": "moderate",
            "name": "Verify loop (build / test / typecheck)",
            "note": null,
            "notes": [],
            "value": 66,
            "inputs": {
              "has_nix": false,
              "has_tests": true,
              "lockfiles": [
                "go.sum"
              ],
              "has_dockerfile": false,
              "typed_language": true,
              "bootstrap_files": [],
              "has_devcontainer": false,
              "has_linter_config": false,
              "typecheck_configs": [],
              "agent_commit_share": 0.67,
              "toolchain_manifests": [
                "examples/desktop-demo/go.mod",
                "examples/oidc-login/go.mod",
                "go.mod",
                "integrations/desktop/go.mod",
                "integrations/oidc/go.mod",
                "uitest/go.mod"
              ],
              "dependency_bot_commit_share": 0
            },
            "components": [
              {
                "key": "one_command_bootstrap",
                "name": "One-command bootstrap",
                "detail": "examples/desktop-demo/go.mod, examples/oidc-login/go.mod, go.mod (toolchain convention, no task runner)",
                "points": 12.6,
                "status": "partial",
                "details": [
                  {
                    "code": "toolchain_convention",
                    "params": {
                      "files": "examples/desktop-demo/go.mod, examples/oidc-login/go.mod, go.mod"
                    }
                  }
                ],
                "max_points": 18
              },
              {
                "key": "automated_tests",
                "name": "Automated tests",
                "detail": null,
                "points": 22,
                "status": "met",
                "details": [],
                "max_points": 22
              },
              {
                "key": "lint_format_config",
                "name": "Lint / format config",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 11
              },
              {
                "key": "static_type_checking",
                "name": "Static type checking",
                "detail": "Go (statically typed)",
                "points": 11,
                "status": "met",
                "details": [
                  {
                    "code": "statically_typed_language",
                    "params": {
                      "language": "Go"
                    }
                  }
                ],
                "max_points": 11
              },
              {
                "key": "reproducible_environment",
                "name": "Reproducible environment",
                "detail": "lockfile",
                "points": 10,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": "lockfile"
                    }
                  }
                ],
                "max_points": 10
              },
              {
                "key": "demonstrated_agent_practice",
                "name": "Demonstrated agent practice",
                "detail": "67 of the last 100 commits agent-authored or agent-credited",
                "points": 10,
                "status": "met",
                "details": [
                  {
                    "code": "agent_authored_commits",
                    "params": {
                      "count": 67,
                      "sampled": 100
                    }
                  }
                ],
                "max_points": 10
              },
              {
                "key": "automated_maintenance",
                "name": "Automated maintenance",
                "detail": "no automated dependency updates observed",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "no_dependency_automation",
                    "params": {}
                  }
                ],
                "max_points": 8
              },
              {
                "key": "openssf_scorecard_pinned_dependencies",
                "name": "OpenSSF Scorecard: Pinned-Dependencies",
                "detail": "dependency not pinned by hash detected -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 10
              }
            ]
          },
          {
            "key": "ai_code_legibility",
            "band": "excellent",
            "name": "Code legibility for models",
            "note": null,
            "notes": [],
            "value": 98,
            "inputs": {
              "primary_language": "Go",
              "largest_source_bytes": 1024695,
              "source_files_sampled": 93,
              "oversized_source_files": 4
            },
            "components": [
              {
                "key": "type_checkable_code",
                "name": "Type-checkable code",
                "detail": "Go (statically typed)",
                "points": 45,
                "status": "met",
                "details": [
                  {
                    "code": "statically_typed_language",
                    "params": {
                      "language": "Go"
                    }
                  }
                ],
                "max_points": 45
              },
              {
                "key": "manageable_file_sizes",
                "name": "Manageable file sizes",
                "detail": "4/93 source files over 60KB",
                "points": 52.6,
                "status": "partial",
                "details": [
                  {
                    "code": "oversized_source_files",
                    "params": {
                      "kb": 60,
                      "sampled": 93,
                      "oversized": 4
                    }
                  }
                ],
                "max_points": 55
              }
            ]
          },
          {
            "key": "ai_interfaces",
            "band": "at_risk",
            "name": "Machine-readable interfaces",
            "note": null,
            "notes": [],
            "value": 40,
            "inputs": {
              "example_dirs": [
                "examples"
              ],
              "has_mcp_signal": false,
              "api_schema_files": []
            },
            "components": [
              {
                "key": "api_schema_openapi_graphql_proto",
                "name": "API schema (OpenAPI/GraphQL/proto)",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 40
              },
              {
                "key": "mcp_server",
                "name": "MCP server",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 20
              },
              {
                "key": "runnable_examples",
                "name": "Runnable examples",
                "detail": "examples",
                "points": 40,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": "examples"
                    }
                  }
                ],
                "max_points": 40
              }
            ]
          }
        ],
        "description": "How well is the repo equipped to be developed and maintained with AI coding agents? An independent, experimental badge — weight 0.0, so it is surfaced on its own and does not affect the overall health score."
      }
    ],
    "metrics_version": "1.13.0"
  },
  "warnings": [
    "Star history unavailable: GitHub GraphQL error: Resource not accessible by personal access token",
    "GitHub dependency-graph SBOM unavailable (404); the dependency graph may be disabled for this repository"
  ],
  "report_type": "repository",
  "generated_at": "2026-07-28T07:17:18.681934Z",
  "schema_version": "0.27.0",
  "badge_url": "https://raw.githubusercontent.com/inspect-software/badges/main/v1/h/HazelnutParadise/syralit.svg",
  "full_name": "HazelnutParadise/syralit",
  "license_state": "standard",
  "license_spdx": "MIT"
}

Las puntuaciones son señales, no garantías. Reflejan prácticas públicamente visibles en GitHub; no son una auditoría de código ni una garantía de seguridad.

Los datos ausentes se excluyen y los pesos se renormalizan; nunca se puntúan como cero. La metodología es versionada y abierta: métricas v1.13.0, esquema v0.27.0 — metodología completa · wiki de métricas.

Cómo se sitúa un resultado dentro del registro general: estadísticas agregadasGo.