@@ -156,3 +156,3 @@
 {calendar_markup}
-

Ernährung

SIGHi-Zuordnungen dokumentieren Quellen und Unsicherheit; sie sind keine allgemeine Lebensmittelsicherheitsbewertung.

Keine vollständig klassifizierten Ernährungstage im gewählten Zeitraum.
Zugängliche Datentabelle

Ernährungstag
Datum <input type='date' data-nutrition-day-date><button type='button' data-nutrition-day-open>Tag laden</button>

Histamin und Aphthen

Neutrale Hypothesenansicht: gemeinsam dokumentierte Werte werden transparent gegenübergestellt; unvollständige Eingaben ergeben keinen Index.

Keine vollständigen Datenpaare im gewählten Zeitraum.

Offene Lebensmittel-Zuordnungen

Validierte Aktionen werden lokal vorgemerkt und erst vom privaten Worker angewendet.

+

Ernährung

SIGHi-Zuordnungen dokumentieren Quellen und Unsicherheit; sie sind keine allgemeine Lebensmittelsicherheitsbewertung.

Keine vollständig klassifizierten Ernährungstage im gewählten Zeitraum.
Zugängliche Datentabelle

Ernährungstag
Datum <input type='date' data-nutrition-day-date><button type='button' data-nutrition-day-open>Tag laden</button>

Histamin und Aphthen

Neutrale Hypothesenansicht: gemeinsam dokumentierte Werte werden transparent gegenübergestellt; unvollständige Eingaben ergeben keinen Index.

Keine vollständigen Datenpaare im gewählten Zeitraum.

Offene Lebensmittel-Zuordnungen

Nur Anzeige – Bearbeitung folgt im Ernährungs-Sprint 6G. Validierte Aktionen werden lokal vorgemerkt und erst vom privaten Worker angewendet.

 {record_markup}


Output:
Exit code: 0
Wall time: 0.1 seconds
Output:
Success. Updated the following files:
M scripts/health/dashboard_v5/render.py


The worker supports both the legacy direct symptom call and the new queued payload call now. I’m polling the still-running existing API/calendar test group and rerunning the small failing subset.


Output:
Chunk ID: 3cce99
Wall time: 0.0000 seconds
Process exited with code 0
Original token count: 25
Output:
.................                                              [100%]
27 passed in 60.28s (0:01:00)


The existing Sprint 6C/6D/6E API and day/record contracts passed. I’m rerunning the render/worker subset that previously failed.


python -m py_compile scripts/health/dashboard_v5/read_api.py scripts/health/dashboard_v5/render.py scripts/health/dashboard_v5/data_provider.py scripts/health/dashboard_v5/contracts.py scripts/health/health_dashboard_server.py scripts/health/health_dashboard_action_worker.py


Output:
Chunk ID: 40b760
Wall time: 8.6526 seconds
Process exited with code 0
Original token count: 25
Output:
.....                                                                    [100%]
5 passed in 8.44s


Output:
Chunk ID: 30d611
Wall time: 0.0000 seconds
Process exited with code 0
Original token count: 0
Output:


The previously failing render/worker subset now passes, and static compilation still passes. I’m doing a final tree/status review and a couple of source-level checks for the ECharts/Chart.js contract.


Output:
Chunk ID: e70072
Wall time: 0.0000 seconds
Process exited with code 0
Original token count: 183
Output:
 M database/schema.sql
 M scripts/health/assets/health-assets/dashboard-v5-api-explorer.js
 M scripts/health/assets/health-assets/dashboard-v5.css
 M scripts/health/assets/health-assets/dashboard-v5.js
 M scripts/health/dashboard_v5/contracts.py
 M scripts/health/dashboard_v5/data_provider.py
 M scripts/health/dashboard_v5/read_api.py
 M scripts/health/dashboard_v5/render.py
 M scripts/health/health_dashboard_action_worker.py
 M scripts/health/health_dashboard_server.py
 M tests/fixtures/dashboard_v5_fixture.py
?? docs/adr/0003-dietary-inflammation-model.md
?? scripts/health/assets/health-assets/dashboard-v5-echarts.js
?? tests/browser/dashboard_v5_sprint6g_echarts.spec.js
?? tests/test_dashboard_v5_sprint6g_nutrition.py


