- Refactor agent_tools to atomic primitives (24 tools, delete workflows) - Fix SVD component score inconsistency between single-window and trajectory views (same PCA basis, same flip handling, same active-MP filter for current_parliament) - Fix Dutch spelling: Huidig parliament -> Huidig parlement - Remove all decorative emojis from UI (app.py, explorer.py, analysis tabs) - Add dark theme matching sgeboers.nl (mint accent on dark background) - Remove browser tab favicon and Streamlit chrome (deploy button, running status) - Remove trajectories debug UI and EMA settings (hardcoded smooth_alpha=0.35) - Switch layout to centered for mobile readability - Add responsive CSS for mobile (touch targets, font sizing, overflow prevention) - Update AGENTS.md and SYSTEM_PROMPT.md with active tool instructions - Add compound docs for SVD consistency bug - Update tests: 214 passed, 3 skippedmain
parent
efb3a8fbd2
commit
272d839a42
@ -0,0 +1,9 @@ |
|||||||
|
[theme] |
||||||
|
primaryColor = "#00d9a3" |
||||||
|
backgroundColor = "#0d1117" |
||||||
|
secondaryBackgroundColor = "#161b22" |
||||||
|
textColor = "#e6edf3" |
||||||
|
font = "sans serif" |
||||||
|
|
||||||
|
[ui] |
||||||
|
showDeployButton = false |
||||||
@ -0,0 +1,147 @@ |
|||||||
|
--- |
||||||
|
title: SVD component scores inconsistent between single-window and trajectory views |
||||||
|
date: "2026-05-04" |
||||||
|
category: logic-errors |
||||||
|
module: analysis |
||||||
|
problem_type: logic_error |
||||||
|
component: service_object |
||||||
|
severity: high |
||||||
|
symptoms: |
||||||
|
- "Party position numbers differ between Enkel venster and Tijdtraject views for the same SVD component and window" |
||||||
|
- "Displayed values have opposite signs for flipped components even when underlying data is identical" |
||||||
|
root_cause: logic_error |
||||||
|
resolution_type: code_fix |
||||||
|
tags: |
||||||
|
- svd |
||||||
|
- pca |
||||||
|
- alignment |
||||||
|
- visualization |
||||||
|
- data-consistency |
||||||
|
--- |
||||||
|
|
||||||
|
# SVD component scores inconsistent between single-window and trajectory views |
||||||
|
|
||||||
|
## Problem |
||||||
|
|
||||||
|
In the parliamentary explorer's "SVD Components" tab, party position numbers differed between the "Enkel venster" (single window) view and the "Tijdtraject" (time trajectory) view for the SAME component and SAME window. Users comparing a specific year across the two views saw inconsistent numerical scores. |
||||||
|
|
||||||
|
## Symptoms |
||||||
|
|
||||||
|
- Selecting component 2, window "2023" in single-window shows a party at +0.42, but the trajectory view at the same point shows that party at a different value (e.g. -0.15) |
||||||
|
- Signs invert for certain components when `theme["flip"]` is `True` |
||||||
|
- The mismatch occurs even though both views claim to show the same underlying SVD component |
||||||
|
- **After initial fixes:** most years aligned, but "Huidig parlement" still showed different values between the two views |
||||||
|
- "Huidig parlement" was misspelled as "Huidig parliament" in the window selector label |
||||||
|
|
||||||
|
## What Didn't Work |
||||||
|
|
||||||
|
Initial suspicion that the difference came from Procrustes alignment or data caching issues. Checking whether `load_party_scores_all_windows_aligned()` vs `load_party_scores_all_windows()` was the culprit. However, both views were already using the same alignment path. |
||||||
|
|
||||||
|
The real cause was subtler: the trajectory view was computing PCA over a different set of windows than the single-window view, and then ignoring the flip flag entirely. |
||||||
|
|
||||||
|
## Solution |
||||||
|
|
||||||
|
### Fix 1: Align trajectory PCA computation with single-window computation |
||||||
|
|
||||||
|
In `analysis/explorer_data.py`, function `_get_aligned_trajectory_scores()`: |
||||||
|
|
||||||
|
```python |
||||||
|
def _get_aligned_trajectory_scores( |
||||||
|
db_path: str, windows: List[str], n_components: int = 10 |
||||||
|
) -> Dict[str, Dict[str, List[float]]]: |
||||||
|
from analysis.political_axis import compute_nd_axes |
||||||
|
|
||||||
|
all_uniform_windows = get_uniform_dim_windows(db_path) |
||||||
|
scores_by_window, _ = compute_nd_axes( |
||||||
|
db_path, window_ids=all_uniform_windows, n_components=n_components |
||||||
|
) |
||||||
|
# ... rest filters to requested windows |
||||||
|
``` |
||||||
|
|
||||||
|
**Change:** Compute PCA on **all** uniform-dim windows (matching `get_aligned_party_scores`), then filter to the requested windows. Previously, `_get_aligned_trajectory_scores()` passed only a subset of windows (excluding `_current_year`) to `compute_nd_axes()`, which produced different principal components, global mean, and flip signs. |
||||||
|
|
||||||
|
### Fix 2: Apply theme flip in trajectory rendering |
||||||
|
|
||||||
|
In `analysis/tabs/_rendering.py`, function `_render_svd_time_trajectory()`: |
||||||
|
|
||||||
|
```python |
||||||
|
idx = comp_sel - 1 |
||||||
|
flip = theme.get("flip", False) |
||||||
|
# ... |
||||||
|
for window in sorted_windows: |
||||||
|
scores_by_party = party_scores_by_window.get(window, {}) |
||||||
|
for party in selected_parties: |
||||||
|
scores = scores_by_party.get(party, []) |
||||||
|
if scores and len(scores) > idx: |
||||||
|
try: |
||||||
|
score = float(scores[idx]) |
||||||
|
if flip: |
||||||
|
score = -score |
||||||
|
party_trajectories.setdefault(party, []).append((window, score)) |
||||||
|
except (ValueError, TypeError): |
||||||
|
continue |
||||||
|
``` |
||||||
|
|
||||||
|
**Change:** Added flip application to negate scores when `theme.get("flip", False)` is `True`. `_render_party_axis_chart_1d()` already did this, but `_render_svd_time_trajectory()` completely ignored the flip flag. |
||||||
|
|
||||||
|
### Fix 3: Filter current_parliament to active MPs in trajectory view |
||||||
|
|
||||||
|
In `analysis/explorer_data.py`, function `_get_aligned_trajectory_scores()`: |
||||||
|
|
||||||
|
```python |
||||||
|
party_map = load_party_map(db_path) |
||||||
|
active_mps = load_active_mps(db_path) |
||||||
|
|
||||||
|
result: Dict[str, Dict[str, List[float]]] = {} |
||||||
|
for window in windows: |
||||||
|
window_scores = scores_by_window.get(window, {}) |
||||||
|
if not window_scores: |
||||||
|
continue |
||||||
|
|
||||||
|
# For current_parliament, match single-window view by filtering to |
||||||
|
# only MPs who are still seated (active). Historical windows include |
||||||
|
# all MPs present in that window. |
||||||
|
if window == "current_parliament": |
||||||
|
window_scores = { |
||||||
|
mp: sc for mp, sc in window_scores.items() if mp in active_mps |
||||||
|
} |
||||||
|
|
||||||
|
party_vecs: Dict[str, List[np.ndarray]] = {} |
||||||
|
# ... aggregate by party as before |
||||||
|
``` |
||||||
|
|
||||||
|
**Change:** Added `active_mps = load_active_mps(db_path)` and filtered `window_scores` to only active MPs when `window == "current_parliament"`. The single-window view (`get_aligned_party_scores()`) already did this filtering, but the trajectory view averaged ALL MPs (including those who had left parliament), producing different party means. |
||||||
|
|
||||||
|
### Fix 4: Correct Dutch spelling of window label |
||||||
|
|
||||||
|
In `analysis/tabs/components.py`: |
||||||
|
|
||||||
|
```python |
||||||
|
def _svd_window_label(w: str) -> str: |
||||||
|
if w == "current_parliament": |
||||||
|
return "Huidig parlement" # was "Huidig parliament" |
||||||
|
return w |
||||||
|
``` |
||||||
|
|
||||||
|
**Change:** Fixed misspelling of Dutch word "parlement" (was "parliament"). |
||||||
|
|
||||||
|
## Why This Works |
||||||
|
|
||||||
|
1. **Same PCA basis**: `compute_nd_axes()` computes global PCA across all provided windows. When the single-window view used all uniform-dim windows and the trajectory view used a subset, the resulting components, mean centering, and variance explained were different. Passing the same `window_ids` to `compute_nd_axes()` guarantees identical PCA bases. |
||||||
|
|
||||||
|
2. **Same flip handling**: The single-window view negates scores when `flip=True`. The trajectory view now does the same, ensuring both views display numerically identical values for the same (window, component, party) tuple. |
||||||
|
|
||||||
|
3. **Same MP population for current_parliament**: The single-window view filtered `current_parliament` to only active (still-seated) MPs before computing party means. The trajectory view now applies the same filter, so party averages are computed over the identical set of MPs. |
||||||
|
|
||||||
|
## Prevention |
||||||
|
|
||||||
|
- When multiple views display the same underlying SVD/PCA data, ensure they all call `compute_nd_axes()` with the **identical** set of window IDs. |
||||||
|
- Never apply visual transformations (like `theme["flip"]` or `active_mps` filtering) in one view but omit them in another — keep rendering logic symmetric across all views for the same data. |
||||||
|
- Add a regression test that asserts `get_aligned_party_scores(window, comp)` equals `_get_aligned_trajectory_scores([window], comp)[window]` for sampled windows and components, including `current_parliament`. |
||||||
|
- Document that `compute_nd_axes()` is a global operation over its input windows; any subset produces a different coordinate frame. |
||||||
|
- When special-casing `current_parliament` (e.g. active-MP filtering), apply the same logic in every code path that processes that window — single-window, trajectory, compass, and exports. |
||||||
|
|
||||||
|
## Related Issues |
||||||
|
|
||||||
|
- `docs/solutions/ui-bugs/svd-axis-pole-labels-incorrect-after-flip.md` — related flip-handling bug in the same SVD Components tab |
||||||
|
- `docs/solutions/ui-bugs/svd-compass-components-position-inconsistency.md` — related alignment inconsistency between compass and components tab |
||||||
@ -0,0 +1,108 @@ |
|||||||
|
--- |
||||||
|
title: "SVD time trajectory shows different scores than single-window view for same component and window" |
||||||
|
date: 2026-05-04 |
||||||
|
module: analysis |
||||||
|
problem_type: ui_bug |
||||||
|
component: analysis |
||||||
|
symptoms: |
||||||
|
- "Party position numbers in Tijdtraject view differ from Enkel venster view for the exact same component and window" |
||||||
|
- "Same party has opposite sign in trajectory vs single-window when theme flip is active" |
||||||
|
- "Inconsistent numerical values break user trust in the SVD Components tab" |
||||||
|
root_cause: logic_error |
||||||
|
resolution_type: code_fix |
||||||
|
severity: high |
||||||
|
tags: |
||||||
|
- svd |
||||||
|
- pca |
||||||
|
- time-trajectory |
||||||
|
- parliamentary-explorer |
||||||
|
- alignment |
||||||
|
- flip |
||||||
|
--- |
||||||
|
|
||||||
|
# SVD Time Trajectory Shows Different Scores Than Single-Window View |
||||||
|
|
||||||
|
## Problem |
||||||
|
|
||||||
|
In the parliamentary explorer's "SVD Components" tab, party position numbers differed between the "Enkel venster" (single window) view and the "Tijdtraject" (time trajectory) view for the SAME component and SAME window. Users comparing a specific year across the two views saw inconsistent numerical scores. |
||||||
|
|
||||||
|
## Symptoms |
||||||
|
|
||||||
|
- Selecting component 2, window "2023-2024" in single-window shows PVV at +0.42, but the trajectory view at the same point shows PVV at -0.15 |
||||||
|
- Signs invert for certain components when `theme["flip"]` is `True` |
||||||
|
- The mismatch occurs even though both views claim to show the same underlying SVD component |
||||||
|
|
||||||
|
## What Didn't Work |
||||||
|
|
||||||
|
Initial suspicion that the difference came from Procrustes alignment or data caching issues. Checking whether `load_party_scores_all_windows_aligned()` vs `load_party_scores_all_windows()` was the culprit. However, both views were already using the same alignment path. |
||||||
|
|
||||||
|
The real cause was subtler: the trajectory view was computing PCA over a different set of windows than the single-window view, and then ignoring the flip flag entirely. |
||||||
|
|
||||||
|
## Solution |
||||||
|
|
||||||
|
### Fix 1: Align trajectory PCA computation with single-window computation |
||||||
|
|
||||||
|
In `analysis/explorer_data.py`, function `_get_aligned_trajectory_scores()`: |
||||||
|
|
||||||
|
```python |
||||||
|
def _get_aligned_trajectory_scores( |
||||||
|
db_path: str, windows: List[str], n_components: int = 10 |
||||||
|
) -> Dict[str, Dict[str, List[float]]]: |
||||||
|
from analysis.political_axis import compute_nd_axes |
||||||
|
|
||||||
|
all_uniform_windows = get_uniform_dim_windows(db_path) |
||||||
|
scores_by_window, _ = compute_nd_axes( |
||||||
|
db_path, window_ids=all_uniform_windows, n_components=n_components |
||||||
|
) |
||||||
|
# ... rest filters to requested windows |
||||||
|
``` |
||||||
|
|
||||||
|
**Change:** Compute PCA on **all** uniform-dim windows (matching `get_aligned_party_scores`), then filter to the requested windows. Previously, `_get_aligned_trajectory_scores()` passed only a subset of windows (excluding `_current_year`) to `compute_nd_axes()`, which produced different principal components, global mean, and flip signs. |
||||||
|
|
||||||
|
### Fix 2: Apply theme flip in trajectory rendering |
||||||
|
|
||||||
|
In `analysis/tabs/_rendering.py`, function `_render_svd_time_trajectory()`: |
||||||
|
|
||||||
|
```python |
||||||
|
idx = comp_sel - 1 |
||||||
|
flip = theme.get("flip", False) |
||||||
|
# ... |
||||||
|
for window in sorted_windows: |
||||||
|
scores_by_party = party_scores_by_window.get(window, {}) |
||||||
|
for party in selected_parties: |
||||||
|
scores = scores_by_party.get(party, []) |
||||||
|
if scores and len(scores) > idx: |
||||||
|
try: |
||||||
|
score = float(scores[idx]) |
||||||
|
if flip: |
||||||
|
score = -score |
||||||
|
party_trajectories.setdefault(party, []).append((window, score)) |
||||||
|
except (ValueError, TypeError): |
||||||
|
continue |
||||||
|
``` |
||||||
|
|
||||||
|
**Change:** Added flip application to negate scores when `theme.get("flip", False)` is `True`. `_render_party_axis_chart_1d()` already did this, but `_render_svd_time_trajectory()` completely ignored the flip flag. |
||||||
|
|
||||||
|
## Why This Works |
||||||
|
|
||||||
|
1. **Same PCA basis**: `compute_nd_axes()` computes global PCA across all provided windows. When the single-window view used all uniform-dim windows and the trajectory view used a subset, the resulting components, mean centering, and variance explained were different. Passing the same `window_ids` to `compute_nd_axes()` guarantees identical PCA bases. |
||||||
|
|
||||||
|
2. **Same flip handling**: The single-window view negates scores when `flip=True`. The trajectory view now does the same, ensuring both views display numerically identical values for the same (window, component, party) tuple. |
||||||
|
|
||||||
|
## Prevention |
||||||
|
|
||||||
|
- When multiple views display the same underlying SVD/PCA data, ensure they all call `compute_nd_axes()` with the **identical** set of window IDs |
||||||
|
- Never apply visual transformations (like `theme["flip"]`) in one view but omit them in another — keep rendering logic symmetric |
||||||
|
- Add a regression test that asserts `get_aligned_party_scores(window, comp)` equals `_get_aligned_trajectory_scores([window], comp)[window]` for sampled windows and components |
||||||
|
- Document that `compute_nd_axes()` is a global operation over its input windows; any subset produces a different coordinate frame |
||||||
|
|
||||||
|
## Related Files |
||||||
|
|
||||||
|
- `analysis/explorer_data.py` — `_get_aligned_trajectory_scores()` fix (all uniform windows) |
||||||
|
- `analysis/tabs/_rendering.py` — `_render_svd_time_trajectory()` fix (flip application) |
||||||
|
- `analysis/political_axis.py` — `compute_nd_axes()` global PCA logic |
||||||
|
|
||||||
|
## Related Issues |
||||||
|
|
||||||
|
- Builds on `docs/solutions/ui-bugs/svd-compass-components-position-inconsistency.md` (consistent alignment for components 1-2) |
||||||
|
- Builds on `docs/solutions/ui-bugs/svd-axis-pole-labels-incorrect-after-flip.md` (runtime flip mechanism) |
||||||
@ -0,0 +1,343 @@ |
|||||||
|
[ |
||||||
|
{ |
||||||
|
"id": "b9997376-b22b-46f7-ae72-05d62fca0654", |
||||||
|
"actor_id": null, |
||||||
|
"action": "embedding_failed", |
||||||
|
"target_type": "motion", |
||||||
|
"target_id": "99", |
||||||
|
"metadata": { |
||||||
|
"error": "RuntimeError(\"Simulated embedding failure for index 0: 'failing motion'\")" |
||||||
|
}, |
||||||
|
"created_at": "2026-05-04T18:35:35.253411Z" |
||||||
|
}, |
||||||
|
{ |
||||||
|
"id": "4d63d924-0fbe-4914-8d4b-854520adfc98", |
||||||
|
"actor_id": null, |
||||||
|
"action": "test_action", |
||||||
|
"target_type": "unit", |
||||||
|
"target_id": "u1", |
||||||
|
"metadata": { |
||||||
|
"k": 1 |
||||||
|
}, |
||||||
|
"created_at": "2026-05-04T18:35:35.857498Z" |
||||||
|
}, |
||||||
|
{ |
||||||
|
"id": "1d8df49c-8a4c-42d5-8479-16d493fd5e83", |
||||||
|
"actor_id": null, |
||||||
|
"action": "another_action", |
||||||
|
"target_type": "motion", |
||||||
|
"target_id": null, |
||||||
|
"metadata": {}, |
||||||
|
"created_at": "2026-05-04T18:35:35.913836Z" |
||||||
|
}, |
||||||
|
{ |
||||||
|
"id": "5ae3a01d-c1fd-46a0-8a68-622cbe90786e", |
||||||
|
"actor_id": null, |
||||||
|
"action": "embedding_failed", |
||||||
|
"target_type": "motion", |
||||||
|
"target_id": "99", |
||||||
|
"metadata": { |
||||||
|
"error": "RuntimeError(\"Simulated embedding failure for index 0: 'failing motion'\")" |
||||||
|
}, |
||||||
|
"created_at": "2026-05-04T19:05:15.463187Z" |
||||||
|
}, |
||||||
|
{ |
||||||
|
"id": "54168d70-b457-4908-a8e9-6bc2202b96b2", |
||||||
|
"actor_id": null, |
||||||
|
"action": "test_action", |
||||||
|
"target_type": "unit", |
||||||
|
"target_id": "u1", |
||||||
|
"metadata": { |
||||||
|
"k": 1 |
||||||
|
}, |
||||||
|
"created_at": "2026-05-04T19:05:16.264375Z" |
||||||
|
}, |
||||||
|
{ |
||||||
|
"id": "03312a0d-e309-4a39-b00b-92b6b7ee7ff3", |
||||||
|
"actor_id": null, |
||||||
|
"action": "another_action", |
||||||
|
"target_type": "motion", |
||||||
|
"target_id": null, |
||||||
|
"metadata": {}, |
||||||
|
"created_at": "2026-05-04T19:05:16.359183Z" |
||||||
|
}, |
||||||
|
{ |
||||||
|
"id": "afb841c6-f3a2-427c-bdd8-59613f7b76e7", |
||||||
|
"actor_id": null, |
||||||
|
"action": "embedding_failed", |
||||||
|
"target_type": "motion", |
||||||
|
"target_id": "99", |
||||||
|
"metadata": { |
||||||
|
"error": "RuntimeError(\"Simulated embedding failure for index 0: 'failing motion'\")" |
||||||
|
}, |
||||||
|
"created_at": "2026-05-04T19:07:13.821418Z" |
||||||
|
}, |
||||||
|
{ |
||||||
|
"id": "598f72d1-9613-4043-a33e-e12e0c5daeb3", |
||||||
|
"actor_id": null, |
||||||
|
"action": "test_action", |
||||||
|
"target_type": "unit", |
||||||
|
"target_id": "u1", |
||||||
|
"metadata": { |
||||||
|
"k": 1 |
||||||
|
}, |
||||||
|
"created_at": "2026-05-04T19:07:14.490337Z" |
||||||
|
}, |
||||||
|
{ |
||||||
|
"id": "f3bf7eda-1da9-4aac-8047-94c891975c2d", |
||||||
|
"actor_id": null, |
||||||
|
"action": "another_action", |
||||||
|
"target_type": "motion", |
||||||
|
"target_id": null, |
||||||
|
"metadata": {}, |
||||||
|
"created_at": "2026-05-04T19:07:14.540426Z" |
||||||
|
}, |
||||||
|
{ |
||||||
|
"id": "94269398-9a89-4f5b-881d-a0ca69269c71", |
||||||
|
"actor_id": null, |
||||||
|
"action": "embedding_failed", |
||||||
|
"target_type": "motion", |
||||||
|
"target_id": "99", |
||||||
|
"metadata": { |
||||||
|
"error": "RuntimeError(\"Simulated embedding failure for index 0: 'failing motion'\")" |
||||||
|
}, |
||||||
|
"created_at": "2026-05-04T19:21:43.038364Z" |
||||||
|
}, |
||||||
|
{ |
||||||
|
"id": "d00f4448-18be-4fd6-b8ad-5ebacadd379c", |
||||||
|
"actor_id": null, |
||||||
|
"action": "test_action", |
||||||
|
"target_type": "unit", |
||||||
|
"target_id": "u1", |
||||||
|
"metadata": { |
||||||
|
"k": 1 |
||||||
|
}, |
||||||
|
"created_at": "2026-05-04T19:21:43.369286Z" |
||||||
|
}, |
||||||
|
{ |
||||||
|
"id": "bcf3f511-35e8-4850-8c91-f4dc51944f1e", |
||||||
|
"actor_id": null, |
||||||
|
"action": "another_action", |
||||||
|
"target_type": "motion", |
||||||
|
"target_id": null, |
||||||
|
"metadata": {}, |
||||||
|
"created_at": "2026-05-04T19:21:43.392718Z" |
||||||
|
}, |
||||||
|
{ |
||||||
|
"id": "3fbaf378-9ced-46ee-a072-33a92a938ad8", |
||||||
|
"actor_id": null, |
||||||
|
"action": "embedding_failed", |
||||||
|
"target_type": "motion", |
||||||
|
"target_id": "99", |
||||||
|
"metadata": { |
||||||
|
"error": "RuntimeError(\"Simulated embedding failure for index 0: 'failing motion'\")" |
||||||
|
}, |
||||||
|
"created_at": "2026-05-04T19:23:01.217155Z" |
||||||
|
}, |
||||||
|
{ |
||||||
|
"id": "ae89efeb-e3de-4eff-b2c6-acfe900ccb4f", |
||||||
|
"actor_id": null, |
||||||
|
"action": "test_action", |
||||||
|
"target_type": "unit", |
||||||
|
"target_id": "u1", |
||||||
|
"metadata": { |
||||||
|
"k": 1 |
||||||
|
}, |
||||||
|
"created_at": "2026-05-04T19:23:01.555475Z" |
||||||
|
}, |
||||||
|
{ |
||||||
|
"id": "dd0728fd-281f-4900-9835-be36cbdf7d42", |
||||||
|
"actor_id": null, |
||||||
|
"action": "another_action", |
||||||
|
"target_type": "motion", |
||||||
|
"target_id": null, |
||||||
|
"metadata": {}, |
||||||
|
"created_at": "2026-05-04T19:23:01.578979Z" |
||||||
|
}, |
||||||
|
{ |
||||||
|
"id": "a21084ac-c935-42b9-a1af-9897a7b3b24a", |
||||||
|
"actor_id": null, |
||||||
|
"action": "embedding_failed", |
||||||
|
"target_type": "motion", |
||||||
|
"target_id": "99", |
||||||
|
"metadata": { |
||||||
|
"error": "RuntimeError(\"Simulated embedding failure for index 0: 'failing motion'\")" |
||||||
|
}, |
||||||
|
"created_at": "2026-05-04T19:29:51.282933Z" |
||||||
|
}, |
||||||
|
{ |
||||||
|
"id": "f5c3bc64-6eaa-45c0-beb0-eb3a5fa1f7bf", |
||||||
|
"actor_id": null, |
||||||
|
"action": "test_action", |
||||||
|
"target_type": "unit", |
||||||
|
"target_id": "u1", |
||||||
|
"metadata": { |
||||||
|
"k": 1 |
||||||
|
}, |
||||||
|
"created_at": "2026-05-04T19:29:51.867770Z" |
||||||
|
}, |
||||||
|
{ |
||||||
|
"id": "1fca9154-63a5-415e-afca-f385cd7fdec4", |
||||||
|
"actor_id": null, |
||||||
|
"action": "another_action", |
||||||
|
"target_type": "motion", |
||||||
|
"target_id": null, |
||||||
|
"metadata": {}, |
||||||
|
"created_at": "2026-05-04T19:29:51.911694Z" |
||||||
|
}, |
||||||
|
{ |
||||||
|
"id": "df6288ef-b571-4373-ad64-8dbe91f3f81f", |
||||||
|
"actor_id": null, |
||||||
|
"action": "embedding_failed", |
||||||
|
"target_type": "motion", |
||||||
|
"target_id": "99", |
||||||
|
"metadata": { |
||||||
|
"error": "RuntimeError(\"Simulated embedding failure for index 0: 'failing motion'\")" |
||||||
|
}, |
||||||
|
"created_at": "2026-05-04T19:30:36.113847Z" |
||||||
|
}, |
||||||
|
{ |
||||||
|
"id": "bc3a7bbc-4539-4547-bc95-1589580a7c4b", |
||||||
|
"actor_id": null, |
||||||
|
"action": "test_action", |
||||||
|
"target_type": "unit", |
||||||
|
"target_id": "u1", |
||||||
|
"metadata": { |
||||||
|
"k": 1 |
||||||
|
}, |
||||||
|
"created_at": "2026-05-04T19:30:36.655350Z" |
||||||
|
}, |
||||||
|
{ |
||||||
|
"id": "2c8384c5-d61c-4d3a-9652-49c4ef911e61", |
||||||
|
"actor_id": null, |
||||||
|
"action": "another_action", |
||||||
|
"target_type": "motion", |
||||||
|
"target_id": null, |
||||||
|
"metadata": {}, |
||||||
|
"created_at": "2026-05-04T19:30:36.694259Z" |
||||||
|
}, |
||||||
|
{ |
||||||
|
"id": "41b4fda9-9525-498a-abcd-30a8517c65f0", |
||||||
|
"actor_id": null, |
||||||
|
"action": "embedding_failed", |
||||||
|
"target_type": "motion", |
||||||
|
"target_id": "99", |
||||||
|
"metadata": { |
||||||
|
"error": "RuntimeError(\"Simulated embedding failure for index 0: 'failing motion'\")" |
||||||
|
}, |
||||||
|
"created_at": "2026-05-04T19:40:45.516057Z" |
||||||
|
}, |
||||||
|
{ |
||||||
|
"id": "8750e275-2230-47fc-b1d3-a624c3539895", |
||||||
|
"actor_id": null, |
||||||
|
"action": "test_action", |
||||||
|
"target_type": "unit", |
||||||
|
"target_id": "u1", |
||||||
|
"metadata": { |
||||||
|
"k": 1 |
||||||
|
}, |
||||||
|
"created_at": "2026-05-04T19:40:46.100175Z" |
||||||
|
}, |
||||||
|
{ |
||||||
|
"id": "4d1bda9d-abcf-4cfe-aa84-9c941ab0bbe9", |
||||||
|
"actor_id": null, |
||||||
|
"action": "another_action", |
||||||
|
"target_type": "motion", |
||||||
|
"target_id": null, |
||||||
|
"metadata": {}, |
||||||
|
"created_at": "2026-05-04T19:40:46.138753Z" |
||||||
|
}, |
||||||
|
{ |
||||||
|
"id": "cab2b3da-2a75-4370-8d3d-81f268bf7ad3", |
||||||
|
"actor_id": null, |
||||||
|
"action": "embedding_failed", |
||||||
|
"target_type": "motion", |
||||||
|
"target_id": "99", |
||||||
|
"metadata": { |
||||||
|
"error": "RuntimeError(\"Simulated embedding failure for index 0: 'failing motion'\")" |
||||||
|
}, |
||||||
|
"created_at": "2026-05-04T19:45:05.857880Z" |
||||||
|
}, |
||||||
|
{ |
||||||
|
"id": "96894d94-9c03-4e40-a3f1-2fea8102084a", |
||||||
|
"actor_id": null, |
||||||
|
"action": "test_action", |
||||||
|
"target_type": "unit", |
||||||
|
"target_id": "u1", |
||||||
|
"metadata": { |
||||||
|
"k": 1 |
||||||
|
}, |
||||||
|
"created_at": "2026-05-04T19:45:06.490973Z" |
||||||
|
}, |
||||||
|
{ |
||||||
|
"id": "6cec2c2e-32ec-46c9-9c62-240571fb994f", |
||||||
|
"actor_id": null, |
||||||
|
"action": "another_action", |
||||||
|
"target_type": "motion", |
||||||
|
"target_id": null, |
||||||
|
"metadata": {}, |
||||||
|
"created_at": "2026-05-04T19:45:06.532577Z" |
||||||
|
}, |
||||||
|
{ |
||||||
|
"id": "47db336d-bfde-47c9-9f2b-dbd9cd5bacb1", |
||||||
|
"actor_id": null, |
||||||
|
"action": "embedding_failed", |
||||||
|
"target_type": "motion", |
||||||
|
"target_id": "99", |
||||||
|
"metadata": { |
||||||
|
"error": "RuntimeError(\"Simulated embedding failure for index 0: 'failing motion'\")" |
||||||
|
}, |
||||||
|
"created_at": "2026-05-04T19:52:20.964915Z" |
||||||
|
}, |
||||||
|
{ |
||||||
|
"id": "336059fa-25cf-4c82-9b57-a8b1bad267cc", |
||||||
|
"actor_id": null, |
||||||
|
"action": "test_action", |
||||||
|
"target_type": "unit", |
||||||
|
"target_id": "u1", |
||||||
|
"metadata": { |
||||||
|
"k": 1 |
||||||
|
}, |
||||||
|
"created_at": "2026-05-04T19:52:21.569161Z" |
||||||
|
}, |
||||||
|
{ |
||||||
|
"id": "46f04f49-a318-41dd-8e90-a9de82ad7a31", |
||||||
|
"actor_id": null, |
||||||
|
"action": "another_action", |
||||||
|
"target_type": "motion", |
||||||
|
"target_id": null, |
||||||
|
"metadata": {}, |
||||||
|
"created_at": "2026-05-04T19:52:21.608752Z" |
||||||
|
}, |
||||||
|
{ |
||||||
|
"id": "22555844-a2f4-4645-90f1-a27d64943256", |
||||||
|
"actor_id": null, |
||||||
|
"action": "embedding_failed", |
||||||
|
"target_type": "motion", |
||||||
|
"target_id": "99", |
||||||
|
"metadata": { |
||||||
|
"error": "RuntimeError(\"Simulated embedding failure for index 0: 'failing motion'\")" |
||||||
|
}, |
||||||
|
"created_at": "2026-05-04T19:55:28.345947Z" |
||||||
|
}, |
||||||
|
{ |
||||||
|
"id": "05812dbd-066f-4d15-b415-e489030f0139", |
||||||
|
"actor_id": null, |
||||||
|
"action": "test_action", |
||||||
|
"target_type": "unit", |
||||||
|
"target_id": "u1", |
||||||
|
"metadata": { |
||||||
|
"k": 1 |
||||||
|
}, |
||||||
|
"created_at": "2026-05-04T19:55:29.064617Z" |
||||||
|
}, |
||||||
|
{ |
||||||
|
"id": "0d1ba715-edbc-4000-a139-6d108edb741b", |
||||||
|
"actor_id": null, |
||||||
|
"action": "another_action", |
||||||
|
"target_type": "motion", |
||||||
|
"target_id": null, |
||||||
|
"metadata": {}, |
||||||
|
"created_at": "2026-05-04T19:55:29.113927Z" |
||||||
|
} |
||||||
|
] |
||||||
Loading…
Reference in new issue