# English phantom-detection configuration
# All phrases are lower-case. Matched against lowercased response text.
intent_phrases = [
"now let me ",
"now update ",
"now fix ",
"now add ",
"now bump ",
"now run ",
"now check ",
"now read ",
"now commit",
"now amend",
"now updating",
"now fixing",
"now committing",
"now amending",
"now pushing",
"now cherry-picking",
"now merging",
"now rebasing",
"now deploying",
"now building",
"now testing",
"now checking",
"now applying",
"now restarting",
"now creating",
"now writing",
"now editing",
"now adding",
"now removing",
"now deleting",
"now reading",
"now running",
"now starting",
"now finishing",
"now finalizing",
"now installing",
"now configuring",
"now wiring",
"now setting up",
"i'll update",
"i'll fix",
"i'll modify",
"i'll create",
"i'll write",
"i'll edit",
"i'll add",
"i'll change",
"i'll replace",
"i'll commit",
"i'll amend",
"i'll proceed",
"i'll start",
"i'll finish",
"i'll run",
"i'll check",
"i'll see",
"i'll look",
"i'll prepare",
"i'll take a look",
"i will proceed",
"let me update",
"let me fix",
"let me modify",
"let me create",
"let me write",
"let me edit",
"let me add",
"let me change",
"let me commit",
"let me amend",
"let me see",
"let me check",
"let me look",
"let me read",
"let me examine",
"let me verify",
"let me inspect",
"let me review",
"let me take",
"let me actually",
"let me prepare",
"let me proceed",
"let me start",
"let me first",
"let me finish",
"let me finalize",
"let me run",
"let's update",
"let's fix",
"let's modify",
"let's create",
"let's write",
"let's edit",
"let's add",
"let's change",
"let's replace",
"let's commit",
"let's amend",
"let's see",
"let's check",
"let's look",
"let's read",
"let's examine",
"let's verify",
"let's inspect",
"let's review",
"let's take a look",
"let's prepare",
"let's proceed",
"let's start",
"let's first",
"let's finish",
"let's finalize",
"let's run",
"let's dig",
"let's investigate",
"let's explore",
"let's search",
"let's find",
"let's gather",
"let's pull",
"let's grab",
"let's get",
"let's fetch",
"let's query",
"let's scan",
"let's hunt",
"let's trace",
"let's track",
"let's look into",
"let's check into",
"let's find out",
"let's dig into",
"let me dig",
"let me investigate",
"let me explore",
"let me search",
"let me find",
"let me gather",
"let me pull",
"let me grab",
"let me get",
"let me fetch",
"let me query",
"let me scan",
"let me hunt",
"let me trace",
"let me track",
"let me look into",
"let me check into",
"let me find out",
"let me dig into",
"i'll dig",
"i'll investigate",
"i'll explore",
"i'll search",
"i'll find",
"i'll gather",
"i'll pull",
"i'll grab",
"i'll get",
"i'll fetch",
"i'll query",
"i'll scan",
"i'll hunt",
"i'll trace",
"i'll track",
"i'll look into",
"i'll check into",
"i'll find out",
"i'll dig into",
"let me build",
"let me push",
"let me deploy",
"let me sync",
"let me migrate",
"let me apply",
"let me install",
"let me configure",
"let me set up",
"let me wire",
"let's build",
"let's push",
"let's deploy",
"let's sync",
"let's migrate",
"let's apply",
"let's install",
"let's configure",
"let's set up",
"let's wire",
"i'll build",
"i'll push",
"i'll deploy",
"i'll sync",
"i'll migrate",
"i'll apply",
"i'll install",
"i'll configure",
"i'll set up",
"i'll wire",
"now build",
"now push",
"now deploy",
"now sync",
"now migrate",
"now apply",
# Deferment stalls — "I need to X", "I have to X", "I must X" —
# 2026-05-28: model emitted "I need to read the actual code before
# writing concrete task descriptions." and the existing list didn't
# cover that shape. These are pre-action narration just like
# "let me X" / "I'll X" and never produced a tool call in the same
# turn.
"i need to read",
"i need to check",
"i need to look",
"i need to examine",
"i need to inspect",
"i need to verify",
"i need to review",
"i need to understand",
"i need to see",
"i need to find",
"i need to investigate",
"i need to explore",
"i need to search",
"i need to gather",
"i need to fetch",
"i need to update",
"i need to fix",
"i need to modify",
"i need to create",
"i need to write",
"i need to edit",
"i need to add",
"i need to remove",
"i need to delete",
"i need to run",
"i need to install",
"i need to configure",
"i need to dig",
"i have to read",
"i have to check",
"i have to look",
"i have to verify",
"i have to update",
"i have to fix",
"i have to write",
"i have to investigate",
"i must read",
"i must check",
"i must verify",
"i must update",
"i must fix",
"i should read",
"i should check",
"i should look",
"i should verify",
"i should update",
"i should fix",
"i should investigate",
"i should examine",
"i should review",
# Pronounless "Need to X" variants — 2026-06-01: model emitted
# "Need to read the tool_loop_inner function entry to add turn
# timing. Let me check that first." The existing list only covered
# "i need to X" with the explicit pronoun. Some models (terser
# outputs, telegraphic narration style) drop the leading "I". These
# patterns are sentence-leading variants — they catch the start of
# a phantom-narration line whether the pronoun is present or not.
"need to read",
"need to check",
"need to look",
"need to examine",
"need to inspect",
"need to verify",
"need to review",
"need to understand",
"need to see",
"need to find",
"need to investigate",
"need to explore",
"need to search",
"need to gather",
"need to fetch",
"need to update",
"need to fix",
"need to modify",
"need to create",
"need to write",
"need to edit",
"need to add",
"need to remove",
"need to delete",
"need to run",
"need to install",
"need to configure",
"need to dig",
# `have to X` / `must X` / `should X` deliberately NOT added without
# the pronoun — they collide too easily with unrelated prose like
# "you should check the docs" or "the file must read like a manual"
# and would false-positive the phantom detector on legit text. The
# `i have to X` / `i must X` / `i should X` forms above stay
# because the explicit pronoun anchors the phrase to first-person
# narration.
# Bare-gerund sentence openers — 2026-06-01: model emitted
# "Reading the current state of the affected files to make precise
# edits." with no leading "I'm" / "let me" / "now". The
# "<gerund> + <determiner>" bigram is rare enough in normal Q&A
# prose (the model typically reports findings rather than narrating
# the act of reading) that substring matches inside the prose lead-
# in are safely treated as phantom narration when no tool was
# called in the same turn.
"reading the ",
"reading current",
"reading affected",
"reading existing",
"checking the ",
"checking current",
"checking existing",
"examining the ",
"examining current",
"examining existing",
"inspecting the ",
"inspecting current",
"verifying the ",
"verifying current",
"reviewing the ",
"reviewing current",
"investigating the ",
"investigating current",
"exploring the ",
"exploring current",
"searching the ",
"searching for the ",
"scanning the ",
"tracing the ",
"tracking the ",
"gathering the ",
"fetching the ",
"looking at the ",
"looking at current",
"looking at existing",
"looking into the ",
# Cleanup / destructive action verbs — 2026-06-04: model emitted
# "Good catch. Let me clean up README.md and all the remaining
# docs plus Rust files." after a 37-tool-call turn, then closed
# without dispatching the cleanup. The verbs here are the action
# shapes that follow a first wave of edits — clean / delete /
# remove / refactor / reorganize / tidy / strip / wipe / purge.
# Each carries the same precedence chain (`let me X` / `i'll X` /
# `let's X` / `now X` / `i need to X` / pronounless `need to X` /
# `i have to X` / `i must X` / `i should X`) so a forward-looking
# cleanup announcement fires phantom regardless of pronoun shape.
"let me clean up",
"let me clean",
"let me delete",
"let me remove",
"let me refactor",
"let me reorganize",
"let me tidy",
"let me tidy up",
"let me strip",
"let me strip out",
"let me wipe",
"let me purge",
"let me scrub",
"let me erase",
"let me dedupe",
"let me deduplicate",
"i'll clean up",
"i'll clean",
"i'll delete",
"i'll remove",
"i'll refactor",
"i'll reorganize",
"i'll tidy",
"i'll tidy up",
"i'll strip",
"i'll strip out",
"i'll wipe",
"i'll purge",
"i'll scrub",
"i'll erase",
"let's clean up",
"let's clean",
"let's delete",
"let's remove",
"let's refactor",
"let's reorganize",
"let's tidy",
"let's tidy up",
"let's strip",
"let's strip out",
"let's wipe",
"let's purge",
"let's scrub",
"let's erase",
"now clean up",
# `"now clean"` bare is omitted — collides with adjectival "is
# now clean and ready for the next release". Only the explicit
# "clean up" form is safe as a substring.
"now delete",
"now remove",
"now refactor",
"now reorganize",
"now strip",
"now wipe",
"now purge",
"i need to clean up",
"i need to clean",
"i need to delete",
"i need to remove",
"i need to refactor",
"i need to reorganize",
"i need to tidy",
"i need to strip",
"i need to wipe",
"i need to purge",
"need to clean up",
"need to clean",
"need to delete",
"need to refactor",
"need to reorganize",
"need to tidy",
"need to strip",
"need to wipe",
"need to purge",
"i have to clean up",
"i have to delete",
"i have to remove",
"i have to refactor",
"i must clean up",
"i must delete",
"i must remove",
"i must refactor",
"i should clean up",
"i should delete",
"i should remove",
"i should refactor",
"i should reorganize",
# Strong forward-commitment phrases — 2026-06-12: mimo-v2.5-pro narrated
# "I'm going to use write_file to create the new file" and called nothing.
# The "let me X" / "I'll X" / "now X" families above missed the
# "I'm going to <verb>" / "I am going to <verb>" / "I'm gonna" shape — the
# single clearest "100% about to act" signal a model emits. Anchored to
# action verbs (not bare "i'm going to", which can precede "explain").
"i'm going to use",
"i'm going to create",
"i'm going to write",
"i'm going to update",
"i'm going to add",
"i'm going to edit",
"i'm going to modify",
"i'm going to replace",
"i'm going to delete",
"i'm going to remove",
"i'm going to run",
"i'm going to check",
"i'm going to read",
"i'm going to commit",
"i'm going to push",
"i'm going to fix",
"i'm going to build",
"i'm going to deploy",
"i'm going to install",
"i'm going to start",
"i'm going to do it",
"i'm going to just",
"i'm going to go ahead",
"i am going to use",
"i am going to create",
"i am going to write",
"i am going to update",
"i am going to add",
"i am going to edit",
"i am going to modify",
"i am going to delete",
"i am going to run",
"i am going to check",
"i am going to commit",
"i am going to fix",
"i am going to start",
"i'm gonna ",
"i'll just ",
"let me just ",
"i'll go ahead and",
"i will go ahead and",
"let me go ahead and",
"i'll now ",
"i will now ",
]
action_verbs = [
"pushed",
"deployed",
"merged",
"migrated",
"committed",
"rebased",
"tagged",
"released",
"published",
"synced",
"rolled back",
"rolled out",
]
completion_claims = [
"here's what changed",
"here's what's changed",
"here are the changes",
"here's what i did",
"here is what i did",
"changes applied",
"updated the file",
"updated the code",
"updated src/",
"modified the file",
"modified src/",
"fixed the file",
"fixed the bug",
"fixed the issue",
"fixed src/",
"created the file",
"wrote the file",
"everything is updated",
"i've made the changes",
"i've completed",
"i've finished",
"i've updated",
"i've written",
"i've created",
"i've saved",
"i've modified",
"i've fixed",
"i've replaced",
"i've amended",
"i've committed",
"i've bumped",
"i've made all",
"all changes have been",
"all files have been",
"the changes have been applied",
"changes are now in place",
"the file now contains",
"the file has been",
"file updated",
"file created",
"file saved",
"changes saved",
"amended.",
"committed.",
"amended the commit",
"bumped the version",
"version bumped",
]
# Regex patterns — all use (?im) for case-insensitive multiline matching.
line_start_re = "(?im)^[\\s\\-*•>]*(?:(?:ok|okay|sure|alright|right|hmm|well|actually|so)\\s*,?\\s+)?(?:now\\s+)?(?:let\\s+me|i['\u2019]ll|let['\u2019]s|i\\s+need\\s+to|i\\s+have\\s+to|i\\s+must|i\\s+should|i\\s+want\\s+to|i['\u2019]d\\s+need\\s+to)\\s+\\w"
# Brief present-continuous work announcement ending the turn with no tool
# call — "Running checks now.", "Checking the logs…", "Rebuilding now:".
# Requires a leading action gerund AND a trailing imminence marker (now / … /
# ... / :) so ordinary sentences that merely open with a gerund ("Reading the
# file is straightforward.") don't match.
work_announcement_re = "(?i)^[\\s\\-*•>]*(?:(?:ok|okay|sure|alright|right|got it|will do|on it)[,.!:]?\\s+)?(?:i['’]?m\\s+|i\\s+am\\s+|now\\s+|let\\s+me\\s+)?(?:re-?)?(?:running|checking|building|rebuilding|testing|fetching|pushing|pulling|committing|updating|fixing|installing|compiling|verifying|validating|searching|scanning|reading|writing|creating|generating|deleting|removing|applying|deploying|merging|rebasing|cloning|downloading|uploading|executing|launching|starting|investigating|inspecting|analy[sz]ing|gathering)\\b[^.!?:\\n]{0,60}?(?:\\s+(?:right\\s+)?now(?:[.!…,]+|\\s*$)|\\.{3}|…|:\\s*$)"
gerund_re = "(?im)(?:^|[.!?]\\s+)\\s*now\\s+(?:updating|fixing|committing|amending|pushing|cherry-picking|merging|rebasing|deploying|building|testing|checking|applying|restarting|creating|writing|editing|adding|removing|deleting|reading|running|starting|finishing|finalizing|installing|configuring|wiring)\\b"
trailing_colon_re = "(?im)(?:^|\\n)\\s*(?:let\\s+me|i'll|i\\s+will|now\\s+let\\s+me|now\\s+i'll)\\s+\\w[^:\\n]{0,80}:\\s*$"
now_imperative_re = "(?m)^[\\s\\-*]*(?:now\\s+(?:let\\s+me\\s+)?|let\\s+me\\s+)\\w"
numbered_steps_re = "(?m)^\\s*\\d+\\.\\s+(?:update|fix|modify|create|write|edit|add|change|remove|delete|check|read|run|bump|amend|verify|test|deploy|install)"
past_tense_standalone_re = "(?m)^[\\s\\-*]*(?:amended|updated|fixed|modified|created|written|saved|deleted|removed|replaced|bumped|deployed|committed)[.!]"
path_re = "(?:^|[\\s`(])(?:\\./)?[a-zA-Z_][\\w\\-]*/[\\w\\-/]*\\.\\w{1,6}(?:[\\s`),:;]|$)"
ext_re = "(?:^|[\\s`(])[\\w\\-]+\\.(?:rs|py|ts|tsx|js|jsx|go|sh|toml|yaml|yml|json|md)(?:[\\s`),:;]|$)"
backtick_code_re = "`[a-zA-Z_]\\w+`"