Commit Graph

317 Commits

Author SHA1 Message Date
Dominik Seemann fb0ac4b5fe fix(graph): replace passthrough reranker with ollama-backed cross-encoder
Graphiti's default cross-encoder hard-codes the OpenAI gpt-4.1-nano model
and depends on OpenAI-specific logprobs/logit_bias, so the adapter has
been injecting a no-op _PassthroughReranker just to keep search code
paths working. Search results consumed by SearchResult, InsightForge,
Panorama, and Interview were therefore returned in Graphiti's RRF order
with no real reranking signal.

Add an Ollama-backed CrossEncoderClient that scores passages through a
local chat model via the OpenAI-compatible /v1 surface and wire it into
_get_graphiti() behind a RERANKER_PROVIDER switch (default: ollama).
Construction is side-effect-free and the rank() method never raises:
per-passage parse failures degrade to a deterministic low score, and a
whole-call failure falls back to passthrough order with a single WARNING
log so Flask keeps serving when Ollama is unreachable. Setting
RERANKER_PROVIDER=none preserves the legacy passthrough for CI and slim
containers that cannot pull the model.

Closes #39
2026-05-11 10:39:50 +00:00
Dominik Seemann ebeff4940d fix(graph): default embeddings to local ollama and gate empty graph builds
Two coupled changes that together restore non-empty post-migration graph
builds and remove the silent "succeeded but empty" outcome.

Root cause: Config defaulted EMBEDDING_MODEL to OpenAI text-embedding-3-small
(1536 dim), but Graphiti's Neo4j vector index is 1024 dim. With the
documented Dashscope LLM default, EMBEDDING_API_KEY/EMBEDDING_BASE_URL
fell back to LLM_*, producing either a 4xx (since #29 propagates as
Task.FAILED) or a write that landed metadata but no entities.

