nisa = {
"role": "Software Engineer",
"based": "Türkiye 🇹🇷",
"tracks": ["retrieval-grounded AI", "production web systems"],
"flagships": {
"Anamnesis": "hospital assistant that answers only from what it retrieved",
"Titulus": "law practice portal — live, 2,468 articles, run by the client",
},
"stack": {
"ai": ["RAG", "tool-calling agents", "LLM APIs", "vector search"],
"backend": ["Python", "FastAPI", "PHP", ".NET", "SQLite"],
"frontend": ["JavaScript", "React", "TypeScript", "PyQt6"],
"signals": ["OpenCV", "librosa", "Arduino", "ESP32", "C++"],
},
"rule": lambda claim: claim if measurable(claim) else labelled(claim),
"shipping": "systems that still run after I stop touching them",
}STATUS |
SYSTEM |
WHAT IT DOES |
STACK |
|---|---|---|---|
| 🟢 LIVE | Titulus | Law practice portal in daily use. 2,468-article legislation library, daily Official Gazette feed, database-free admin panel the client runs himself. | PHP JS JSON Apache |
| 🧪 CI ✅ | Anamnesis | Hospital assistant that can only answer from what it retrieved. Clinical questions refused before the agent runs. No write path exists — a test proves it. | RAG agents FastAPI NumPy |
| 🧪 CI ✅ | LetheFS | Autonomous forgetting file system. Recall decays along the Ebbinghaus curve into a reversible quarantine. Nothing is deleted silently. | FastAPI WebSocket JS |
| 🧪 CI ✅ | Aurora | Live audio → pitch, timbre, loudness → a volumetric raymarching shader. Every session is a one-time piece. | librosa GLSL p5.js |
| 🧪 CI ✅ | Unicorn | Solar search-and-rescue rover. Raises its own Wi-Fi, serves a command centre from flash, reports position as a disc with a growing radius — because it has no encoders. | ESP32 C++ Python |
| 🧪 CI ✅ | Helixir | AES-256-GCM file encryption with a DNA representation layer. The A/C/G/T layer is representation — the cipher is AES. | PyQt6 scrypt AES-GCM |
| 🧪 CI ✅ | BOZGUN | Colour-tracking turret. Pixel position → pan/tilt servo angles over serial. Simulated hit, no projectile. | OpenCV Arduino serial |
| 🧪 CI ✅ | Orchidia | Orchid identification and care. Classifier reads the species, then checks readings against that species' range. | Flask transfer learning |
| 🔧 BUILD | Cardia | Single-lead ECG. R-peaks found on-device — adaptive threshold, refractory window, interval gating — streamed to a dependency-free dashboard. | Arduino AD8232 DSP |
![]() |
![]() |
![]() |
| AURORA · sound driving a shader | LETHEFS · files decaying into quarantine | BOZGUN · detect → track → lock on |
GROUNDED_ANSWERS // CITATION_TRACKING // SEMANTIC_CHUNKING // OFFLINE_FALLBACK // REFUSAL_LAYERS
R_PEAK_DETECTION // COLOUR_TRACKING // DEAD_RECKONING // FFT // ADAPTIVE_THRESHOLDING
Portfolios only show finished things, which makes everything look equally easy. These are real defects I found in my own work, and the change each one forced.
! ANAMNESIS · the offline vectoriser collided
- a question about currency hedging retrieved a triage document, score 0.11
+ lexical gate added: a passage must share a real term before it counts as evidence
+ two tests — one asserts off-topic queries return nothing, one asserts that
+ WITHOUT the gate they would not, so the guard cannot be removed silently
! CARDIA · the dashboard showed a blood-pressure figure
- an AD8232 cannot measure blood pressure
+ removed; modelled values are now labelled as modelled
! UNICORN · position reported as a bare coordinate
- no wheel encoders, so dead reckoning drifts and a coordinate hides that
+ position is a disc with an uncertainty radius, different constants when uncalibrated
- two motor pins sat on ESP32 strapping pins; a blocking pulseIn stalled the loop
+ repinned and replaced — both caught by moving mission logic off the board
! HELIXIR · the README framed the DNA layer as encryption
- encoding is not encryption
+ reframed: AES-256-GCM does the work, A/C/G/T is representation
! ORCHIDIA · the UI said "live conditions" over simulated readings
+ says simulated now, in the interface and in the docsThe pattern is the same every time. The bug was never the algorithm — it was a claim the system was not entitled to make.
# 1 · a grounded answer, and the evidence behind it
git clone https://github.com/nisamaasoglu/anamnesis && cd anamnesis
pip install -r requirements.txt && python run.py
# ask "What are the visiting hours in the intensive care unit?"
# → the answer names the document and section it used
# ask "Do I have cancer?"
# → refused before any tool runs, with the route to a human
# 2 · the tests that hold it together
pip install -r requirements-dev.txt && python -m pytest -q # 45 passed
# 3 · firmware logic, verified with no hardware attached
git clone https://github.com/nisamaasoglu/Unicorn && cd Unicorn
./tools/run_tests.shAnamnesis 45 · Helixir 25 · Aurora 16 · Orchidia 13 — plus Unicorn's host-compiled C++ suite. CI runs ruff and pytest on Python 3.10 / 3.11 / 3.12 on every push.
[01] TEST THE DECISION, NOT THE DEVICE
The logic that decides — is this a heartbeat, is this a survivor, has this
file been forgotten, is this passage evidence — is separated from the
hardware or model feeding it. Testable on a laptop with nothing attached.
[02] STATE THE UNCERTAINTY
An estimate that reports its own error is worth more than a confident
number that quietly lies.
[03] DECLARE THE MODE
Anamnesis reports generative:false when no model is running. Cardia prints
"--" with no electrode. Orchidia labels simulated readings as simulated.
A system that hides which mode it is in is lying politely.
[04] DOCUMENT WHAT EXISTS
No roadmaps. No planned features. No claim I could not defend in a
technical interview.


