fix: avoid unicode filepath suffix panic#393
Merged
dmtrKovalenko merged 3 commits intoApr 21, 2026
Merged
Conversation
dmtrKovalenko
approved these changes
Apr 19, 2026
Owner
|
@copilot resolve the merge conflicts in this pull request |
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).
91cd463 to
f067e82
Compare
dmtrKovalenko
approved these changes
Apr 21, 2026
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))
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
path_ends_with_suffix()falseinstead of panicking when a byte-derived suffix offset lands inside a multibyte characterapply_constraints(Constraint::FilePath(...))Similar PR / duplicate check
I checked existing PRs before opening this:
fix: Unicode segmentation crash)Constraint::FilePath/path_ends_with_suffix()panic pathThis PR is intentionally narrow: it fixes the unchecked
path[start..]slice incrates/fff-core/src/constraints.rswithout changing matching semantics.Root cause
path_ends_with_suffix()computed:and then sliced with:
startis a byte offset, not guaranteed to be a UTF-8 char boundary. For Unicode filenames, a non-matching suffix can makestartland inside a multibyte codepoint, which panics before constraint filtering can returnfalse.Fix
Use
path.get(start..)instead of unchecked indexing:startis not a valid char boundary, returnfalse/boundary behaviorVerification
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_suffixtest_apply_constraints_file_path_with_unicode_suffixtest_path_contains_segment_does_not_panic_on_unicode_segmentThe important regression case uses a synthetic filename such as:
data/유니코드_파일_테스트.csvand 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 -- --nocaptureResult
All constraint tests pass locally after the fix, including the new Unicode regression coverage.
Scope notes