Agent skill

Flowfile Debugging Playbook

by Edwardvaneechoud in Edwardvaneechoud/Flowfile

Symptom-to-cause triage playbook for Flowfile (core/worker/kernel/frontend/AI) — covers "no such table" DB cascades (two distinct causes), import-time Alembic migration corruption, silent…

MITAuto-check passedDevelopment

Install Flowfile Debugging Playbook

skills CLI
$ npx skills add Edwardvaneechoud/Flowfile --skill flowfile-debugging-playbook -a claude-code

Project install by default; add -g for ~/.claude/skills/.

GitHub CLI
$ gh skill install Edwardvaneechoud/Flowfile flowfile-debugging-playbook --agent claude-code

Project scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).

Manual copy
$ git clone --depth 1 https://github.com/Edwardvaneechoud/Flowfile.git skills-src && mkdir -p .claude/skills && cp -r skills-src/.claude/skills/flowfile-debugging-playbook .claude/skills/flowfile-debugging-playbook && rm -rf skills-src

Use ~/.claude/skills/ instead of .claude/skills for a personal install. The folder must contain SKILL.md.

Claude Code skills documentation · loads skills from .claude/skills/

Facts

Skill name
flowfile-debugging-playbook
GitHub stars
370
Token cost
~6.3k tokens
SKILL.md length
2,904 words
Files
1
Skills in repo
19
Repo updated
First seen
Licence
MIT

At a glance

Symptom-to-cause triage playbook for Flowfile (core/worker/kernel/frontend/AI) — covers "no such table" DB cascades (two distinct causes), import-time Alembic migration corruption, silent…

  • Works in 2 steps: On macOS, Cmd+Q and dock-quit route… → A quit that lands mid-startup, or a…
  • A flow run fails unexpectedly
  • SKILL.md covers When NOT to use this skill, Quick orientation: what runs…, The triage table and Deep dive: "no such table"…, plus 7 more sections
  • Calls poetry, docker and python

What it does

Flowfile Debugging Playbook is an agent skill from Edwardvaneechoud/Flowfile. Symptom-to-cause triage playbook for Flowfile (core/worker/kernel/frontend/AI) — covers "no such table" DB cascades (two distinct causes), import-time Alembic migration corruption, silent axios/FastAPI 307 redirects in Docker, browser "CORS error" that is really an unhandled 500, stale-vs-rerunning node caching, "flow no longer in memory" 404s, Docker kernel container failures, Tauri desktop sidecar leaks, and AI agent misbehavior via the prompt log. Use when a flow run fails unexpectedly, a pytest run shows…

Its SKILL.md is about 6.3k tokens, which your agent loads only when the skill is triggered. It is a single SKILL.md file with no bundled scripts.

It sits in Development, covering Unit testing, Backend development and Database migrations. It works with pytest, Docker, Tauri and FastAPI. The repository describes itself as: Flowfile is a visual ETL tool and Python library combining drag-and-drop workflows with Polars dataframes. Build data pipelines visually, define flows programmatically with a… The licence is MIT.

When your agent uses it

  • A flow run fails unexpectedly
  • A pytest run shows failures you didnt cause
  • The UI silently no-ops
  • The browser console says CORS error

Example prompts

  • “no such table”
  • “CORS error”
  • “flow no longer in memory”
  • “/flowfile-debugging-playbook”

Requirements

  • Python 3
  • Docker

Workflow steps

2 steps, taken from the first numbered list in SKILL.md.

  1. On macOS, Cmd+Q and dock-quit route through RunEvent::Exit, not
  2. A quit that lands mid-startup, or a sidecar that dies exactly during

What it can do on your machine

Read from SKILL.md and the folder at commit c054c90. It shows what the files ask for, not the result of running them.

  • Tool permissions

    Pre-approves nothing: there is no allowed-tools line, so your agent's usual permission prompts apply.

    From allowed-tools in the SKILL.md frontmatter.

  • Runs code

    Shell commands in SKILL.md call:

    • poetry
    • docker
    • python
    • sqlite3
    • curl

    From the folder's file list and the shell code blocks in SKILL.md.

  • Network

    No URLs in SKILL.md. Its commands use docker and curl, which can reach the network depending on how they are called.

    From URLs in SKILL.md, links to its own repository left out.

  • Credentials

    Names no API keys, tokens, secrets or passwords.

    From names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.

Context cost

Flowfile Debugging Playbook loads about 6.3k tokens when it runs. Until then it costs about 240 tokens; SKILL.md has 2,904 words of instructions outside code blocks.

Always · name and description, kept in context so the agent knows when to use it
~240
When it runs · the whole SKILL.md, loaded when a task matches
~6.3k

Estimates: characters ÷ 4, the usual rule of thumb; real counts depend on the model's tokenizer. Scripts and assets cost tokens only if the agent reads them.

