The memory substrate for AI agents and developer tools. Git-versioned, file-native, MCP-first.
Drift inferred · capture-to-capture
- HIGH code analysis flagged dynamic code execution in phasespace-labs/palinode
- HIGH code analysis flagged dynamic code execution in phasespace-labs/palinode
- HIGH code analysis flagged dynamic code execution in phasespace-labs/palinode
- HIGH code analysis flagged dynamic code execution in phasespace-labs/palinode
- HIGH code analysis flagged dynamic code execution in phasespace-labs/palinode
- HIGH code analysis flagged dynamic code execution in phasespace-labs/palinode
- HIGH code analysis flagged dynamic code execution in phasespace-labs/palinode
- HIGH code analysis flagged dynamic code execution in phasespace-labs/palinode
- HIGH code analysis flagged dynamic code execution in phasespace-labs/palinode
- HIGH code analysis flagged dynamic code execution in phasespace-labs/palinode
- HIGH code analysis flagged dynamic code execution in phasespace-labs/palinode
- HIGH code analysis flagged dynamic code execution in phasespace-labs/palinode
- HIGH code analysis flagged dynamic code execution in phasespace-labs/palinode
- HIGH code analysis flagged dynamic code execution in phasespace-labs/palinode
- HIGH code analysis flagged dynamic code execution in phasespace-labs/palinode
- HIGH code analysis flagged dynamic code execution in phasespace-labs/palinode
- HIGH code analysis flagged dynamic code execution in phasespace-labs/palinode
- HIGH code analysis flagged dynamic code execution in phasespace-labs/palinode
- HIGH code analysis flagged dynamic code execution in phasespace-labs/palinode
- HIGH code analysis flagged dynamic code execution in phasespace-labs/palinode
tool count over time
tools
-
archive
Retire one memory that's wrong or obsolete — archive it, or supersede it with a named replacement
-
archive_expired
Archive ephemeral memories whose TTL has expired
-
blame
Trace a fact back to the commit that recorded it
-
cluster_neighbors
Find top-K semantically related files NOT already wiki-linked — surface implicit relationships for cross-link proposals
-
consolidate
Preview or run LLM-powered compaction
-
dedup_suggest
Before saving, surface existing files that overlap the draft
-
depends
Dependency tree (or unblocked-items list) from depends_on / blocks / parallel_with frontmatter on ProjectSnapshots
-
diff
What changed in the last N days
-
doctor
Fast diagnostic pass — 18+ checks across paths, services, config, index
-
doctor_deep
Full diagnostic with canary write test (~10–15s)
-
entities
Entity graph — cross-references between memories
-
history
Git history for a file with diff stats and rename tracking
-
ingest
Fetch a URL and save as research
-
lint
Health scan — orphans, stale files, missing fields
-
list
Browse memory files by type, filter by core status
-
orphan_repair
Find semantic matches for broken [[wikilinks]]
-
prompt
List, show, or activate versioned LLM prompts
-
push
Sync memory to a remote git repo
-
read
Read the full content of a memory file
-
review
Advisory project-memory review that proposes corrective operations without writing them
-
rollback
Revert a file to a previous commit (safe, creates new commit)
-
save
Store a typed memory (person, decision, insight, project)
-
search
Hybrid BM25 + vector search with category filter
-
session_end
Capture summary, decisions, and blockers at end of session
-
session_init
Session-start context digest for the resolved project scope
-
status
Health check — file counts, index stats, service status
-
timeline
_Deprecated — use history with detail='full'._ Commit-level evolution of a file with per-commit diffs
-
topic_coverage
Given a short topic phrase, return whether any existing wiki page already covers it (binary covered / best_match / similarity)
-
trace
Compose a fact's full provenance lineage — sources, saved/changed commits, supersession, typed links, recall
-
trigger
Prospective recall — auto-inject when a topic comes up
analyzed commit 194ae70 · analyzer v33 · 14h ago
skills & prompt files 12
- agent-rules phasespace-labs-palinode-194ae70/examples/CLAUDE.md
- skill phasespace-labs-palinode-194ae70/skill/palinode-claude-code/SKILL.md
- skill phasespace-labs-palinode-194ae70/skill/palinode-memory/SKILL.md
- skill phasespace-labs-palinode-194ae70/skill/palinode-session/SKILL.md
- prompt-file phasespace-labs-palinode-194ae70/specs/prompts/compaction.md
- prompt-file phasespace-labs-palinode-194ae70/specs/prompts/consolidation.md
- prompt-file phasespace-labs-palinode-194ae70/specs/prompts/context-assembly.md
- prompt-file phasespace-labs-palinode-194ae70/specs/prompts/digest.md
- prompt-file phasespace-labs-palinode-194ae70/specs/prompts/extraction.md
- prompt-file phasespace-labs-palinode-194ae70/specs/prompts/ingestion.md
- prompt-file phasespace-labs-palinode-194ae70/specs/prompts/nightly-consolidation.md
- prompt-file phasespace-labs-palinode-194ae70/specs/prompts/update.md
danger signals3
- dynamic code execution __import__ sink phasespace-labs-palinode-194ae70/palinode/core/defaults.py :82
__import__("os").environ.get("PALINODE_SESSION_END_TIMEOUT", "90") - suspicious endpoint 169.254.169.254 (cloud metadata) phasespace-labs-palinode-194ae70/tests/integration/test_security.py :216
resp = client.post("/ingest-url", json={"url": "http://169.254.169.254/latest/meta-data/"}) - committed secret Anthropic key phasespace-labs-palinode-194ae70/tests/test_security_log_redaction.py :34
sk-ant…(37 chars, redacted)
code files: 423
filesystem 208
- fs phasespace-labs-palinode-194ae70/bench/abstention.py :38
from pathlib import Path - fs phasespace-labs-palinode-194ae70/bench/corpus.py :22
from pathlib import Path - fs phasespace-labs-palinode-194ae70/bench/harness.py :22
from pathlib import Path - fs phasespace-labs-palinode-194ae70/bench/longmemeval/adapter.py :15
import shutil - fs phasespace-labs-palinode-194ae70/bench/longmemeval/data.py :7
from pathlib import Path - fs phasespace-labs-palinode-194ae70/bench/longmemeval/llm.py :92
text = open(out_path, encoding="utf-8").read().strip() if os.path.exists(out_path) else "" - fs phasespace-labs-palinode-194ae70/bench/longmemeval/pipeline.py :32
import shutil - fs phasespace-labs-palinode-194ae70/bench/longmemeval/rejudge.py :18
from pathlib import Path - fs phasespace-labs-palinode-194ae70/bench/longmemeval/run.py :28
from pathlib import Path - fs phasespace-labs-palinode-194ae70/bench/report.py :150
results = json.loads(open(argv[0], encoding="utf-8").read()) - fs phasespace-labs-palinode-194ae70/bench/run.py :19
import shutil - fs phasespace-labs-palinode-194ae70/palinode/api/enrichment.py :384
with open(file_path, "r", encoding="utf-8") as f: - fs phasespace-labs-palinode-194ae70/palinode/api/path_safety.py :62
`os.path.exists()` and `open()` could redirect a memory read to a - fs phasespace-labs-palinode-194ae70/palinode/api/routers/health.py :231
with open(canary_path, "w", encoding="utf-8") as f: - fs phasespace-labs-palinode-194ae70/palinode/api/routers/memory.py :306
with open(filepath, "r", encoding="utf-8") as f: - fs phasespace-labs-palinode-194ae70/palinode/api/routers/session.py :301
# O_APPEND open(): the same trade every other choke-point write already - fs phasespace-labs-palinode-194ae70/palinode/api/server.py :15
from pathlib import Path - fs phasespace-labs-palinode-194ae70/palinode/api/ui/router.py :26
from pathlib import Path - fs phasespace-labs-palinode-194ae70/palinode/api/ui/views.py :19
from pathlib import Path - fs phasespace-labs-palinode-194ae70/palinode/cli/__init__.py :189
import shutil - fs phasespace-labs-palinode-194ae70/palinode/cli/doctor.py :211
from pathlib import Path - fs phasespace-labs-palinode-194ae70/palinode/cli/embedding_tools.py :84
with open(file_path, "r", encoding="utf-8") as f: - fs phasespace-labs-palinode-194ae70/palinode/cli/import_vault.py :24
from pathlib import Path - fs phasespace-labs-palinode-194ae70/palinode/cli/init.py :25
from pathlib import Path - fs phasespace-labs-palinode-194ae70/palinode/cli/mcp_config.py :15
from pathlib import Path - fs phasespace-labs-palinode-194ae70/palinode/cli/mcp_smoke.py :16
from pathlib import Path - fs phasespace-labs-palinode-194ae70/palinode/cli/obsidian_sync.py :167
with open(filepath, "r", encoding="utf-8") as fh: - fs phasespace-labs-palinode-194ae70/palinode/cli/repair_status.py :116
with open(history_path, encoding="utf-8") as f: - fs phasespace-labs-palinode-194ae70/palinode/cli/retrieval_stats.py :15
from pathlib import Path - fs phasespace-labs-palinode-194ae70/palinode/cli/save.py :190
with open(file_path, "r", encoding="utf-8") as f: - fs phasespace-labs-palinode-194ae70/palinode/cli/worktree.py :26
from pathlib import Path - fs phasespace-labs-palinode-194ae70/palinode/consolidation/archive.py :78
with open(path, encoding="utf-8") as f: - fs phasespace-labs-palinode-194ae70/palinode/consolidation/executor.py :149
with open(file_path, encoding="utf-8") as f: - fs phasespace-labs-palinode-194ae70/palinode/consolidation/fact_ids.py :40
with open(file_path, encoding="utf-8") as f: - fs phasespace-labs-palinode-194ae70/palinode/consolidation/forget.py :123
with open(path, encoding="utf-8", errors="replace") as f: - fs phasespace-labs-palinode-194ae70/palinode/consolidation/layer_split.py :50
with open(file_path, encoding="utf-8") as f: - fs phasespace-labs-palinode-194ae70/palinode/consolidation/retract.py :271
with open(abs_path, encoding="utf-8") as f: - fs phasespace-labs-palinode-194ae70/palinode/consolidation/run_lock.py :19
from pathlib import Path - fs phasespace-labs-palinode-194ae70/palinode/consolidation/runner.py :96
with open(filepath, "r", encoding="utf-8") as f: - fs phasespace-labs-palinode-194ae70/palinode/consolidation/ttl.py :163
with open(path, encoding="utf-8") as f: - fs phasespace-labs-palinode-194ae70/palinode/consolidation/write_time.py :148
with open(marker_path, encoding="utf-8") as f: - fs phasespace-labs-palinode-194ae70/palinode/core/aliases.py :141
with open(path, encoding="utf-8") as fh: - fs phasespace-labs-palinode-194ae70/palinode/core/audit.py :16
from pathlib import Path - fs phasespace-labs-palinode-194ae70/palinode/core/auth.py :25
from pathlib import Path - fs phasespace-labs-palinode-194ae70/palinode/core/claims.py :241
with open(full_path, encoding="utf-8") as f: - fs phasespace-labs-palinode-194ae70/palinode/core/config.py :19
from pathlib import Path - fs phasespace-labs-palinode-194ae70/palinode/core/context_prime.py :93
with open(filepath, encoding="utf-8") as f: - fs phasespace-labs-palinode-194ae70/palinode/core/cross_refs.py :111
with open(filepath, encoding="utf-8") as fh: - fs phasespace-labs-palinode-194ae70/palinode/core/depends.py :51
with open(path, encoding="utf-8") as f: - fs phasespace-labs-palinode-194ae70/palinode/core/git_tools.py :96
# formerly-scattered ``open(w)`` / ``git add`` sites (save, write-time dedup, - fs phasespace-labs-palinode-194ae70/palinode/core/lint.py :421
with open(filepath, "r", encoding="utf-8") as f: - fs phasespace-labs-palinode-194ae70/palinode/core/path_guard.py :7
tree — using ``pathlib.Path.resolve()`` + ``Path.is_relative_to()`` rather - fs phasespace-labs-palinode-194ae70/palinode/core/quote_verify.py :226
with open(full_path, encoding="utf-8") as f: - fs phasespace-labs-palinode-194ae70/palinode/core/retrieval_log.py :23
from pathlib import Path - fs phasespace-labs-palinode-194ae70/palinode/core/save.py :175
with open(path, "r", encoding="utf-8") as existing: - fs phasespace-labs-palinode-194ae70/palinode/core/store.py :1120
with open(full_path, "r", encoding="utf-8") as f: - fs phasespace-labs-palinode-194ae70/palinode/core/trace.py :156
with open(history_abs, encoding="utf-8") as fh: - fs phasespace-labs-palinode-194ae70/palinode/core/typed_links.py :181
with open(target_path, encoding="utf-8") as f: - fs phasespace-labs-palinode-194ae70/palinode/core/visibility.py :78
with open(file_path, encoding="utf-8") as fh: - fs phasespace-labs-palinode-194ae70/palinode/diagnostics/checks/audit_log.py :19
from pathlib import Path - fs phasespace-labs-palinode-194ae70/palinode/diagnostics/checks/claude_md.py :23
from pathlib import Path - fs phasespace-labs-palinode-194ae70/palinode/diagnostics/checks/config_drift.py :18
from pathlib import Path - fs phasespace-labs-palinode-194ae70/palinode/diagnostics/checks/db_path.py :21
from pathlib import Path - fs phasespace-labs-palinode-194ae70/palinode/diagnostics/checks/fts5_sync.py :29
from pathlib import Path - fs phasespace-labs-palinode-194ae70/palinode/diagnostics/checks/git_identity.py :19
from pathlib import Path - fs phasespace-labs-palinode-194ae70/palinode/diagnostics/checks/git_remote.py :20
from pathlib import Path - fs phasespace-labs-palinode-194ae70/palinode/diagnostics/checks/index_size.py :29
from pathlib import Path - fs phasespace-labs-palinode-194ae70/palinode/diagnostics/checks/memory_dir.py :9
from pathlib import Path - fs phasespace-labs-palinode-194ae70/palinode/diagnostics/checks/multiple_dirs.py :23
from pathlib import Path - fs phasespace-labs-palinode-194ae70/palinode/diagnostics/checks/phantom_db.py :31
from pathlib import Path - fs phasespace-labs-palinode-194ae70/palinode/diagnostics/checks/process_env.py :37
from pathlib import Path - fs phasespace-labs-palinode-194ae70/palinode/diagnostics/checks/recall_write_health.py :31
from pathlib import Path - fs phasespace-labs-palinode-194ae70/palinode/diagnostics/checks/service.py :23
from pathlib import Path - fs phasespace-labs-palinode-194ae70/palinode/diagnostics/checks/watcher.py :31
from pathlib import Path - fs phasespace-labs-palinode-194ae70/palinode/diagnostics/fixes.py :38
from pathlib import Path - fs phasespace-labs-palinode-194ae70/palinode/import_/vault.py :15
from pathlib import Path - fs phasespace-labs-palinode-194ae70/palinode/indexer/index_file.py :62
with open(filepath, "r", encoding="utf-8") as f: - fs phasespace-labs-palinode-194ae70/palinode/indexer/watcher.py :293
with open(filepath, 'r', encoding="utf-8") as f: - fs phasespace-labs-palinode-194ae70/palinode/ingest/pipeline.py :20
from pathlib import Path - fs phasespace-labs-palinode-194ae70/palinode/lint/contradictions.py :89
with open(filepath, "r", encoding="utf-8") as fh: - fs phasespace-labs-palinode-194ae70/palinode/migration/bullets.py :56
with open(validated, "r", encoding="utf-8") as source: - fs phasespace-labs-palinode-194ae70/palinode/migration/frontmatter_backfill.py :410
with open(os.path.join(base, rel_path), encoding="utf-8") as fh: - fs phasespace-labs-palinode-194ae70/palinode/migration/openclaw.py :109
with open(fpath, "r", encoding="utf-8") as f: - fs (weak) phasespace-labs-palinode-194ae70/scripts/dump-parity-registry.py :19
from pathlib import Path - fs (weak) phasespace-labs-palinode-194ae70/tests/conftest.py :15
import pathlib - fs (weak) phasespace-labs-palinode-194ae70/tests/integration/test_api_roundtrip.py :98
with open(fp) as f: - fs (weak) phasespace-labs-palinode-194ae70/tests/integration/test_mcp_e2e.py :221
with open(fp) as f: - fs (weak) phasespace-labs-palinode-194ae70/tests/integration/test_mcp_stdio.py :22
from pathlib import Path - fs (weak) phasespace-labs-palinode-194ae70/tests/integration/test_obsidian_demo.py :145
with open(file_path) as f: - fs (weak) phasespace-labs-palinode-194ae70/tests/integration/test_security.py :392
with open(fp) as f: - fs (weak) phasespace-labs-palinode-194ae70/tests/integration/test_session_end_e2e_l1_l3.py :248
with open(status_path, "w", encoding="utf-8") as f: - fs (weak) phasespace-labs-palinode-194ae70/tests/test_amr_conformance.py :35
from pathlib import Path - fs (weak) phasespace-labs-palinode-194ae70/tests/test_api_route_inventory.py :28
from pathlib import Path - fs (weak) phasespace-labs-palinode-194ae70/tests/test_archive_on_demand_664.py :89
with open(path, "w", encoding="utf-8") as f: - fs (weak) phasespace-labs-palinode-194ae70/tests/test_archive_recall_485.py :81
with open(path, "w", encoding="utf-8") as f: - fs (weak) phasespace-labs-palinode-194ae70/tests/test_audit.py :31
with open(path) as f: - fs (weak) phasespace-labs-palinode-194ae70/tests/test_bench_harness.py :20
import shutil - fs (weak) phasespace-labs-palinode-194ae70/tests/test_bench_longmemeval.py :241
open(out_path, "w").write("Border collie.\n") - fs (weak) phasespace-labs-palinode-194ae70/tests/test_changelog_structure.py :29
from pathlib import Path - fs (weak) phasespace-labs-palinode-194ae70/tests/test_check_freshness_hash_domains.py :49
whole_file_hash = hashlib.sha256(open(path).read().encode()).hexdigest() - fs (weak) phasespace-labs-palinode-194ae70/tests/test_claims_508.py :49
with open(file_path, "r") as f: - fs (weak) phasespace-labs-palinode-194ae70/tests/test_cli_init.py :11
from pathlib import Path - fs (weak) phasespace-labs-palinode-194ae70/tests/test_cli_json_output.py :21
import pathlib - fs (weak) phasespace-labs-palinode-194ae70/tests/test_collection_integrity.py :35
from pathlib import Path - fs (weak) phasespace-labs-palinode-194ae70/tests/test_config_validation.py :16
from pathlib import Path - fs (weak) phasespace-labs-palinode-194ae70/tests/test_consolidation_dry_run.py :5
from pathlib import Path - fs (weak) phasespace-labs-palinode-194ae70/tests/test_consolidation_run_lock.py :13
from pathlib import Path - fs (weak) phasespace-labs-palinode-194ae70/tests/test_consolidation_runner.py :17
from pathlib import Path - fs (weak) phasespace-labs-palinode-194ae70/tests/test_consolidation_status_write_path.py :20
from pathlib import Path - fs (weak) phasespace-labs-palinode-194ae70/tests/test_content_hash_and_confidence.py :38
with open(file_path, "r") as f: - fs (weak) phasespace-labs-palinode-194ae70/tests/test_context_prime.py :46
with open(os.path.join(tmp_path, "decisions", "legacy.md"), "w") as f: - fs (weak) phasespace-labs-palinode-194ae70/tests/test_db_disambiguation.py :91
with open(os.path.join(memory_dir, "projects", "alpha.md"), "w") as f: - fs (weak) phasespace-labs-palinode-194ae70/tests/test_default_db_guard_scope.py :24
import shutil - fs (weak) phasespace-labs-palinode-194ae70/tests/test_depends.py :14
from pathlib import Path - fs (weak) phasespace-labs-palinode-194ae70/tests/test_deploy_systemd.py :13
import shutil - fs (weak) phasespace-labs-palinode-194ae70/tests/test_diagnostics_skeleton.py :16
from pathlib import Path - fs (weak) phasespace-labs-palinode-194ae70/tests/test_docker_compose.py :21
from pathlib import Path - fs (weak) phasespace-labs-palinode-194ae70/tests/test_docs_schema_alignment.py :13
from pathlib import Path - fs (weak) phasespace-labs-palinode-194ae70/tests/test_doctor_api.py :16
from pathlib import Path - fs (weak) phasespace-labs-palinode-194ae70/tests/test_doctor_config_drift.py :19
from pathlib import Path - fs (weak) phasespace-labs-palinode-194ae70/tests/test_doctor_fix.py :22
from pathlib import Path - fs (weak) phasespace-labs-palinode-194ae70/tests/test_doctor_fts5_sync.py :12
from pathlib import Path - fs (weak) phasespace-labs-palinode-194ae70/tests/test_doctor_git_commit_ready.py :12
from pathlib import Path - fs (weak) phasespace-labs-palinode-194ae70/tests/test_doctor_path_checks.py :17
from pathlib import Path - fs (weak) phasespace-labs-palinode-194ae70/tests/test_doctor_phase5.py :21
from pathlib import Path - fs (weak) phasespace-labs-palinode-194ae70/tests/test_doctor_service_checks.py :23
from pathlib import Path - fs (weak) phasespace-labs-palinode-194ae70/tests/test_doctor_test_isolation.py :5
from pathlib import Path - fs (weak) phasespace-labs-palinode-194ae70/tests/test_embedding_tools.py :127
with open(full, "w") as f: - fs (weak) phasespace-labs-palinode-194ae70/tests/test_entity_aliases.py :17
from pathlib import Path - fs (weak) phasespace-labs-palinode-194ae70/tests/test_example_config_keys_have_readers.py :28
from pathlib import Path - fs (weak) phasespace-labs-palinode-194ae70/tests/test_executor.py :40
with open(temp_memory_file, encoding="utf-8") as f: - fs (weak) phasespace-labs-palinode-194ae70/tests/test_executor_ops_coverage.py :29
from pathlib import Path - fs (weak) phasespace-labs-palinode-194ae70/tests/test_executor_replace_guard.py :36
with open(path, "w", encoding="utf-8") as f: - fs (weak) phasespace-labs-palinode-194ae70/tests/test_external_refs.py :37
with open(file_path, "r") as f: - fs (weak) phasespace-labs-palinode-194ae70/tests/test_fact_ids.py :36
with open(path) as f: - fs (weak) phasespace-labs-palinode-194ae70/tests/test_forget_write_time.py :301
with open(history) as f: - fs (weak) phasespace-labs-palinode-194ae70/tests/test_fresh_session_context.py :33
from pathlib import Path - fs (weak) phasespace-labs-palinode-194ae70/tests/test_frontmatter_readers_cache.py :25
from pathlib import Path - fs (weak) phasespace-labs-palinode-194ae70/tests/test_fts5_lockstep_delete.py :21
from pathlib import Path - fs (weak) phasespace-labs-palinode-194ae70/tests/test_git_tools_diff.py :62
with open(path, "a", encoding="utf-8") as handle: - fs (weak) phasespace-labs-palinode-194ae70/tests/test_git_tools_history.py :45
with open(before, "w", encoding="utf-8") as handle: - fs (weak) phasespace-labs-palinode-194ae70/tests/test_import_vault.py :17
from pathlib import Path - fs (weak) phasespace-labs-palinode-194ae70/tests/test_init_obsidian.py :16
from pathlib import Path - fs (weak) phasespace-labs-palinode-194ae70/tests/test_init_skills.py :13
from pathlib import Path - fs (weak) phasespace-labs-palinode-194ae70/tests/test_init_wrap_heavy.py :13
from pathlib import Path - fs (weak) phasespace-labs-palinode-194ae70/tests/test_injection_scanner.py :6
from pathlib import Path - fs (weak) phasespace-labs-palinode-194ae70/tests/test_ku_compat.py :90
with open(file_path) as f: - fs (weak) phasespace-labs-palinode-194ae70/tests/test_launch_checklist_harness.py :9
from pathlib import Path - fs (weak) phasespace-labs-palinode-194ae70/tests/test_layer_split_hint_hardening.py :57
with open(path, "w") as f: - fs (weak) phasespace-labs-palinode-194ae70/tests/test_layer_split_history_hint.py :82
content = open(path).read() - fs (weak) phasespace-labs-palinode-194ae70/tests/test_lint_contradictions.py :31
with open(path, "w", encoding="utf-8") as fh: - fs (weak) phasespace-labs-palinode-194ae70/tests/test_list_read.py :19
with open(os.path.join(tmp_path, "people", "alice.md"), "w") as f: - fs (weak) phasespace-labs-palinode-194ae70/tests/test_loud_silent_misconfig.py :17
from pathlib import Path - fs (weak) phasespace-labs-palinode-194ae70/tests/test_mcp_config_diagnose.py :10
from pathlib import Path - fs (weak) phasespace-labs-palinode-194ae70/tests/test_mcp_schema_size.py :5
from pathlib import Path - fs (weak) phasespace-labs-palinode-194ae70/tests/test_mcp_server_metadata.py :17
from pathlib import Path - fs (weak) phasespace-labs-palinode-194ae70/tests/test_mcp_sse_alias_deprecation.py :20
from pathlib import Path - fs (weak) phasespace-labs-palinode-194ae70/tests/test_mcp_tool_count.py :13
from pathlib import Path - fs (weak) phasespace-labs-palinode-194ae70/tests/test_migrate_bullets.py :5
from pathlib import Path - fs (weak) phasespace-labs-palinode-194ae70/tests/test_migrate_openclaw.py :7
from pathlib import Path - fs (weak) phasespace-labs-palinode-194ae70/tests/test_no_build_artifacts_tracked.py :12
from pathlib import Path - fs (weak) phasespace-labs-palinode-194ae70/tests/test_no_issue_refs_user_surface.py :28
from pathlib import Path - fs (weak) phasespace-labs-palinode-194ae70/tests/test_obsidian_sync.py :21
from pathlib import Path - fs (weak) phasespace-labs-palinode-194ae70/tests/test_package_discovery.py :4
from pathlib import Path - fs (weak) phasespace-labs-palinode-194ae70/tests/test_parity_is_dependency_free.py :22
from pathlib import Path - fs (weak) phasespace-labs-palinode-194ae70/tests/test_pr_template_smoke_args.py :7
from pathlib import Path - fs (weak) phasespace-labs-palinode-194ae70/tests/test_prompts.py :49
with open(path, "w") as f: - fs (weak) phasespace-labs-palinode-194ae70/tests/test_proposer_seam.py :19
from pathlib import Path - fs (weak) phasespace-labs-palinode-194ae70/tests/test_readme_documents_real_commands.py :22
from pathlib import Path - fs (weak) phasespace-labs-palinode-194ae70/tests/test_reciprocal_contradicts_indexed.py :56
with open(target, "w") as f: - fs (weak) phasespace-labs-palinode-194ae70/tests/test_reindex_gc.py :4
from pathlib import Path - fs (weak) phasespace-labs-palinode-194ae70/tests/test_rel_path_api_parity.py :85
with open(full, "w") as f: - fs (weak) phasespace-labs-palinode-194ae70/tests/test_resolve_memory_path_hardening.py :47
from pathlib import Path - fs (weak) phasespace-labs-palinode-194ae70/tests/test_retrieval_instrumentation.py :13
from pathlib import Path - fs (weak) phasespace-labs-palinode-194ae70/tests/test_robustness_483.py :114
with open(doc_path, "w") as f: - fs (weak) phasespace-labs-palinode-194ae70/tests/test_save_derived_slug_collision.py :68
with open(result["file_path"], "r", encoding="utf-8") as fh: - fs (weak) phasespace-labs-palinode-194ae70/tests/test_save_git_committed.py :24
from pathlib import Path - fs (weak) phasespace-labs-palinode-194ae70/tests/test_save_project.py :32
with open(file_path, "r", encoding="utf-8") as f: - fs (weak) phasespace-labs-palinode-194ae70/tests/test_save_wiki_footer.py :174
with open(file_path, encoding="utf-8") as f: - fs (weak) phasespace-labs-palinode-194ae70/tests/test_scope_filtered_listing.py :73
with open(os.path.join(tmp_path, "decisions", "legacy.md"), "w") as f: - fs (weak) phasespace-labs-palinode-194ae70/tests/test_search_internal_guard.py :28
from pathlib import Path - fs (weak) phasespace-labs-palinode-194ae70/tests/test_security_toctou_read.py :3
The TOCTOU window between os.path.exists() and open() let a symlink swap - fs (weak) phasespace-labs-palinode-194ae70/tests/test_server_json_version_alignment.py :15
from pathlib import Path - fs (weak) phasespace-labs-palinode-194ae70/tests/test_session_end.py :51
daily_content = open(daily_path, encoding="utf-8").read() - fs (weak) phasespace-labs-palinode-194ae70/tests/test_session_end_dedup.py :66
with open(file_path, "w", encoding="utf-8") as f: - fs (weak) phasespace-labs-palinode-194ae70/tests/test_session_end_envelope_guard.py :22
import shutil - fs (weak) phasespace-labs-palinode-194ae70/tests/test_session_end_floor_hook.py :18
import shutil - fs (weak) phasespace-labs-palinode-194ae70/tests/test_session_end_status_line.py :55
with open(status_path, "w", encoding="utf-8") as f: - fs (weak) phasespace-labs-palinode-194ae70/tests/test_session_end_timeout.py :28
from pathlib import Path - fs (weak) phasespace-labs-palinode-194ae70/tests/test_session_start_hook.py :21
import shutil - fs (weak) phasespace-labs-palinode-194ae70/tests/test_setup_worktree.py :19
import shutil - fs (weak) phasespace-labs-palinode-194ae70/tests/test_source_capture_g1.py :40
with open(file_path, "r", encoding="utf-8") as f: - fs (weak) phasespace-labs-palinode-194ae70/tests/test_source_surface.py :34
with open(file_path, "r") as f: - fs (weak) phasespace-labs-palinode-194ae70/tests/test_status_doc_repair.py :24
from pathlib import Path - fs (weak) phasespace-labs-palinode-194ae70/tests/test_store_wal_indexes.py :19
from pathlib import Path - fs (weak) phasespace-labs-palinode-194ae70/tests/test_subprocess_argv_form.py :22
from pathlib import Path - fs (weak) phasespace-labs-palinode-194ae70/tests/test_surface_parity.py :31
from pathlib import Path - fs (weak) phasespace-labs-palinode-194ae70/tests/test_timestamp_consistency.py :46
with open(file_path, "r") as f: - fs (weak) phasespace-labs-palinode-194ae70/tests/test_trace_536.py :84
with open(abs_path, "w", encoding="utf-8") as f: - fs (weak) phasespace-labs-palinode-194ae70/tests/test_ttl_archive_482.py :136
with open(path, "w", encoding="utf-8") as f: - fs (weak) phasespace-labs-palinode-194ae70/tests/test_typed_links.py :229
os.remove(p) - fs (weak) phasespace-labs-palinode-194ae70/tests/test_ui_phase1.py :74
with open(abs_path, "w", encoding="utf-8") as f: - fs (weak) phasespace-labs-palinode-194ae70/tests/test_user_prompt_submit_hook.py :20
from pathlib import Path - fs (weak) phasespace-labs-palinode-194ae70/tests/test_utf8_encoding_guard.py :5
``open()`` with no ``encoding=`` decodes with the *locale* default — cp1252 on - fs (weak) phasespace-labs-palinode-194ae70/tests/test_visibility_scopes.py :236
with open(abs_path, "w") as f: - fs (weak) phasespace-labs-palinode-194ae70/tests/test_watcher_debounce_coalesce.py :116
with open(path, "w") as fh: - fs (weak) phasespace-labs-palinode-194ae70/tests/test_watcher_thread_shutdown.py :31
from pathlib import Path - fs (weak) phasespace-labs-palinode-194ae70/tests/test_write_time.py :49
with open(path, "w") as f:
shell / exec 50
- shell phasespace-labs-palinode-194ae70/bench/longmemeval/llm.py :24
import subprocess - shell phasespace-labs-palinode-194ae70/bench/run.py :20
import subprocess - shell phasespace-labs-palinode-194ae70/palinode/api/routers/health.py :14
import subprocess - shell phasespace-labs-palinode-194ae70/palinode/api/server.py :14
import subprocess # noqa: F401 — re-export: tests patch `server.subprocess.run` - shell phasespace-labs-palinode-194ae70/palinode/cli/__init__.py :188
import subprocess - shell phasespace-labs-palinode-194ae70/palinode/cli/mcp_smoke.py :13
import subprocess # nosec B404 - argv-form process probe, no shell - shell phasespace-labs-palinode-194ae70/palinode/cli/worktree.py :24
import subprocess # nosec B404 - argv-form git calls, no shell - shell phasespace-labs-palinode-194ae70/palinode/core/git_tools.py :13
import subprocess - shell phasespace-labs-palinode-194ae70/palinode/diagnostics/checks/git_identity.py :18
import subprocess - shell phasespace-labs-palinode-194ae70/palinode/diagnostics/checks/git_remote.py :19
import subprocess - shell phasespace-labs-palinode-194ae70/palinode/diagnostics/checks/watcher.py :29
import subprocess - shell phasespace-labs-palinode-194ae70/palinode/ingest/pipeline.py :18
import subprocess - shell (weak) phasespace-labs-palinode-194ae70/tests/integration/test_api_roundtrip.py :370
import subprocess as _subprocess - shell (weak) phasespace-labs-palinode-194ae70/tests/integration/test_mcp_stdio.py :18
import subprocess - shell (weak) phasespace-labs-palinode-194ae70/tests/test_api_bearer_auth.py :45
import subprocess - shell (weak) phasespace-labs-palinode-194ae70/tests/test_archive_on_demand_664.py :18
import subprocess - shell (weak) phasespace-labs-palinode-194ae70/tests/test_bench_longmemeval.py :234
import subprocess - shell (weak) phasespace-labs-palinode-194ae70/tests/test_cli_import_boundary.py :5
import subprocess - shell (weak) phasespace-labs-palinode-194ae70/tests/test_cli_init.py :15
import subprocess - shell (weak) phasespace-labs-palinode-194ae70/tests/test_cli_stop.py :1
import subprocess - shell (weak) phasespace-labs-palinode-194ae70/tests/test_collection_integrity.py :32
import subprocess - shell (weak) phasespace-labs-palinode-194ae70/tests/test_consolidation_dry_run.py :3
import subprocess - shell (weak) phasespace-labs-palinode-194ae70/tests/test_consolidation_status_write_path.py :18
import subprocess - shell (weak) phasespace-labs-palinode-194ae70/tests/test_default_db_guard_scope.py :26
import subprocess - shell (weak) phasespace-labs-palinode-194ae70/tests/test_deploy_systemd.py :15
import subprocess - shell (weak) phasespace-labs-palinode-194ae70/tests/test_doctor_git_commit_ready.py :11
import subprocess - shell (weak) phasespace-labs-palinode-194ae70/tests/test_doctor_phase5.py :20
import subprocess - shell (weak) phasespace-labs-palinode-194ae70/tests/test_forget_write_time.py :21
import subprocess - shell (weak) phasespace-labs-palinode-194ae70/tests/test_frontmatter_backfill_309.py :19
import subprocess - shell (weak) phasespace-labs-palinode-194ae70/tests/test_git_tools_diff.py :31
import subprocess - shell (weak) phasespace-labs-palinode-194ae70/tests/test_git_tools_history.py :20
import subprocess - shell (weak) phasespace-labs-palinode-194ae70/tests/test_mcp_http_bind_gate.py :22
import subprocess - shell (weak) phasespace-labs-palinode-194ae70/tests/test_migrate_openclaw.py :55
os.system(f"git init -q {mem} 2>/dev/null") - shell (weak) phasespace-labs-palinode-194ae70/tests/test_no_build_artifacts_tracked.py :11
import subprocess - shell (weak) phasespace-labs-palinode-194ae70/tests/test_parity_is_dependency_free.py :65
import subprocess - shell (weak) phasespace-labs-palinode-194ae70/tests/test_proposer_seam.py :17
import subprocess - shell (weak) phasespace-labs-palinode-194ae70/tests/test_save_git_committed.py :23
import subprocess - shell (weak) phasespace-labs-palinode-194ae70/tests/test_security_narrowed_exceptions.py :14
import subprocess - shell (weak) phasespace-labs-palinode-194ae70/tests/test_session_end.py :3
import subprocess - shell (weak) phasespace-labs-palinode-194ae70/tests/test_session_end_envelope_guard.py :23
import subprocess - shell (weak) phasespace-labs-palinode-194ae70/tests/test_session_end_floor_hook.py :19
import subprocess - shell (weak) phasespace-labs-palinode-194ae70/tests/test_session_start_hook.py :22
import subprocess - shell (weak) phasespace-labs-palinode-194ae70/tests/test_setup_worktree.py :20
import subprocess - shell (weak) phasespace-labs-palinode-194ae70/tests/test_subprocess_argv_form.py :42
# subprocess.run(...) or sp.run(...) -- any module attribute - shell (weak) phasespace-labs-palinode-194ae70/tests/test_trace_536.py :21
import subprocess - shell (weak) phasespace-labs-palinode-194ae70/tests/test_ui_phase1.py :21
import subprocess - shell (weak) phasespace-labs-palinode-194ae70/tests/test_user_prompt_submit_hook.py :19
import subprocess - shell (weak) phasespace-labs-palinode-194ae70/tests/test_utf8_encoding_guard.py :28
import subprocess - shell (weak) phasespace-labs-palinode-194ae70/tests/test_watcher_thread_shutdown.py :26
import subprocess - shell (weak) phasespace-labs-palinode-194ae70/tests/test_worktree_reconcile.py :9
import subprocess
network 40
- net phasespace-labs-palinode-194ae70/bench/longmemeval/data.py :6
import urllib.request - net phasespace-labs-palinode-194ae70/bench/longmemeval/llm.py :27
import urllib.error - net phasespace-labs-palinode-194ae70/palinode/api/server.py :16
from urllib.parse import urlparse - net phasespace-labs-palinode-194ae70/palinode/api/ui/router.py :25
import socket - net phasespace-labs-palinode-194ae70/palinode/cli/_api.py :2
import httpx - net phasespace-labs-palinode-194ae70/palinode/consolidation/run_lock.py :14
import socket - net phasespace-labs-palinode-194ae70/palinode/core/ollama_client.py :44
import httpx - net phasespace-labs-palinode-194ae70/palinode/diagnostics/checks/reindex_state.py :19
import httpx - net phasespace-labs-palinode-194ae70/palinode/diagnostics/checks/service.py :25
import httpx - net phasespace-labs-palinode-194ae70/palinode/indexer/watcher.py :19
import urllib.request - net phasespace-labs-palinode-194ae70/palinode/ingest/pipeline.py :22
import httpx - net phasespace-labs-palinode-194ae70/palinode/mcp.py :41
import httpx - net (weak) phasespace-labs-palinode-194ae70/tests/integration/test_mcp_e2e.py :5
to the Palinode API, which we redirect in-process via an ``httpx.MockTransport`` - net (weak) phasespace-labs-palinode-194ae70/tests/integration/test_mcp_e2e_rel_path.py :5
``test_mcp_e2e.py`` (``httpx.MockTransport`` shim over FastAPI's - net (weak) phasespace-labs-palinode-194ae70/tests/integration/test_mcp_stdio.py :17
import socket - net (weak) phasespace-labs-palinode-194ae70/tests/integration/test_session_end_e2e_l1_l3.py :21
(``palinode.cli._api.api_client``) has its underlying ``httpx.Client`` swapped for one - net (weak) phasespace-labs-palinode-194ae70/tests/live/test_live_instance.py :22
import httpx - net (weak) phasespace-labs-palinode-194ae70/tests/test_api_bearer_auth.py :509
# middleware armed: MCP over ``httpx.ASGITransport``, the CLI over a transport - net (weak) phasespace-labs-palinode-194ae70/tests/test_auto_summary_async.py :280
# Phase 5: liveness now goes through OllamaClient.ping, not httpx.get. - net (weak) phasespace-labs-palinode-194ae70/tests/test_bench_longmemeval.py :156
monkeypatch.setattr(llm.urllib.request, "urlopen", fake_urlopen) - net (weak) phasespace-labs-palinode-194ae70/tests/test_bench_rowe_pipeline.py :123
monkeypatch.setattr(llm.urllib.request, "urlopen", lambda req, timeout=None: Resp()) - net (weak) phasespace-labs-palinode-194ae70/tests/test_body_size_limit.py :17
import socket - net (weak) phasespace-labs-palinode-194ae70/tests/test_cli_error_exit_codes.py :6
import httpx - net (weak) phasespace-labs-palinode-194ae70/tests/test_cold_save_fast_return.py :13
httpx.MockTransport where a client is needed. - net (weak) phasespace-labs-palinode-194ae70/tests/test_consolidation_run_lock.py :10
import socket - net (weak) phasespace-labs-palinode-194ae70/tests/test_description_graceful_degrade.py :18
than calling httpx.post directly, so these tests patch the client seam - net (weak) phasespace-labs-palinode-194ae70/tests/test_doctor_mcp.py :20
import httpx - net (weak) phasespace-labs-palinode-194ae70/tests/test_doctor_phase5.py :379
"palinode.diagnostics.checks.reindex_state.httpx.get", - net (weak) phasespace-labs-palinode-194ae70/tests/test_doctor_service_checks.py :72
"""Return a mock that looks like an httpx.Response.""" - net (weak) phasespace-labs-palinode-194ae70/tests/test_embed_nan_input.py :19
faked at the HTTP layer (``httpx.MockTransport``) with the exact 500 body. - net (weak) phasespace-labs-palinode-194ae70/tests/test_fallback.py :5
`httpx.post`. The fallback chain (primary → fallbacks) stays in the runner; each attempt - net (weak) phasespace-labs-palinode-194ae70/tests/test_first_run_ux.py :9
Network is driven through httpx.MockTransport (real httpx exception types); no - net (weak) phasespace-labs-palinode-194ae70/tests/test_health_endpoint_accuracy.py :116
with mock.patch("httpx.get"): # skip Ollama reachability check - net (weak) phasespace-labs-palinode-194ae70/tests/test_mcp.py :13
import httpx - net (weak) phasespace-labs-palinode-194ae70/tests/test_mcp_is_error.py :16
import httpx - net (weak) phasespace-labs-palinode-194ae70/tests/test_mcp_parity.py :30
"""Minimal stand-in for an httpx.Response — only what the dispatch reads.""" - net (weak) phasespace-labs-palinode-194ae70/tests/test_ollama_client.py :13
httpx.MockTransport drives real httpx exception types through the retry path. - net (weak) phasespace-labs-palinode-194ae70/tests/test_reindex_concurrency.py :183
mock.patch("httpx.get"), - net (weak) phasespace-labs-palinode-194ae70/tests/test_review_cli.py :19
import httpx - net (weak) phasespace-labs-palinode-194ae70/tests/test_search_embedder_outage.py :9
import httpx
secrets 2
- secrets phasespace-labs-palinode-194ae70/bench/longmemeval/llm.py :48
key = os.environ.get(p + "API_KEY") or os.environ.get("OPENAI_API_KEY", "") - secrets phasespace-labs-palinode-194ae70/palinode/core/auth.py :54
env_tok = os.environ.get("PALINODE_API_TOKEN", "").strip()
database 19
- db phasespace-labs-palinode-194ae70/palinode/core/store.py :14
import sqlite3 - db phasespace-labs-palinode-194ae70/palinode/diagnostics/checks/db_path.py :20
import sqlite3 - db phasespace-labs-palinode-194ae70/palinode/diagnostics/checks/fts5_sync.py :28
import sqlite3 - db phasespace-labs-palinode-194ae70/palinode/diagnostics/checks/index_size.py :27
import sqlite3 - db phasespace-labs-palinode-194ae70/palinode/diagnostics/checks/phantom_db.py :29
import sqlite3 - db phasespace-labs-palinode-194ae70/palinode/diagnostics/checks/recall_write_health.py :30
import sqlite3 - db phasespace-labs-palinode-194ae70/palinode/diagnostics/checks/service.py :22
import sqlite3 - db (weak) phasespace-labs-palinode-194ae70/tests/test_default_db_guard_scope.py :25
import sqlite3 - db (weak) phasespace-labs-palinode-194ae70/tests/test_doctor_fix.py :21
import sqlite3 - db (weak) phasespace-labs-palinode-194ae70/tests/test_doctor_fts5_sync.py :11
import sqlite3 - db (weak) phasespace-labs-palinode-194ae70/tests/test_doctor_path_checks.py :16
import sqlite3 - db (weak) phasespace-labs-palinode-194ae70/tests/test_doctor_phase5.py :19
import sqlite3 - db (weak) phasespace-labs-palinode-194ae70/tests/test_doctor_service_checks.py :21
import sqlite3 - db (weak) phasespace-labs-palinode-194ae70/tests/test_read_recall_e2e.py :25
import sqlite3 - db (weak) phasespace-labs-palinode-194ae70/tests/test_recent_save_embeddings_db_error.py :11
import sqlite3 - db (weak) phasespace-labs-palinode-194ae70/tests/test_store.py :3
import sqlite3 - db (weak) phasespace-labs-palinode-194ae70/tests/test_store_wal_indexes.py :18
import sqlite3 - db (weak) phasespace-labs-palinode-194ae70/tests/test_triggers_vec_upsert.py :24
import sqlite3 - db (weak) phasespace-labs-palinode-194ae70/tests/test_write_chunk_row_vec_failure.py :21
import sqlite3
declared dependencies 19
- mcp@>=2,<3
- sqlite-vec@>=0.1.6
- watchdog@>=4.0
- pyyaml@>=6.0,<7.0
- httpx@>=0.27
- python-frontmatter@>=1.1
- fastapi@>=0.115,<0.137
- uvicorn@>=0.32
- pydantic@>=2.7,<3.0
- rich@>=13.7
- click@>=8.1
- jinja2@>=3.1.5
- markdown-it-py@>=3.0
- nh3@>=0.2.18
- pytest@*
- pytest-asyncio@*
- pytest-timeout@*
- ruff@*
- bandit@*