Changes:
- Flip Config defaults to local Ollama (mxbai-embed-large, 1024 dim,
  http://localhost:11434/v1). Override semantics unchanged: explicit
  EMBEDDING_* env vars continue to win, so existing OpenAI/Gemini setups
  are not affected.
- Gate _build_graph_worker on a non-zero entity-node count before
  complete_task. Mirrors the existing _recover_stuck_projects rule;
  surfaces any residual silent failure as Task.FAILED with the new
  progress.emptyGraphFailure locale key, instead of marking the project
  GRAPH_COMPLETED on an empty graph.
- Update README, CLAUDE.md, and docker-compose.yml comments to reflect
  Ollama as the active default and OpenAI/Gemini as commented fallbacks.
- The matching .env.example diff is recorded in
  .kiro/specs/graph-build-empty-fix/HANDOFF.md for manual operator apply
  (file is hook-protected from the assistant).

Spec: .kiro/specs/graph-build-empty-fix/

Closes #37
2026-05-11 09:43:28 +00:00
Dominik Seemann 54d7fb7828
Merge pull request #32 from salestech-group/feat/25-i18n-oasis-profile-generator-prompts
fix(i18n): translate oasis profile generator prompts to english
2026-05-11 11:21:11 +02:00
Dominik Seemann af9381b359
Merge pull request #30 from salestech-group/fix/23-externalize-chinese-frontend-strings
fix(i18n): externalize chinese ui strings in process and step views
2026-05-11 11:20:52 +02:00
Dominik Seemann 1f256f3683 Merge remote-tracking branch 'origin/main' into feat/25-i18n-oasis-profile-generator-prompts
# Conflicts:
#	.kiro/specs/i18n-oasis-profile-generator-prompts/design.md
#	.kiro/specs/i18n-oasis-profile-generator-prompts/requirements.md
#	.kiro/specs/i18n-oasis-profile-generator-prompts/spec.json
#	.kiro/specs/i18n-oasis-profile-generator-prompts/tasks.md
#	backend/app/services/oasis_profile_generator.py
2026-05-11 11:19:46 +02:00
Dominik Seemann 9df4e155ff Merge remote-tracking branch 'origin/main' into fix/23-externalize-chinese-frontend-strings
# Conflicts:
#	frontend/src/components/Step2EnvSetup.vue
#	frontend/src/components/Step4Report.vue
#	frontend/src/views/Process.vue
2026-05-11 11:16:40 +02:00
Dominik Seemann 056f3664be
Merge pull request #36 from salestech-group/docs/i18n-7-translate-backend-comments
docs(i18n): translate chinese docstrings/comments in backend (full ticket #7)
2026-05-11 11:03:30 +02:00
Dominik Seemann eeef916e49
Merge pull request #35 from salestech-group/feat/11-i18n-locale-parity-ci-guard
feat(i18n): enforce locale-key parity in pr-time ci guard
2026-05-11 11:03:17 +02:00
Dominik Seemann 339cc396dd chore(i18n): refresh cjk baseline and update spec status
backend/app baseline drops from 2792 to 307 after the comment/docstring
translation pass. Mark i18n-translate-backend-comments tasks complete in
the spec and update HANDOFF.md to record the second-installment scope.
Add the AST-aware scanner used during verification under the spec
directory so future audits can re-run it.
2026-05-09 10:59:51 +00:00
Dominik Seemann 5815ed28d2 docs(i18n): translate chinese docstrings/comments in backend/scripts 2026-05-09 10:59:44 +00:00
Dominik Seemann 8189c08166 docs(i18n): translate chinese docstrings/comments in backend/services 2026-05-09 10:59:40 +00:00
Dominik Seemann b5a8996692 docs(i18n): translate chinese docstrings/comments in backend/api 2026-05-09 10:59:36 +00:00
Dominik Seemann 6439e58eb5 Merge branch 'main' into docs/i18n-7-translate-backend-comments
# Conflicts:
#	backend/app/services/ontology_generator.py
2026-05-09 10:40:10 +00:00
Dominik Seemann a7eab1eea1 feat(i18n): enforce locale-key parity in pr-time ci guard
Extend scripts/ci/i18n_cjk_guard.py with a third check that fails any
PR introducing a key in only one of locales/en.json / locales/zh.json.
The new check runs alongside the existing CJK-clean and per-path
ratchet checks, with no short-circuit and the same single-exit-code
contract; the workflow file and CLI flags are untouched.

Live catalogues are already parity-clean (962 keys per side), so the
guard ships green. This addresses acceptance criterion 4 of the
English-support epic ("for every externalized log message, matching
log.* keys exist in both locales/en.json and locales/zh.json") with a
permanent automated guard, complementing the CJK-clean ratchet from #26.

Refs #11
2026-05-09 00:46:37 +00:00
Dominik Seemann e6f939592c
Merge pull request #34 from salestech-group/feat/i18n-3-translate-oasis-profile-prompts
feat(i18n): translate oasis_profile_generator prompts to english
2026-05-08 11:09:17 +02:00
Dominik Seemann 37774accaf
Merge pull request #33 from salestech-group/feat/26-add-i18n-cjk-ci-guard
ci(i18n): add cjk regression guard for every pull request
2026-05-08 11:09:09 +02:00
Dominik Seemann ec669c1d10
Merge pull request #31 from salestech-group/fix/24-externalize-remaining-backend-log-strings
fix(i18n): externalize remaining chinese backend log strings
2026-05-08 11:08:56 +02:00
Dominik Seemann 729a51ea82
Merge pull request #29 from salestech-group/fix/18-graphiti-loud-embedding-failures
fix(graphiti): surface embedding failures and document ollama embedder
2026-05-08 11:08:22 +02:00
Dominik Seemann d3b0b65bda
Merge pull request #28 from salestech-group/docs/i18n-12-readme-tagline-and-assets
docs(i18n): translate readme tagline and rename chinese assets
2026-05-08 11:07:19 +02:00
Dominik Seemann d53f3110dd
Merge pull request #27 from salestech-group/chore/i18n-10-e2e-english-verification
chore(i18n): add e2e english verification spec, audit, and report
2026-05-08 11:06:46 +02:00
Dominik Seemann 777302bc61
Merge pull request #22 from salestech-group/docs/i18n-9-translate-frontend-comments
docs(i18n): translate chinese comments in frontend src to english
2026-05-08 11:03:59 +02:00
Dominik Seemann 3793c960e8 feat(i18n): translate oasis_profile_generator prompts to english
Translate the system prompt and the individual / group persona prompt
builders in backend/app/services/oasis_profile_generator.py from
Chinese to English. The base prompt language was biasing persona
prose (bio, persona, profession, interested_topics) toward Chinese
even under Accept-Language: en, despite the existing
get_language_instruction() postfix mechanism. Translating the base
prompts removes that bias.

All locale-steering call sites are preserved verbatim (the inline
{get_language_instruction()} in each builder, the system-prompt
assembly), so non-English locales continue to receive Chinese output
of equivalent quality. Locale-independent constraints stay English
inside the prompt: gender stays the literal "male"/"female" enum
for individuals and "other" for groups; age stays an integer (30
for institutional accounts). The two attrs_str / context_str fallback
defaults ("无", "无额外上下文") are translated to "None" /
"No additional context" so they compose with the English body.

The country-language hint country: 国家(使用中文,如"中国") is
dropped during translation; locale now decides the country language
via the postfix.

Out of scope (untouched): logger calls (issue #6, already merged),
docstrings and comments (issue #7), the rule-based fallback
_generate_profile_rule_based, and the resilience helpers
_fix_truncated_json / _try_fix_json. No public API change, no new
dependencies, no edits outside the target file.

Closes #3
2026-05-08 05:44:00 +00:00
Dominik Seemann 081de636f1 ci(i18n): add cjk regression guard for every pull request
Adds a stdlib-only Python script and a new GitHub Actions workflow
that fail any pull request which reintroduces CJK characters into
locales/en.json or which raises the total CJK match count under
backend/app or frontend/src above a committed per-path baseline.

The guard captures the two highest-signal checks of the larger
i18n-e2e-english-verification audit so it can run on every PR with a
sub-second budget and without depending on that pipeline being on
main. The committed baseline lets the codebase ratchet down toward
English-only without blocking unrelated PRs on pre-existing CJK
content; refresh it intentionally via the documented flag.

Closes #26
2026-05-08 00:39:34 +00:00
Dominik Seemann 7f74e0a3f8 fix(i18n): translate oasis profile generator prompts to english
The oasis_profile_generator.py system prompt, both user-message
templates (individual + group personas), the context-builder section
labels embedded into the prompt context, the fallback persona templates,
and the per-batch console output banners were all written in Chinese.
Even when Accept-Language was en, the Chinese base prompt and embedded
section labels biased the LLM toward Chinese persona output.

Translate every owned prompt-assembly literal to English while
preserving all functional contracts: f-string interpolations, the
required JSON output keys, the gender/age literal-token rules, the
get_language_instruction() postfix call sites, the _normalize_gender
mapping (which still accepts Chinese gender keys from upstream),
and the rule-based country: "中国" data default. Logger calls,
docstrings, and inline comments are out of scope (issues #6 / #7)
and were not touched.

Closes #25
2026-05-07 23:36:42 +00:00
Dominik Seemann e60a5a93d3 fix(i18n): externalize remaining chinese backend log strings
Replace the last hard-coded Chinese log/print strings in the Flask
graph API, OASIS profile generator, and retry utility with calls to
the existing t() helper, completing the backend i18n coverage started
by ticket #6 so EN-locale operators see English logs end to end.

Adds nine entries to locales/{en,zh}.json: log.graph_api.m027-m029,
log.profile_generator.m024-m025, and a new log.retry.m001-m004
sub-namespace for the retry utility.

Closes #24
2026-05-07 22:40:18 +00:00
Dominik Seemann 960e3ba81d fix(i18n): externalize chinese ui strings in process and step views
Routes ~50 hard-coded Chinese literals across Process.vue, Step2EnvSetup.vue,
Step3Simulation.vue, Step4Report.vue and Step5Interaction.vue through
vue-i18n, with corresponding entries added in lockstep to locales/en.json and
locales/zh.json (1031 -> 1101 lines each, parity preserved). En-locale users
no longer see Chinese in headers, status messages, error fallbacks, project-
info modals, or chat-history prompt construction.

Backend-coupled regex parsers in Step4Report.vue (28 markers + no-reply
predicate + log-severity helper) are centralised into a frozen REPORT_MARKERS
block at the top of <script setup>, with each entry comment-anchored to its
canonical source line in backend/app/services/zep_tools.py. The block is
allowlisted in the audit script so future English alternates can be added
inline once the backend prompts are translated under spec
i18n-report-agent-prompts (issue #25). The Step2EnvSetup stage watcher gets
the same treatment: a STAGE_PHASE_MAP collapses three Chinese-string
equality checks into a lookup that already accepts both legacy Chinese
display strings and the snake_case backend identifiers.

Adds frontend/scripts/audit-i18n-strings.sh as a local verifier (the
referenced .kiro/specs/i18n-e2e-english-verification audit script no longer
exists). The script greps the five files for non-allowlisted CJK literals,
diffs en.json/zh.json key sets, and guards against an en.json CJK regression
(per #20 / spec i18n-backfill-zh-json). Exits 0 on success.

Closes #23
2026-05-07 21:57:06 +00:00
Dominik Seemann b8de81a539 fix(graphiti): surface embedding failures and document ollama embedder
Replace the silent placeholder-UUID fallback in
_GraphNamespace.add_batch with logger.exception(...) + raise so
embedder misconfiguration (404 unknown model, connection refused, etc.)
fails the surrounding graph-build Task with a visible error instead of
producing a Task that looks completed while the graph stays empty.

Document the existing-but-undocumented Ollama embedder configuration
in .env.example, CLAUDE.md, README.md, and docker-compose.yml.
mxbai-embed-large is the recommended local model because its 1024-dim
output matches Graphiti's default EMBEDDING_DIM. Adds a curl smoke
test to verify embedder reachability before the first graph build.

No new env var or provider literal: Ollama is reached through the
existing openai-provider branch by setting EMBEDDING_BASE_URL,
EMBEDDING_API_KEY, and EMBEDDING_MODEL.

Closes #18
2026-05-07 20:39:42 +00:00
Dominik Seemann 8442a58f9d docs(i18n): translate readme tagline and rename chinese assets
Replace the chinese tagline on README.md and README-EN.md with the
existing english subtitle (collapsing the duplicate stack), and switch
the package.json and backend/pyproject.toml description fields to
english so the project's metadata surface no longer surprises
non-chinese readers.

Rename nine chinese-named static image files under static/image/ to
ASCII slugs (six screenshots, two video covers, the QQ-group image)
via git mv so rename history is preserved, and update every <img src>
in README.md, README-EN.md, and README-ZH.md to the new paths. The
chinese body text of README-ZH.md is preserved by design.

A ripgrep scan for chinese characters in README.md and README-EN.md
(excluding the language-switcher line) now returns zero matches,
satisfying the ticket's acceptance criteria.

Closes #12
2026-05-07 19:39:30 +00:00
Dominik Seemann 348140859d chore(i18n): add e2e english verification spec, audit, and report
Spec under .kiro/specs/i18n-e2e-english-verification/ defines a read-only
verification pipeline that classifies every CJK match in backend/app,
frontend/src, and locales/en.json into deliberate / gap / non-applicable /
review-needed, plus a four-class follow-up grouping (frontend ui strings,
backend log strings, backend prompt-label strings, permanent ci guard).

The captured baseline run at audit/9dcaecd2.../ shows 2916 matches: 237
gaps actionable in follow-up issues #23 #24 #25 #26 (filed by this run),
2299 deliberate (covered by issue #7), and 380 review-needed soft signals.
The verification report comment is posted on issue #10. Locale catalogues
are at full key parity (953/953) and locales/en.json is CJK-clean.

The spec is verification-only: production source under backend/app,
frontend/src, and locales is intentionally untouched. Live UI and
docker-compose walkthrough items in the issue checklist are reported as
manual-pending, with reproduction steps and a re-runnable audit script.

Closes #10
2026-05-07 18:44:13 +00:00
Dominik Seemann 9dcaecd2d2 docs(i18n): translate chinese comments in frontend src to english
Translate chinese developer comments in frontend/src/ to english so
non-chinese-reading maintainers can understand intent without translation
tooling. Pure documentation cleanup with no runtime behavior changes.

Twenty files updated across views, components, api services, App.vue, and
pendingUpload.js. Region-eligibility matrix from .kiro/specs/i18n-
frontend-comments/design.md drives every edit:

- Translate `//`, `/* */`, JSDoc, and Vue `<!-- -->` template comments.
- Drop comments that merely restate the code per dev-guidelines.md.
- Translate console.error/warn/log argument strings (developer-facing).
- Append (#9) to the single chinese-content TODO in views/Process.vue.

Five files retain documented chinese string literals per requirements 1.5
and 4.4: hardcoded UI text and error fallbacks (Process.vue, Step3Simulation.vue),
backend-format regex patterns and i18n-keyed UI labels (Step4Report.vue),
backend stage-key matchers (Step2EnvSetup.vue), and LLM prompt templates
sent to a chinese-tuned model (Step5Interaction.vue). Translating any of
these would either be out of scope (UI strings belong in /locales/*.json)
or would change runtime behavior.

Verification: `rg '[\x{4e00}-\x{9fff}]' frontend/src/` returns 5 documented
files; `npm run build` exits 0 with the same Vite output as before.

Closes #9
2026-05-07 17:42:05 +00:00
Dominik Seemann 063b7fb17d
Merge pull request #21 from salestech-group/fix/i18n-8-backfill-zh-json
fix(i18n): backfill english-only entries in zh.json
2026-05-07 17:41:55 +02:00
Dominik Seemann 0a65edfa46 fix(i18n): backfill english-only entries in zh.json
translate nine user-facing english values (step3/step4/step5 waiting
states, step5 interactive tools and report-agent chat panel, graph
panel labels) plus the user-visible step 2 log line `log.prepareTaskId`
to natural chinese, so chinese-locale users no longer see english text
mixed into the chinese ui.

`home.heroDescBrand` is intentionally left as the literal `MiroFish`
because it is a brand name. `log.prepareTaskId` was translated rather
than kept english because it is rendered into the in-ui log panel via
`Step2EnvSetup.vue:801` and every surrounding `log.*` value in zh.json
is already translated; the leading two-space indent, the `└─`
continuation glyph, and the `{taskId}` placeholder are preserved.

en.json and zh.json key sets remain identical
(`paths(scalars)` diff is empty); no frontend code is changed.

Closes #8
2026-05-07 15:32:30 +00:00
Dominik Seemann b15dc2ea2c
Merge pull request #19 from salestech-group/feat/i18n-6-externalize-backend-logs
feat(i18n): externalize chinese log and api response strings
2026-05-07 17:09:38 +02:00
Dominik Seemann 4f6d5d19a8
Merge pull request #17 from salestech-group/feat/i18n-5-translate-report-agent-prompts
feat(i18n): translate report_agent react prompts to english
2026-05-07 17:08:22 +02:00
Dominik Seemann 0f3ba443dd
Merge pull request #16 from salestech-group/feat/i18n-4-translate-sim-config-prompts
feat(i18n): translate simulation_config_generator prompts to english
2026-05-07 17:07:52 +02:00
Dominik Seemann 1632aaf5fa
Merge pull request #14 from salestech-group/feat/2-translate-ontology-generator-prompts
feat(i18n): translate ontology_generator prompts to english
2026-05-07 17:06:59 +02:00
Dominik Seemann 2ba84f4c8b docs(spec): add i18n-translate-backend-comments spec and handoff 2026-05-07 14:53:47 +00:00
Dominik Seemann c8c455ceb4 docs(i18n): translate chinese docstrings/comments in backend/scripts/{test_profile_format,action_logger} 2026-05-07 14:51:05 +00:00
Dominik Seemann e1019d91cb docs(i18n): translate chinese docstrings/comments in backend root, api init, simulation_ipc, simulation_manager, zep_entity_reader 2026-05-07 14:49:20 +00:00
Dominik Seemann e3f7defefc docs(i18n): translate chinese docstrings/comments in backend/app/{models,utils} and partial services 2026-05-07 14:44:08 +00:00
Dominik Seemann 74997fd088 feat(i18n): externalize chinese log and api response strings
Extract every Chinese string inside backend logger.{info,warning,error,
debug,exception} calls and inside user-facing jsonify({"error|message":
...}) responses across the listed in-scope modules into
locales/{en,zh}.json under nested namespaces (log.<module>.*,
api.{error,message}.<scope>.*). Locale dictionaries stay structurally
identical; the existing flat frontend-facing keys at log.* / api.* are
left untouched. The locale helper (backend/app/utils/locale.py) now
emits a single deduplicated mirofish.locale warning per (locale, key)
pair when a translation is missing instead of silently returning the
raw key, so unknown keys are visible without crashing requests or
background tasks. A repo-root scripts/check_i18n_logs.py verifier
performs an AST-aware source scan for residual Chinese inside the
in-scope logger/jsonify calls and a recursive parity diff between
en.json and zh.json — both modes pass.

Why: backend logs and API errors previously emitted Chinese-only
strings, leaving English-speaking operators with unreadable log
aggregator output and API consumers with locale-mismatched error
messages. The t() helper and per-thread set_locale propagation already
existed; this change makes every backend caller route through them.

Closes #6
2026-05-07 13:52:22 +00:00
Dominik Seemann 22a3ca7af5 feat(i18n): translate report_agent react prompts to english
translate every llm-facing string-literal in
backend/app/services/report_agent.py — the four tool-description
constants, the plan/section/chat system+user prompts, the react loop
templates, the inline messages re-injected during the section and chat
loops, the _execute_tool error returns, and the plan_outline default and
fallback outline content. preserve every {interpolation} token, the
literal final answer: trigger and <tool_call> xml tag, the four primary
tool names, and all three get_language_instruction() postfix call sites.
also switch the unused-tools join separator from "、" to ", " so it
renders naturally inside the now-english react templates.

removes the chinese language bias that the english postfix alone could
not overcome — under accept-language: en the report agent now produces
english-flavoured analytical reports and chat replies; under
accept-language: zh the postfix continues to steer the model into
chinese with no semantic delta. logger calls (#6) and docstrings or
comments (#7) are deliberately untouched.

Closes #5
2026-05-07 12:49:23 +00:00
Dominik Seemann 6c2a412196 feat(i18n): translate simulation_config_generator prompts to english
translate the three llm prompt blocks plus the two prompt-feeding helpers
(_build_context, _summarize_entities) in
backend/app/services/simulation_config_generator.py from chinese to english.
the chinese base prompts were biasing the model toward chinese structure
and lexical choice for content, narrative_direction, hot_topics, and
reasoning fields even when accept-language was en, because
get_language_instruction() only steers the response language as a
postfix.

translation is in-place and preserves every functional contract: the
json output schema for all three prompts, every variable interpolation,
the per-entity-type heuristic ranges in the agent-config prompt, the
trailing english IMPORTANT directives that lock poster_type to
PascalCase and stance to {supportive,opposing,neutral,observer}, and
all three get_language_instruction() postfix call sites. the two
default-path reasoning literals are translated to locale-agnostic
english so generation_reasoning no longer mixes chinese and english on
the failure path.

logger calls, docstrings, and inline comments are intentionally left
chinese (out of scope; covered by issues #6 and #7). public api,
dataclasses, class constants, and the SimulationParameters payload
shape are unchanged.

Closes #4
2026-05-07 11:43:47 +00:00
Dominik Seemann 080683295d feat(i18n): translate ontology_generator prompts to english
translate the system prompt constant and the user-message template in
backend/app/services/ontology_generator.py from chinese to english.
the chinese base prompt was biasing the model toward chinese structure
and word choice even when accept-language was en, leaving ontology
descriptions and analysis_summary fields chinese-flavoured.

translation is in-place and preserves every functional contract: the
json output schema, the entity-type and relationship-type taxonomies
verbatim, the reserved-attribute-name list, the count and length
constraints, and all f-string interpolations. the
get_language_instruction() postfix call site and the trailing english
identifier-format directive are unchanged, so zh and other locales
continue to receive locale-appropriate descriptions.

logger calls, docstrings, and inline comments are intentionally left
in chinese — they are owned by issues #6 and #7.

a small static guard script (backend/scripts/test_ontology_prompts_no_cjk.py)
ast-parses the module and asserts zero cjk in the system prompt and in
every string literal of _build_user_message except the docstring, so
the regression cannot reappear silently.

Closes #2
2026-05-07 09:40:27 +00:00
Dominik Seemann 3b17c0b9ba
Merge pull request #13 from salestech-group/feat/1-finalize-graphiti-neo4j-migration
feat(graphiti): finalize neo4j migration with provider switch
2026-05-07 10:51:05 +02:00
Dominik Seemann 2badf568e7 feat(graphiti): finalize neo4j migration with provider switch
Adds a Neo4j service to docker-compose so `docker compose up -d` works
on a clean checkout, and unhardcodes Graphiti's LLM/embedder so the
documented default provider (Qwen via Dashscope) actually works.

- docker-compose: neo4j:5-community service with cypher-shell
  healthcheck, named volumes, and `depends_on: service_healthy` on the
  app container; in-Docker NEO4J_URI override leaves the host-mode
  default untouched.
- Config: new GRAPHITI_LLM_PROVIDER (openai|gemini, default openai) plus
  optional EMBEDDING_API_KEY / EMBEDDING_BASE_URL that fall back to the
  chat LLM credentials.
- graphiti_adapter: provider switch inside the singleton factory with
  lazy per-provider imports; Gemini path is preserved exactly. The
  no-op `_GeminiReranker` becomes a provider-agnostic
  `_PassthroughReranker`, still injected explicitly so Graphiti does
  not fall back to its OpenAI-only default reranker.
- Drop the ignored `reranker=` kwarg from `_GraphNamespace.search` and
  the misleading callers in `zep_tools.py` and
  `oasis_profile_generator.py`.
- Refresh `.env.example` to mirror the README env section.

Spec, requirements, and design under
`.kiro/specs/graphiti-neo4j-finalize/`.

Closes #1
2026-05-07 08:43:36 +00:00
Dominik Seemann bb81a48727 Create done.md 2026-05-07 10:14:46 +02:00
Dominik Seemann d4f1a9aee0 chore(claude): bootstrap kiro steering files (Step 5)
Add .kiro/steering/ as persistent project memory for CC-SDD / Kiro
workflows. Three core files (product, tech, structure) capture
purpose, stack, and organization patterns; three custom files
(database, api-standards, error-handling) pin the load-bearing
project-specific conventions:

- group_id isolation and the Graphiti adapter / event-loop singleton
- {success, data|error} envelope and the Task polling contract
- reasoning-model output stripping and the retry_with_backoff helper

Files focus on patterns and decisions, not catalogs, per the
steering-principles "golden rule".
2026-05-07 09:39:38 +02:00
Dominik Seemann 8144290fc6 feat(claude): add CC-SDD planning workflow and /plan command (Step 4)
Adopt CC-SDD (Kiro) as the project's spec-driven planning tool, with
plans persisted in .kiro/specs/ and a checkpoint after every task
(strictest cadence — no code without an approved plan).

CC-SDD install (via npx cc-sdd@latest --claude --lang en):
- .kiro/settings/rules/: EARS format, gap-analysis, design and
  requirements review gates, design discovery, tasks generation,
  steering principles, parallel-task analysis.
- .kiro/settings/templates/: specs (init, requirements, design, tasks,
  research) and steering (product/tech/structure plus optional
  api-standards/auth/db/deployment/error-handling/security/testing).
- .claude/commands/kiro/: 11 Kiro slash commands — spec-init,
  spec-requirements, spec-design, spec-tasks, spec-impl, spec-status,
  steering, steering-custom, validate-gap, validate-design,
  validate-impl.

Local additions:
- .claude/commands/plan.md: /plan [task] wrapper that picks up the task
  from $ARGUMENTS or a single .ticket/<n>.md snapshot, walks the Kiro
  flow (steering -> spec-init -> spec-requirements -> validate-gap ->
  spec-design -> validate-design -> spec-tasks) and stops for human
  approval after each artefact. Refuses "just code it" requests.
- .claude/hooks/session_start.sh: extend to print active tickets
  (.ticket/*.md) and open specs (.kiro/specs/*/) with phase from
  spec.json, alongside the existing branch/state line.

Documentation: .claude/onboarding/step4_workflow/01_tool_decision.md
2026-05-06 18:01:41 +02:00
Dominik Seemann 52f78d9fe3 feat(claude): add /ticket and /ticket-list commands for GitHub Issues (Step 3)
Adapt the Notion onboarding prompt — originally Jira/MCP-oriented — to
this project's actual issue tracker (GitHub at
salestech-group/MiroFish) using the gh CLI.

Slash commands (.claude/commands/):
- /ticket <number>: fetch a GitHub issue via gh, self-assign, try to
  add an in-progress label (skips silently if the label doesn't exist),
  and snapshot the issue (frontmatter + body) to .ticket/<n>.md so
  later planning steps can read the description without refetching.
- /ticket-list: interactive overview of issues; asks for filters
  (open/closed, status, assignee, milestone, labels) and runs a single
  gh issue list with the answers, rendering a compact markdown table.

Workspace:
- .ticket/repo.md declares the target repo (GitHub equivalent of the
  Jira "board.md" referenced in the prompt).
- .gitignore: ignore .ticket/* except repo.md and .gitkeep so cached
  ticket markdowns stay local.

Settings:
- Allow-list gh issue view/list/edit/comment, gh repo view,
  gh pr view/list, gh auth status to avoid permission prompts.

Documentation: .claude/onboarding/step3_planning/01_ticket_sync.md
2026-05-06 17:55:42 +02:00