Repository navigation
Claude Desktop test follow-up (2026-10-21)
- Declare the
process_thoughtstageparameter as a string listing the five
stages, so strict clients accept the documented case-insensitive spelling
("research"); unknown stages still returnINVALID_INPUT. - Stage-jump warnings in
process_thoughtandgenerate_summary.stage_transitions
compare with the previous mainline or revision note; a stage reached in a
revision is no longer reported as skipped. - Add
deprecation_noticetogenerate_summary,clear_historyand legacy-session
export_session/import_sessionresults (null for explicit sessions). - Name the involved fields in
INVALID_INPUThints for cross-field validation
errors (e.g.Fields: branch_from_thought, branch_id). read_sessionsteps view: a first note larger thanmax_charsdegrades to its
first content chunk (content_truncated,next_content_offset) instead of
returningRESPONSE_LIMIT.- Kept by decision:
truncatedstays one flag (next_cursorsignals more pages),
cursors stay opaque per view, and acreate_sessionretry returns the original
snapshot (useread_sessionfor current state).
Cleanup (2026-10-21)
- Remove
run_server.py; usemcp-sequential-thinkingor
python -m mcp_sequential_thinking.server. - Remove
debug_mcp_connection.py;scripts/stdio_smoke.pycovers the stdio check
with the real MCP client. - Remove the unused
utils.to_camel_caseandThoughtStage.from_string;
ThoughtStage(value)accepts the same case-insensitive spelling. - Drop the unused
vis,webandallextras (matplotlib, numpy, fastapi, uvicorn). ThoughtDataserializes through Pydantic camelCase aliases; the stored format and
key order are unchanged, unknown keyword arguments are now rejected.- Rely on the MCP SDK's UTF-8 stdio wrapping; drop the duplicate re-wrap and the
script-mode import fallback inserver.py.
Second manual MCP audit follow-up (2026-09-08)
- Return
PATH_OUTSIDE_EXPORTSfor rejected import/export paths with a useful,
sanitized correction hint. - Include migration guidance in
process_thought.deprecation_notice, and explain
the basis of mainline progress and the database-wide sequence cursor in results. - Add MCP regression coverage for the quoted German lexical overlap (score 0.6),
tag matching, and atomic rejection of nonexistent/cross-session completion evidence.
Evidence validation already existed; the reported bypass was not reproduced.
Empty related matches for the full manual inputs remain unverified without those inputs.
Manual MCP audit follow-up (2026-09-08)
- Preserve decimal/version numbers in summary excerpts.
- Add explicit
session_idexport/import with a validated, atomic single-session
archive preserving branches, IDs, sources and completion. Existing sessions
conflict on import; legacy v1/v2 behavior stays available. - Distinguish
SESSION_FINALIZEDfrom retryable version conflicts and expose
current_versionthrough sanitized MCP errors. - Qualify legacy analysis references and revision chains by branch.
- Paginate the prioritized resume view without repeating page zero; document its
ordering and omit completion from later pages unless explicitly requested. - Deprecate the legacy workflow without removing it; emphasize working notes,
auditability and resumption rather than improved reasoning.
Reliability upgrade (2026-09-05)
- Serialize JSONL recovery and mutations; repair incomplete UTF-8/JSON tails with
exact backups; reject complete corruption, future schemas and identity conflicts. - Add transactional SQLite sessions, ID references, request-ID retries, versioned
finalization, bounded resume/full reads and explicit typed completion records. - Migrate legacy UUIDs and contents without deduplication; keep the five tools on
the explicit legacy session, with guarded old-writer exclusion and snapshot restore. - Add memory-only operation, controlled diagnostics, schema limits and sanitized
correctable tool errors. Legacy stage spelling remains case insensitive. - Extend process/crash/fault/stdio tests and complete Python/Windows/SDK gates;
test installed artifacts outside the checkout and publish the same tested files. - Prepare a bilingual evaluation collection and registry metadata. A completed
model usefulness comparison is still required; no general quality claim is made.
Compatibility changes: corrupt storage fails closed rather than starting empty;
correctable legacy errors are now isError tool results; inputs/outputs have explicit
limits; source imports no longer initialize storage. SQLite snapshots are required
for complete restore after new writes; legacy JSONL alone cannot downgrade all
session semantics. See the README for details.
Earlier 0.7 development work (2026-08-24; not a published release)
Breaking
mcpdependency moves to the 2.x line:mcp>=2,<3(was
>=1.2.0,<2.0.0).mcp.server.fastmcp.FastMCPis gone upstream; the
server is rewritten againstmcp.server.mcpserver.MCPServer. If you
vendor or subclass anything from this package's server module, the SDK
types you get back changed from camelCase to snake_case (isError→
is_error,structuredContent→structured_content, etc.) — this
package's own request/response shapes below are affected the same way.- Every tool now returns structured, typed output (a Pydantic model,
surfaced asstructured_content) instead of an untyped dict serialized
to JSON text. Field names are snake_case throughout, replacing the old
camelCase dict shape end to end — not just the fields called out below.
tools/listnow advertises anoutput_schemafor all five tools. process_thoughtanalysis output: the old singleprogressfloat
(which froze/misreported once revisions or branches entered the
picture) is replaced by four explicit fields:main_line_progress,
main_line_position,total_thoughts_recorded,branch_count,
revision_count.relatedThoughtsCount/relatedThoughtSummaries—
which matched on stage equality or tag overlap and called that
"related" — are replaced byrelated_thoughts(lexical similarity
across the actual thought text, stage-independent) and
same_category_thoughts(the honest name for the old categorical
match, now requiring an actual shared tag rather than stage alone).
Every response also carries awarningslist (stage-order issues; see
below).thought_numberis now optional onprocess_thought— omit it to
have the server assign the next free number on the current line
(mainline, or the givenbranch_id). Sending athought_numberthat's
already used on that line is now rejected (previously accepted
silently, corrupting progress accounting).generate_summaryoutput restructured: a newcontentsection
(per-stage thought excerpts, aggregatedassumptions_challenged,
open_branches,revision_chains) sits alongside the old counters,
now understructure.completionStatus.percentCompleteis replaced
bystructure.completion.stages_used_percent, whose denominator is
alwayslen(ThoughtStage)(5), never hardcoded.- Export/import path errors, invalid stage names, and duplicate
thought_numbernow fail the tool call as a protocol-level error
(MCPError, JSON-RPCINVALID_PARAMS/REQUEST_TIMEOUT) instead of
being swallowed into a{"status": "failed"}response. Execution
failures the model can retry past (a missing import file, an
unexpected storage error) instead come back asis_error=Truetool
results. - Session/export files on disk are unaffected — no schema migration
needed, existingcurrent_session.jsonland v1/v2 exports keep
working (seedocs/MIGRATION_PLAN.md§6).
Added
- Stage-order warnings: every
process_thoughtresponse includes a
warningslist noting a skipped or backward stage transition on the
mainline. Permissive by default. New--strict-stagesCLI flag (and
ThoughtStorage-adjacent server state) rejects such transitions with
MCPErrorinstead of just warning. --healthCLI subcommand: checks the storage directory exists, is
writable, and that the session lock can be acquired; prints a report
and exits 0/1.--transport {stdio,sse,streamable-http}CLI flag (plus
--host/--port);stdioremains the default.- Structured stderr logging: each tool call logs start/completion (or
failure) with elapsed time in milliseconds. - Tool annotations (
readOnlyHint,destructiveHint,idempotentHint)
are now set per tool —clear_historyandimport_sessionare marked
destructive.
Fixed
- A handful of concurrent
process_thoughtcalls against the same
session could stall for minutes: blocking file I/O (a file lock
acquire plusfsync) ran synchronously inside anasync defhandler,
serializing every concurrent request behind it on the single event-loop
thread. Storage calls now run in worker threads
(anyio.to_thread.run_sync); a lock that can't be acquired within its
timeout now fails fast with a clear error instead of blocking. generate_summarypreviously reported only structural statistics
(stage/branch/tag counts) with no actual thinking content — it now
includes per-stage excerpts of the recorded thoughts, aggregated
challenged assumptions, open branches, and revision chains.