Public record
Software health reportschema 0.27.0 · metrics 1.13.0 · 2026-07-27 16:08 UTC

hahalee000000 / helen

Helen Agent Develop Language

PythonMIT★ 2 stars⑂ 0 forkssince Jun 2026View on GitHub ↗

hahalee000000/helen holds a health index of 55 out of 100, placing it in the Moderate band. It scores highest on Engineering Quality (78/100) and lowest on Security (22/100). It was last updated today.

55
overall / 100
Moderate

Software health index

Metrics are grouped into weighted categories on one standardized 1–100 scale. Overall starts as their weighted mean; when public evidence triggers the High-Risk Jurisdiction Policy, the rating is adjusted and receives an At risk ceiling of 49. AI Readiness sits outside the overall score.

55
Excellent85-100Exemplary; meets essentially all checked criteria
Good70-84Healthy; minor gaps
Moderate50-69Acceptable with notable gaps; review recommended
At risk30-49Significant weaknesses; adoption warrants caution
Critical1-29Severe problems (abandoned, single-maintainer, no hygiene)
VitalityCommunity &AdoptionSustainability &GovernanceEngineeringQualitySecurityAI Readiness

Score profile

Each axis is a category. The shape matters more than the average — a healthy subject fills the whole shape, while a spike-and-crater profile means strength in one dimension is masking risk in another.

Ownership

hahalee000000Personal account
0 followers5 public repossince Nov 2024

This repository is owned by a personal account. A single-owner project carries more continuity risk than an organization-backed one.

Package ecosystems

Metrics by category

Vitality

Is the project alive — is code being written and are releases shipping?

75Good · 22% of overall
How it's scored
36/36Push recency — last push 0 days ago
4.8/36Commit cadence — 7/52 weeks with commits
18/18Commit volume — 472 commits in the last year
0/10OpenSSF Scorecard: Maintained — project was created within the last 90 days. Please review its contents carefully
Inputs used
commits_last_year472
human_commit_share1
days_since_last_push0
active_weeks_last_year7

Release discipline

100Excellent
How it's scored
27/27Ships releases — 3 releases published
36/36Release recency — latest release 3 days ago
27/27Release cadence — a release every ~0.1 days
0/10OpenSSF Scorecard: Signed-Releases — no data
Inputs used
releases_count3
latest_release_tagv1.25.2
releases_from_tagsno
days_since_latest_release3
mean_days_between_releases0.1
Excluded from scoring (no data or not applicable): OpenSSF Scorecard: Signed-Releases. Remaining weights renormalized.

Community & Adoption

Does the project have users, downloads, attention, and a welcoming setup for contributors?

24Critical · 18% of overall
How it's scored
0/60Stars — 2 stars
0/25Forks — 0 forks
0/15Watchers — 0 watchers
Inputs used
forks0
stars2
watchers0
growth_stateunverified
growth_factor_pct100
growth_unverified_reasonno_history
How it's scored
22.5/22.5README
22.5/22.5License — recognized license (MIT)
0/18CONTRIBUTING guide
0/13.5Code of conduct
0/7.2Issue template
0/6.3PR template
Inputs used
has_readmeyes
has_licenseyes
has_contributingno
has_issue_templateno
has_code_of_conductno
has_pull_request_templateno

Sustainability & Governance

Will the project survive its people — bus factor, responsiveness, who backs it, and package upkeep?

63Moderate · 24% of overall
How it's scored
44.7/46.8Issue resolution — 96% of issues closed
0/38.3PR acceptance — no decided pull requests or no data
0/15OpenSSF Scorecard: Code-Review — Found 0/30 approved changesets -- score normalized to 0
Inputs used
merged_prs0
open_issues1
closed_issues22
issue_closed_ratio0.957
closed_unmerged_prs0
Excluded from scoring (no data or not applicable): PR acceptance. Remaining weights renormalized.
How it's scored
10/30Ownership backing — personal (user) account
0/20Verified domain — not applicable to user accounts
0/25Owner reach — 0 followers of hahalee000000
9.1/25Track record — 5 public repos, account ~1 yr old
Inputs used
followers0
owner_typeUser
is_verified
owner_loginhahalee000000
public_repos5
account_age_days619
Excluded from scoring (no data or not applicable): Verified domain. Remaining weights renormalized.
How it's scored
25/25Published & resolvable — 1 package(s) on pypi
35/35Publish recency — latest publish 0 days ago
20/20Version history — 37 published versions
20/20Not deprecated — active, not deprecated or yanked
Inputs used
packageshelen-lang
ecosystemspypi
any_deprecatedno
min_days_since_publish0

Engineering Quality

Are baseline engineering and documentation practices in place?