Safety

Auto-check passed

The automated check found no risky patterns in SKILL.md.

Automated static check — not a guarantee. Review scripts before installing. It scans the text of SKILL.md for risky patterns (piping downloads into a shell, reading credential files, hidden Unicode, destructive commands); files beside SKILL.md are not scanned.

SKILL.md

The full file from Edwardvaneechoud/Flowfile at commit c054c90, republished under its MIT licence (© Edwardvaneechoud). 2,904 words, ~6,347 tokens.

Download SKILL.mdSave it as .claude/skills/flowfile-debugging-playbook/SKILL.md (or your agent's skills folder).
name
flowfile-debugging-playbook
description
Symptom-to-cause triage playbook for Flowfile (core/worker/kernel/frontend/AI) — covers "no such table" DB cascades (two distinct causes), import-time Alembic migration corruption, silent axios/FastAPI 307 redirects in Docker, browser "CORS error" that is really an unhandled 500, stale-vs-rerunning node caching, "flow no longer in memory" 404s, Docker kernel container failures, Tauri desktop sidecar leaks, and AI agent misbehavior via the prompt log. Use when a flow run fails unexpectedly, a pytest run shows failures you didn't cause, the UI silently no-ops, the browser console says "CORS error", a node's result looks stale or keeps re-running for no reason, a scheduled/desktop run's logs seem to have vanished, a kernel (Python Script) node won't connect, quitting the desktop app leaves processes running, or an AI agent loops/hallucinates/misreferences columns — anytime you need to find root cause before writing a fix.

Flowfile Debugging Playbook

A field guide for triaging live breakage in the Flowfile monorepo: symptom in, probable cause + discriminating check + fix pointer out. This is not an architecture reference and not a "how to run the test suite" guide — see "When NOT to use this skill" below.

When NOT to use this skill

  • Starting/operating services under normal conditions (no symptom yet) → flowfile-run-and-operate.
  • Full test-suite-by-suite run commands, markers, CI evidence bar → flowfile-testing-and-validation.
  • Complete environment-variable reference → flowfile-config-and-flags.
  • Understanding why the DAG engine, node lifecycle, or worker-offload seam is built the way it is (not "it's broken, why") → flowfile-architecture-contract.
  • Deep git/commit archaeology on a past incident, or writing up a postmortem → flowfile-failure-archaeology.
  • AI agent/prompt architecture beyond "read the prompt log" → flowfile-ai-subsystem.
  • Frontend code conventions (Pinia store map, node-UI-by-convention, Tauri bridge patterns) beyond the sidecar-leak triage below → flowfile-frontend-conventions.

Quick orientation: what runs where

Frontend (Tauri/Web) --HTTP--> flowfile_core (:63578) --HTTP--> flowfile_worker (:63579)
                                      |                          (spawned subprocesses hold data)
                                      +--Docker SDK--> kernel_runtime containers (host ports 19000-19999)

Flows live in core's process memory (flow_file_handler), not just the DB — a core restart or reload invalidates every open flow_id in the browser. The worker never talks to a database; it holds results in spawned child processes and an on-disk Arrow cache. Keep this triangle in mind: almost every "it's broken" symptom below is really "which of these three lost state, or which two disagree."


The triage table

SymptomLikely causeDiscriminating checkFix pointer
sqlite3.OperationalError: no such table: <x> appearing mid-run, nondeterministically, across unrelated testsCause A: a concurrent pytest session on the same machine tore down the shared fixed test DB (its teardown runs DROP ALL + deletes the file)ps aux | grep pytest — is there a second session? Check if the failure timing correlates with another terminal finishingIsolate every session: FLOWFILE_DB_PATH=/tmp/ff_$$.db poetry run pytest flowfile_core/tests
sqlite3.OperationalError: no such table: users immediately, on the very first DB accessCause B: you combined FLOWFILE_SKIP_STARTUP_MIGRATION=1 with a brand-new/nonexistent DB file — migrations never ran, so no tables were ever createdecho $FLOWFILE_SKIP_STARTUP_MIGRATION; sqlite3 <db path> '.tables' (empty or missing file)Never combine FLOWFILE_SKIP_STARTUP_MIGRATION=1 with a fresh FLOWFILE_DB_PATH. For diagnostics against a fresh DB, drop the skip flag and let Alembic run; for the pytest suite, never set the skip flag at all
Live catalog DB's alembic_version looks wrong / behind repo head after nothing but reading codeimport flowfile_core (even transitively, e.g. python -c "import flowfile_core") runs run_startup_migration() against whatever DB resolves at import time. A stale Poetry env whose local migration scripts only go up to an older revision will re-stamp the live DB backward without reverting its schemasqlite3 ~/.flowfile/database/flowfile_catalog.db 'select * from alembic_version;' vs. ls flowfile_core/flowfile_core/alembic/versions/ | tail -3 (highest NNN_ prefix is the head)Always set FLOWFILE_SKIP_STARTUP_MIGRATION=1 for diagnostic imports against real/live data — never for the test suite. Recover a corrupted stamp by manually re-stamping to the correct revision, then re-running alembic upgrade head
UI action appears to do nothing in Docker (works fine in local dev)axios path and the FastAPI route decorator disagree on a trailing slash → FastAPI issues an absolute 307 redirect that silently fails; the Vite dev proxy and pytest's TestClient both paper over the mismatch, so it only manifests in Docker/nginxdocker compose logs -f flowfile-core | grep 307; diff the axios call's path string against the @router.post("/...") decorator it targets, character for characterFix the frontend path to match the decorator's slash exactly (e.g. POST /update_settings/ needs the trailing /) — see flowfile-frontend-conventions
Browser devtools shows "CORS error" / "blocked by CORS policy"Almost always not actually a CORS problem — an unhandled exception (commonly AttributeError on a None node/connection) becomes a FastAPI 500, and a 500 response is missing the CORS headers a normal response would carry; the browser mislabels this as CORSRead the core log for a traceback at the same timestamp (~/.flowfile/logs/flow_<flow_id>.log, or core's stdout) — do NOT trust the browser console's diagnosisFix the underlying 500 (typically a missing None/existence guard before touching a possibly-deleted node/connection)
A node's preview/result doesn't reflect data that changed outside the flow (e.g. new rows landed in a source the node reads)Worker cache hit: the node's hash (settings + inputs + parent_uuid) didn't change, so Development-mode execution logic skips and serves the stale cached resultForce a refresh in the UI (reset_cache) and compare; if scripting directly against a FlowGraph/FlowNode object, no route exposes this — call it in-processnode.invalidate_cache() bumps _cache_epoch, busting the hash without touching settings — this is the intended escape hatch for out-of-band data changes (e.g. Kafka offset resets use this pattern)
A node re-executes every single run even though nothing changed and cache_results-style behavior is expectedresults_exists() returns False unconditionally whenever the worker is unreachable or OFFLOAD_TO_WORKER is off — Development-mode "skip" decisions silently degrade to "always run"Is the worker actually up? curl -sf http://localhost:63579/docs; check core's startup log line Worker configured at <URL>Start/restart poetry run flowfile_worker; verify WORKER_HOST/FLOWFILE_WORKER_PORT. Remember FLOWFILE_OFFLOAD_TO_WORKER only treats the exact string "1" as true
Running a flow (or fetching a node) returns 404: Flow <id> is no longer in memory. Reload the flow and try again.Flows live only in core's in-process flow_file_handler; a core restart, or a "Save As" that mints a new flow_id, orphans the frontend's cached flow_idCheck core's stdout for a recent restart timestamp; compare the frontend's flow_id against the current flow_registrations row for that flow nameNot a bug — reload the flow in the UI. Route/message: flowfile_core/flowfile_core/routes/routes.py around the flow-run handler
A Python Script (kernel) node hangs, errors connecting, or the container seems goneThe Docker kernel container isn't running, its mapped host port (range 19000-19999) is blocked/reused, or the image tag doesn't match FLOWFILE_KERNEL_IMAGEdocker ps | grep flowfile-kernel-; docker logs flowfile-kernel-<kernel_id>; check core's startup/kernel-manager log for the assigned host portReconnect/retry from the UI, or docker rm -f flowfile-kernel-<kernel_id> and retry so a fresh container is created; confirm FLOWFILE_KERNEL_IMAGE/_BASE/_ML/_LITE point at a pulled image
Quit the Tauri desktop app (either via window close or Cmd+Q/dock-quit) but flowfile_core/flowfile_worker processes are still runningTwo known open races: (a) quitting during startup can shut down before sidecar PIDs are recorded, so that spawn is never reaped; (b) a sidecar dying mid-shutdown can leave a stale PID that a later killpg targets after the PID was recycled. There is currently no automated desktop E2E test guarding thisps aux | grep flowfile_core; ps aux | grep flowfile_worker — run this test both ways (window close, and Cmd+Q/dock-quit) after quittingKill leftover PIDs manually for now. This is a known, tracked gap — see flowfile-frontend-conventions for the exact races (lib.rs, sidecar/mod.rs) before touching sidecar shutdown code
An AI agent loops on a tool name, references a nonexistent column, or otherwise does something surprisingNeed to see exactly what the model was given (system prompt, tool catalog, message history) — guessing from the output is unreliableSet FLOWFILE_AI_LOG_PROMPTS=true, reproduce the run, then python -m flowfile_core.ai.prompt_log tail 20Also python -m flowfile_core.ai.prompt_log grep PATTERN [SURFACE]; see "AI agent misbehavior" below and flowfile-ai-subsystem for architecture
A scheduled flow's log is missing from $FLOWFILE_STORAGE_DIR/logsA writer bypassing shared/run_logs.py::run_log_path, or a log written by an older version (still under the real home dir)Every writer routes through run_log_path, which honours FLOWFILE_STORAGE_DIR and docker modeCheck nothing bypasses run_log_path
A run's log is gone after restarting core, even though the run definitely happened recentlyAge-based retention removed it, or a new sweep bypasses that retentionLogs expire only by age (FLOWFILE_RUN_LOG_RETENTION_DAYS, default 30d). Cross-check the durable record: sqlite3 ~/.flowfile/database/flowfile_catalog.db 'select id,flow_name,started_at,ended_at,success from flow_runs order by id desc limit 10;'Do not add a logs sweep to cleanup_directories() — it silently overrides the env var
Worker offload fails with Connection refused mentioning /submit_query/The worker process isn't running, or core is pointed at the wrong worker URLCore startup log line Worker configured at <WORKER_URL>; curl -sf <WORKER_URL>/docsStart poetry run flowfile_worker; or set the flow's execution_location to local to bypass the worker entirely
Worker-offloaded node fails with error code -1 / "unknown error … process got killed by the server"The worker's spawned child process was OOM-killed mid-computationCheck worker stdout around that timestamp for OS-level kill signals; check available memory on the worker hostCore degrades gracefully (keeps its own lazy frame, shows a warning, no example data) — not silent data loss, but you likely need to reduce data volume or fix a memory leak in the transform
"My unrelated change broke N tests" right after a routine editSee "Discriminating-experiment discipline" below before trusting this conclusion——

Deep dive: "no such table" cascades (the two causes, precisely)

Both causes produce the same error text, so do not assume it's whichever one you saw last time.

Cause A — concurrent pytest sessions clobbering the shared test DB. TESTING=True resolves the catalog DB to one fixed path, <storage base>/temp/test_flowfile_catalog.db — every pytest invocation on the machine that doesn't override FLOWFILE_DB_PATH shares that single file. The core test suite's session-scoped teardown does Base.metadata.drop_all(engine) and then deletes the file. If a second pytest session (yours, or a leftover background one) finishes and tears down while your session is still mid-run, your tables vanish out from under you — nondeterministically, often on a table your test never even touches directly.

Check: ps aux | grep pytest. Fix: give every session its own DB —

bash
FLOWFILE_DB_PATH=/tmp/ff_isolated_$$.db poetry run pytest flowfile_core/tests

This also isolates the worker subprocess the core conftest spawns for you, since it inherits your env.

Cause B — skip-migration flag combined with a fresh DB. FLOWFILE_SKIP_STARTUP_MIGRATION=1 skips run_startup_migration() at flowfile_core import. That's exactly what you want for a diagnostic import against a database that already has its schema. But if you also point FLOWFILE_DB_PATH at a path that doesn't exist yet, skipping migration means the tables are simply never created — every query fails immediately with no such table: users (the seed table). This is not corruption; it's an empty file.

bash
# WRONG — combines both, empty DB, nothing ever gets created:
FLOWFILE_DB_PATH=/tmp/throwaway.db FLOWFILE_SKIP_STARTUP_MIGRATION=1 \
  poetry run python -c "import flowfile_core"

# RIGHT for a throwaway diagnostic DB — let migrations run once:
FLOWFILE_DB_PATH=/tmp/throwaway.db poetry run python -c "import flowfile_core"

# RIGHT for skipping migration — only against a DB that's already migrated:
FLOWFILE_SKIP_STARTUP_MIGRATION=1 FLOWFILE_DB_PATH=/tmp/already_migrated.db \
  poetry run python -c "import flowfile_core"

Never set FLOWFILE_SKIP_STARTUP_MIGRATION=1 for the pytest suite itself — the session-autouse setup_test_db fixture relies on the migration to build the schema; skipping it fails every test with no such table: users.


Deep dive: import-time migration against the live DB

import flowfile_core is not inert. Its package __init__.py runs validate_setup() and init_db() at import time, and init_db() runs Alembic migrations against whatever database URL resolves — by default that's the real, live catalog DB (~/.flowfile/database/flowfile_catalog.db), the same one the desktop app or your running poetry run flowfile_core uses.

Real incident (worth internalizing the shape of): a diagnostic script was run through a stale Poetry virtualenv whose local copy of flowfile_core/flowfile_core/alembic/versions/ only went up to an older migration (e.g. 010), while the live DB was already stamped at a newer revision (e.g. 013). Alembic saw the DB's stamp as "ahead of what I know about," and the stale env's migration run rewrote the alembic_version row backward to match what it knew — without reverting any of the schema changes those newer migrations had made. The DB ended up schema-013 but labeled 010: the next correct env's migration attempt then tried to re-apply already-applied migrations and broke.

Rule: any ad-hoc import of flowfile_core against real data must set FLOWFILE_SKIP_STARTUP_MIGRATION=1.

bash
FLOWFILE_SKIP_STARTUP_MIGRATION=1 poetry run python -c "
import flowfile_core  # inspect models, call helpers, etc. — no migration runs
"

If you suspect a stamp has already been corrupted this way: compare sqlite3 <db> 'select * from alembic_version;' against the actual head file under flowfile_core/flowfile_core/alembic/versions/ (the highest NNN_ file), and re-stamp manually before running alembic upgrade head for real.


Show full SKILL.md (1,083 more words)Show less

Deep dive: kernel container triage

Kernel containers back Python Script nodes (sandboxed user code). Each is a Docker container that EXPOSEs port 9999 internally; core maps that to a host port in 19000-19999 and the kernel calls back to core on :63578.

bash
docker ps | grep flowfile-kernel-          # is it even running?
docker logs flowfile-kernel-<kernel_id>    # container-side error?

Container naming is flowfile-kernel-<kernel_id> (the kernel's DB id/uuid, not the flow id). If a stale container from a previous test run or crashed session is holding a port, force-remove it and let core recreate it:

bash
docker rm -f flowfile-kernel-<kernel_id>

Local (non-Docker-in-Docker) mode bind-mounts the cache and catalog-tables directories into the container — if kernel code can't see catalog tables or shared artifacts, verify those directories weren't relocated out from under the kernel-visible volume (shared_directory/artifact_staging_directory/ global_artifacts_directory must stay under <base>/temp/kernel_shared or $FLOWFILE_SHARED_DIR).

Core also stops every kernel container on its own shutdown — if kernels vanish right when you stop core in dev, that's expected, not a leak.


Deep dive: desktop (Tauri) sidecar leaks

The desktop shell spawns flowfile_core and flowfile_worker as sidecar subprocesses and is supposed to reap them on quit via an HTTP /shutdown → SIGTERM → SIGKILL ladder. Two things make this fragile enough to warrant a manual check after any change near src-tauri/src/lib.rs or src-tauri/src/sidecar/:

  1. On macOS, Cmd+Q and dock-quit route through RunEvent::Exit, not RunEvent::ExitRequested — code that only handles the latter leaks sidecars on those quit paths specifically (window-close-button quit is unaffected). Always test both quit paths, not just one.
  2. A quit that lands mid-startup, or a sidecar that dies exactly during shutdown, can leave a PID uncleared that a later kill targets after the OS has recycled it onto an unrelated process.

There is currently no automated E2E test covering desktop sidecar lifecycle — manual verification is the only guardrail:

bash
# after quitting via the window's close button:
ps aux | grep flowfile_core; ps aux | grep flowfile_worker
# after quitting via Cmd+Q / dock-quit — check again, separately:
ps aux | grep flowfile_core; ps aux | grep flowfile_worker

Any hits after a clean quit mean the shutdown ladder didn't reach that process; kill it manually and treat the reproduction steps as a bug report against the sidecar lifecycle code, not a one-off fluke.


Deep dive: AI agent misbehavior

When an agent run does something surprising (tool-name loops, planner self-loops, references to columns that don't exist, refuses to stop), the fastest path to ground truth is the prompt log — it captures the exact system prompt, full message history, tool catalog, and model response for every LLM call, regardless of provider (all vendors route through the same LiteLLMProvider seam).

bash
export FLOWFILE_AI_LOG_PROMPTS=true     # accepts true/1/yes/on
# reproduce the failing flow/chat/agent session, then:
python -m flowfile_core.ai.prompt_log tail 20
python -m flowfile_core.ai.prompt_log grep '<pattern>' [SURFACE]

The file lives at <storage base>/ai_prompts/YYYY-MM-DD.jsonl (UTC-dated — ~/.flowfile/ai_prompts/... by default), one JSON line per LLM call, jq-parseable. Lines over 256 KiB (runaway loops) keep the system prompt and most-recent turns verbatim and stub older message bodies with [...truncated, len=N chars] plus "truncated": true, so it stays parseable even for pathological sessions. Set FLOWFILE_AI_LOG_PROMPTS_SCRUB=true before sharing a transcript externally — it masks PII in user/tool messages while leaving system+assistant content verbatim (that's the part you're debugging). Both flags default off; don't leave prompt logging on in production.

For the agent architecture itself (assist/copilot/planner surfaces, provider registry, rate-limit scheduler caveats) see flowfile-ai-subsystem.


Where every log file lives

LogLocationNotes
Per-flow execution log<storage base>/logs/flow_<flow_id>.logTruncated at every run start, so it holds only the latest run; expires by age (FLOWFILE_RUN_LOG_RETENTION_DAYS, default 30d)
Scheduled-run subprocess output<storage base>/logs/scheduled_run_<run_id>.logResolved via shared/run_logs.py::run_log_path (honors FLOWFILE_STORAGE_DIR / docker); one file per run, kept until it ages out
Core service logstdout only, no file handlerElectron/Tauri pipes it through the shell's own log plugin
Worker service logstdout only, no file handlerWorker subprocesses ship flow-scoped log lines back to core over POST /raw_logs, landing in the same flow_<id>.log
AI prompt log<storage base>/ai_prompts/YYYY-MM-DD.jsonlUTC-dated; only written when FLOWFILE_AI_LOG_PROMPTS is truthy
Docker container logsdocker compose logs -f [service]Core/worker/kernel containers all log to stdout
Durable run record (survives log wipes)flow_runs table in the catalog DBsqlite3 ~/.flowfile/database/flowfile_catalog.db 'select id,flow_name,started_at,ended_at,success,pid from flow_runs order by id desc limit 10;'

<storage base> = FLOWFILE_STORAGE_DIR env if set, else ~/.flowfile locally, else /app/internal_storage in Docker mode.


Discriminating-experiment discipline

Before you conclude "my change broke N tests" (or "my change fixed the bug"), run the elimination checklist — false positives from shared, stateful infrastructure are the norm here, not the exception:

  1. Check for concurrent sessions first. ps aux | grep pytest (another pytest run can drop your shared test DB's tables mid-run — see the "no such table" deep dive above). Also check for a second flowfile_core/ flowfile_worker already listening on the default ports (lsof -i :63578, lsof -i :63579) — your "new" server might be talking through a stale one.
  2. Re-run the exact failing subset in isolation, with a scratch DB and without prior state:
    bash
    FLOWFILE_DB_PATH=/tmp/ff_recheck_$$.db poetry run pytest \
      path/to/test_file.py::TestClass::test_name -q -p no:cacheprovider -rX
    If it passes alone but failed in the full run, you likely hit shared-state bleed (catalog namespace rows wiped by another module's cleanup, a stale worker/postgres/mysql session-singleton left dirty by a previous run, process-wide env mutation not restored) — not a regression from your change.
  3. Compare skip counts, not just pass/fail counts. A large slice of the integration surface only runs when Docker/MinIO/GCS/Azurite/Redpanda are up; a run with more skips than your baseline is weaker evidence, not stronger, even if it's "green."
  4. XPASS on an xfail marker means the bug was already fixed — delete the marker, don't add work to preserve it. (Verify with -rX and look for xpassed in the summary line before trusting an xfail's reason text.)
  5. Only after 1-4 clear the bar should you attribute a result to your change.

Provenance and maintenance

Volatile facts below are dated 2026-07-03 (v0.12.7) — re-verify with the commands shown before relying on the numbers in a new session.

  • App version: grep '^version' pyproject.toml.
  • Alembic head: ls flowfile_core/flowfile_core/alembic/versions/ | sort | tail -3, compared against the live DB. Live DB check: sqlite3 ~/.flowfile/database/flowfile_catalog.db 'select * from alembic_version;'.
  • results_exists worker-down behavior: grep -n "def results_exists" -A 15 flowfile_core/flowfile_core/flowfile/flow_data_engine/subprocess_operations/subprocess_operations.py.
  • invalidate_cache escape hatch: grep -n "def invalidate_cache" -A 10 flowfile_core/flowfile_core/flowfile/flow_node/flow_node.py.
  • "Flow no longer in memory" 404 message/route: grep -n "no longer in memory" flowfile_core/flowfile_core/routes/routes.py.
  • CORS-masked-500 guard comment: grep -n "CORS" flowfile_core/flowfile_core/flowfile/flow_graph.py.
  • Kernel host port range: grep -n "_BASE_PORT\|_PORT_RANGE" flowfile_core/flowfile_core/kernel/manager.py.
  • Kernel container naming: grep -n 'f"flowfile-kernel-' flowfile_core/flowfile_core/kernel/manager.py.
  • AI prompt log CLI: python -m flowfile_core.ai.prompt_log tail 5 (run against a scratch FLOWFILE_DB_PATH/FLOWFILE_STORAGE_DIR first if you don't want to touch real data).
  • Run-log path + retention: grep -n "run_log_path\|cleanup_old_logs" shared/run_logs.py shared/subprocess_utils.py flowfile_core/flowfile_core/main.py flowfile_scheduler/flowfile_scheduler/engine.py.
  • Test DB isolation model / shared-fixed-path behavior: grep -n "get_database_url" -A 20 shared/storage_config.py.
  • FLOWFILE_SKIP_STARTUP_MIGRATION gate: grep -n "FLOWFILE_SKIP_STARTUP_MIGRATION" flowfile_core/flowfile_core/database/init_db.py.
  • Tauri Cmd+Q / RunEvent::Exit handling and the two open TODO races: grep -n "RunEvent::Exit\|TODO(D)\|TODO(C)" flowfile_frontend/src-tauri/src/lib.rs flowfile_frontend/src-tauri/src/sidecar/mod.rs.
  • Sidecar process names for ps aux triage: grep -n 'BINARIES = ' tools/rename_sidecar.py (binaries are named flowfile_core/flowfile_worker).
  • Trailing-slash 307 pattern: grep -n "proxy_redirect" flowfile_frontend/nginx.conf; grep -n "configure:" flowfile_frontend/vite.config.mjs.

© Edwardvaneechoud, MIT. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file

Files

Just SKILL.md in .claude/skills/flowfile-debugging-playbook of Edwardvaneechoud/Flowfile.

Open the folder on GitHubat commit c054c90

Compare with similar skills

Flowfile Debugging Playbook next to the 5 skills that share the most tags, products or categories with it. Stars are the repository's; “used in” counts other GitHub owners with a copy.

Flowfile Debugging Playbook compared with similar skills
SkillStarsUsed inTokensAuto-checkLicenceRepo updated
Flowfile Debugging Playbook this skillEdwardvaneechoud/Flowfile370—~6.3kAutomated safety check: PassMIT
Mastering Python SkillSpillwaveSolutions/agent-brain120—~1.4kAutomated safety check: NotesMIT
Pythonericrisco/rsc-harness156—~3.8kAutomated safety check: PassMIT
Code PatternsAedelon/claude-code-blueprint120—~1.2kAutomated safety check: PassCustom licence
Python Devdoccker/cc-use-exp1.1k—~790Automated safety check: PassCustom licence
PythonMadAppGang/claude-code283—~2.8kAutomated safety check: NotesMIT

Similar skills

  • Mastering Python Skill

    SpillwaveSolutions/agent-brain

    Modern Python coaching covering language foundations through advanced production patterns.

    120 GitHub stars~1.4k tokensUpdated 17 days ago
    DevelopmentAuto-check: notes
  • Python

    ericrisco/rsc-harness

    A skill your agent uses when the task is Python itself, in any framework or none: PEP 695 generics, mypy --strict typing, dataclass/Protocol/TypedDict/Enum choices, asyncio.TaskGroup, stdlib idioms…

    156 GitHub stars~3.8k tokensUpdated today
    Backend & APIsAuto-check passed
  • Code Patterns

    Aedelon/claude-code-blueprint

    Reference patterns for REST APIs, pytest/vitest testing, Docker multi-stage builds, GitHub Actions CI/CD, PostgreSQL, TypeScript generics, Python async, and React Server Components.

    120 GitHub stars~1.2k tokensUpdated 7 mo ago
    DevOps & CloudAuto-check passed
  • Python Dev

    doccker/cc-use-exp

    Python 开发规范。当用户操作 .py、pyproject.toml、requirements.txt、setup.py 文件, 或涉及 FastAPI、Django、Flask、pytest、asyncio 开发时触发。

    1.1k GitHub stars~790 tokensUpdated 1 mo ago
    Backend & APIsAuto-check passed
  • Python

    MadAppGang/claude-code

    A skill your agent uses when building FastAPI applications, implementing async endpoints, setting up Pydantic schemas, working with SQLAlchemy, or writing pytest tests for Python backend services.

    283 GitHub stars~2.8k tokensUpdated 6 mo ago
    Backend & APIsAuto-check: notes
  • Pytest

    bobmatnyc/claude-mpm

    pytest - Python's most powerful testing framework with fixtures, parametrization, plugins, and framework integration for FastAPI, Django, Flask

    155 GitHub stars~8.2k tokensUpdated 1 mo ago
    Testing & QAAuto-check passed

More from Edwardvaneechoud/Flowfile

All 19 skills in this repo
  • Flowfile AI Subsystem Guide

    Edwardvaneechoud/Flowfile

    Maps the /ai/ subsystem of flowfile_core, its three agent tiers, litellm seam, BYOK keys and rate limits, and sets rules for extending or debugging it safely.

    370 GitHub stars~7k tokensUpdated today
    Auto-check: notes
  • Flowfile Architecture Contract

    Edwardvaneechoud/Flowfile

    Maps Flowfile's core, worker, frontend, kernel, scheduler and shared services and the design contracts between them, for onboarding and cross-service debugging.

    370 GitHub stars~9.9k tokensUpdated today
    Auto-check passed
  • Flowfile Build and Environment Setup

    Edwardvaneechoud/Flowfile

    Recreates every Flowfile development and build environment from scratch, with exact version pins and an explanation of what each Makefile target really does.

    370 GitHub stars~7.3k tokensUpdated today
    Auto-check: notes
  • Flowfile Change Control

    Edwardvaneechoud/Flowfile

    Explains how changes to the Flowfile monorepo are gated, versioned and released, including version sync, stub and docs drift checks, Alembic migrations and pinned dependencies.

    370 GitHub stars~7.3k tokensUpdated today
    Auto-check passed
  • Flowfile Codegen Parity Campaign

    Edwardvaneechoud/Flowfile

    Runbook for closing gaps between a Flowfile visual flow's results and its exported Polars or FlowFrame Python code, measured by tests rather than by eye.

    370 GitHub stars~7.5k tokensUpdated today
    Auto-check passed
  • Flowfile Config and Flags Catalog

    Edwardvaneechoud/Flowfile

    Catalog of Flowfile's environment variables and runtime flags: what each does, where the code reads it, its default, and where the docs disagree with the code.

    370 GitHub stars~12k tokensUpdated today
    Auto-check: notes

Questions about Flowfile Debugging Playbook

What does Flowfile Debugging Playbook do?

Symptom-to-cause triage playbook for Flowfile (core/worker/kernel/frontend/AI) — covers "no such table" DB cascades (two distinct causes), import-time Alembic migration corruption, silent…. Flowfile Debugging Playbook is an agent skill from Edwardvaneechoud/Flowfile. Symptom-to-cause triage playbook for Flowfile (core/worker/kernel/frontend/AI) — covers "no such table" DB cascades (two distinct causes), import-time Alembic migration corruption, silent axios/FastAPI 307 redirects in Docker, browser "CORS error" that is really an unhandled 500, stale-vs-rerunning node caching, "flow no longer in memory" 404s, Docker kernel container failures, Tauri desktop sidecar leaks, and AI agent misbehavior via the prompt log.

When should I use Flowfile Debugging Playbook?

Flowfile Debugging Playbook fits situations like: A flow run fails unexpectedly; A pytest run shows failures you didnt cause; the UI silently no-ops; the browser console says CORS error.

How do I install Flowfile Debugging Playbook in Claude Code?

Run `npx skills add Edwardvaneechoud/Flowfile --skill flowfile-debugging-playbook -a claude-code`. Or copy the skill folder (.claude/skills/flowfile-debugging-playbook in Edwardvaneechoud/Flowfile) into .claude/skills/flowfile-debugging-playbook in your project. Claude Code loads it when a task matches its description.

How do I install Flowfile Debugging Playbook in Codex?

Run `npx skills add Edwardvaneechoud/Flowfile --skill flowfile-debugging-playbook -a codex`. Or copy the skill folder (.claude/skills/flowfile-debugging-playbook in Edwardvaneechoud/Flowfile) into .agents/skills/flowfile-debugging-playbook in your project. Codex loads it when a task matches its description.

Can I use Flowfile Debugging Playbook in Cursor, Gemini CLI or GitHub Copilot?

Cursor, Gemini CLI, GitHub Copilot and OpenCode also load SKILL.md folders. With the skills CLI, run `npx skills add Edwardvaneechoud/Flowfile --skill flowfile-debugging-playbook -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/flowfile-debugging-playbook, .gemini/skills/flowfile-debugging-playbook, .github/skills/flowfile-debugging-playbook and .opencode/skills/flowfile-debugging-playbook in your project.

What does Flowfile Debugging Playbook need to run?

Going by SKILL.md and its folder, Flowfile Debugging Playbook needs the command-line tools its instructions call (poetry, docker, python, sqlite3 and curl). Our summary lists: Python 3; Docker.

Does Flowfile Debugging Playbook access the network?

SKILL.md contains no URLs. Its commands use docker and curl, which can reach the network depending on how they are called. This is read from the text; nothing was executed.

Is Flowfile Debugging Playbook safe to install?

Our automated static check of SKILL.md found no risky patterns, such as piping downloads into a shell, reading credential files or hidden Unicode. It is not a guarantee. Review the folder before installing.

What licence does Flowfile Debugging Playbook use?

Flowfile Debugging Playbook is published under the MIT licence (the repository's licence). It allows redistribution, so the full SKILL.md is shown on this page.

How many tokens does Flowfile Debugging Playbook use?

About 6.3k tokens (SKILL.md is roughly 25k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full.

What are the alternatives to Flowfile Debugging Playbook?

Skills that share tags, products or a category with Flowfile Debugging Playbook: Mastering Python Skill (SpillwaveSolutions/agent-brain, 120 stars), Python (ericrisco/rsc-harness, 156 stars), Code Patterns (Aedelon/claude-code-blueprint, 120 stars) and Python Dev (doccker/cc-use-exp, 1.1k stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.

Who maintains Flowfile Debugging Playbook?

Edwardvaneechoud (a GitHub user) maintains it in Edwardvaneechoud/Flowfile, which has 370 GitHub stars. The repository holds 19 skills in this directory. The repository was last updated on October 6, 2026.

Source: Edwardvaneechoud/Flowfile on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.