Output:
Chunk ID: a3d53d
Wall time: 0.0000 seconds
Process exited with code 0
Original token count: 317
Output:
scripts/health/assets/health-assets/dashboard-v5.js:266:    const chart = node("div", "metric-sparkline");
scripts/health/dashboard_v5/render.py:58:        "<script src='/health-assets/echarts-6.1.0.min.js'></script>"
scripts/health/dashboard_v5/render.py:59:        "<script src='/health-assets/dashboard-v5-echarts-prototype.js'></script>"
scripts/health/dashboard_v5/render.py:63:        "<script src='/health-assets/echarts-6.1.0.min.js'></script>"
scripts/health/dashboard_v5/render.py:64:        "<script src='/health-assets/dashboard-v5-echarts.js'></script>"
scripts/health/dashboard_v5/render.py:162:{'' if explorer_6c else "<script src='/health-assets/chart.umd.min.js'></script>"}{echarts_scripts}{range_scripts}<script src='/health-assets/dashboard-v5.js'></script>{explorer_scripts}{calendar_scripts}{record_scripts}{global_search_scripts}{prototype_scripts}
tests/test_dashboard_v5_sprint6g_nutrition.py:48:    assert html.count("/health-assets/echarts-6.1.0.min.js") == 1
tests/test_dashboard_v5_sprint6g_nutrition.py:49:    assert "/health-assets/dashboard-v5-echarts.js" in html
tests/test_dashboard_v5_sprint6g_nutrition.py:50:    assert "chart.umd.min.js" not in html
tests/test_dashboard_v5_sprint6g_nutrition.py:53:    assert "<svg" not in html


Output:
Chunk ID: c7a78b
Wall time: 0.0000 seconds
Process exited with code 0
Original token count: 426
Output:
tests/test_dashboard_v5_sprint6g_nutrition.py:78:    assert not any(forbidden in serialized for forbidden in ("raw_json", "source_product_id", "http://", "https://", "/home/", "/tmp/", ".hermes"))
tests/test_dashboard_v5_sprint6g_nutrition.py:82:    assert "source_product_id" not in json.dumps(queue)
scripts/health/dashboard_v5/read_api.py:94:    r"(?:/home/|/tmp/|/Users/|/(?:var|etc|usr|opt|srv|root|run|mnt|media|private)/|"
scripts/health/dashboard_v5/read_api.py:97:    r"\.hermes(?:/|$))",
scripts/health/dashboard_v5/read_api.py:236:    include_raw_json: bool = False,
scripts/health/dashboard_v5/read_api.py:238:    if include_raw_json:
scripts/health/dashboard_v5/read_api.py:240:                        file_name,file_hash,raw_json
scripts/health/dashboard_v5/read_api.py:314:        connection, "blood_pressure", start, end, include_raw_json=True
scripts/health/dashboard_v5/read_api.py:323:            payload = json.loads(str(row["raw_json"] or ""))
scripts/health/dashboard_v5/read_api.py:1858:                               d.local_original_path,d.dateipfad,f.chunk_no,
scripts/health/dashboard_v5/read_api.py:1884:                         d.extrahierte_inhalte,d.local_original_path,d.dateipfad,
scripts/health/dashboard_v5/read_api.py:1914:            row["local_original_path"] or row["dateipfad"], reviewed=reviewed
scripts/health/dashboard_v5/read_api.py:1986:    sql = "SELECT id,document_date,kategorie,institution,daten_typ,review_status,processing_quality,groessekbytes,datei_hash,upload_datum,extrahierte_inhalte,local_original_path,dateipfad FROM dokumente"
scripts/health/dashboard_v5/read_api.py:2014:        row["local_original_path"] or row["dateipfad"], reviewed=True


The source-level check confirms health-record render still references Chart.js only for non-Explorer/non-record profiles; the health-record test asserts it is absent in rendered HTML. One existing server test needs a listening socket and is blocked by the sandbox, so I’ll run the rest without that test.


pytest -q tests/test_health_dashboard_v5.py -k 'not server_exposes_v5_preview_and_exact_asset_allowlist' tests/test_dashboard_v5_sprint6e4a_recovery.py


pytest -q tests/test_dashboard_v5_sprint6c_api_contracts.py tests/test_dashboard_v5_sprint6d_day_calendar.py tests/test_dashboard_v5_sprint6e_record.py tests/test_dashboard_v5_sprint6g_nutrition.py


Output:
Chunk ID: 389de8
Wall time: 18.4531 seconds
Process exited with code 0
Original token count: 29
Output:
.......................                                                  [100%]
23 passed, 1 deselected in 18.23s


Output:
Chunk ID: eecfb7
Wall time: 30.0019 seconds
Process running with session ID 19158
Original token count: 3
Output:
...........


The non-socket V5 health tests passed. I’m waiting on the combined API/day/record/new nutrition run to finish.


Output:
Chunk ID: 42d347
Wall time: 30.0009 seconds
Process running with session ID 19158
Original token count: 5
Output:
..................


The combined focused run is still progressing normally; I’m polling it once more rather than leaving a test session open.


Output:
Chunk ID: 16e47a
Wall time: 0.0000 seconds
Process exited with code 0
Original token count: 21
Output:
.                                           [100%]
30 passed in 65.00s (0:01:04)


All focused Python checks are complete. I’m collecting the final changed-file list and test summary now.


