Skip to content

fix: avoid unicode filepath suffix panic#393

Merged
dmtrKovalenko merged 3 commits into
dmtrKovalenko:mainfrom
tmdgusya:fix/unicode-filepath-suffix-panic
Apr 21, 2026
Merged

fix: avoid unicode filepath suffix panic#393
dmtrKovalenko merged 3 commits into
dmtrKovalenko:mainfrom
tmdgusya:fix/unicode-filepath-suffix-panic

Conversation

@tmdgusya

Copy link
Copy Markdown
Contributor

Summary

  • fix a remaining UTF-8 boundary panic in path_ends_with_suffix()
  • return false instead of panicking when a byte-derived suffix offset lands inside a multibyte character
  • add regression tests for the helper and for apply_constraints(Constraint::FilePath(...))

Similar PR / duplicate check

I checked existing PRs before opening this:

  • closest prior fix: fix: Unicode segmentation crash #373 (fix: Unicode segmentation crash)
  • no open PR currently covers this remaining Constraint::FilePath / path_ends_with_suffix() panic path

This PR is intentionally narrow: it fixes the unchecked path[start..] slice in crates/fff-core/src/constraints.rs without changing matching semantics.

Root cause

path_ends_with_suffix() computed:

let start = path.len() - suffix.len();

and then sliced with:

path[start..]

start is a byte offset, not guaranteed to be a UTF-8 char boundary. For Unicode filenames, a non-matching suffix can make start land inside a multibyte codepoint, which panics before constraint filtering can return false.

Fix

Use path.get(start..) instead of unchecked indexing:

  • if start is not a valid char boundary, return false
  • otherwise preserve the existing ASCII-insensitive suffix comparison and / boundary behavior

Verification

I avoided using any user-specific filename in tests and instead used synthetic Unicode fixture names.

Reproduction guard added

New tests in crates/fff-core/src/constraints.rs:

  • test_path_ends_with_suffix_does_not_panic_on_unicode_suffix
  • test_apply_constraints_file_path_with_unicode_suffix
  • test_path_contains_segment_does_not_panic_on_unicode_segment

The important regression case uses a synthetic filename such as:

  • data/유니코드_파일_테스트.csv

and a deliberately non-matching suffix that would previously place the byte offset in the middle of a multibyte character.

Commands run

cargo test -p fff-search constraints::tests -- --nocapture

Result

All constraint tests pass locally after the fix, including the new Unicode regression coverage.

Scope notes

  • no parser changes
  • no matching behavior expansion
  • no Unicode normalization/case-folding changes
  • only panic prevention for valid UTF-8 input in the file path suffix constraint path

@dmtrKovalenko

Copy link
Copy Markdown
Owner

@copilot resolve the merge conflicts in this pull request

dmtrKovalenko and others added 2 commits April 19, 2026 09:55
The previous fix (a09292e) only guarded path_ends_with_suffix with
path.get(start..), but three problems remained:

1. path_ends_with_suffix: path_bytes[start - 1] reads inside a
   multi-byte char when start is a valid boundary but start-1 is not.
   Fixed by scanning backward to find the preceding ASCII byte.

2. path_contains_segment: path[..segment_len] and path[start..end]
   slice at non-char-boundary offsets when segment is ASCII but the
   path contains multi-byte UTF-8 (Korean, etc).
   Fixed with is_char_boundary() checks before each slice.

3. file_has_extension: same byte-offset issue for dot_pos.
   Fixed with is_char_boundary() check.

