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

hahalee000000 / helen

Helen Agent Develop Language

PythonMIT★ 2 estrellas⑂ 0 forksdesde jun 2026Ver en GitHub ↗

hahalee000000/helen tiene un índice de salud de 55 sobre 100, lo que lo sitúa en la banda Moderado. Su puntuación más alta es Engineering Quality (78/100) y la más baja, Security (22/100). Se actualizó por última vez hoy.

55
global / 100
Moderado

Í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.

55
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

hahalee000000Cuenta personal
0 seguidores5 repositorios públicosdesde nov 2024

Este repositorio pertenece a una cuenta personal. Un proyecto con un único propietario conlleva más riesgo de continuidad que uno respaldado por una organización.

Ecosistemas de paquetes

Métricas por categoría

Vitalidad

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

75Bueno · 22% del índice global
Cómo se puntúa
36/36Recencia de push — último push hace 0 días
4.8/36Cadencia de commits — 7/52 semanas con commits
18/18Volumen de commits — 472 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_year472
human_commit_share1
days_since_last_push0
active_weeks_last_year7
Cómo se puntúa
27/27Publica versiones — 3 versiones publicadas
36/36Recencia de las versiones — última versión hace 3 días
27/27Cadencia de publicación — una versión cada ~0,1 días
0/10OpenSSF Scorecard: Signed-Releases — sin datos
Datos de entrada utilizados
releases_count3
latest_release_tagv1.25.2
releases_from_tagsno
days_since_latest_release3
mean_days_between_releases0,1
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?

63Moderado · 24% del índice global
Cómo se puntúa
44.7/46.8Resolución de issues — 96% de issues cerradas
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_issues1
closed_issues22
issue_closed_ratio0,957
closed_unmerged_prs0
Excluidos de la puntuación (sin datos o no aplicable): Aceptación de PR. Los pesos restantes se han renormalizado.
Cómo se puntúa
10/30Respaldo de la propiedad — cuenta personal (usuario)
0/20Dominio verificado — no aplicable a cuentas de usuario
0/25Alcance del propietario — 0 seguidores de hahalee000000
9.1/25Trayectoria — 5 repos públicos, cuenta de ~1 años
Datos de entrada utilizados
followers0
owner_typeUser
is_verified
owner_loginhahalee000000
public_repos5
account_age_days619
Excluidos de la puntuación (sin datos o no aplicable): Dominio verificado. Los pesos restantes se han renormalizado.
Cómo se puntúa
25/25Publicado y resoluble — 1 paquete(s) en pypi
35/35Recencia de publicación — última publicación hace 0 días
20/20Historial de versiones — 37 versiones en el registro
20/20No obsoleto — activo, ni obsoleto ni retirado
Datos de entrada utilizados
packageshelen-lang
ecosystemspypi
any_deprecatedno
min_days_since_publish0

Calidad de Ingeniería

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

78Bueno · 20% del índice global
Cómo se puntúa
24/24Flujos de trabajo de CI — 1 flujo(s) de trabajo
24/24Pruebas presentes
16/16Configuración de linter — .flake8
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_config
has_precommit_configno
Excluidos de la puntuación (sin datos o no aplicable): OpenSSF Scorecard: CI-Tests. Los pesos restantes se han renormalizado.
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 — 20 topics
0/10Wiki
Datos de entrada utilizados
topicsagent, agent-orchestration, ai, ai-agent, ai-application, autogen-alternative, bilingual, chatbot, chinese-programming, claude, crewai-alternative, domain-specific-language, dsl, gpt, langchain-alternative, llm, multi-agent, natural-language-programming, programming-language, prompt-engineering
has_wikino
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?

22Crítico · 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
0/2.5Contributors — project has 0 contributing companies or organizations -- score normalized to 0
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
0/7.5Vulnerabilities — 22 existing vulnerabilities detected
Datos de entrada utilizados
sourceopenssf_scorecard
checks_evaluated15
scorecard_versionv5.5.0
checks_inconclusive3
scorecard_aggregate2,2
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.

69Moderado · 0% del índice global
Cómo se puntúa
45/45Instrucciones para agentes — CLAUDE.md
0/15Documentación legible por máquinas (llms.txt)
40/40Historial de commits legible — 100 de 100 commits humanos declaran su intención (asunto estructurado o cuerpo explicativo)
Datos de entrada utilizados
has_llms_txtno
legible_history_share1
agent_instruction_filesCLAUDE.md
agent_instruction_max_bytes9259
Cómo se puntúa
0/18Arranque con un solo comando
22/22Pruebas automatizadas
11/11Configuración de lint / formato — .flake8
11/11Verificación estática de tipos — extensions/vscode/tsconfig.json, helen/agent/webui/frontend/tsconfig.json, helen/py.typed
10/10Entorno reproducible — lockfile
10/10Práctica demostrada con agentes — 44 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
lockfilespackage-lock.json, uv.lock
has_dockerfileno
typed_languageno
bootstrap_files
has_devcontainerno
has_linter_config
typecheck_configsextensions/vscode/tsconfig.json, helen/agent/webui/frontend/tsconfig.json, helen/py.typed
agent_commit_share0,44
toolchain_manifests
dependency_bot_commit_share0
Cómo se puntúa
27/45Código verificable por tipos — Python con configuración de verificación de tipos (extensions/vscode/tsconfig.json, helen/agent/webui/frontend/tsconfig.json, helen/py.typed)
53.9/55Tamaños de archivo manejables — 7/346 archivos fuente de más de 60 KB
Datos de entrada utilizados
primary_languagePython
largest_source_bytes90.308
source_files_sampled346
oversized_source_files7
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
-contribuidores
472commits en los últimos 12 meses
0días desde el último push
3versiones publicadas
-factor bus
1issues abiertas
PyPIecosistemas de paquetes

Advertencias de recopilación de datos

  • Star history unavailable: GitHub GraphQL error: Resource not accessible by personal access token
  • Contributor list unavailable
  • GitHub dependency-graph SBOM unavailable (404); the dependency graph may be disabled for this repository
  • deps.dev does not index pypi:helen-lang@1.29.4; advisories assessed against the repository dependency graph instead

Más detalle

OpenSSF Scorecard 2.2 / 10
2.2agregado

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-27 16:08 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
0Contributorsproject has 0 contributing companies or organizations -- score normalized to 0
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
0Vulnerabilities22 existing vulnerabilities detected
Dependencias directas 3
RegistroPaqueteRestricción de versiónManifiesto
PyPIpyyaml>=6.0pyproject.toml
PyPItoml>=0.10pyproject.toml
PyPIhttpx>=0.24.0pyproject.toml
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": [
        "agent",
        "agent-orchestration",
        "ai",
        "ai-agent",
        "ai-application",
        "autogen-alternative",
        "bilingual",
        "chatbot",
        "chinese-programming",
        "claude",
        "crewai-alternative",
        "domain-specific-language",
        "dsl",
        "gpt",
        "langchain-alternative",
        "llm",
        "multi-agent",
        "natural-language-programming",
        "programming-language",
        "prompt-engineering"
      ],
      "is_fork": false,
      "size_kb": 43584,
      "has_wiki": false,
      "homepage": null,
      "languages": {
        "CSS": 2291,
        "HTML": 363,
        "Shell": 36892,
        "Python": 3356401,
        "JavaScript": 1402,
        "TypeScript": 86387
      },
      "pushed_at": "2026-07-27T16:07:10Z",
      "created_at": "2026-06-08T03:23:05Z",
      "owner_type": "User",
      "updated_at": "2026-07-27T09:48:12Z",
      "description": "Helen Agent Develop Language ",
      "is_archived": false,
      "is_disabled": false,
      "license_spdx": "MIT",
      "default_branch": "master",
      "license_spdx_raw": "MIT",
      "primary_language": "Python",
      "significant_languages": [
        "Python"
      ]
    },
    "owner": {
      "blog": null,
      "name": null,
      "type": "User",
      "login": "hahalee000000",
      "company": null,
      "location": null,
      "followers": 0,
      "avatar_url": "https://avatars.githubusercontent.com/u/188537877?v=4",
      "created_at": "2024-11-15T04:02:53Z",
      "is_verified": null,
      "public_repos": 5,
      "account_age_days": 619
    },
    "license": {
      "state": "standard",
      "spdx_id": "MIT",
      "raw_spdx": "MIT",
      "file_present": true,
      "scorecard_found": true,
      "profile_has_license": true
    },
    "activity": {
      "releases": [
        {
          "tag": "v1.25.2",
          "kind": "patch",
          "published_at": "2026-07-24T09:39:56Z"
        },
        {
          "tag": "v1.25.1",
          "kind": "patch",
          "published_at": "2026-07-24T08:49:32Z"
        },
        {
          "tag": "v1.25.0",
          "kind": "minor",
          "published_at": "2026-07-24T04:20:27Z"
        }
      ],
      "recent_commits": [
        {
          "oid": "741417fc0ca0ae76b3486132a9779ea9cabc673a",
          "body": "Major improvements:\n- Compress CLAUDE.md from 280 lines to 161 lines (-43%, ~50% size reduction)\n- Sync 16 Helen skills to .claude/skills/ for on-demand loading\n- Clean up 6 duplicate keyword entries in helen/core/tokens.py\n- Remove obsolete test_helen_assistant.py (helen_assistant.helen removed in \n[…]\ntokens)\n- Better cache hit rate (more stable CLAUDE.md)\n- On-demand skill loading for focused context\n- Easier maintenance (skills update independently)\n\nCo-Authored-By: Claude <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "v1.29.4: CLAUDE.md optimization + skills sync + tokens cleanup",
          "author_name": "rxx",
          "author_login": null,
          "committed_at": "2026-07-27T16:07:00Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "4f8bcdb635bf21c63277e4d103ade55e395901f5",
          "body": null,
          "is_bot": false,
          "headline": "bump: v1.29.3 - sync helenagent logo and Web UI design",
          "author_name": "hahalee000000",
          "author_login": null,
          "committed_at": "2026-07-27T09:47:07Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "35a037f2583c632dd68be68c07da682e2c77e6dd",
          "body": "- Add Helen logo (RGBA version) - helen.png\n- Add Web UI logo files: favicon.png, helen-logo-64.png, helen-logo-128.png\n- Integrate Helen logo into Web UI:\n  * Browser favicon\n  * Sidebar header with logo\n  * Assistant message avatar\n  * 'Helen 思考中...' indicator with breathing animation\n  * Empty co\n[…]\n extra='ignore' to tolerate stale .env fields\n\nSynced from helenagent commits:\n- 9aa2266 chore: 更新 Helen logo(RGBA 版本)\n- 0be48be feat: 集成 Helen logo 到 Web UI\n- ac53a80 fix: Web UI 后端启动失败(ECONNREFUSED)",
          "is_bot": false,
          "headline": "sync: helenagent logo and Web UI design updates",
          "author_name": "hahalee000000",
          "author_login": null,
          "committed_at": "2026-07-27T09:46:44Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "ec42794ae0e1823a057515dc7691f0f1c78e2891",
          "body": null,
          "is_bot": false,
          "headline": "bump: v1.29.2 - runtime transcript control",
          "author_name": "hahalee000000",
          "author_login": null,
          "committed_at": "2026-07-27T08:19:18Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "35f66dbb7f92a78456d3a648eb8abc709c9ba315",
          "body": "- Add runtime support for agent transcript declarations (none/memory/persistent)\n- Modify _enter_invocation to accept transcript_level parameter\n- Update _call_agent to read agent.transcript and pass to invocation\n- Implement three-level transcript behavior in _add_to_history:\n  * none: Don't write \n[…]\ns were creating\nsession files even when not needed. Now developers can explicitly control\ntranscript behavior per agent, with 'none' as the default to avoid\nunnecessary disk I/O and directory clutter.",
          "is_bot": false,
          "headline": "feat: implement runtime transcript control for agents (v1.29.2)",
          "author_name": "hahalee000000",
          "author_login": null,
          "committed_at": "2026-07-27T08:18:52Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "4d8be306db0df1f16960a37f724db072432d3fd8",
          "body": "- Total keywords: 89 → 91 (added transcript/记录)\n- Chinese keywords: 45 → 46 (added 记录)\n- Fixes CI failures in test_keyword_count and related tests",
          "is_bot": false,
          "headline": "fix: update keyword count tests for v1.29 transcript keyword",
          "author_name": "hahalee000000",
          "author_login": null,
          "committed_at": "2026-07-27T07:40:46Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "45e5baeb76c290b4b486b5c97faf8c59bcd5b1f7",
          "body": null,
          "is_bot": false,
          "headline": "bump: v1.29.1 - sync ChatSessionActor from helenagent",
          "author_name": "hahalee000000",
          "author_login": null,
          "committed_at": "2026-07-27T07:33:33Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "a6639a120e691c2117c3728b895fecb0dc40cb45",
          "body": "- Add transcript \"persistent\" declaration (v1.29+ feature)\n  Required for Web UI to read transcript, search, session resume, etc.\n- Forward LLM error messages to Web UI via _emit_actor_stream_event\n- Improves error visibility in chat interface\n\nSynced from helenagent commit 65d3311",
          "is_bot": false,
          "headline": "sync: Update ChatSessionActor from helenagent",
          "author_name": "hahalee000000",
          "author_login": null,
          "committed_at": "2026-07-27T07:33:12Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "0aa2ea62b73f61016bced938b7d4e70527388375",
          "body": "- Add TRANSCRIPT token and Chinese keyword 记录\n- Support transcript 'none'|'memory'|'persistent' in agent declarations\n- Default is 'none' to avoid directory pollution\n- Update wiki tutorial and built-in skills with documentation\n- Fully backward compatible\n\nThis feature allows developers to explicitly control agent transcript\nbehavior, solving the issue of session directory accumulation in\nworking directories.",
          "is_bot": false,
          "headline": "v1.29.0: Add agent-level transcript control",
          "author_name": "hahalee000000",
          "author_login": null,
          "committed_at": "2026-07-27T07:21:34Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "85332a78536851f2329685ab4bfb1273aec3d6f0",
          "body": "Bug Fix:\n- Add \\uNNNN Unicode escape support in string literals\n- Previously, \"\\u4e00\" was incorrectly parsed as literal \"4e00\" (length 4)\n- Now correctly produces Unicode character 一 (length 1)\n\nImplementation:\n- Added \\uNNNN parsing in lexer._parse_escape() method\n- Follows same pattern as existin\n[…]\ncapes\n- All 181 lexer tests passing\n- Fully backward compatible\n\nExamples:\n  \"一\"     → 一 (U+4E00)\n  \"一二中\" → 一二中\n  \"ABC\" → ABC\n\nTriggered by: User question about \\u4e00 not being interpreted as Unicode",
          "is_bot": false,
          "headline": "v1.28.6: fix Unicode escape sequence support",
          "author_name": "hahalee000000",
          "author_login": null,
          "committed_at": "2026-07-27T06:52:55Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "ff74bf117a240d7d5cab1efcd4311cc802746823",
          "body": "New Features:\n- Add find_from(s, sub, start) for position-based string search\n- Add json_parse_lenient(text) to auto-strip markdown fences from LLM output\n- Chinese aliases: 从位置查找, json宽松解析\n\nParser Improvements:\n- Detect if/while boolean expression trap: if (a || b) && c { }\n- Provide clear error me\n[…]\n for common parsing pitfalls\n\nBackward Compatibility:\n- All changes fully backward compatible\n- No breaking changes to existing code\n\nTriggered by: Helen agent feedback from docx-converter development",
          "is_bot": false,
          "headline": "v1.28.5: stdlib improvements and parser enhancements",
          "author_name": "hahalee000000",
          "author_login": null,
          "committed_at": "2026-07-27T03:57:40Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "e3bef262df079bdcad41fb00868974232af62085",
          "body": "Sync from helenagent commit 5fe9f2d. compress_context() returns\nincorrect compressed_tokens value (tracked as helen#23). The /compress\ncommand now uses context_stats() before and after compression to get\nthe actual token counts instead of trusting the compress_context\nreturn value.\n\nWorkaround note added to the command docstring referencing helen#23.\n\nCo-Authored-By: Claude <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(agent): v1.28.4 /compress token count workaround (helen#23)",
          "author_name": "rxx",
          "author_login": null,
          "committed_at": "2026-07-26T10:09:53Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "b87cd7e897c58f4daa4a72ea299bc0ce75bab3dc",
          "body": "Two bugs in the v1.28 :ask feature causing empty assistant responses:\n\n1. Session ID was empty: new_assistant_session called\n   interp.get_session_id() which doesn't exist on Interpreter. The\n   actual session_id lives at interp._agent_context.session_id (set by\n   AgentContextManager on init). Now \n[…]\n    are visible instead of silent empty responses\n\nTest results: 27/27 passed (updated 2 tests for new tool schema shape\nand session_id access pattern).\n\nCo-Authored-By: Claude <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(repl): v1.28.3 :ask two more bugs — session_id + tool schema format",
          "author_name": "rxx",
          "author_login": null,
          "committed_at": "2026-07-26T10:05:47Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "d0d21c17663c70192161d99240b381b3f6eb0884",
          "body": "… tools\n\nSync from helenagent commit 7301a19. The tools declaration in\nchat_session_actor.helen was missing the '=' sign:\n\n    tools CHAT_TOOLS     # broken: parsed as unknown statement\n    tools = CHAT_TOOLS   # fixed: proper tools allowlist assignment\n\nWithout the '=' the parser didn't recognize i\n[…]\n>60% (resume loads all\n  history including duplicated prompt boilerplate)\n\nBoth wrapped in try/catch so compression failures don't break the\nactor loop.\n\nCo-Authored-By: Claude <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(agent): v1.28.2 tools declaration missing '=' — LLM couldn't call…",
          "author_name": "rxx",
          "author_login": null,
          "committed_at": "2026-07-26T09:40:30Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "141aaad2691db8a36b877433b00b94586f0898e3",
          "body": "… events\n\nHttpLLMRuntime.act_stream yields typed dicts\n({\"type\": \"content\", \"content\": \"...\"} for text, plus tool_call /\ntool_result / usage / compaction / error events), not plain strings.\nThe v1.28 _run_streaming wrote every chunk directly to stdout, so the\nfirst event (a dict) triggered 'write() \n[…]\nt (tool_call/tool_result/usage filtered out), another\nverifies the plain-string fallback path.\n\nTest count: 27 in tests/cli/test_repl_ask.py (25 -> 27).\n\nCo-Authored-By: Claude <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(repl): v1.28.1 :ask streaming — extract 'content' from typed dict…",
          "author_name": "rxx",
          "author_login": null,
          "committed_at": "2026-07-26T09:37:25Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "09e8d488eae547b65f2efe6437cbed1460bfff29",
          "body": "Rewrite the REPL :ask command. The old implementation depended on\nhelen_assistant.helen (removed in helenagent v1.0 refactor) and did\nfragile string-replacement to inject parameters. The new :ask calls\nthe LLM directly with a system prompt that includes fresh REPL state.\n\nL1 - REPL context injection\n[…]\new user-facing feature).\n\nTest results: 3235 passed, 1 pre-existing unrelated failure\n(test_helen_assistant_program_exists, existed before this change).\n\nCo-Authored-By: Claude <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(repl): v1.28 :ask three-tier enhancement (L1/L2/L3)",
          "author_name": "rxx",
          "author_login": null,
          "committed_at": "2026-07-26T09:31:48Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "b0bef2f19dbb6d605c9c9387acdedb30890c7a05",
          "body": "Helenagent added media_ref support for restoring images in transcript\nconversations, plus a new /media endpoint in the webui backend to serve\nreferenced media files.\n\nChanges:\n- webui/backend/app/routers/chat.py: add /media endpoint\n- webui/backend/app/services/session_index.py: media_ref parsing + restoration\n- webui/backend/tests/test_session_index.py: tests for media_ref handling\n\nCo-Authored-By: Claude <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(agent): sync media_ref transcript image restoration from helenagent",
          "author_name": "rxx",
          "author_login": null,
          "committed_at": "2026-07-26T09:16:34Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "312f41634c51356b08acf90c7c5ecd083625ee32",
          "body": "… as SSOT)\n\nSync the bundled agent from the standalone helenagent repo, which was\nrefactored to a simpler v1.0: removed the Web SQLite DB (transcript is now\nthe single data source), added memento-file-based session recovery, and\ncleaned up outdated files.\n\nSource changes (helenagent -> helen/agent):\n[…]\n docs.\n\nVerified: backend Python syntax clean, all 4 modified .helen files pass\n`helen check`, wheel 745KB with 0 node_modules files and no database.py.\n\nCo-Authored-By: Claude <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(agent): sync helen/agent to helenagent v1.0 (simpler, transcript…",
          "author_name": "rxx",
          "author_login": null,
          "committed_at": "2026-07-26T08:21:32Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "541c44fc25e4a4ad58be4cfa414eeca471d79e2d",
          "body": "_get_agent_setting()'s field_map only contained model/temperature/max-turns,\nomitting \"description\", so the agent's `description \"...\"` clause never\nreached the system prompt assembled for `llm act` (nor the system_prompt\npassed by the streaming path in interpreter.py). The role-definition section\nw\n[…]\nand the no-description\nregression guard. Verified the tests fail without the fix (git stash) and\npass with it. Full suite 3214 passed, zero regressions.\n\nCo-Authored-By: Claude <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(agent): v1.27.2 inject agent description into LLM system prompt",
          "author_name": "rxx",
          "author_login": null,
          "committed_at": "2026-07-26T07:58:46Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "e3d6f30dbc301ed906b6ca7f003eb0aad7d55c64",
          "body": "…main\n\nv1.27's spawn resume / Interpreter(session_id=) continued the transcript\nfile but the LLM did NOT actually see the prior conversation inside agent\nmain {} - llm act's history (self._history) filters by _current_invocation_id\n(v1.22 per-invocation isolation), and load_from_backend preserved th\n[…]\nisolation regression test. Full suite: 2654\npassed (1 pre-existing unrelated failure).\n\nDocs: wiki/tutorial/07-spawn.md, wiki/log.md, CLAUDE.md updated.\n\nCo-Authored-By: Claude <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(spawn-resume): v1.27.1 make llm act see resumed history in agent …",
          "author_name": "rxx",
          "author_login": null,
          "committed_at": "2026-07-26T01:14:09Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "5fa39f72cf6408b1eb0dbcd6a2e7f9edf6660e11",
          "body": "…s session lock\n\nAdd optional `spawn Agent(...) resume(\"<session_id>\")` clause (Chinese\nalias 恢复会话(...)) so a spawned agent continues a previously saved\nchild-session transcript instead of starting fresh. The spawned\nInterpreter is constructed with the given session_id, loading that\nsession's histor\n[…]\nSpawned Session\"\nsection), wiki/log.md (v1.27 changelog), CLAUDE.md, and helen-syntax /\nhelen-agent-patterns / helen-agent-collaboration skills updated.\n\nCo-Authored-By: Claude <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(spawn): v1.27 spawn resume(\"<session_id>\") clause + cross-proces…",
          "author_name": "rxx",
          "author_login": null,
          "committed_at": "2026-07-26T00:17:54Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "ae4ae5ec679c16d900bf3807c1a7bfa07a886589",
          "body": "Backend imports chat_tui_web module for actor management.\nThis file provides Python interface to Helen actor system.\n\nFixes: /session command error 'No module named chat_tui_web'\n\nCo-Authored-By: Claude <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(agent): add chat_tui_web.py for Web UI backend",
          "author_name": "rxx",
          "author_login": null,
          "committed_at": "2026-07-25T16:09:55Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "58a4c256403295770386717237c3fc3bc10a83b2",
          "body": "Problem: helen agent was using agent directory as working directory,\nnot the user's current directory. This prevented reading session data\nfrom .helen/sessions/ in the user's project.\n\nFix: Pass Path.cwd() as HELEN_WEBUI_CWD environment variable to\nstart-web.sh, which then uses it for the backend process.\n\nBackend now correctly identifies user's working directory and can\naccess project-specific session data.\n\nCo-Authored-By: Claude <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(agent): pass user's cwd to Web UI backend",
          "author_name": "rxx",
          "author_login": null,
          "committed_at": "2026-07-25T16:06:18Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "5d3b161dfe97a615a938a0528271692fbb4484a1",
          "body": "Catch KeyboardInterrupt to prevent traceback when user presses Ctrl+C.\nThe start-web.sh script handles cleanup, we just exit cleanly.\n\nCo-Authored-By: Claude <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(agent): handle Ctrl+C gracefully in agent launcher",
          "author_name": "rxx",
          "author_login": null,
          "committed_at": "2026-07-25T15:58:45Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "29bd6fbdad26e33573c97dee08a5f950221b8d94",
          "body": "Backend failed to start with ModuleNotFoundError: No module named 'ui'.\n\nRoot cause:\n- Backend code imports from ui.hint_queue\n- ui module was not included in Helen package\n- PYTHONPATH only included backend/, not agent/\n\nFix:\n- Copy ui/ directory from helenagent (14 files)\n- Update start-backend.sh to add agent/ to PYTHONPATH\n- Backend can now import ui module successfully\n\nTested: Backend starts successfully on port 8000.\n\nCo-Authored-By: Claude <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(agent): add ui module and fix PYTHONPATH for backend",
          "author_name": "rxx",
          "author_login": null,
          "committed_at": "2026-07-25T15:55:49Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "a81f9dcc9ea67a3f5031fc60ca02ed5732712e1c",
          "body": "Reduce package size from 15.4 MB to 2.29 MB (85% reduction).\n\nChanges:\n- MANIFEST.in: Add prune rules for node_modules and dist\n- pyproject.toml: Add exclude patterns for setuptools\n\nUsers install frontend dependencies via npm, not pip.\n\nCo-Authored-By: Claude <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(build): exclude node_modules from package",
          "author_name": "rxx",
          "author_login": null,
          "committed_at": "2026-07-25T15:49:29Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "ee18c668310e80b2a3aa08554a3741aad3d577f7",
          "body": "Major release: Integrated helenagent v8.0 as built-in programming assistant.\n\nNew features:\n- helen agent command launches Web UI\n- Single long-lived actor architecture (v8.0)\n- 14 core Helen files + 6 project skills\n- FastAPI backend + React frontend\n- Optional dependencies: pip install helen-lang[agent]\n\nCo-Authored-By: Claude <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "chore: bump version to 1.26.0 for helenagent integration",
          "author_name": "rxx",
          "author_login": null,
          "committed_at": "2026-07-25T15:46:33Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "6943faee92efd585c431b960fe5f666d4a5cc640",
          "body": "Replace simple helen_assistant.helen with full-featured helenagent (v8.0).\n\nKey changes:\n- Remove helen/agent/helen_assistant.helen (simple reference implementation)\n- Add helenagent v8.0: single long-lived actor architecture\n- 14 core Helen files (chat_session_actor, context_manager, etc.)\n- 6 proj\n[…]\nUpdated CLI help text with agent command\n\nThis makes Helen a complete agent programming language with a\nproduction-ready programming assistant built-in.\n\nCo-Authored-By: Claude <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(agent): integrate helenagent as built-in programming assistant",
          "author_name": "rxx",
          "author_login": null,
          "committed_at": "2026-07-25T15:17:56Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "b9db4625632398462fe9d8a2a02e7dc295b0d1e6",
          "body": "Changed Channel.is_closed and ChannelEndpoint.is_closed from @property\nto regular methods to match documentation (ch.is_closed()) and be\nconsistent with other Channel methods (send(), receive(), close(), cancel()).\n\nThis fixes the error where calling ch.is_closed() would fail with\n'bool is not calla\n[…]\nst_channel.py: Update tests to use method call syntax\n- tests/runtime/test_channel_is_closed_property.py: Update test docstring\n- Version bump to 1.25.5\n\nCo-Authored-By: Claude <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(channel): change is_closed from @property to method for consistency",
          "author_name": "rxx",
          "author_login": null,
          "committed_at": "2026-07-25T11:24:43Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "c2c54fcdc9655d3a268dabc9cf828ea5f10649e9",
          "body": "Co-Authored-By: Claude <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "chore: bump version to 1.25.4 for PyPI release",
          "author_name": "rxx",
          "author_login": null,
          "committed_at": "2026-07-25T11:08:33Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "fba5f3fa3a23d08b8e1a2d74931ef8973995c068",
          "body": "Fix AttributeError when accessing ChannelEndpoint.is_closed directly.\n\nProblem:\n- Documentation states Channel has is_closed() method\n- ChannelEndpoint only had is_channel_closed() method\n- call_method mapping had is_closed but direct property access failed\n- HelenAgent called reply.is_closed() → At\n[…]\ne is_closed property in Channel (was defined twice)\n- tests/runtime/test_channel_is_closed_property.py: 7 new tests\n\nAll 68 channel/spawn tests passing.\n\nCo-Authored-By: Claude <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(channel): add is_closed property to ChannelEndpoint",
          "author_name": "rxx",
          "author_login": null,
          "committed_at": "2026-07-25T11:06:21Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "7fa363d3441df4ec815bdb165bf188961c94983a",
          "body": "Replace non-existent save_new_skill/update_existing_skill functions with\nactual file operations using shell_exec and write_file.\n\nChanges:\n- helen-programming-methodology/SKILL.md:\n  * Replace fake function calls with real file operations\n  * Add clear guidance on skill directory locations (project \n[…]\n creation checklist\n\nThis fixes the issue where HelenAgent was creating skills in the wrong\nlocation (built-in skill directory) due to missing guidance.\n\nCo-Authored-By: Claude <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs(skills): add comprehensive skill creation guidance",
          "author_name": "rxx",
          "author_login": null,
          "committed_at": "2026-07-25T06:21:08Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "ff5d22c4a34e1c197dcd7b857f0799650513570d",
          "body": "…issues\n\nv1.25.3: Fix two critical issues with working memory implementation:\n\n1. Streaming visibility fix:\n   - Add _WorkingMemoryStreamFilter class for real-time filtering\n   - Buffer and detect <working_memory> blocks during streaming\n   - Only send non-working-memory content to users\n   - Handle\n[…]\nosing tag filtered\n  * Partial tag prefix buffering\n  * Empty chunks handled\n  * Real-world scenario\n\nAll 265 interpreter tests passing, no regressions.\n\nCo-Authored-By: Claude <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(working-memory): resolve streaming visibility and prompt clarity …",
          "author_name": "rxx",
          "author_login": null,
          "committed_at": "2026-07-25T04:27:10Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "2fdca7bf438f6f6227b94435d228e301cf1ac5e8",
          "body": null,
          "is_bot": false,
          "headline": "chore: bump version to 1.25.2",
          "author_name": "hahalee000000",
          "author_login": null,
          "committed_at": "2026-07-24T09:34:51Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "b3c5fc3368ff43200592b0513254a5a90cbd93dd",
          "body": "The working memory extraction was working correctly, but the <working_memory>\nXML block was not being removed from the response text, causing users to see\ninternal working memory updates.\n\nChanges:\n- Modified _apply_working_memory_update() to return cleaned response text\n- Updated both sync and streaming paths to use the cleaned response\n- Added comprehensive tests for block removal\n\nFixes helenagent feedback issue where users could see <working_memory> blocks.",
          "is_bot": false,
          "headline": "fix: remove <working_memory> block from LLM responses",
          "author_name": "hahalee000000",
          "author_login": null,
          "committed_at": "2026-07-24T09:34:38Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "767b249a5d8eda8ee6c087b851fe3657e3356ebf",
          "body": null,
          "is_bot": false,
          "headline": "chore: bump version to 1.25.1 for bug fix release",
          "author_name": "hahalee000000",
          "author_login": null,
          "committed_at": "2026-07-24T08:48:31Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "af468b5aa07ec86b5425d57424c485d0cafcf058",
          "body": "Issue #20: SharedStore methods lost after spawn\n- Fix SharedStore.__deepcopy__ to copy methods and rebind to new store\n- Methods now work correctly in spawned agents\n\nIssue #21: shared let not visible after spawn\n- Transfer _shared_vars registry to spawned interpreter\n- shared let variables are now \n[…]\ndPythonObject\n- Return self since Python modules are process-level singletons\n- spawn now works with Python FFI imports\n\nAll fixes include comprehensive tests (11 new test cases).\nCloses #20, #21, #22",
          "is_bot": false,
          "headline": "fix: resolve 3 P1 spawn bugs (issues #20, #21, #22)",
          "author_name": "hahalee000000",
          "author_login": null,
          "committed_at": "2026-07-24T08:47:53Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "80f811639a9ba730ed698ac280a99f267f852104",
          "body": null,
          "is_bot": false,
          "headline": "chore: bump version to 1.25.0 for PyPI release",
          "author_name": "hahalee000000",
          "author_login": null,
          "committed_at": "2026-07-24T04:19:23Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "f70abdb25267d1e043d48054adead639d06d1076",
          "body": "Convert all Chinese prose, section headings, and table content to English.\n\nChanges:\n- Title and description translated\n- Directory structure comments translated\n- Skill search priority section translated\n- Project-level skills section translated\n- Two-tier skill disclosure mechanism explained in En\n[…]\n All skill names and directory names (identifiers)\n- Code block structure and formatting\n- Table structure\n- URLs and links\n\nThis completes the English-ification of the skills directory documentation.",
          "is_bot": false,
          "headline": "docs: English-ify helen/skills/README.md",
          "author_name": "hahalee000000",
          "author_login": null,
          "committed_at": "2026-07-24T04:17:45Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "0e044e889e23dc91ca71f61631eca4e96fe0ebd6",
          "body": "Convert all Chinese prose, section headings, and code comments to English\nwhile preserving Chinese programming keywords, stdlib aliases, and keyword\nmapping examples as required.\n\nREADME.md changes:\n- Main title and all section headings translated\n- Comparison tables translated\n- Code block comments\n[…]\namming keywords (通道, 仓库, 发送, 接收, etc.)\n- Chinese stdlib alias examples\n- Keyword mapping examples\n- All code logic unchanged\n\nThis completes the comprehensive English-ification of Helen documentation.",
          "is_bot": false,
          "headline": "docs: Convert README.md and CLAUDE.md to English",
          "author_name": "hahalee000000",
          "author_login": null,
          "committed_at": "2026-07-24T04:12:39Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "1184e5ca7d7cfce5bda9cc793b32c09afbf1283e",
          "body": "…, and Python code\n\nComprehensive English-ification of Helen documentation and code while\npreserving Chinese programming examples and keyword mappings.\n\n## Changes\n\n### Skills (11 files)\n- helen-stdlib: Converted prose to English, kept keyword mapping table and Chinese stdlib aliases\n- helen-syntax:\n[…]\n: Chinese programming examples preserved\n\nAll changes maintain backward compatibility and preserve Helen's bilingual\nprogramming capabilities while making documentation accessible to English speakers.",
          "is_bot": false,
          "headline": "docs: Convert Chinese prose to English across skills, wiki, tutorials…",
          "author_name": "hahalee000000",
          "author_login": null,
          "committed_at": "2026-07-24T04:05:04Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "e0ba4fe7900e15af2327b514ea7f05eb7f2c30a7",
          "body": "Implement a simpler, smarter working memory approach that leverages the LLM\nitself to maintain context, replacing the need for the complex semantic\nworking memory proposal.\n\n## Changes\n\n### Implementation\n- helen/interpreter/llm_mixin.py:\n  - Add _build_working_memory_instructions(): injects <workin\n[…]\n code changes (~100 lines vs ~2000 in the original proposal)\n- Full backward compatibility with existing working_memory stdlib API\n\nAll 908 existing interpreter/runtime tests pass with no regressions.",
          "is_bot": false,
          "headline": "feat(working-memory): v1.25 system prompt-based working memory",
          "author_name": "hahalee000000",
          "author_login": null,
          "committed_at": "2026-07-24T03:01:25Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "477e76681e6807b99629836c6749b892730197ca",
          "body": "移动文件:\n- docs/COMPARISON.md → reports/COMPARISON.md\n- docs/LLM_DISCOVERY.md → reports/LLM_DISCOVERY.md\n- docs/PYTHON_3.12_UPGRADE.md → reports/PYTHON_3.12_UPGRADE.md\n- docs/REORGANIZATION_REPORT.md → reports/REORGANIZATION_REPORT.md\n\n更新引用:\n- README.md: 更新文档链接\n- tests/integration/test_helen_assistant.py: 更新测试文件路径\n- wiki/schema.md: 更新文档架构说明\n- helen/skills/*/references/*.md: 更新技能参考文档中的链接\n\n删除:\n- docs/ 目录(所有文件已移至 reports/)\n\n理由:\n- docs/ 目录中的文件本质上都是报告和分析文档\n- reports/ 目录更适合存放这类内容\n- 统一文档组织结构,减少目录层级",
          "is_bot": false,
          "headline": "docs: 将 docs/ 目录移入 reports/ 并删除",
          "author_name": "hahalee000000",
          "author_login": null,
          "committed_at": "2026-07-24T02:19:46Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "9224bbfec47be0126f5db5381bbd16bcf86c1e50",
          "body": "Phase 1: 文档清理\n- 删除 4 个重复文档 (-8,099 行): tutorial.md, python_bridge.md,\n  transcript_store_user_guide.md, keyword_stdlib_reference.md\n- 归档 4 个过时 wiki 页面到 wiki/_archive/: agent_context.md,\n  working_memory.md, graduated_compression.md, cache_aware_compression.md\n- 更新 wiki/index.md 反映归档状态\n\nPhase 2-3: 技能\n[…]\n更新\n- 更新 CLAUDE.md 技能列表(行数、描述)\n- 更新 wiki/tutorial/13-skills.md 技能清单\n- 创建 docs/REORGANIZATION_REPORT.md 详细重组报告\n\n总体成果:\n- docs/ 文件: 7 → 3 (-57%)\n- docs/ 行数: 8,755 → 656 (-92%)\n- 技能系统上下文占用: -45%\n- 所有验证测试通过",
          "is_bot": false,
          "headline": "docs: 文档与技能系统大规模重组",
          "author_name": "hahalee000000",
          "author_login": null,
          "committed_at": "2026-07-24T02:17:42Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "47802a03259d67ef0e133d6365b922577062f23e",
          "body": "针对\"持续对话 + agent 隔离\"的核心张力,提出三层上下文模型:\n- Layer 1: 现有结构追踪(工具调用精确追踪)\n- Layer 2: 语义摘要(LLM 增量生成,本方案新增)\n- Layer 3: Transcript SSOT(完整历史,用于审计/恢复)\n\n核心机制:\n- SemanticSnapshot 作为 Transcript 项持久化,继承 SSOT 所有好处\n- SessionMeta.working_memory_uuid 指向最新 snapshot\n- 增量算法:old_summary + new_messages → new_summary\n- 自动触发:invocation 边界 + 阈值 + 显式 stdlib\n- 用小模型(主模型降一级)做摘要,增加约 5% 成本\n\n分 5 个 Phase 实施,预计 4-5 周。\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs: 语义 Working Memory 设计方案 (v1.25 proposal)",
          "author_name": "hahalee000000",
          "author_login": null,
          "committed_at": "2026-07-23T08:12:55Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "923d84a77077d2bc2ff12168722e5b94b522b97f",
          "body": "Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "chore: bump version to 1.24.9 for PyPI release",
          "author_name": "hahalee000000",
          "author_login": null,
          "committed_at": "2026-07-23T01:35:28Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "69933a5e4509efd8e415ca034506b03eae640576",
          "body": "重建多模态 Message 时遗漏 pinned、agent_name、invocation_id、\nparent_invocation_id、visible_to_invocation_ids,导致 agent 内\nllm act media(...) 因 invocation 过滤失效而丢失图片内容。\n\n补全字段复制(list 字段防御性拷贝)并新增回归测试。\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(transcript): _restore_media_in_messages 复制全部 Message 字段 (Issue #19)",
          "author_name": "hahalee000000",
          "author_login": null,
          "committed_at": "2026-07-23T01:35:10Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "d621f76c8b097029d7075b90477b57236f8d2b50",
          "body": "Issue #17 延伸修复 (media(list) 动态列表) 在 agent 内失效: agent 参数\n被包装为 ReadOnlyView (v1.12 不可变保护), 而 _media() 只认 list, 导致\nmedia(media_list) 在 agent 内报 TypeError --动态媒体列表传给 agent 内\nllm act media(...) 这一核心场景不可用。\n\n修复 (helen/stdlib/media.py):\n- 新增 _is_list_like() helper: 判断 list 或 list-backed ReadOnlyView\n- _medi\n[…]\nstr)\n- 多参数混入 ReadOnlyView\n- 空 ReadOnlyView\n- dict-backed ReadOnlyView 不展平 (报 TypeError)\n- llm act 动态列表集成\n\n全部 29 个 media 测试通过, 1193 个相关测试无回归。\n\n版本: 1.24.8\n\nCo-Authored-By: Claude <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(media): 支持 ReadOnlyView 参数展平 (Issue #18)",
          "author_name": "rxx",
          "author_login": null,
          "committed_at": "2026-07-22T18:16:00Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "c349c8d5d58662d9822e40fb1ed68f5a862f445a",
          "body": "修复教程\"批量处理\"章节展示的 media(images...) 写法 --Helen 无 spread\n语法,media(list) 也报 TypeError,动态长度图片列表无法传给 llm act。\n\n方案 Y 修复 (stdlib 级,不引入新语法):\n- _media() 单参为 list 时自动展平为 list[MediaPart]\n- media([img1, img2]) -> [img1, img2]\n- media([\"a.png\", \"b.png\"]) -> [MediaPart, MediaPart]\n- media([img, \"path.png\"]) -> 混合展平\n[…]\n 单 list 展平 (MediaPart/str/混合)\n- 空 list / 单元素 list\n- 多参数混入 list\n- 错误处理 (list 内非法类型)\n- llm act 动态列表集成\n\n向后兼容: 全部 23 个 media 测试通过,1035 个相关测试无回归。\n\n版本: 1.24.7\n\nCo-Authored-By: Claude <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(media): 支持 media(list) 动态列表展平 (Issue #17 延伸)",
          "author_name": "rxx",
          "author_login": null,
          "committed_at": "2026-07-22T18:04:45Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "68e7b61ff4c87ed99b606385a613fa4a1156d4fa",
          "body": "修复 media() 不接受 MediaPart 对象的 bug --教程 5 个 block 展示的\nmedia(img1, img2) 写法运行即崩 (AttributeError: startswith)。\n\n根因: _media() 第一步 source.startswith() 假设入参为字符串,无 passthrough 分支。\n\n方案 A 修复 (helen/stdlib/media.py):\n- _media(*args, media_type=None) 支持 MediaPart passthrough (单参原样返回)\n- 多参数形式返回 list[MediaPart] (\n[…]\nrough (单参返回同一对象)\n- 多参数 (返回 list)\n- 向后兼容 (字符串/关键字/legacy 位置)\n- 错误处理 (无参/类型错误)\n- llm act 集成 (list 展平)\n\n全部 3117 测试通过 (1 个 LLM API 配额失败与本次修复无关)。\n\n版本: 1.24.6\n\nCo-Authored-By: Claude <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(media): 支持 MediaPart passthrough + 多参数形式 (Issue #17)",
          "author_name": "rxx",
          "author_login": null,
          "committed_at": "2026-07-22T17:51:26Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "e95ae316edb936990a8613ae3ff0ff60dba0664d",
          "body": "HelenFunctionWrapper.__call__() 现在支持 **kwargs 关键字参数传递:\n- 位置参数和关键字参数可混合使用\n- 完整的错误处理(参数过多、未知参数、重复参数)\n- 与 Python 函数调用语义一致\n\n版本:1.24.5\n\nCo-Authored-By: Claude <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(python-bridge): HelenFunctionWrapper 支持关键字参数",
          "author_name": "rxx",
          "author_login": null,
          "committed_at": "2026-07-22T17:10:41Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "e9c1bf4e1542dcd588702e2dc003f2a46f4b1b7a",
          "body": "修复 Python bridge type_converter 将 MediaPart 转为字符串的问题,\n现在 MediaPart 可以在 Python 和 Helen 之间原生传递。\n\n修改内容:\n- python_to_helen() 添加 MediaPart 类型检查\n- helen_to_python() 添加 MediaPart 类型检查\n- 保持对象身份和所有字段不变\n\n版本:1.24.4\n\nCo-Authored-By: Claude <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(python-bridge): MediaPart 原生传递支持",
          "author_name": "rxx",
          "author_login": null,
          "committed_at": "2026-07-22T15:30:59Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "25e79d1c64a634e9777827a1fb67784d836374b6",
          "body": "Co-Authored-By: Claude <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "chore: bump version to 1.24.3 for PyPI release",
          "author_name": "rxx",
          "author_login": null,
          "committed_at": "2026-07-22T15:20:26Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "c62a0852472ee85b3b2d9fdb6779dd5b87b21bf2",
          "body": "问题:type_converter.py 将 MediaPart 包装为 WrappedPythonObject,\n导致 Helen 代码无法直接访问其字段(source, content, mime 等)\n\n修复:\n- type_converter.py 新增 MediaPart case,直接传递不包装\n- 保持 MediaPart 作为一等公民类型(与 v1.17 多模态设计一致)\n- Python → Helen:MediaPart 直接传递\n- Helen → Python:MediaPart 直接传递\n\n测试:\n- 新增 5 个 MediaPart 转换测试(helen_to_py\n[…]\npy 适配 session_meta(v1.23.3 特性)\n\n影响:\n- 性能提升:消除包装/解包开销\n- 类型安全:Helen 类型系统可识别 MediaPart\n- API 一致性:与其他一等公民类型(int, str, list 等)行为一致\n\n测试:3103 passed, 1 skipped\n\nCo-Authored-By: Claude <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(ffi): MediaPart 原生传递支持(Python ↔ Helen)",
          "author_name": "rxx",
          "author_login": null,
          "committed_at": "2026-07-22T15:17:21Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "d96c84fcbab7227f771073c51686667759995073",
          "body": null,
          "is_bot": false,
          "headline": "chore: bump version to 1.24.2 for PyPI release",
          "author_name": "rxx",
          "author_login": null,
          "committed_at": "2026-07-22T12:40:23Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "63d7fce468cda8a5fdcd6a505d8eeb8185ab94fd",
          "body": "核心改进:\n- Message 新增 visible_to_invocation_ids 字段,支持跨调用者可见性\n- resume_session 保留原始 invocation_id(调用树完整性)\n- resume_session 使用 UUID 去重(幂等性,多次调用不重复)\n- resume_session 返回 dict(包含 imported_messages, skipped_duplicates)\n- restore_context 保留调用树 + 添加可见性标记\n- _history 过滤逻辑同时检查 invocation_id 和 visible_to_invocatio\n[…]\n- helen/stdlib/context.py: restore_context 和 _import_context 改进\n- helen/cli/repl.py: 适配新返回类型\n- tests/stdlib/test_resume_session_v124.py: 新增 4 个测试\n- reports/v1.24-release-report.md: 发布报告\n\n测试:4 个新测试全部通过",
          "is_bot": false,
          "headline": "feat(v1.24): resume_session 改进 — 可见性标记 + 调用树完整性 + 幂等恢复",
          "author_name": "rxx",
          "author_login": null,
          "committed_at": "2026-07-22T12:38:54Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "8f0ce1155044fbcf7882d9bed34a207faa8ac1dc",
          "body": "Python Bridge import hook now resolves session_id via a priority chain,\nenabling transcript continuity across process restarts:\n\n    1. set_session_id() explicit (highest, in-process dynamic control)\n    2. HELEN_SESSION_ID env var (cross-restart recovery)\n    3. .helen/current_session_id memento fi\n[…]\nl/15-python-bridge.md, helen-python-bridge SKILL.md,\nwiki/log.md\nTests: tests/execution/test_python_bridge_session_id.py (15 cases)\n\nCloses #16\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(python-bridge): support session_id in import hook (Issue #16)",
          "author_name": "hahalee000000",
          "author_login": null,
          "committed_at": "2026-07-22T08:59:37Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "3ee241cae464b57e416228124f52465cfe5b92f0",
          "body": "- Add CLI flags: --session=ID and --resume-latest for Interpreter recovery\n- Support Python API: Interpreter(session_id='session_xxx')\n- Update CLI parsing: _extract_session_flags() at top level\n- Update run_command/watch_command/repl_command to accept session_id\n\nDocumentation updates:\n- wiki/log.m\n[…]\nn recovery section\n- helen-programming-methodology SKILL: Pattern C update\n- helen-python-bridge SKILL: session management section\n- CLAUDE.md: toolchain and transcript updates\n\nBump version to 1.24.0",
          "is_bot": false,
          "headline": "feat(v1.24): add session resume at startup",
          "author_name": "hahalee000000",
          "author_login": null,
          "committed_at": "2026-07-22T07:58:30Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "00739e5654bed5946096bf125e695e4dd8ecb5e4",
          "body": "…ming-methodology\n\nAdded Pattern D (v1.23.7+): Automatic spawn tracking\n- Query spawn tree with get_spawn_tree()\n- Aggregate view with replay_full_session()\n- Cascade deletion to avoid orphan transcripts\n\nUpdated decision table:\n- Added 2 new scenarios for Pattern D (debugging + cleanup)\n\nEnhanced c\n[…]\nreference\n\nUpdated cross-references:\n- Added helen-stdlib skill reference\n\nThis completes the documentation coverage for v1.23.7 spawn transcript\nfeatures across all relevant skills and documentation.",
          "is_bot": false,
          "headline": "docs(skill): add spawn transcript management pattern to helen-program…",
          "author_name": "hahalee000000",
          "author_login": null,
          "committed_at": "2026-07-21T08:25:37Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "103fd203dc84bea804881881a7015335d52c42e5",
          "body": "New section covers v1.23.7 features:\n- Querying spawn relationships (get_spawned_sessions, get_spawn_tree)\n- Aggregated view (replay_full_session)\n- Cross-spawn search (search_transcript with include_spawned)\n- Cascade deletion (delete_session, cleanup_sessions with cascade)\n- Design rationale for cascade behavior\n\nUpdated version to v1.23.7 and date to 2026-07-21.",
          "is_bot": false,
          "headline": "docs(tutorial): add spawn transcript management section to 07-spawn.md",
          "author_name": "hahalee000000",
          "author_login": null,
          "committed_at": "2026-07-21T08:22:30Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "80db1c9d17890fb27655ee5a3da25434a6e8df2b",
          "body": "…tures\n\nAdded comprehensive sections:\n- replay_full_session() - aggregate view across spawn tree\n- search_transcript(include_spawned=true) - cross-spawn search\n- export_transcript(include_spawned=true) - export full spawn tree\n- get_spawned_sessions() and get_spawn_tree() - spawn relationship queries\n- Cascade deletion (delete_session, delete_current_session, cleanup_sessions)\n- Updated Chinese alias table with v1.23.7 functions\n\nAll examples include both English and Chinese usage patterns.",
          "is_bot": false,
          "headline": "docs(tutorial): update 10-stdlib.md with v1.23.7 spawn transcript fea…",
          "author_name": "hahalee000000",
          "author_login": null,
          "committed_at": "2026-07-21T08:21:51Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "271a4fac017d8aaf5a67a1354c217815c58c4a35",
          "body": "New Chinese aliases:\n- 回放完整会话 → replay_full_session\n- 获取子会话 → get_spawned_sessions\n- 获取会话树 → get_spawn_tree\n\nThese aliases follow the existing naming convention in zh.py and\nprovide natural Chinese names for the new spawn tracking functions.",
          "is_bot": false,
          "headline": "feat(stdlib): add Chinese aliases for v1.23.7 spawn-aware functions",
          "author_name": "hahalee000000",
          "author_login": null,
          "committed_at": "2026-07-21T08:16:39Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "4dda33b33c1b81be7171606ead3dfbce06a4d97d",
          "body": "wiki/log.md:\n- Add v1.23.7 feature entry documenting P1 and P2 functions\n- Include usage examples and implementation details\n\nhelen-stdlib SKILL.md:\n- Update Transcript category count: 17 → 22 functions\n- Add spawn tracking section with examples:\n  * get_spawned_sessions() - query spawn relationship\n[…]\ncript(include_spawned=true) - export full tree\n  * cleanup_sessions(cascade=true) - cascade cleanup\n\nAll documentation now reflects the complete v1.23.7 spawn-aware\ntranscript management capabilities.",
          "is_bot": false,
          "headline": "docs: update wiki and skill for v1.23.7 spawn-aware functions",
          "author_name": "hahalee000000",
          "author_login": null,
          "committed_at": "2026-07-21T08:13:58Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "04a74a957602929642332075a8025808958c550d",
          "body": "P1 Functions (High Priority):\n- replay_full_session(): Aggregate messages from session and all spawns\n- search_transcript(include_spawned=true): Search across spawn tree\n\nP2 Functions (Medium Priority):\n- cleanup_sessions(cascade=true): Cascade deletion using delete_session\n- export_transcript(inclu\n[…]\nmessages = replay_full_session()\n  let matches = search_transcript('error', include_spawned=true)\n  cleanup_sessions(keep_count=10, cascade=true)\n  export_transcript('full.json', include_spawned=true)",
          "is_bot": false,
          "headline": "feat(transcript): implement P1 and P2 spawn-aware functions",
          "author_name": "hahalee000000",
          "author_login": null,
          "committed_at": "2026-07-21T08:12:13Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "9db1016df3cd7ebb27eade71eabeec4135a00b8a",
          "body": "- Add cascade parameter to delete_current_session(confirm, cascade=true)\n- Recursively collect and delete all spawned sessions\n- Return deleted_sessions list in response\n- Prevents orphaned transcripts from accumulating\n\nNote: cleanup_sessions cascade support deferred to next iteration due to\ncomple\n[…]\nspawn_tree() - query full spawn hierarchy\n✅ delete_session(id, cascade=true) - cascade deletion\n✅ delete_current_session(confirm, cascade=true) - cascade deletion\n⏳ cleanup_sessions cascade - deferred",
          "is_bot": false,
          "headline": "feat(transcript): enhance delete_current_session with cascade support",
          "author_name": "hahalee000000",
          "author_login": null,
          "committed_at": "2026-07-21T08:01:22Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "8176a66a1987ca566eca86d8e5461b9e3a222745",
          "body": "Major feature: Track spawn relationships across sessions and enable\ncascade deletion to prevent orphaned transcripts.\n\n## Core Changes\n\n### 1. SessionMeta adds parent_session_id\n- helen/runtime/transcript_store.py\n- New field tracks which session spawned this one\n- Backward compatible (old transcrip\n[…]\nand project scopes\n- Cascade deletion is recursive (handles nested spawns)\n- Current session cannot be deleted (use delete_current_session)\n- Spawn tree is different from invocation tree (agent calls)",
          "is_bot": false,
          "headline": "feat(transcript): spawn session tracking and cascade deletion (v1.23.7)",
          "author_name": "hahalee000000",
          "author_login": null,
          "committed_at": "2026-07-21T07:55:43Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "b752578edc5ca3c7d7828b02e7e9cf7920183445",
          "body": "- wiki/log.md: add v1.23.6+ import hook update entry\n- helen-python-bridge SKILL.md: document function import via import hook\n  - Show how to import fn alongside agent\n  - Complete example with Helen file + Python usage\n  - Note about install_import_hook() requirement",
          "is_bot": false,
          "headline": "docs: update for import hook function support",
          "author_name": "hahalee000000",
          "author_login": null,
          "committed_at": "2026-07-21T06:50:58Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "d56ea831307879ee88adb0fe7ef4469560d88764",
          "body": "- Updated HelenLoader.exec_module() to load both agents AND functions\n- All functions (fn) are wrapped with HelenFunctionWrapper\n- Agents and functions share the same Interpreter instance\n- Module metadata includes __interpreter__ for advanced usage\n\nUsage:\n  from helen.python_bridge.import_hook imp\n[…]\ny_function, MY_CONST\n  result = my_function(10, 20)  # Call Helen fn directly\n  agent_result = my_agent()     # Call Helen agent\n\nNote: Function names cannot shadow stdlib builtins (e.g., 'calculate')",
          "is_bot": false,
          "headline": "feat(python-bridge): import hook now exposes Helen functions (fn)",
          "author_name": "hahalee000000",
          "author_login": null,
          "committed_at": "2026-07-21T06:50:20Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "cbcc4343383cdd214977f6f707732dad504322c9",
          "body": "- wiki/log.md: add v1.23.6 changelog (LSP references, Python Bridge functions)\n- helen-python-bridge SKILL.md: document HelenFunctionWrapper usage\n  - How to call Helen fn from Python\n  - load_helen_functions() for batch loading\n  - When to use fn vs agent\n  - Mixed usage examples\n\nVersion: 1.0.0 → 1.1.0",
          "is_bot": false,
          "headline": "docs: update wiki and skill for v1.23.6 features",
          "author_name": "hahalee000000",
          "author_login": null,
          "committed_at": "2026-07-21T04:43:07Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "25e8aa6cfbe5816af1d0c2410823c70928b1c5df",
          "body": "…om Python\n\n- HelenFunctionWrapper: call individual Helen functions from Python\n- load_helen_functions(): load all functions from a Helen file\n- Complements existing HelenAgentWrapper (agent-only)\n- Enables hybrid Python+Helen codebases\n\nUsage:\n  from helen.python_bridge.function_wrapper import HelenFunctionWrapper\n  add = HelenFunctionWrapper('add', 'utils.helen')\n  result = add(10, 32)  # 42",
          "is_bot": false,
          "headline": "feat(python-bridge): add HelenFunctionWrapper for calling Helen fn fr…",
          "author_name": "hahalee000000",
          "author_login": null,
          "committed_at": "2026-07-21T04:40:44Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "98f71e4cf915c5694f5d9479762e23c8e2f7c45f",
          "body": "- Add referencesProvider to LSP server (Shift+F12 in VS Code)\n  - Find all call sites of functions/agents/variables\n  - Support Chinese identifiers\n  - Skip comments and string literals\n  - Cross-file search (all open documents)\n  - Optional includeDeclaration flag\n\n- VS Code extension: auto-detect \n[…]\ness of VS Code launch method (desktop/terminal)\n  - User can still override via helen.lsp.path setting\n\n- LSP server: use helen.__version__ instead of hardcoded 1.10.0\n\n- Version bump: 1.23.5 → 1.23.6",
          "is_bot": false,
          "headline": "v1.23.6: LSP add Find All References + auto-detect helen binary",
          "author_name": "hahalee000000",
          "author_login": null,
          "committed_at": "2026-07-21T04:24:28Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "85dcd0597c564de64cc577a04f7665f353682145",
          "body": "…, not LSP process CWD\n\nLSP was reporting spurious 'import file not found' diagnostics for any\nrelative import (e.g. 'import \"./helper.helen\"'), even when the imported\nfile existed next to the main file.\n\n== Root Cause ==\n\nhelen/lsp/server.py _analyze() hard-coded '<lsp>' as the Scanner's file\nname:\n[…]\nt_analyze_with_uri_resolves_imports: end-to-end sibling import\n- test_analyze_without_uri_reports_missing_import: baseline negative case\n\nAll 35 LSP tests pass. 230 semantic + import tests still pass.",
          "is_bot": false,
          "headline": "fix(lsp): v1.23.5 resolve relative imports against document directory…",
          "author_name": "hahalee000000",
          "author_login": null,
          "committed_at": "2026-07-21T03:59:00Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "0a789fe2924162d41c1c7751af0d77eac4360d85",
          "body": "…1.23\n\nUpdates the TextMate grammar to cover all keywords introduced since\nv1.10. The extension was stuck at v1.10.0 while Helen advanced to\nv1.23.4, leaving spawn/Channel/shared store/on_tool_end/etc. without\nsyntax highlighting.\n\nAdded keyword groups:\n- keyword.concurrency: spawn, Channel, mailbox\n[…]\nar size: 8.32 KB -> 9.14 KB.\n\nLSP integration unchanged (already current via 'helen lsp' on the\nPython side). Rebuild locally with:\n  cd extensions/vscode && npm install && npx tsc && npx vsce package",
          "is_bot": false,
          "headline": "feat(vscode): v1.23.4 extension - add 22 missing keywords for v1.12-v…",
          "author_name": "hahalee000000",
          "author_login": null,
          "committed_at": "2026-07-21T03:27:49Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "a46af243aea12c5f479a309a5e66366559987937",
          "body": "…vscode/\n\nRemoved the duplicate vscode-extension/ directory (contained only stale\nv1.8.0 build artifacts - compiled out/, node_modules, and an old .vsix,\nwith no source code). extensions/vscode/ is now the single canonical\nlocation for the VS Code extension, containing complete source:\n\n  extensions\n[…]\ntensions/vscode/ source was already up to date\nand tracked in git. Build artifacts (out/, node_modules/, .vsix) are\ngitignored and regenerated locally via 'npm install && npx tsc && npx\nvsce package'.",
          "is_bot": false,
          "headline": "docs: consolidate VS Code extension into single directory extensions/…",
          "author_name": "hahalee000000",
          "author_login": null,
          "committed_at": "2026-07-21T03:21:30Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "f7ea22af113f596beb6cedc21fb4a482ede6a674",
          "body": "…ting main thread\n\nCritical concurrency bug fix: spawn was silently corrupting the main\nthread's session_id and agent context, causing all subsequent stdlib\ncalls (llm act, working_memory, compress_context, etc.) in the main\nthread to operate on the spawned interpreter's context.\n\n== Root Cause ==\n\n\n[…]\nme + stdlib + interpreter), no regressions.\n\nDocumentation:\n- CLAUDE.md: added thread isolation note to Runtime Isolation section\n- wiki/log.md: v1.23.4 changelog entry\n\nVersion bump: 1.23.3 -> 1.23.4",
          "is_bot": false,
          "headline": "fix(stdlib): v1.23.4 thread-local agent context - prevent spawn pollu…",
          "author_name": "hahalee000000",
          "author_login": null,
          "committed_at": "2026-07-21T02:07:11Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "f419944b36de53a4355fa47cc83325cedd3fe58c",
          "body": "…amp, version tracking\n\nAdds SessionMeta record as the first line of every new transcript,\ncapturing the execution context (program name, arguments, start time,\nversions, working directory) for session identification, audit trail,\nand debugging.\n\nNew in v1.23.3:\n\n1. SessionMeta dataclass (helen/runt\n[…]\nanscript-store.md: new §4.7 with format, fields, design goals\n- wiki/index.md: updated TranscriptStore entry with v1.23.3 note\n- wiki/log.md: changelog entry for v1.23.3\n\nVersion bump: 1.23.2 → 1.23.3",
          "is_bot": false,
          "headline": "feat(stdlib): v1.23.3 TranscriptStore session metadata — argv, timest…",
          "author_name": "hahalee000000",
          "author_login": null,
          "committed_at": "2026-07-21T01:25:27Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "e1a812e263cedd781a2bccb27980d1fd845a69eb",
          "body": "…duction P0)\n\nPart of the 'isolation vs complexity' reduction plan — implementing\nonly the two non-over-engineered P0 items. Other proposals deferred.\n\n== Plan 1: Smart Error Messages ==\n\nWhen a user accesses a module-level variable from inside an agent main\nblock, the compiler now emits a detailed,\n[…]\n/README.md - template index with usage guide\n- helen/templates/*.helen - 6 template files\n- helen/cli/__main__.py - template_command() implementation\n- wiki/toolchain/templates.md - wiki documentation",
          "is_bot": false,
          "headline": "feat: smart error messages + built-in template library (complexity re…",
          "author_name": "hahalee000000",
          "author_login": null,
          "committed_at": "2026-07-20T09:36:50Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "5ed5d045ba6bd821eb8064f2d0d5091c366d46b0",
          "body": "…n principle + bump to v1.23.2\n\nCore design principle:\n- '调用 agent 前先问:它需要知道什么?' (Before calling an agent,\n  ask: what context does it need?)\n- Agent is strictly isolated — each call creates an independent\n  execution environment that does NOT auto-inherit caller's variables,\n  history, or LLM conte\n[…]\nnciple\n  with 5 design reasons + context passing reference table\n- helen-agent-patterns SKILL: new first-principle preface tying all\n  patterns back to context isolation\n\nVersion bump: 1.23.1 → 1.23.2",
          "is_bot": false,
          "headline": "docs: establish 'Caller Decides Context' as Helen's first agent desig…",
          "author_name": "hahalee000000",
          "author_login": null,
          "committed_at": "2026-07-20T08:36:25Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "588fe5c111e6c2699ac64ef009c092f0b41e17e1",
          "body": "…ngual error detection, exit_code extraction, task_description auto-set\n\nFixes from working-memory-audit-2026-07-20.md:\n\n1. Chinese tool name canonicalization (agent_context.py)\n   - update_from_tool_call now translates Chinese aliases (读文件 → read_file)\n     before matching, so user-defined Chinese \n[…]\n\n- Chinese tool name canonicalization (4 tests)\n- Multilingual error detection (6 tests)\n- task_description auto-set (3 tests)\n\nAll 40 working memory tests + 644 runtime tests + 807 stdlib tests pass.",
          "is_bot": false,
          "headline": "fix(working-memory): 4 fixes from audit — Chinese tool names, multili…",
          "author_name": "hahalee000000",
          "author_login": null,
          "committed_at": "2026-07-20T08:11:06Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "e16ff17e5c1549efcc360b2881c332c140affcd6",
          "body": "…pattern\n\n- CLAUDE.md: document Runtime Isolation design principle for TranscriptStore\n- helen-agent-patterns: add anti-pattern, handoff template, and decision table to spawn pattern\n- helen-programming-methodology: add Context Handoff Pattern as core principle §5 (3 modes + decision table)\n- helen-\n[…]\n\n\nKey takeaway: 'spawn means isolation, handoff must be explicit' — transcript is\nscoped to Interpreter instance; cross-runtime inheritance requires explicit\nresume_session() or Channel-based passing.",
          "is_bot": false,
          "headline": "docs: add transcript runtime isolation principle and context handoff …",
          "author_name": "hahalee000000",
          "author_login": null,
          "committed_at": "2026-07-20T07:44:37Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "481e72beb23fe7ea47771fa44970e77363d43b3a",
          "body": "AgentContextManager now defers TranscriptStore initialization until first\naccess of transcript_store or session_id property. This prevents creating\nempty session directories for agents that never use transcript features.\n\nKey changes:\n- __init__() no longer calls _init_transcript_store() immediately\n[…]\ncess\n- Use getattr() safety for objects created via __new__() (bypassing __init__)\n\nCleanup: ~5800 empty session directories removed from:\n- ~/.helen/sessions/ (33 → 1)\n- .helen/sessions/ (6325 → 563)",
          "is_bot": false,
          "headline": "bugfix: lazy-init session directory to prevent empty dir accumulation",
          "author_name": "rxx",
          "author_login": null,
          "committed_at": "2026-07-19T09:40:27Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "4c7ccd3d19dd8d6a80295e69764b123a725594f1",
          "body": "…skill\n\nllm_mixin.py _build_tools_list() now includes list_skill_references\nin all three default tool injection points:\n1. @sandbox agents (L3 isolation)\n2. Agents with no declared tools\n3. All agents as a catch-all at the end\n\nCo-Authored-By: Claude <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix: add list_skill_references to agent default tools alongside load_…",
          "author_name": "rxx",
          "author_login": null,
          "committed_at": "2026-07-19T03:53:53Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "74d07671b36f3f0a8a2fcfbc0432f6f4aedd9001",
          "body": "- Enhanced load_skill with include_references parameter to list\n  reference files alongside SKILL.md content\n- Added new list_skill_references tool that returns reference file\n  names, paths, sizes, and 3-line previews for LLM to decide which\n  to load via read_file\n- Chinese alias: 列出技能引用 → list_sk\n[…]\nutorial/13-skills.md: added third-tier docs\n- helen-stdlib SKILL.md: Tools category 6 → 7\n- CLAUDE.md: tool/builtin counts updated\n\nAll 3048 tests pass.\n\nCo-Authored-By: Claude <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat: enhance skill reference system with list_skill_references tool",
          "author_name": "rxx",
          "author_login": null,
          "committed_at": "2026-07-19T03:46:49Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "57d8c5d1df3681a1a12742891679a5d7701bf170",
          "body": "…stration\n\ninterpreter.py: 3258 → 1990 lines (-39%)\n\nPhase 1: Extract auxiliary classes\n- closure.py: Closure class + free variable analysis functions\n- readonly_view.py: ReadOnlyView (agent parameter isolation)\n- shared_store.py: SharedStore + SharedStoreMethod (thread-safe shared state)\n\nPhase 2: \n[…]\nin architecture diagram\n- wiki/interpreter/execution.md: added mixin architecture table\n- wiki/log.md: added refactoring log entry\n\nAll 3048 tests pass.\n\nCo-Authored-By: Claude <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "refactor: split interpreter.py into mixins and reorganize stdlib regi…",
          "author_name": "rxx",
          "author_login": null,
          "committed_at": "2026-07-19T01:50:13Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "7ffaf54b942551cf593f27693798b7999200d0ea",
          "body": "- wiki/runtime/context-management.md: 更新 restore_context vs resume_session 对比表\n- wiki/tutorial/10-stdlib.md: 更新 resume_session 描述和使用场景\n- helen-stdlib/SKILL.md: 更新 restore_context vs resume_session 注释\n\nv1.23 变更:\n- 之前:resume_session 替换 transcript store 引用,LLM 看不到\n- 现在:resume_session 导入消息到当前 store,LLM 能看到(标记 invocation_id)",
          "is_bot": false,
          "headline": "docs: 更新 resume_session 语义说明(v1.23 修复后 LLM 可见)",
          "author_name": "rxx",
          "author_login": null,
          "committed_at": "2026-07-18T09:05:57Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "2e97f24af8ea639b317ae085a1432d91cf42b953",
          "body": "- helen-agent-patterns/SKILL.md: 新增 'Agent 上下文隔离' 章节,说明 invocation 级别隔离机制\n- helen-stdlib/SKILL.md: 添加 v1.23 上下文隔离修复说明和验证示例\n- wiki/runtime/context-management.md: 更新版本至 v1.23,新增 §0.6 修复说明\n- wiki/appendix/changelog.md: 补充 v1.22 和 v1.23 变更日志\n- wiki/log.md: 添加 v1.23 wiki 更新记录",
          "is_bot": false,
          "headline": "docs: 更新 wiki 和 skills 文档,补充 v1.22/v1.23 invocation 隔离说明",
          "author_name": "rxx",
          "author_login": null,
          "committed_at": "2026-07-18T09:01:34Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "c2321a3b57e94be036580f9c0b851048ec558d92",
          "body": null,
          "is_bot": false,
          "headline": "chore: bump version to 1.23.1 for PyPI upload",
          "author_name": "rxx",
          "author_login": null,
          "committed_at": "2026-07-18T08:47:52Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "0455ed9fed986c803f82717422d96b561b704908",
          "body": "核心修复(v1.22 提案 vs 实现不一致):\n- Bug 1: _prepare_history_for_llm 统一走 self._history(包含 invocation_id 过滤)\n- Bug 2: _import_context 单写语义 + invocation_id 标记\n- Bug 3: resume_session 导入消息到当前 store 而非替换引用\n\n修改文件:\n- helen/interpreter/llm_mixin.py: 统一使用 _history property\n- helen/stdlib/context.py: _import_context 单\n[…]\nlation.py(2 个测试)\n- 更新 tests/stdlib/test_context_v119_p1p3.py(适配单写语义)\n- 修复 tests/runtime/test_session_scope.py(3 个测试,mock Path.exists 隔离 /tmp/.helen)\n\n结果: 3048 passed, 0 failed(从 3042 passed, 4 failed)",
          "is_bot": false,
          "headline": "feat(v1.23): 修复调用隔离 + 版本 bump 至 1.23.0",
          "author_name": "rxx",
          "author_login": null,
          "committed_at": "2026-07-18T08:43:26Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "2938f7b35084f3f66a2014374e014244214a77ce",
          "body": "User-defined symbols (variables, functions, agents, parameters, loop\niterators, match bindings, catch error names, import aliases, alias\nstatements, shared store/channel names) can no longer shadow stdlib\nbuiltins. Since Helen is AI-native (LLM reads and writes the code),\nshadowing builtins creates \n[…]\nhape\n- Updated 12 existing tests that relied on builtin names (log, count,\n  sum, input, describe, add, calculate, 列表, 测试) to use non-builtin\n  alternatives\n\n3050 tests pass (+18 new), no regressions.",
          "is_bot": false,
          "headline": "feat(v1.23): forbid builtin shadowing",
          "author_name": "hahalee000000",
          "author_login": null,
          "committed_at": "2026-07-17T08:54:55Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "27cf7ddba6bd9a3cce6f77a7b261aa797bf57f90",
          "body": "…ript + builtin shadowing 修复\n\n== v1.22 主体:Invocation Tree + Per-Main Fresh Context ==\n\n实现 reports/v1.22-invocation-tree-proposal.md 提案。核心设计原则:\n每次 agent main {} 执行都是 fresh context,main {} 退出后丢弃;\n记忆管理是程序的事,不是语言的事。\n\nMessage 字段扩展 (helen/runtime/history.py):\n- 新增 agent_name / invocation_id / parent_invoc\n[…]\nter 看不到 Inner 的消息)\n- 顶层 agent_name: null\n- 元数据持久化: 不持久化,从 transcript 重建 (SSOT)\n- list_invocations 分页: limit=100, offset=0\n- call_stack 关系: 独立实现\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(v1.22): Invocation Tree + Per-Main Fresh Context + search_transc…",
          "author_name": "hahalee000000",
          "author_login": null,
          "committed_at": "2026-07-17T08:16:18Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "31837ce51cc56772e8c131ac0db5753cf9efcb70",
          "body": "填补 TranscriptStore (审计层) 与 Active Context (活跃层) 之间的 API 缺口。\n之前从旧 transcript session 恢复 active context 需要手写格式适配,\n现在一步到位。\n\n核心实现:\n- helen/stdlib/context.py: _restore_context() 直接读 TranscriptStore\n  拿完整 Message 对象,保留 role/content/tool_calls/tool_call_id/\n  uuid/compressed/pinned 全部字段,内部委托 import_context\n[…]\n: 替换 transcript store 引用 (LLM 看不到)\n\n限制 (已显式记录):\n- 只恢复 messages, 不恢复 working_memory 和 context config\n  (transcript 不持久化这些)\n- 返回值 note 字段提示用户手动恢复\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(v1.21): 新增 restore_context(session_id) 跨会话恢复函数",
          "author_name": "hahalee000000",
          "author_login": null,
          "committed_at": "2026-07-17T03:20:42Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "3fea90c7eb28a7d3e4520fba74be9be84a57b371",
          "body": "避免将会话 transcript 文件提交到仓库",
          "is_bot": false,
          "headline": "chore: 添加 .helen/sessions/ 到 .gitignore",
          "author_name": "rxx",
          "author_login": null,
          "committed_at": "2026-07-16T15:37:04Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "417a694c5a5d016441c598ae90a2779cbe99a8e5",
          "body": "重要:同步修改到内置 skill 目录 (helen/skills/) 和 Claude skill 目录 (.claude/skills/)\n\n## 新增内容\n\n### 1. ImportResolver 缓存机制文档\n- wiki/runtime/import.md: 完整技术说明\n  * 内存缓存行为(_cached_results)\n  * 缓存命中/未命中场景对比\n  * 三种解决方案(新建实例/手动清除/mtime 检查)\n  * Helen vs Python 缓存对比\n\n- wiki/tutorial/08-modules.md: 开发者教程\n  * 问题场景演示\n  * 快速\n[…]\n务:缓存不自动失效,需手动清除\n✅ 解决方案:新建 Interpreter 实例或手动清除缓存\n✅ Helen 无磁盘缓存:内存缓存,进程重启自动清空\n\n## 解决的问题\n\n- Issue #15: Helen 解释器 bytecode 缓存问题\n- 开发者在 REPL/Web 服务中修改代码后不生效的困惑\n- 统一文档位置,避免 .claude/skills vs helen/skills 混淆",
          "is_bot": false,
          "headline": "docs: 补充 Helen 缓存机制知识到多个 skill 和 wiki",
          "author_name": "rxx",
          "author_login": null,
          "committed_at": "2026-07-16T15:36:40Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "425983c51f00b84dab7e30841455674bd5c45a2b",
          "body": "修复 GitHub Issue #14: resume_session 无视 set_session_dir() 和项目级会话作用域\n\n问题:\n- resume_session() 和 replay_transcript() 使用 get_transcript_config()['session_dir']\n- 这会返回默认值 ~/.helen/sessions,忽略了环境变量和项目级作用域\n- 导致 helenagent Web UI 刷新后无法恢复 LLM 上下文\n\n修复:\n- 将 get_transcript_config()['session_dir'] 替换为 resolve_ses\n[…]\nR 环境变量\n- 现在正确使用项目级会话作用域 (v1.20+ 默认)\n- 现在正确使用 set_session_dir() 动态设置的路径\n\n影响:\n- helenagent Web UI 可以正确恢复会话\n- 所有使用项目级会话的应用现在工作正常\n- delete_session/cleanup_sessions/list_sessions 已经正确使用 resolve_session_dir",
          "is_bot": false,
          "headline": "fix: resume_session 和 replay_transcript 现在正确使用 resolve_session_dir",
          "author_name": "rxx",
          "author_login": null,
          "committed_at": "2026-07-16T15:09:05Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "00ea620eb7f193002bdb1b030933e97bde9a79ed",
          "body": "P0: 修复文档中的关键字和函数引用\n- helen-syntax SKILL.md: 删除不存在的 让/async/await/call 关键字\n- helen-stdlib SKILL.md: 修正 25 个幽灵函数名\n- 统一 prompt 中文为 提示词\n\nP1: 添加中文配置键支持\n- parser.py: 添加 上下文 和 记忆 中文关键字支持\n- 修复 agent 声明中的中文配置块解析\n\nP2: 补充 stdlib 函数文档\n- Context 高级函数 (27个): 检查/变更/工作记忆/配置/查询/转移/钩子\n- Transcript 会话记录 (11个): 会话管理/回放\n[…]\n/stopwatch_lap\n\n中文别名 (+27个): 余弦/正弦/幂/对数/操作系统/主机名/生成UUID 等\n\n统计:\n- stdlib 函数: 290 → 317 (+27)\n- 中文别名: 290 → 317 (+27)\n- 关键字文档准确性: 100%\n\n修复 get_session_dir() 文档错误:\n- 返回值从暗示的字符串改为实际的 dict\n- 添加完整的返回结构说明和示例",
          "is_bot": false,
          "headline": "feat: 完善中文关键字和 stdlib 别名完整性",
          "author_name": "rxx",
          "author_login": null,
          "committed_at": "2026-07-16T14:27:55Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "5551087dc19f09dae79ad3d3bf6bcc14f1dcf1e9",
          "body": "新增测试文件:\n- test_clear_context_behavior.py: 12 个行为驱动测试\n  * 验证 clear_context() 实际清除 read_view()\n  * 验证 BoundaryMarker 覆盖所有消息\n  * 验证压缩状态重置\n  * 验证 working memory 清除\n  * 边界条件测试\n\n- test_compress_context_integration.py: 14 个集成测试\n  * 验证所有策略在 TranscriptStore 启用时的行为\n  * 验证 BoundaryMarker 创建\n  * 验证 read_view() \n[…]\n_description = \"\" 到清除列表\n\n2. compress_context(\"none\") 在 TranscriptStore 路径未处理\n   - 添加 \"none\" 策略的显式处理\n\n测试结果:\n- 26 个新测试全部通过\n- 所有 145 个相关测试通过\n- 无回归\n\nCo-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "test: 新增 26 个行为驱动测试和集成测试,修复 2 个 bug",
          "author_name": "hahalee000000",
          "author_login": null,
          "committed_at": "2026-07-16T10:03:41Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "bfd37463303ecf02dd7a2cb0bc46f0679051f9b9",
          "body": "Bug: clear_context() 创建的 BoundaryMarker 使用空 UUID(head_uuid=\"\"、\ntail_uuid=\"\"),导致 read_view() 查找 _uuid_index 时返回 None,\n条件 if head_idx is not None and tail_idx is not None 为 False,\nmarker 被完全跳过,上下文实际未被清除。\n\n修复:\n- 查找当前 transcript 中第一条和最后一条 Message 的 UUID\n- 设置 BoundaryMarker 的 head_uuid/tail_uuid 为真实消息 UU\n[…]\nTrue 使缓存失效\n- 返回 cleared_message_count 字段\n\n验证:\n- 3 条消息 → clear_context → read_view() 返回 0 条 ✓\n- 清除后添加新消息 → read_view() 返回 1 条 ✓\n- 所有 146 个相关测试通过\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix: clear_context() BoundaryMarker 现在覆盖所有消息,真正清除上下文",
          "author_name": "hahalee000000",
          "author_login": null,
          "committed_at": "2026-07-16T09:09:56Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "8ac8aa0029af43357498a0f32f8654201e62beb0",
          "body": "CI 失败原因:issue #12 的测试使用 Mock 对象并断言压缩后消息数为 1,\n但 compress_context 实现已改为使用 _force_compact(保留摘要+最后1条=2条)\n和 _context_collapse(需 >20 条消息才触发)。\n\n修复:\n- summarize 测试:使用真实 Message 对象,断言压缩后消息数 < 原始数\n- truncate 测试:使用 25 条消息(满足 CONTEXT_COLLAPSE_THRESHOLD=20)\n- none 测试:保持不变(已通过)\n\n所有 3 个测试通过,CI 应恢复绿色。\n\nCo-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(test): 修复 test_issue_12 与 _force_compact 新实现不兼容",
          "author_name": "hahalee000000",
          "author_login": null,
          "committed_at": "2026-07-16T08:56:37Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "a5a5eb59f153fa4ff43e406d7aafb0f99d73c094",
          "body": "新增 3 个 stdlib 函数用于永久删除 TranscriptStore 会话数据:\n\n- delete_session(session_id): 永久删除指定会话\n- delete_current_session(confirm?): 永久删除当前会话(需确认)\n- cleanup_sessions(keep_count?, older_than_days?): 批量清理旧会话\n\n中文别名:删除会话、删除当前会话、清理会话\n\n设计原则:\n- 审计追踪优先:delete_message/clear_context 只进行逻辑删除\n- 显式永久删除:delete_session 系列函数才真\n[…]\noolchain/stdlib.md: 函数数量更新\n- helen-stdlib/SKILL.md: Transcript 章节 + 函数列表更新\n- helen-agent-patterns/SKILL.md: 会话删除最佳实践\n- CLAUDE.md: stdlib 函数列表更新\n\nCo-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(stdlib): v1.21 新增 TranscriptStore 会话删除功能",
          "author_name": "hahalee000000",
          "author_login": null,
          "committed_at": "2026-07-16T08:46:35Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "d998b9a506d839006dc7fd17c6b797fe72c939ec",
          "body": "问题:\n- 之前使用 _auto_compact,要求消息数 > 6 才压缩\n- 用户显式调用 compress_context(\"summarize\") 时,如果消息数少(如 3 条大消息),不会压缩\n- 用户报告: 10285 tokens → 10285 tokens(无压缩)\n\n修复:\n- 新增 _force_compact 函数,专门为显式调用设计\n- 无阈值检查,即使只有 2-3 条消息也会压缩\n- 保留最后 1 条消息用于连续性,其他消息压缩为摘要\n- 支持 LLM 语义摘要(如果有 llm_client)\n- 符合 TranscriptStore SSOT 和 context \n[…]\n 场景 1: 3 条消息 (3662 tokens) → 2 条消息 (1220 tokens),减少 66.7%\n- 场景 2: 20 条消息 (2700 tokens) → 2 条消息 (1639 tokens),减少 39.3%\n- 所有 100 个 context 相关测试通过\n\nCo-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix: compress_context(summarize) 现在无条件压缩,即使消息数很少",
          "author_name": "hahalee000000",
          "author_login": null,
          "committed_at": "2026-07-16T07:44:31Z",
          "body_truncated": true,
          "is_coding_agent": true
        }
      ],
      "releases_count": 3,
      "commits_last_year": 472,
      "latest_release_at": "2026-07-24T09:39:56Z",
      "latest_release_tag": "v1.25.2",
      "releases_from_tags": false,
      "days_since_last_push": 0,
      "active_weeks_last_year": 7,
      "days_since_latest_release": 3,
      "mean_days_between_releases": 0.1
    },
    "community": {
      "has_readme": true,
      "has_license": true,
      "has_description": true,
      "has_contributing": false,
      "health_percentage": 42,
      "has_issue_template": false,
      "has_code_of_conduct": false,
      "has_pull_request_template": false
    },
    "ecosystem": {
      "packages": [
        {
          "name": "helen-lang",
          "exists": true,
          "license": "MIT",
          "keywords": [
            "helen",
            "helen-lang",
            "ai",
            "artificial-intelligence",
            "machine-learning",
            "deep-learning",
            "llm",
            "gpt",
            "claude",
            "large-language-model",
            "chatgpt",
            "agent",
            "ai-agent",
            "multi-agent",
            "agent-orchestration",
            "autonomous-agent",
            "prompt",
            "prompt-engineering",
            "prompt-first",
            "dsl",
            "domain-specific-language",
            "programming-language",
            "langchain",
            "crewai",
            "autogen",
            "langchain-alternative",
            "chatbot",
            "conversational-ai",
            "natural-language",
            "bilingual",
            "chinese-programming",
            "中文编程",
            "context-management",
            "transcript",
            "session-management",
            "tool-calling",
            "function-calling",
            "agent-framework",
            "Development Status :: 4 - Beta",
            "Intended Audience :: Developers",
            "License :: OSI Approved :: MIT License",
            "Natural Language :: Chinese (Simplified)",
            "Natural Language :: English",
            "Operating System :: OS Independent",
            "Programming Language :: Python :: 3",
            "Programming Language :: Python :: 3.12",
            "Topic :: Internet :: WWW/HTTP :: Dynamic Content",
            "Topic :: Scientific/Engineering :: Artificial Intelligence",
            "Topic :: Software Development :: Compilers",
            "Topic :: Software Development :: Libraries :: Python Modules",
            "Typing :: Typed"
          ],
          "ecosystem": "pypi",
          "matches_repo": true,
          "registry_url": "https://pypi.org/project/helen-lang/",
          "is_deprecated": false,
          "latest_version": "1.29.4",
          "repository_url": "https://github.com/hahalee000000/helen",
          "versions_count": 37,
          "total_downloads": null,
          "dependents_count": null,
          "deprecation_note": null,
          "maintainers_count": null,
          "monthly_downloads": null,
          "first_published_at": "2026-07-15T08:14:43.615939Z",
          "latest_published_at": "2026-07-27T16:07:56.315749Z",
          "latest_version_yanked": null,
          "days_since_latest_publish": 0
        }
      ]
    },
    "popularity": {
      "forks": 0,
      "stars": 2,
      "watchers": 0,
      "fork_history": {
        "days": [],
        "complete": true,
        "collected": 0,
        "total_forks": 0
      },
      "star_history": null,
      "open_issues_and_prs": 1
    },
    "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": [
        "extensions/vscode/tsconfig.json",
        "helen/agent/webui/frontend/tsconfig.json",
        "helen/py.typed"
      ],
      "toolchain_manifests": [],
      "largest_source_bytes": 90308,
      "source_files_sampled": 346,
      "oversized_source_files": 7,
      "agent_instruction_files": [
        "CLAUDE.md"
      ],
      "agent_instruction_max_bytes": 9259
    },
    "dependencies": {
      "manifests": [
        "pyproject.toml"
      ],
      "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": [
        "pypi"
      ],
      "dependencies": [
        {
          "name": "pyyaml",
          "manifest": "pyproject.toml",
          "ecosystem": "pypi",
          "version_constraint": ">=6.0"
        },
        {
          "name": "toml",
          "manifest": "pyproject.toml",
          "ecosystem": "pypi",
          "version_constraint": ">=0.10"
        },
        {
          "name": "httpx",
          "manifest": "pyproject.toml",
          "ecosystem": "pypi",
          "version_constraint": ">=0.24.0"
        }
      ],
      "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": 1,
        "closed_ratio": 0.957,
        "closed_issues": 22,
        "closed_unmerged_prs": 0
      },
      "bus_factor": null,
      "bot_contributors": 0,
      "top_contributors": [],
      "contributors_sampled": null,
      "top_contributor_share": null
    },
    "quality_signals": {
      "has_ci": true,
      "has_tests": true,
      "ci_workflows": [
        "ci.yml"
      ],
      "has_docs_dir": true,
      "linter_configs": [
        ".flake8"
      ],
      "has_editorconfig": false,
      "has_linter_config": true,
      "has_precommit_config": false
    },
    "security_signals": {
      "lockfiles": [
        "package-lock.json",
        "uv.lock"
      ],
      "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": 0,
            "reason": "project has 0 contributing companies or organizations -- score normalized to 0",
            "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": 0,
            "reason": "22 existing vulnerabilities detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#vulnerabilities"
          }
        ],
        "commit": "741417fc0ca0ae76b3486132a9779ea9cabc673a",
        "ran_at": "2026-07-27T16:08:52Z",
        "aggregate_score": 2.2,
        "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-27T16:07:16Z",
      "oldest_open_prs": [],
      "last_merged_pr_at": null,
      "ci_last_conclusion": null,
      "oldest_open_issues": [
        {
          "number": 23,
          "created_at": "2026-07-26T09:44:17Z",
          "last_comment_at": null,
          "last_comment_author": null
        }
      ]
    }
  },
  "config": {
    "disabled_metrics": [],
    "disabled_categories": [],
    "disabled_components": {}
  },
  "source": {
    "url": "https://github.com/hahalee000000/helen",
    "host": "github.com",
    "name": "helen",
    "owner": "hahalee000000"
  },
  "metrics": {
    "overall": {
      "key": "overall",
      "band": "moderate",
      "name": "Overall health",
      "note": null,
      "notes": [],
      "value": 55,
      "inputs": {
        "security": 22,
        "vitality": 75,
        "community": 24,
        "governance": 63,
        "engineering": 78
      },
      "components": []
    },
    "categories": [
      {
        "key": "vitality",
        "band": "good",
        "name": "Vitality",
        "value": 75,
        "weight": 0.22,
        "metrics": [
          {
            "key": "development_activity",
            "band": "moderate",
            "name": "Development activity",
            "note": null,
            "notes": [],
            "value": 59,
            "inputs": {
              "commits_last_year": 472,
              "human_commit_share": 1,
              "days_since_last_push": 0,
              "active_weeks_last_year": 7
            },
            "components": [
              {
                "key": "push_recency",
                "name": "Push recency",
                "detail": "last push 0 days ago",
                "points": 36,
                "status": "met",
                "details": [
                  {
                    "code": "push_recency",
                    "params": {
                      "days": 0
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "commit_cadence",
                "name": "Commit cadence",
                "detail": "7/52 weeks with commits",
                "points": 4.8,
                "status": "partial",
                "details": [
                  {
                    "code": "commit_cadence_weeks",
                    "params": {
                      "weeks": 7
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "commit_volume",
                "name": "Commit volume",
                "detail": "472 commits in the last year",
                "points": 18,
                "status": "met",
                "details": [
                  {
                    "code": "commits_last_year",
                    "params": {
                      "count": 472
                    }
                  }
                ],
                "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": 3,
              "latest_release_tag": "v1.25.2",
              "releases_from_tags": false,
              "days_since_latest_release": 3,
              "mean_days_between_releases": 0.1
            },
            "components": [
              {
                "key": "ships_releases",
                "name": "Ships releases",
                "detail": "3 releases published",
                "points": 27,
                "status": "met",
                "details": [
                  {
                    "code": "releases_published",
                    "params": {
                      "count": 3
                    }
                  }
                ],
                "max_points": 27
              },
              {
                "key": "release_recency",
                "name": "Release recency",
                "detail": "latest release 3 days ago",
                "points": 36,
                "status": "met",
                "details": [
                  {
                    "code": "release_recency",
                    "params": {
                      "days": 3
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "release_cadence",
                "name": "Release cadence",
                "detail": "a release every ~0.1 days",
                "points": 27,
                "status": "met",
                "details": [
                  {
                    "code": "release_cadence",
                    "params": {
                      "gap": 0.1
                    }
                  }
                ],
                "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": "moderate",
        "name": "Sustainability & Governance",
        "value": 63,
        "weight": 0.24,
        "metrics": [
          {
            "key": "responsiveness",
            "band": "good",
            "name": "Issue & PR responsiveness",
            "note": "Excluded from scoring (no data or not applicable): PR acceptance. Remaining weights renormalized.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "pr_acceptance"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              }
            ],
            "value": 72,
            "inputs": {
              "merged_prs": 0,
              "open_issues": 1,
              "closed_issues": 22,
              "issue_closed_ratio": 0.957,
              "closed_unmerged_prs": 0
            },
            "components": [
              {
                "key": "issue_resolution",
                "name": "Issue resolution",
                "detail": "96% of issues closed",
                "points": 44.7,
                "status": "partial",
                "details": [
                  {
                    "code": "issues_closed_share",
                    "params": {
                      "share": 96
                    }
                  }
                ],
                "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": "critical",
            "name": "Ownership & stewardship",
            "note": "Excluded from scoring (no data or not applicable): Verified domain. Remaining weights renormalized.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "verified_domain"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              }
            ],
            "value": 24,
            "inputs": {
              "followers": 0,
              "owner_type": "User",
              "is_verified": null,
              "owner_login": "hahalee000000",
              "public_repos": 5,
              "account_age_days": 619
            },
            "components": [
              {
                "key": "ownership_backing",
                "name": "Ownership backing",
                "detail": "personal (user) account",
                "points": 10,
                "status": "partial",
                "details": [
                  {
                    "code": "owner_personal",
                    "params": {}
                  }
                ],
                "max_points": 30
              },
              {
                "key": "verified_domain",
                "name": "Verified domain",
                "detail": "not applicable to user accounts",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "not_applicable_to_user_accounts",
                    "params": {}
                  }
                ],
                "max_points": 20
              },
              {
                "key": "owner_reach",
                "name": "Owner reach",
                "detail": "0 followers of hahalee000000",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "owner_followers",
                    "params": {
                      "count": 0,
                      "login": "hahalee000000"
                    }
                  }
                ],
                "max_points": 25
              },
              {
                "key": "track_record",
                "name": "Track record",
                "detail": "5 public repos, account ~1 yr old",
                "points": 9.1,
                "status": "partial",
                "details": [
                  {
                    "code": "public_repos",
                    "params": {
                      "count": 5
                    }
                  },
                  {
                    "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": [
                "helen-lang"
              ],
              "ecosystems": "pypi",
              "any_deprecated": false,
              "min_days_since_publish": 0
            },
            "components": [
              {
                "key": "published_resolvable",
                "name": "Published & resolvable",
                "detail": "1 package(s) on pypi",
                "points": 25,
                "status": "met",
                "details": [
                  {
                    "code": "packages_published",
                    "params": {
                      "count": 1,
                      "ecosystems": "pypi"
                    }
                  }
                ],
                "max_points": 25
              },
              {
                "key": "publish_recency",
                "name": "Publish recency",
                "detail": "latest publish 0 days ago",
                "points": 35,
                "status": "met",
                "details": [
                  {
                    "code": "publish_recency",
                    "params": {
                      "days": 0
                    }
                  }
                ],
                "max_points": 35
              },
              {
                "key": "version_history",
                "name": "Version history",
                "detail": "37 published versions",
                "points": 20,
                "status": "met",
                "details": [
                  {
                    "code": "published_versions",
                    "params": {
                      "count": 37
                    }
                  }
                ],
                "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": 78,
        "weight": 0.2,
        "metrics": [
          {
            "key": "engineering_practices",
            "band": "good",
            "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": 80,
            "inputs": {
              "has_ci": true,
              "has_tests": true,
              "has_editorconfig": false,
              "has_linter_config": true,
              "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": ".flake8",
                "points": 16,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": ".flake8"
                    }
                  }
                ],
                "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": "good",
            "name": "Documentation",
            "note": null,
            "notes": [],
            "value": 75,
            "inputs": {
              "topics": [
                "agent",
                "agent-orchestration",
                "ai",
                "ai-agent",
                "ai-application",
                "autogen-alternative",
                "bilingual",
                "chatbot",
                "chinese-programming",
                "claude",
                "crewai-alternative",
                "domain-specific-language",
                "dsl",
                "gpt",
                "langchain-alternative",
                "llm",
                "multi-agent",
                "natural-language-programming",
                "programming-language",
                "prompt-engineering"
              ],
              "has_wiki": false,
              "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": "20 topics",
                "points": 10,
                "status": "met",
                "details": [
                  {
                    "code": "topics_count",
                    "params": {
                      "count": 20
                    }
                  }
                ],
                "max_points": 10
              },
              {
                "key": "wiki",
                "name": "Wiki",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 10
              }
            ]
          }
        ],
        "description": "Are baseline engineering and documentation practices in place?"
      },
      {
        "key": "security",
        "band": "critical",
        "name": "Security",
        "value": 22,
        "weight": 0.16,
        "metrics": [
          {
            "key": "security_posture",
            "band": "critical",
            "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": 22,
            "inputs": {
              "source": "openssf_scorecard",
              "checks_evaluated": 15,
              "scorecard_version": "v5.5.0",
              "checks_inconclusive": 3,
              "scorecard_aggregate": 2.2
            },
            "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 0 contributing companies or organizations -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "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": "22 existing vulnerabilities detected",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.5
              }
            ]
          }
        ],
        "description": "Are visible security and supply-chain practices strong, with no malicious dependency and no unresolved high-risk jurisdiction exposure?"
      },
      {
        "key": "ai_readiness",
        "band": "moderate",
        "name": "AI Readiness",
        "value": 69,
        "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": 1,
              "agent_instruction_files": [
                "CLAUDE.md"
              ],
              "agent_instruction_max_bytes": 9259
            },
            "components": [
              {
                "key": "agent_instructions",
                "name": "Agent instructions",
                "detail": "CLAUDE.md",
                "points": 45,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": "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": "100 of 100 human commits state their intent (structured subject or explanatory body)",
                "points": 40,
                "status": "met",
                "details": [
                  {
                    "code": "legible_history",
                    "params": {
                      "legible": 100,
                      "sampled": 100
                    }
                  }
                ],
                "max_points": 40
              }
            ]
          },
          {
            "key": "ai_verify_loop",
            "band": "moderate",
            "name": "Verify loop (build / test / typecheck)",
            "note": null,
            "notes": [],
            "value": 64,
            "inputs": {
              "has_nix": false,
              "has_tests": true,
              "lockfiles": [
                "package-lock.json",
                "uv.lock"
              ],
              "has_dockerfile": false,
              "typed_language": false,
              "bootstrap_files": [],
              "has_devcontainer": false,
              "has_linter_config": true,
              "typecheck_configs": [
                "extensions/vscode/tsconfig.json",
                "helen/agent/webui/frontend/tsconfig.json",
                "helen/py.typed"
              ],
              "agent_commit_share": 0.44,
              "toolchain_manifests": [],
              "dependency_bot_commit_share": 0
            },
            "components": [
              {
                "key": "one_command_bootstrap",
                "name": "One-command bootstrap",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "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": ".flake8",
                "points": 11,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": ".flake8"
                    }
                  }
                ],
                "max_points": 11
              },
              {
                "key": "static_type_checking",
                "name": "Static type checking",
                "detail": "extensions/vscode/tsconfig.json, helen/agent/webui/frontend/tsconfig.json, helen/py.typed",
                "points": 11,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": "extensions/vscode/tsconfig.json, helen/agent/webui/frontend/tsconfig.json, helen/py.typed"
                    }
                  }
                ],
                "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": "44 of the last 100 commits agent-authored or agent-credited",
                "points": 10,
                "status": "met",
                "details": [
                  {
                    "code": "agent_authored_commits",
                    "params": {
                      "count": 44,
                      "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": "good",
            "name": "Code legibility for models",
            "note": null,
            "notes": [],
            "value": 81,
            "inputs": {
              "primary_language": "Python",
              "largest_source_bytes": 90308,
              "source_files_sampled": 346,
              "oversized_source_files": 7
            },
            "components": [
              {
                "key": "type_checkable_code",
                "name": "Type-checkable code",
                "detail": "Python with type-check config (extensions/vscode/tsconfig.json, helen/agent/webui/frontend/tsconfig.json, helen/py.typed)",
                "points": 27,
                "status": "partial",
                "details": [
                  {
                    "code": "typecheck_config_language",
                    "params": {
                      "files": "extensions/vscode/tsconfig.json, helen/agent/webui/frontend/tsconfig.json, helen/py.typed",
                      "language": "Python"
                    }
                  }
                ],
                "max_points": 45
              },
              {
                "key": "manageable_file_sizes",
                "name": "Manageable file sizes",
                "detail": "7/346 source files over 60KB",
                "points": 53.9,
                "status": "partial",
                "details": [
                  {
                    "code": "oversized_source_files",
                    "params": {
                      "kb": 60,
                      "sampled": 346,
                      "oversized": 7
                    }
                  }
                ],
                "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",
    "Contributor list unavailable",
    "GitHub dependency-graph SBOM unavailable (404); the dependency graph may be disabled for this repository",
    "deps.dev does not index pypi:helen-lang@1.29.4; advisories assessed against the repository dependency graph instead"
  ],
  "report_type": "repository",
  "generated_at": "2026-07-27T16:08:59.191423Z",
  "schema_version": "0.27.0",
  "badge_url": "https://raw.githubusercontent.com/inspect-software/badges/main/v1/h/hahalee000000/helen.svg",
  "full_name": "hahalee000000/helen",
  "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 agregadasPyPI.