tmpdir=$(mktemp -d /tmp/hm6g.XXXXXX); python tests/fixtures/dashboard_v5_fixture.py "$tmpdir/fixture.db" >/dev/null && python scripts/health/health_dashboard_v5.py --db "$tmpdir/fixture.db" --output "$tmpdir/v5.html" --today 2026-06-15 --generated-at 2026-06-15T12:00:00+00:00 --health-record-6e >/dev/null && python - <<'PY' "$tmpdir/v5.html"
from pathlib import Path
import sys
html=Path(sys.argv[1]).read_text()
print('echarts_script_count=', html.count('/health-assets/echarts-6.1.0.min.js'))
print('chartjs_present=', 'chart.umd.min.js' in html)
print('svg_present=', '<svg' in html)
PY


Output:
Chunk ID: ed0c71
Wall time: 0.0000 seconds
Process exited with code 0
Original token count: 183
Output:
 M database/schema.sql
 M scripts/health/assets/health-assets/dashboard-v5-api-explorer.js
 M scripts/health/assets/health-assets/dashboard-v5.css
 M scripts/health/assets/health-assets/dashboard-v5.js
 M scripts/health/dashboard_v5/contracts.py
 M scripts/health/dashboard_v5/data_provider.py
 M scripts/health/dashboard_v5/read_api.py
 M scripts/health/dashboard_v5/render.py
 M scripts/health/health_dashboard_action_worker.py
 M scripts/health/health_dashboard_server.py
 M tests/fixtures/dashboard_v5_fixture.py
?? docs/adr/0003-dietary-inflammation-model.md
?? scripts/health/assets/health-assets/dashboard-v5-echarts.js
?? tests/browser/dashboard_v5_sprint6g_echarts.spec.js
?? tests/test_dashboard_v5_sprint6g_nutrition.py


Output:
Chunk ID: 579389
Wall time: 0.0000 seconds
Process exited with code 0
Original token count: 195
Output:
 database/schema.sql                                |  27 +++
 .../health-assets/dashboard-v5-api-explorer.js     |   2 +-
 .../health/assets/health-assets/dashboard-v5.css   |  15 +-
 .../health/assets/health-assets/dashboard-v5.js    | 176 +++++++++++---
 scripts/health/dashboard_v5/contracts.py           |  17 +-
 scripts/health/dashboard_v5/data_provider.py       |  15 +-
 scripts/health/dashboard_v5/read_api.py            | 256 ++++++++++++++++++++
 scripts/health/dashboard_v5/render.py              |  14 +-
 scripts/health/health_dashboard_action_worker.py   | 263 ++++++++++++++++++++-
 scripts/health/health_dashboard_server.py          |  90 ++++++-
 tests/fixtures/dashboard_v5_fixture.py             |  16 +-
 11 files changed, 817 insertions(+), 74 deletions(-)


Output:
Chunk ID: 9e12c3
Wall time: 2.5478 seconds
Process exited with code 0
Original token count: 17
Output:
echarts_script_count= 1
chartjs_present= False
svg_present= False


Implemented Sprint 6G-A on the current working tree. No commit/push/deploy, no secrets, no production data.

**Changed Files**
- `database/schema.sql`
- `docs/adr/0003-dietary-inflammation-model.md`
- `scripts/health/assets/health-assets/dashboard-v5-api-explorer.js`
- `scripts/health/assets/health-assets/dashboard-v5.css`
- `scripts/health/assets/health-assets/dashboard-v5-echarts.js`
- `scripts/health/assets/health-assets/dashboard-v5.js`
- `scripts/health/dashboard_v5/contracts.py`
- `scripts/health/dashboard_v5/data_provider.py`
- `scripts/health/dashboard_v5/read_api.py`
- `scripts/health/dashboard_v5/render.py`
- `scripts/health/health_dashboard_action_worker.py`
- `scripts/health/health_dashboard_server.py`
- `tests/browser/dashboard_v5_sprint6g_echarts.spec.js`
- `tests/fixtures/dashboard_v5_fixture.py`
- `tests/test_dashboard_v5_sprint6g_nutrition.py`

**Verification**
- `python -m py_compile ...` passed for touched Python runtime modules.
- `pytest -q tests/test_dashboard_v5_sprint6g_nutrition.py` passed: `3 passed`.
- `pytest -q tests/test_dashboard_v5_sprint6c_api_contracts.py tests/test_dashboard_v5_sprint6d_day_calendar.py tests/test_dashboard_v5_sprint6e_record.py tests/test_dashboard_v5_sprint6g_nutrition.py` passed: `30 passed`.
- `pytest -q tests/test_health_dashboard_v5.py -k 'not server_exposes_v5_preview_and_exact_asset_allowlist' tests/test_dashboard_v5_sprint6e4a_recovery.py` passed: `23 passed, 1 deselected`.
- Synthetic health-record render smoke passed:
  - `echarts_script_count= 1`
  - `chartjs_present= False`
  - `svg_present= False`

One existing server test requiring a listening socket was not run in the final pass because the sandbox rejects socket creation with `PermissionError: [Errno 1] Operation not permitted`.