78Good · 20% of overall
How it's scored
24/24CI workflows — 1 workflow(s)
24/24Tests present
16/16Linter config — .flake8
0/9.6Pre-commit hooks
0/6.4.editorconfig
0/20OpenSSF Scorecard: CI-Tests — no data
Inputs used
has_ciyes
has_testsyes
has_editorconfigno
has_linter_configyes
has_precommit_configno
Excluded from scoring (no data or not applicable): OpenSSF Scorecard: CI-Tests. Remaining weights renormalized.
How it's scored
30/30README
25/25Documentation directory
0/15Documentation / homepage site
10/10Repository description
10/10Topics — 20 topics
0/10Wiki
Inputs used
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_readmeyes
has_docs_diryes
has_descriptionyes

Security

Are visible security and supply-chain practices strong, without unresolved high-risk jurisdiction exposure?

22Critical · 16% of overall
How it's scored
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 — no data
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.5License — license file detected
0/7.5Maintained — project was created within the last 90 days. Please review its contents carefully
0/5Packaging — no data
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 — no data
0/7.5Token-Permissions — detected GitHub workflow tokens with excessive permissions
0/7.5Vulnerabilities — 22 existing vulnerabilities detected
Inputs used
sourceopenssf_scorecard
checks_evaluated15
scorecard_versionv5.5.0
checks_inconclusive3
scorecard_aggregate2.2
Excluded from scoring (no data or not applicable): ci_tests, packaging, signed_releases. Remaining weights renormalized.

AI Readiness

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.

69Moderate · 0% of overall
How it's scored
45/45Agent instructions — CLAUDE.md
0/15Machine-readable docs (llms.txt)
40/40Legible commit history — 100 of 100 human commits state their intent (structured subject or explanatory body)
Inputs used
has_llms_txtno
legible_history_share1
agent_instruction_filesCLAUDE.md
agent_instruction_max_bytes9,259
How it's scored
0/18One-command bootstrap
22/22Automated tests
11/11Lint / format config — .flake8
11/11Static type checking — extensions/vscode/tsconfig.json, helen/agent/webui/frontend/tsconfig.json, helen/py.typed
10/10Reproducible environment — lockfile
10/10Demonstrated agent practice — 44 of the last 100 commits agent-authored or agent-credited
0/8Automated maintenance — no automated dependency updates observed
0/10OpenSSF Scorecard: Pinned-Dependencies — dependency not pinned by hash detected -- score normalized to 0
Inputs used
has_nixno
has_testsyes
lockfilespackage-lock.json, uv.lock
has_dockerfileno
typed_languageno
bootstrap_files
has_devcontainerno
has_linter_configyes
typecheck_configsextensions/vscode/tsconfig.json, helen/agent/webui/frontend/tsconfig.json, helen/py.typed
agent_commit_share0.44
toolchain_manifests
dependency_bot_commit_share0
How it's scored
27/45Type-checkable code — Python with type-check config (extensions/vscode/tsconfig.json, helen/agent/webui/frontend/tsconfig.json, helen/py.typed)
53.9/55Manageable file sizes — 7/346 source files over 60KB
Inputs used
primary_languagePython
largest_source_bytes90,308
source_files_sampled346
oversized_source_files7
How it's scored
0/40API schema (OpenAPI/GraphQL/proto)
0/20MCP server
40/40Runnable examples — examples
Inputs used
example_dirsexamples
has_mcp_signalno
api_schema_files

Key facts

2GitHub stars
-contributors
472commits, last 12 months
0days since last push
3releases
-bus factor
1open issues
PyPIpackage ecosystems

Data collection 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

More detail

OpenSSF Scorecard 2.2 / 10
2.2aggregate

Independent, tool-agnostic security assessment from the open-source OpenSSF Scorecard. Each check rewards a security practice, not a specific vendor's tool. Checks Scorecard could not determine are marked n/a and excluded from the security score (never counted as zero).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/aCI-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/aPackagingpackaging 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/aSigned-Releasesno releases found
0Token-Permissionsdetected GitHub workflow tokens with excessive permissions
0Vulnerabilities22 existing vulnerabilities detected
Direct dependencies 3
RegistryPackageVersion constraintManifest
PyPIpyyaml>=6.0pyproject.toml
PyPItoml>=0.10pyproject.toml
PyPIhttpx>=0.24.0pyproject.toml
All dependencies not collected

The resolved dependency set could not be collected for this report: GitHub dependency-graph SBOM unavailable (404); the dependency graph may be disabled for this repository

Raw JSON report machine-readable
{
  "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"
}

Scores are signals, not warranties. They reflect publicly visible practices on GitHub — not a code audit, and not a security guarantee.

Missing data is excluded and weights renormalized, never scored as zero. Methodology is versioned and open: metrics v1.13.0, schema v0.27.0 — full methodology · metrics wiki.

How one result sits in the wider record: aggregate statisticsPyPI.