Adds regression tests with the exact Korean filenames that caused
panics (커리큘럼, 세부_커리큘럼_최종, 설치-및-기본-사용, etc).
Merges upstream unicode tests (apostrophe, narrow-space mismatches).
@tmdgusya tmdgusya force-pushed the fix/unicode-filepath-suffix-panic branch from 91cd463 to f067e82 Compare April 21, 2026 12:56
@dmtrKovalenko dmtrKovalenko merged commit a24cf55 into dmtrKovalenko:main Apr 21, 2026
40 checks passed
tmdgusya added a commit to tmdgusya/roach-pi that referenced this pull request Apr 22, 2026
0.6.0 crashes the fff-bg indexing thread on UTF-8 multibyte filenames
(e.g. Korean, emoji) due to a non-char-boundary &str slice in
path_ends_with_suffix() panicking across the FFI boundary. Fixed
upstream in dmtrKovalenko/fff#393; pin nightly until a stable
0.6.2 is cut.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
github-actions Bot pushed a commit to tmdgusya/roach-pi that referenced this pull request Apr 22, 2026
## [1.9.5](v1.9.4...v1.9.5) (2026-04-22)

### Bug Fixes

* **fff:** pin @ff-labs/fff-node to 0.6.2-nightly.acd2f0c ([4470b66](4470b66)), closes [dmtrKovalenko/fff#393](dmtrKovalenko/fff#393)

### Miscellaneous

* upgrade @ff-labs/fff-node 0.5.2 → 0.6.0 ([3b1ea47](3b1ea47))
github-actions Bot pushed a commit to portrik/svab-pi that referenced this pull request Jun 16, 2026
## 1.0.0 (2026-06-16)

### Features

* add agent discovery module (agents.ts) ([e5b7ca5](e5b7ca5))
* add agentic-brainstorming skill ([a301f49](a301f49))
* add bundled agent definitions and wire up agent discovery ([8b8b4f1](8b8b4f1))
* add context compaction with phase-aware summarization and microcompaction ([44f8565](44f8565))
* add dedicated synthesis agent for ultraplan Phase 3 ([88b9c73](88b9c73))
* add durable async subagent joins ([8210721](8210721))
* add English system instructions for clarification priority ([21910f3](21910f3))
* add FFF-powered search engine extension ([7c42996](7c42996))
* add includeScripts option to webfetch tool ([e802b82](e802b82))
* add NestedSubagentCall type and SingleResult.nestedCalls field ([5033685](5033685))
* add PI_ENABLE_TEAM_MODE_ENV constant for team mode gate ([5a6885e](5a6885e))
* add pi-code-previews as default dependency ([d05cdb4](d05cdb4))
* add pi-nested-agents-md and pi-lsp-client extensions ([a428b62](a428b62))
* add Powerline-style UI layer to agentic-harness ([ef3e804](ef3e804))
* add real-time progress streaming for subagent execution ([93a0140](93a0140))
* add run-plan execution agents (plan-worker, plan-validator, plan-compliance) ([08b09a0](08b09a0))
* add structured harness state tools ([290a420](290a420))
* add subagent execution engine (subagent.ts) ([83c7bf8](83c7bf8))
* add subagent tool call logging and progress tracking ([9ee8e3e](9ee8e3e))
* add task status snapshot and recovery to PlanProgressTracker ([abab546](abab546))
* add team backend selection contract ([9444b54](9444b54))
* add team command flow and tmux plans ([d5959ac](d5959ac))
* add tmux helper module for team backend ([9c11abe](9c11abe))
* adopt pi v0.71 ux compatibility ([51644fb](51644fb))
* adopt selected subagent orchestration features ([6846b06](6846b06))
* **agentic-harness:** add /review and /ultrareview commands ([869a22d](869a22d))
* **agentic-harness:** add sandbox approval modes and sensitive env guard ([2e5d8cd](2e5d8cd))
* **agentic-harness:** add shimmer working status ([98afe19](98afe19))
* **agentic-harness:** remove /ultrareview deep-review command ([c93a564](c93a564))
* **agentic-harness:** replace planning flow with goal runtime ([08b8147](08b8147))
* **agentic-harness:** replace ultraplan with plan milestones ([8f7888c](8f7888c))
* bundle pi-mcp-adapter as 8th battery-included extension ([1136abc](1136abc))
* compact tool output rendering ([ff4a43a](ff4a43a))
* detect nested subagent calls from child process messages ([c9cf782](c9cf782))
* **docs:** add workflow video ([5698688](5698688))
* **editor-border:** add fitBorder helper and segment builders for omp-style border ([e9a0e29](e9a0e29))
* **editor-composition:** integrate border builders and use oh-my-pi blue ([5747d34](5747d34)), closes [#178fb9](https://github.com/portrik/svab-pi/issues/178fb9)
* enforce karpathy rules and auto-spawn slop-cleaner for code-writing agents ([4fe821f](4fe821f))
* **footer:** background-block powerline rendering and new segments ([8c9816c](8c9816c))
* **footer:** connect senpi-style todos to footer rendering ([6d4e40a](6d4e40a))
* **footer:** expand FooterContext with git stats, thinking level, model info ([123422f](123422f))
* **footer:** per-turn cache rate + declutter statusline ([bc1b45a](bc1b45a))
* **footer:** show completed todos with ✓ icon ([f734be0](f734be0))
* gate /team slash command handler on PI_ENABLE_TEAM_MODE ([b81d542](b81d542))
* gate team tool registration on PI_ENABLE_TEAM_MODE ([cafa8d6](cafa8d6))
* guard async subagent final responses ([986adae](986adae))
* **harness:** add fixed validator prompt template for information barrier ([6eaeadb](6eaeadb))
* **harness:** add plan markdown parser for validator isolation ([2f8f102](2f8f102))
* **harness:** add todoread/todowrite facade and fix dual-lock race condition ([29c00ea](29c00ea))
* **harness:** animate welcome banner shimmer ([91ab405](91ab405))
* **harness:** custom ROACH PI header and statusline footer ([0d760e2](0d760e2))
* **harness:** enforce validator information barrier via plan-derived prompts ([1da04ff](1da04ff))
* **harness:** inject progress tracking rules into system prompt for all users ([2ceb2f0](2ceb2f0))
* **harness:** pi-coding-agent compatibility and validator information barrier ([4131e46](4131e46))
* hide built-in working row during plan progress ([23c5ead](23c5ead))
* implement workspace-memory extension with auto-save, recall, and scoring ([64b3a02](64b3a02))
* improve team mode summary output ([8643e78](8643e78))
* integrate optional tmux backend for team workers ([ae6ff4b](ae6ff4b))
* load plan progress from finalized assistant messages ([9a76136](9a76136))
* persist plan progress snapshots as CustomEntries ([d87a347](d87a347))
* **plan-progress:** add content-based fallback for non-standard plan paths ([2cf58fb](2cf58fb))
* reconstruct plan progress from session entries ([1333eb0](1333eb0))
* register subagent tool and update PHASE_GUIDANCE ([2946bdc](2946bdc))
* remove autonomous-dev extension ([03a8c34](03a8c34))
* render nested subagent calls as indented tree with status icons ([704d661](704d661))
* **sandbox:** make subagents YOLO - auto-approve all bash commands ([875f725](875f725))
* **session-loop:** extension entry point and root registration ([164ab48](164ab48))
* **session-loop:** implement /loop, /loop-stop, /loop-list, /loop-stop-all commands ([b43cd5b](b43cd5b))
* **session-loop:** implement JobScheduler with timeout and error isolation ([f860285](f860285))
* **session-loop:** project setup and type definitions ([ab35267](ab35267))
* **subagent:** add async background execution, status/interrupt, completion notification, live progress ([a9e4d50](a9e4d50))
* **subagent:** add CLI argument inheritance for child processes ([daa1e5c](daa1e5c))
* **subagent:** add event processing with message deduplication ([c466abb](c466abb))
* **subagent:** add shared type definitions — SingleResult, SubagentDetails, UsageStats ([7234a14](7234a14))
* **subagent:** add TUI component rendering with renderCall/renderResult ([3131e72](3131e72))
* **subagent:** wire renderCall/renderResult TUI rendering and delegation safety guards ([120ce75](120ce75))
* **team-tmux:** add session-scoped mouse-scroll helper for tmux backend ([f0b323c](f0b323c))
* **team-tmux:** also enable mouse-scroll in current-window split branch ([8ee1603](8ee1603))
* **team-tmux:** wire enableMouseScrolling into detached team sessions ([fa48444](fa48444))
* vendor pi-code-previews as internal extension ([5c9bc17](5c9bc17))
* **webfetch:** add core fetch + convert pipeline with caching ([61c3e4f](61c3e4f))
* **webfetch:** add custom TUI rendering for fetch status and results ([0fb2d65](0fb2d65))
* **webfetch:** add dependencies and shared types ([d63dea6](d63dea6))
* **webfetch:** add lazy Turndown + GFM service ([32f809c](32f809c))
* **webfetch:** add LRU cache with TTL eviction ([e3b1364](e3b1364))
* **webfetch:** add Readability content extraction with dynamic imports ([e22f13f](e22f13f))
* **webfetch:** register webfetch tool in agentic-harness extension ([edf3226](edf3226))

### Bug Fixes

* add FFF fallback and cwd-aware search ([86f10d5](86f10d5))
* add task_blocked to TeamEventType and fix runTeam test signature ([dd761b8](dd761b8))
* **agentic-harness:** accept PR URLs in /review and /ultrareview target ([927e2ec](927e2ec))
* **agentic-harness:** add missing typebox dependency ([79079cd](79079cd))
* **agentic-harness:** allow root sandbox access to PI agent dir ([4077339](4077339))
* **agentic-harness:** harden plan progress footer ([de5621e](de5621e))
* **agentic-harness:** hide ask guidance from subagents ([b5e1b3b](b5e1b3b))
* **agentic-harness:** hide ask_user_question from subagents ([98b7a95](98b7a95))
* **agentic-harness:** import Type from @sinclair/typebox ([7a1e524](7a1e524))
* **agentic-harness:** make subagent shutdown accounting truthful ([6945420](6945420))
* **agentic-harness:** notify plan progress changes ([121fb57](121fb57))
* **agentic-harness:** preserve plan progress on idempotent reload ([1547fdc](1547fdc))
* **agentic-harness:** refresh plan progress footer ([6e0d6dd](6e0d6dd))
* **agentic-harness:** satisfy strict build types ([48ae4c0](48ae4c0))
* **agentic-harness:** wire plan progress render requests ([34ef50f](34ef50f))
* **autonomous-dev:** add missing tsconfig and fix test type errors ([a9bea96](a9bea96))
* **autonomous-dev:** preserve default signal termination behavior ([a6ff810](a6ff810))
* **autonomous-dev:** reap nested worker processes ([0670a61](0670a61))
* **autonomous-dev:** use provider/id instead of model display name for child processes ([1962270](1962270))
* **ci:** sync plugin version to v1.0.0 ([a2f1c93](a2f1c93))
* **ci:** use plugin package.json as primary version source ([04542a4](04542a4))
* complete mixed plan validation chains ([1627363](1627363))
* correct tool names in agent files (glob -> find) ([941e6d0](941e6d0))
* **editor-border:** preserve scroll indicators and handle autocomplete lines in border replacement ([9cb58ce](9cb58ce))
* **fff-search:** upgrade @ff-labs/fff-node from 0.5.2 to 0.6.4 ([19a6d7e](19a6d7e))
* **fff:** disable indexing at $HOME to avoid multi-second startup stalls ([fbd3544](fbd3544))
* **fff:** pin @ff-labs/fff-node to 0.6.2-nightly.acd2f0c ([4470b66](4470b66)), closes [dmtrKovalenko/fff#393](dmtrKovalenko/fff#393)
* **fff:** skip root cwd init and document startup debug toggles ([5821631](5821631))
* **footer:** add background colors to secondary metrics segments ([cfbc168](cfbc168))
* **footer:** re-add missing thinking:/💾 filter that was accidentally removed ([4c9ce33](4c9ce33))
* **footer:** re-enable structured milestone/todo rendering ([8393c44](8393c44))
* **footer:** tweak thinking color and ANSI-safe extension statuses ([f60ce07](f60ce07)), closes [#008778](https://github.com/portrik/svab-pi/issues/008778)
* guard cross-task completion, add CustomEntry replay and running demotion ([497c4fd](497c4fd))
* handle tmux setup failures and session collisions ([0bedd7c](0bedd7c))
* harden tmux runtime log and lifecycle handling ([f2c682a](f2c682a))
* harden tmux shell command handling ([1f1907c](1f1907c))
* **harness:** auto-reset phase on terminal-artifact write ([c14351d](c14351d))
* **harness:** clear activeGoalDocument on phase auto-reset ([88dbba1](88dbba1))
* **harness:** detect worker source changes for slop cleanup ([40376af](40376af))
* **harness:** guard session_compact phase restore with isRootSession ([f527d20](f527d20))
* **harness:** match encoded editor stash shortcuts ([3ad3454](3ad3454))
* **harness:** never inject phase guidance in subagent context ([8af3455](8af3455))
* **harness:** restore powerline footer styling ([bac09fd](bac09fd))
* **harness:** suppress phase guidance on skill/command invocations ([e7c0266](e7c0266))
* improve subagent render call and result preview to avoid ambiguous ellipsis ([7a2ff36](7a2ff36))
* **memory:** cap recalled prompt context size ([586e1db](586e1db))
* prevent fff native watcher fd leaks ([b8c38a8](b8c38a8))
* prevent LLM from hallucinating agent names and models ([3438d14](3438d14))
* rebuild plan progress on session start ([e0f8d81](e0f8d81))
* remove missing hud extension entry ([d5c0032](d5c0032))
* render subagent action-mode calls correctly ([78ecd63](78ecd63))
* replace invalid 'cyan' theme color with 'blue' ([77fdc33](77fdc33))
* resolve 6 bugs from code review and stabilize test suite ([5e56141](5e56141))
* respect shellPath setting in sandboxed bash operations ([b94b986](b94b986))
* restore agentic harness strict build ([97e939b](97e939b))
* restore ask command baseline ([cc508e5](cc508e5))
* **sandbox:** persist approvals across processes and enforce bash approval guard ([7aec87d](7aec87d))
* **sandbox:** require explicit approval before all bash commands ([ae232af](ae232af))
* **session-loop:** clear timeout timer on Promise.race settle to prevent unhandledRejection ([1bcd2a4](1bcd2a4))
* **session-loop:** fix vitest Mock type in test file for tsc --noEmit ([f6f8a0a](f6f8a0a))
* **session-loop:** use deliverAs followUp to queue messages during active turns ([08acab1](08acab1))
* **skills:** add plan checkbox auto-update rule to run-plan skills ([99191c5](99191c5))
* stabilize macos process spawning ([539bf5f](539bf5f))
* stop loading prior-session async runs on session_start ([df78293](df78293))
* stop removing nav/header/footer/aside from turndown output ([bf8e3b2](bf8e3b2))
* **subagent:** resolve TypeScript type errors in render.ts and subagent.ts ([16f0d8e](16f0d8e))
* track plan progress by task id ([6a22c41](6a22c41))
* track plan progress during subagent execution ([06975f2](06975f2))
* type tmux availability mock ([f0e0e12](f0e0e12))
* use gh api for star (gh repo star not available) ([e8b9dfc](e8b9dfc))
* use resolved tmux binary for worker send-keys ([e80f23f](e80f23f))
* use valid theme color 'muted' instead of invalid 'blue' ([e7b49f1](e7b49f1))
* **webfetch:** resolve TypeScript type declaration errors ([7981a61](7981a61))
* **workspace-memory:** align eviction types and add recall/e2e tests ([0758e24](0758e24))
* **workspace-memory:** ensure keyword-based template selection works when LLM omits template ([353f02e](353f02e))

### Documentation

* add ai slop cleanup pilot plan ([d5c66d5](d5c66d5))
* add autonomous dev handoff document ([b130cb3](b130cb3))
* add brief and plan for team mode feature flag ([1cfafdb](1cfafdb))
* add deep-dive feature documentation pages ([38e3036](38e3036))
* add discipline hooks implementation plan ([e0eb8a6](e0eb8a6))
* add Neo-Brutalist GitHub Pages site (EN/KR bilingual) ([b4370a5](b4370a5))
* add pi v0.72 adoption plan ([04bfd33](04bfd33))
* add plan progress robustness hardening plan ([d6bd1ba](d6bd1ba))
* add plan progress robustness review ([b016a30](b016a30))
* add plan progress session replay plan ([bb81e95](bb81e95))
* add plan progress tracker repair plan ([b3940a9](b3940a9))
* add plan tracker audit artifacts ([e8f69e4](e8f69e4))
* add review fixes plan for autonomous-dev process cleanup ([00e8503](00e8503))
* add session-loop extension implementation plan ([c068c2a](c068c2a))
* add session-loop to README.md and docs/index.html ([a823153](a823153))
* add SVG illustrations for README feature sections ([2cfcb2a](2cfcb2a))
* add workspace-memory feature context brief and implementation plan ([a8b39dc](a8b39dc))
* capture pi v0.72 compatibility boundaries ([3fa2f2c](3fa2f2c))
* clarify tmux cleanup and sandbox caveats ([94302e3](94302e3))
* describe team tmux backend and fallback behavior ([dc536b0](dc536b0))
* document FFF engine usage ([b341e68](b341e68))
* document PI_ENABLE_TEAM_MODE feature flag ([b5e73c8](b5e73c8))
* explain parser usage in features ([948b718](948b718))
* **lessons:** add patterns from footer evolution ([eaf973b](eaf973b))
* mark slop-cleanup pilot superseded; add removal spec and plan ([3a46d99](3a46d99))
* plan team-mode testing docs release ([ee09c15](ee09c15))
* plan team-mode testing docs release ([e04af79](e04af79))
* **plan:** phase state multi-session isolation plan ([273cca7](273cca7))
* **readme:** document /review and /ultrareview commands ([c81cc13](c81cc13))
* record main push completion ([4ba7418](4ba7418))
* redesign README in omp.sh editorial style ([2637fa9](2637fa9))
* remove installation section and prerequisite — skills are bundled ([4522625](4522625))
* remove milestone-tracker terminology from skills and system prompt ([0c0e070](0c0e070))
* restructure README with visual sections and illustrations ([a95d041](a95d041))
* **session-loop:** add README with usage and architecture ([0678e9c](0678e9c))
* translate agentic skill docs to english ([9ce0301](9ce0301))
* update hero goal runtime flow ([7733ea4](7733ea4))
* update webfetch sample to reflect Turndown-only output ([dd434c2](dd434c2))
* update workflow preview graphic ([d8659de](d8659de))
* use renamed goal workflow graphic ([88acea8](88acea8))
* **webfetch:** add context comparison report and benchmark script ([77981a4](77981a4))
* **webfetch:** add raw output samples for docs.anthropic.com comparison ([7900451](7900451))
* **webfetch:** add review document and clean up residual comments ([2d97ccf](2d97ccf))

### Styles

* add Neo-Brutalist design system CSS ([c8ee298](c8ee298))

### Miscellaneous

* bump @ff-labs/fff-node to ^0.6.4 and version up ([0e621b4](0e621b4))
* bump version to 1.2.1 ([3436d55](3436d55))
* bump version to 1.22.0 ([17d5d79](17d5d79))
* checkpoint outstanding workspace updates ([4706197](4706197))
* clean up unused CSS rules and add implementation plan ([45fa1bb](45fa1bb))
* **dependencies:** update pi to the new npm organization ([278bfa8](278bfa8))
* **harness:** delete orphaned slop-cleaner files ([73b8a9e](73b8a9e))
* **harness:** sync agentic-harness lockfile version ([c41c6fe](c41c6fe))
* **harness:** trim trailing blank line in discipline.ts ([254c47e](254c47e))
* pin pi extension dependencies to v0.72 ([5cd1adf](5cd1adf))
* refresh root pi lockfile to v0.72 ([2b8a2a9](2b8a2a9))
* **release:** 1.0.0 ([6b58a6a](6b58a6a))
* **release:** 1.0.1 ([cb06005](cb06005))
* **release:** 1.1.0 ([bdc6d60](bdc6d60))
* **release:** 1.10.0 ([8d96f75](8d96f75))
* **release:** 1.11.0 ([d7fc819](d7fc819))
* **release:** 1.12.0 ([445ae0d](445ae0d))
* **release:** 1.13.0 ([902df30](902df30))
* **release:** 1.13.1 ([64d5389](64d5389))
* **release:** 1.14.0 ([25d374b](25d374b))
* **release:** 1.14.1 ([a84fec3](a84fec3))
* **release:** 1.15.0 ([dfc52bb](dfc52bb))
* **release:** 1.16.0 ([69043c7](69043c7))
* **release:** 1.17.0 ([b7a018d](b7a018d))
* **release:** 1.18.0 ([56a0c73](56a0c73))
* **release:** 1.18.1 ([9061fb8](9061fb8))
* **release:** 1.18.2 ([6123e08](6123e08))
* **release:** 1.19.0 ([7ea7ce5](7ea7ce5))
* **release:** 1.2.0 ([c475eb1](c475eb1))
* **release:** 1.2.1 ([68f6099](68f6099))
* **release:** 1.20.0 ([bcb7d4f](bcb7d4f))
* **release:** 1.20.1 ([62739ed](62739ed))
* **release:** 1.21.0 ([81d58e8](81d58e8))
* **release:** 1.21.1 ([bc6ef5d](bc6ef5d))
* **release:** 1.21.2 ([c44be10](c44be10))
* **release:** 1.21.3 ([0eec5d1](0eec5d1))
* **release:** 1.21.4 ([250ef69](250ef69))
* **release:** 1.22.0 ([fe6be82](fe6be82))
* **release:** 1.22.1 ([a1e3a1e](a1e3a1e))
* **release:** 1.23.0 ([20c3d27](20c3d27))
* **release:** 1.24.0 ([c2f4afc](c2f4afc))
* **release:** 1.25.0 ([621252a](621252a))
* **release:** 1.26.0 ([2f2ec98](2f2ec98))
* **release:** 1.26.1 ([33aa768](33aa768))
* **release:** 1.26.2 ([825b6f7](825b6f7))
* **release:** 1.26.3 ([6d42024](6d42024))
* **release:** 1.26.4 ([ccc54c9](ccc54c9))
* **release:** 1.26.5 ([410734c](410734c))
* **release:** 1.27.0 ([ea18d30](ea18d30))
* **release:** 1.28.0 ([78e9b5f](78e9b5f))
* **release:** 1.29.0 ([41ad301](41ad301))
* **release:** 1.29.1 ([4e3da22](4e3da22))
* **release:** 1.3.0 ([808a5eb](808a5eb))
* **release:** 1.30.0 ([987a4fd](987a4fd))
* **release:** 1.31.0 ([6e0e5b8](6e0e5b8))
* **release:** 1.32.0 ([4b61e90](4b61e90))
* **release:** 1.33.0 ([37fec37](37fec37))
* **release:** 1.34.0 ([b095d7e](b095d7e))
* **release:** 1.35.0 ([e47a142](e47a142))
* **release:** 1.36.0 ([6364054](6364054))
* **release:** 1.37.0 ([e0fa668](e0fa668))
* **release:** 1.38.0 ([a2da093](a2da093))
* **release:** 1.4.0 ([482a359](482a359))
* **release:** 1.5.0 ([03e9f8e](03e9f8e))
* **release:** 1.6.0 ([c8c2ca1](c8c2ca1))
* **release:** 1.6.1 ([c126080](c126080))
* **release:** 1.6.2 ([4e5e333](4e5e333))
* **release:** 1.7.0 ([0c4b143](0c4b143))
* **release:** 1.7.1 ([9749003](9749003))
* **release:** 1.7.2 ([341ca42](341ca42))
* **release:** 1.8.0 ([0f4c67b](0f4c67b))
* **release:** 1.8.1 ([8dff314](8dff314))
* **release:** 1.8.2 ([a30b439](a30b439))
* **release:** 1.9.0 ([1bebedd](1bebedd))
* **release:** 1.9.1 ([7edf3cc](7edf3cc))
* **release:** 1.9.2 ([a565e51](a565e51))
* **release:** 1.9.3 ([697dfb9](697dfb9))
* **release:** 1.9.4 ([8466c27](8466c27))
* **release:** 1.9.5 ([d35df04](d35df04))
* **release:** 1.9.6 ([e1215ef](e1215ef))
* **release:** v1.2.0 ([501193e](501193e))
* remove AI-generated code smells ([ff4d214](ff4d214))
* remove dead imports from harness leaf files ([c4f362f](c4f362f))
* remove webfetch comparison docs and samples ([82766f1](82766f1))
* slop-cleaner pass on nested subagent visibility code ([435c5f2](435c5f2))
* trim non-behavioral comment noise ([e615181](e615181))
* udpate README.md and add tip modal ([1a2ae90](1a2ae90))
* update package-lock.json ([6222c5e](6222c5e))
* upgrade @ff-labs/fff-node 0.5.2 → 0.6.0 ([3b1ea47](3b1ea47))

### Refactor

* **agentic-harness:** reduce ultraplan reviewers from 5 to 3 ([f3f98ec](f3f98ec))
* **agentic-harness:** remove stale planning leftovers ([c08ee4d](c08ee4d))
* **footer:** remove harnessProgress, simple todo only ([a4e2dd6](a4e2dd6))
* **harness:** drop global state file; phase is per-process in-memory only ([9bb134b](9bb134b))
* **harness:** sever slop-cleaner references ([1912177](1912177))
* remove completion.md-based planProgress.clear() ([5e2dc39](5e2dc39))
* remove milestone-tracker completely ([d934632](d934632))
* remove PlanProgressTracker and all file-scanning plan progress ([42f4d1c](42f4d1c))
* rewrite agentic harness — remove hardcoded templates, add dynamic agent-driven architecture ([b77abec](b77abec))
* simplify todowrite/todoread to senpi-style ([d87d6fa](d87d6fa))
* simplify webfetch to Turndown-only pipeline (Claude Code style) ([02045c7](02045c7))
* **skills:** prefix bundled skills with agentic- and remove en html docs ([147cb40](147cb40))
* **subagent:** use new types, event processing, CLI arg inheritance, and safety guards ([9ba8857](9ba8857))
* **workspace-memory:** fix scoring/eviction bugs, extract modules, improve type safety ([c17090a](c17090a))

### Tests

* add agent discovery tests (parseFrontmatter, loadAgentsFromDir) ([d59dd2f](d59dd2f))
* add failing tests for PI_ENABLE_TEAM_MODE gate ([ce41296](ce41296))
* add subagent execution engine tests (extractFinalOutput, concurrency, helpers) ([7150704](7150704))
* expose PI_ENABLE_TEAM_MODE_ENV in team.js mock ([03d1389](03d1389))
* **footer:** fix test stubs for new FooterContext fields ([6e03851](6e03851))
* **footer:** update tests for background blocks and new segments ([7e12556](7e12556))
* **harness:** set PI_AGENTIC_SANDBOX_BASH for user_bash handler check ([7b57fb9](7b57fb9))
* **harness:** stabilize approval tests and isolate agent-dir utility ([47d6479](47d6479))
* isolate subagent depth env in resolve config tests ([b2b4c88](b2b4c88))
* **memory:** cover recalled prompt size caps ([57ec7be](57ec7be))
* **memory:** verify bounded system prompt injection ([56d7dae](56d7dae))
* **session-loop:** unit tests for parseInterval and JobScheduler ([38f39ea](38f39ea))
* update tests for subagent tool registration and PHASE_GUIDANCE changes ([f6c6598](f6c6598))
* update ultraplan tests and add comprehensive extension tests ([90aa605](90aa605))

### CI

* add GitHub Pages deployment workflow ([3f59f67](3f59f67))
* add semantic release automation ([121785d](121785d))
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants