| MSG-73 |
llmmsg-srv |
cdw: Caddy flush_interval -1 for SSE reconnecting issue (Caddyfile) |
backlog |
low |
nw-venus-cc |
2026-06-19 17:54 |
| MSG-72 |
llmmsg-srv |
Bug: brainstorm_close_forbidden fires when sender=opener=pm_agent |
done |
high |
coder-llmmsgsrv-cc |
2026-06-19 17:48 |
| MSG-71 |
llmmsg-srv |
Bug: PM kind=brainstorm in active ARO opens sibling session instead of being rejected |
done |
high |
coder-llmmsgsrv-cc |
2026-06-19 17:48 |
| MSG-70 |
llmmsg-srv |
MSG-73: settled brainstorm mode (kind=settled, mode=settled, bs_settled_by) |
done |
high |
coder-llmmsgsrv-cc |
2026-06-19 17:48 |
| PLUTO-146 |
pluto |
DB connection scaling: verify Supavisor txn-pooler + query-shape pass (pre-scale) |
backlog |
normal |
— |
2026-06-19 17:16 |
| MSG-69 |
llmmsg-srv |
MSG-72: hub DM to PM when all brainstorm turns complete |
done |
high |
coder-llmmsgsrv-cc |
2026-06-19 17:15 |
| MARS-145 |
mars |
Mars DB scaling: migrate serverless runtime from direct-5432 to Supavisor transaction pooler (6543); reserve direct-5432 for weekly-kpi cron + migrations/seed; cut runtime pg.Pool max 16->~3; audit+cap per-request concurrent-query fan-outs (mirror Pluto mapWithConcurrency); pre-flight named-prepared-statement check (txn mode drops them). 3-PM consensus bs-mql6kqmrm6j, Venus=reference (already on pooler). One-env-var + cron carve-out, reversible. |
backlog |
high |
db-mars-cc |
2026-06-19 17:10 |
| MARS-139 |
mars |
Weekly-KPI JTP self-digest does not reach ayudante-picked-as-JTP recipients — JTP_SQL scopes recipients to TCM roleLabel='JTP', so an ayudante carrying real picked-práctica backlog gets no self-nudge to grade it |
done |
normal |
— |
2026-06-19 17:02 |
| MSG-68 |
llmmsg-srv |
MSG-71: bare-DM gate for Elazar (reject_bare_dm flag) |
done |
high |
coder-llmmsgsrv-cc |
2026-06-19 14:40 |
| EVO-4 |
evolutiva |
Render/server errors in appEvents (appLog): verify capture parity across pluto, mars, venus + fill gaps |
backlog |
high |
pm-pluto-cc |
2026-06-19 10:49 |
| MARS-144 |
mars |
Práctica create: duplicate-on-retry when committed POST loses its response |
done |
someday |
— |
2026-06-17 05:38 |
| MSG-67 |
llmmsg-srv |
MSG-67: brainstorm protocol fixes — enforce opener/PM-only close + skip post-close coaching |
done |
high |
coder-llmmsgsrv-cc |
2026-06-17 04:30 |
| CLEDGER-1 |
cledger |
E1: Audit & Standardize |
backlog |
high |
nw-whey-cc |
2026-06-17 04:17 |
| MARS-142 |
mars |
Migration-file hygiene: file 8 loose mars/db/*.sql into db/migrations/applied/NNN per fleet decision bs-mqgwqsix9s0 |
done |
low |
— |
2026-06-16 19:19 |
| MARS-143 |
mars |
createUser GoTrue NULL-token lockout: blank 8 auth.users token cols to '' (helper + repair) — cross-project, mirrors venus 5f4e8cb |
done |
normal |
— |
2026-06-16 18:51 |
| VENUS-21 |
venus |
bug(auth): login-lockout — roster-import createUser left NULL GoTrue token columns → 500 on login |
done |
high |
pm-venus-cc |
2026-06-16 18:47 |
| VENUS-20 |
venus |
bug(auth): seed scripts use raw admin.createUser → NULL-token login-lockout in seeded users |
backlog |
low |
— |
2026-06-16 18:43 |
| MSG-66 |
llmmsg-srv |
MSG-66: blocked_agent_names table — hard-reject register/send/join for blocked names with redirect message |
done |
high |
coder-llmmsgsrv-cc |
2026-06-16 17:48 |
| PLUTO-144 |
pluto |
fn_getInformesBundle: include 0-practica JTPs (Opt A) across jtpStats + comparativaJtp + jtpBenchmark |
done |
urgent |
db-pluto-cc |
2026-06-16 17:33 |
| PLUTO-145 |
pluto |
Per-agent git worktree / path-scoped add for coder-pluto + db-pluto on venus (end shared-checkout git-add-all race) |
blocked |
normal |
nw-venus-cc |
2026-06-16 17:24 |
| PLUTO-143 |
pluto |
/practicas Resumen de Comisiones + per-comision cards: same KPI treatment as PLUTO-142 |
done |
high |
coder-pluto-cc |
2026-06-16 17:18 |
| MARS-140 |
mars |
Downgrade benign client aborted-stream errors from error→warn |
done |
low |
— |
2026-06-16 16:59 |
| MARS-141 |
mars |
Vercel runtime-log API billing-capped (ExceedsBillingLimitError) — blinds PTD runtime-log gate until cap reset/raised |
backlog |
normal |
— |
2026-06-16 16:53 |
| PLUTO-142 |
pluto |
/informes 'Practicas por JTP' KPI refinement + fix Comparativa por Adjunto |
done |
high |
coder-pluto-cc |
2026-06-16 13:56 |
| MSG-65 |
llmmsg-srv |
MSG-65: allow kind=brainstorm fan-out in non-whitelisted AROs |
done |
high |
coder-llmmsgsrv-cc |
2026-06-16 13:28 |
| #136 |
pluto |
Stage 4: Comisiones + Períodos grids — operational editing en el mismo workspace style |
done |
normal |
— |
2026-06-16 06:59 |
| MARS-138 |
mars |
getJtpStats PENDING axis is SA-populated while admin-delta-report + vPracticasSinEvaluar are SA-free — informes oracle can miss a picked-but-no-active-SA práctica |
backlog |
low |
— |
2026-06-16 06:55 |
| PLUTO-141 |
pluto |
Grading authz audit: práctica-grade permission scope vs Puia rule (comisión-wide adjunto/jtp/ayudante + titular-all) |
done |
urgent |
audit-pluto-cc |
2026-06-16 06:27 |
| MARS-137 |
mars |
Orphaned-pending picks: reassign-pending-practicas handling after write-path retire (MARS-136) |
backlog |
low |
— |
2026-06-16 06:19 |
| MARS-136 |
mars |
Re-key grading attribution to práctica-pick (jtpUserId) — reverses live-SA model |
backlog |
normal |
— |
2026-06-16 06:04 |
| OPS-20 |
agent-ops |
cc-context-monitor: send ss+Enter, wait 60s, then send /compact (not back-to-back) |
done |
high |
bin-whey-cc |
2026-06-16 05:35 |
| MSG-64 |
llmmsg-srv |
MSG-64: /setpm admin form — /setpm <aro> <agent> lets elazar set any ARO member as PM |
done |
high |
coder-llmmsgsrv-cc |
2026-06-16 05:31 |
| MARS-135 |
mars |
Rotate Mars Supabase DB (postgres) password — leaked in git history |
backlog |
low |
— |
2026-06-16 05:16 |
| MARS-134 |
mars |
Externalize inline superuser DSN in db/backup-db.sh |
done |
normal |
— |
2026-06-16 05:03 |
| MARS-133 |
mars |
Pin NEXT_SERVER_ACTIONS_ENCRYPTION_KEY in Vercel prod (stop per-deploy server-action-ID churn) |
done |
normal |
— |
2026-06-16 05:02 |
| MSG-63 |
llmmsg-srv |
MSG-63: brainstorm pass/abstain after stuck-watchdog exhausts nudges |
done |
high |
coder-llmmsgsrv-cc |
2026-06-16 05:00 |
| MSG-56 |
llmmsg-srv |
ccs.sh: write LLMMSG_AGENT=$LABEL to .llmmsg-env on launch so UserPromptSubmit hook always registers with suffix-correct identity (fleet-wide phantom-seat fix) |
done |
high |
bin-whey-cc |
2026-06-16 04:28 |
| MSG-62 |
llmmsg-srv |
hub MSG-59: stuck watchdog must skip only offline/dormant agents — exclude registered+online agents from auto-skip (compaction != absent) |
done |
high |
coder-llmmsgsrv-cc |
2026-06-16 04:23 |
| MSG-61 |
llmmsg-srv |
hub: brainstorm busy-nudge exclusion + threshold bumps — exclude kind=brainstorm from BUSY_NUDGE; BUSY_NUDGE_HUMAN_S 5→300, BUSY_NUDGE_AGENT_S 30→600, REPLY_NUDGE_AGE_S 180→900 |
done |
high |
coder-llmmsgsrv-cc |
2026-06-16 04:23 |
| MSG-60 |
llmmsg-srv |
hub: close-quorum soft warn — kind=decision with pending expected turns warns PM (force:true to override), does not hard-block |
done |
high |
coder-llmmsgsrv-cc |
2026-06-16 04:23 |
| MSG-59 |
llmmsg-srv |
hub: brainstorm-stuck-alert — setInterval watchdog DMs ARO PM when pending turns > 5min idle, auto-skips pending agents after 2 DMs with no movement (drops from expected_json, unblocks brainstorm) |
done |
high |
pm-llmmsgsrv-cc |
2026-06-16 03:51 |
| MSG-58 |
llmmsg-srv |
hub /send + MCP shim: multi-destination send (to as string|array, N rows one call, recipients[] in response) |
done |
high |
pm-llmmsgsrv-cc |
2026-06-16 03:20 |
| MSG-57 |
llmmsg-srv |
hub /send + MCP shim: improve aro_fanout_denied error message (explain reason, redirect to DM or multi-dest) |
done |
normal |
pm-llmmsgsrv-cc |
2026-06-16 03:20 |
| PLUTO-140 |
pluto |
DB-perf collector — Pluto app leg (fleet bs-mqg1357zx6m decision): provide Pluto's leg of the evolutiva-dbperf@pluto snapshot+diff collector. (1) dbperfSnapshots table via migration — PARITY with venus's canonical schema (get the DDL + 4-query set from db-venus/pm-venus so all 3 apps match byte-for-byte, like the applog rail); telemetry-table discipline (NO archive-context, short retention prune mirroring appEvents). (2) GRANT the existing applog least-priv reader role SELECT on the snapshot table + the catalog/stat views the 4 queries read (cache / pg_stat_statements top-50 / seq-scans / dead-tuples). (3) hand nw-venus the reader-grant confirmation so it can stand up the systemd timer (daily 04:30 ART → biweekly → monthly). Reversible: drop table + disable timer. Coordinate schema parity with venus BEFORE applying. |
done |
normal |
db-pluto-cc |
2026-06-16 03:00 |
| VENUS-19 |
venus |
feat(infra): DB perf snapshot+diff collector (dbperfSnapshots) |
backlog |
normal |
— |
2026-06-16 02:41 |
| PLUTO-139 |
pluto |
DB-health sweep follow-ups (from PLUTO-138, non-urgent): (1) verify practicas.idx_practicas_editlocked query path — drop if genuinely cold; (2) confirm userAuditLogLegacy table is retired → archival candidate (table+idx); (3) FK-usage audit: of 64 advisor-flagged unindexed FKs, identify which appear in live WHERE/JOIN (hot) vs audit/write-path (createdBy/deletedBy/archivedBy — leave cold), index only the hot ones via migration w/ archive-context. Don't index/drop blindly — query-path verify first. |
backlog |
low |
coder-pluto-cc |
2026-06-16 02:39 |
| PLUTO-138 |
pluto |
DB-health one-shot inspect sweep (Supabase inspect-db via MCP): outliers/cache-hit/unused-indexes/seq-scans/bloat/vacuum-stats/locks-blocking/long-running + get_advisors(performance). Triage real findings, keep/drop to PM. Fleet inspect-db monitoring rollout (bs-mqg1357zx6m). Caveat: pg_stat_statements recently reset (PLUTO-134), lookback thin. |
done |
high |
db-pluto-cc |
2026-06-16 02:39 |
| MARS-132 |
mars |
EXPLAIN ANALYZE teeth_agg practica report query (1661ms mean, /informes teeth aggregation) |
backlog |
low |
— |
2026-06-16 02:37 |
| PLUTO-137 |
pluto |
Inactivity-warning baseline floor: don't count dormancy before 2026-06-09 clinical go-live |
done |
normal |
db-pluto-cc |
2026-06-16 02:10 |
| PLUTO-134 |
pluto |
Supabase Disk-IO budget alert (2026-06-15) disposition: reads clean (99.96% cached). Two analyses diverge on write driver — (1) */2 rate-spike cron churn vs (2) one-time Jun-14 PLUTO-128/130 DDL burst + pg_dump catalog walks. Discriminator = IO graph shape (spike=one-time self-clearing; plateau=cron lever PLUTO-67). GATED on Elazar interval ruling if plateau. No compute upgrade warranted. |
done |
normal |
— |
2026-06-16 02:05 |
| MSG-55 |
llmmsg-srv |
cc-context-monitor: remove drain poke, fix zombie alerts (route+cooldown+threshold+allowlist) |
done |
high |
bin-whey-cc |
2026-06-16 01:39 |
| MSG-54 |
llmmsg-srv |
KPI Track A: ADD pg views (usage.v_kpi_tokens_7d + context.v_kpi_compact_7d) + extend scrp-kpiweekly-whey (email + snapshot/live-read) |
backlog |
high |
bin-whey-cc |
2026-06-16 01:23 |
| PLUTO-133 |
pluto |
feat(toast-telemetry): log guardrail toasts to appEvents as toast/error-shown (bs-mqfa6wg9bi8 (b)) |
done |
normal |
coder-pluto-cc |
2026-06-15 17:16 |
| PLUTO-135 |
pluto |
bug: pluto-lifecycle-inactivity cron FAILED nightly since 2026-06-09 — fn_lifecycleInactivity() UPDATEs users without SET LOCAL app.user_id GUC, so fn_archive_users() trigger rejects (line 21). 7+ days silent-dead, prod. Fix: set archive-context (app.user_id sentinel + app.archive_reason) in-txn before the users UPDATE per archive discipline; audit pre-apply review (fn + trigger-archived users table). |
done |
high |
db-pluto-cc |
2026-06-15 17:14 |
| PLUTO-136 |
pluto |
PLUTO-133 follow-up (Elazar 5b, sequenced AFTER the main toast sweep ships): should-be-required / data-integrity candidates needing a verify pass then fix — (1) periodo date-range fechaFin<=fechaInicio unvalidated client+server; (2) practica rejection comentario not required; (3) destructive activo toggles (periodo/comision) no confirm dialog → toggle-off cascades; (4) admin create-user with no role → primaryRoleId NULL → blank-redirect login. Verify each path first (2nd-sweep agent guessed some), then fix. Do NOT start until PLUTO-133 main sweep is shipped. |
backlog |
normal |
— |
2026-06-15 16:33 |
| VENUS-18 |
venus |
fix(perf): drain-outbox slow-query — idle-gate + idx_emailOutbox_active partial index |
done |
normal |
— |
2026-06-15 16:19 |
| VENUS-17 |
venus |
chore(db): emailOutbox terminal-row retention prune — sent/permanentlyFailed rows never deleted, accumulate unbounded (was factor in drain-outbox seq-scan slow-query). Add retention prune for sent/permanentlyFailed older than ~30d (evolutiva-commons retention hygiene; emailOutbox not audited → no setArchiveContext needed). Non-urgent: partial index on status IN ('pending','sending') already neutralizes perf impact; this caps table growth. Note: drain-outbox idle-gate + partial-index fix in flight separately. |
backlog |
normal |
— |
2026-06-15 16:13 |
| VENUS-16 |
venus |
chore(db): index unindexed FKs on live query paths |
backlog |
low |
— |
2026-06-15 16:13 |
| MARS-131 |
mars |
Mars DB hygiene (no IO risk, found in 06-15 Disk-IO self-check): (1) VACUUM ANALYZE teacherComisionMemberships (65d stale, 19.7% dead); (2) lower autovacuum_vacuum_scale_factor on notifications (high churn); (3) drop unused idx_st_createdbyuserid on supportTickets (0 scans, 13 rows); (4) index users.comisionId when query plans warrant. All reversible, audit pre-apply DDL review. |
backlog |
low |
— |
2026-06-15 16:12 |
| MARS-128 |
mars |
UX: take-to-gap inline cue for 'Seleccioná al menos una pieza dental' no-teeth-selected submit gate (practica-form line 401) — match MARS-99 pattern |
done |
low |
— |
2026-06-15 16:09 |
| VENUS-13 |
venus |
feat(telemetry): device/viewport coarse-banded capture + most-used-viewport report for mobile UX, riding appEvents rail |
done |
normal |
— |
2026-06-15 16:07 |
| MARS-130 |
mars |
Data-min hardening of client-env viewport telemetry: drop raw userAgent + exact px + session_id, store fine width buckets + dpr bucket + orientation + deviceType + OS-family, keep actorUserId for role tie |
done |
normal |
— |
2026-06-15 16:03 |
| VENUS-12 |
venus |
feat(cursada): sede self-selection UNBUILT — students cannot pick rotation sede (mi-cursada only filters); go-live blocker per client 2026-06-09 |
done |
high |
pm-venus-cc |
2026-06-15 15:59 |
| VENUS-15 |
venus |
chore(db): prune legacy viewport fingerprint rows — 132 pre-reshape client-env/viewport rows store exact-px+full-UA+userId, IMMUTABLE (wi302 appevents-immutable), no retention-prune job → persist indefinitely. Reshape (VENUS-13) stops new fingerprints only. Prune via db-venus SET LOCAL app.bypass_immutable. Irreversible deletion → Elazar go/no-go required. Pre-go-live test-user data (21 testers), low stakes. |
blocked |
normal |
— |
2026-06-15 15:46 |
| MARS-129 |
mars |
Device viewport telemetry: one-per-session client-env/viewport appEvent + /api/log-client-env route + breakpoint-band aggregation for mobile UX |
done |
normal |
— |
2026-06-15 14:41 |
| VENUS-14 |
venus |
feat(ptd): authed-route PTD tooling — PTD render-GET can't exercise authed routes (302/login); authed pages + authed-only behavior (toast/error-shown producer, práctica gates) never runtime-verified. Fix: in-process self-check route (preferred) or least-priv stored session for manual authed pass. Sibling: MARS-118. |
backlog |
normal |
— |
2026-06-15 14:39 |
| VENUS-11 |
venus |
bug(validation): D3-4/5 antecedentes parent-checked-no-children + complicaciones notas/ids mismatch — advisory-log-only to measure real-user frequency |
deferred |
normal |
— |
2026-06-15 14:38 |
| VENUS-10 |
venus |
feat(ux): práctica-form UX-friction sweep — all-errors-inline (Model-A), zero-operador+sede=Otros gates, toast/error telemetry PRODUCER, D3-4/5 advisory log-only |
done |
normal |
— |
2026-06-15 14:37 |
| MARS-127 |
mars |
UX: eliminate /practicas/nueva guardrail toasts (piece-required add+submit, combined-image-size) via inline affordance enforcement |
done |
normal |
— |
2026-06-15 14:06 |
| #619 |
llmmsg-srv |
aro_leave-on-idle rule: llmmsg-protocol.md ARO-Membership canonical + per-agent CLAUDE.md one-liner (self-leave non-essential AROs when last task done, stay registered, rejoin on assignment) ↳#617 |
done |
high |
pm-llmmsgsrv-cc |
2026-06-15 09:15 |
| MSG-52 |
llmmsg-srv |
Post-migration team restructure: PM=single always-on front door + retire support + rename hub-llmmsgsrv-cc to coder-llmmsgsrv-cc (ARO-less on-demand) |
done |
normal |
pm-llmmsgsrv-cc |
2026-06-15 08:39 |
| MSG-51 |
llmmsg-srv |
Triage edge LLMMSG_HUB_BEARER rotation: exposed on GitHub via api-images repo (NOT llmmsg-only exposure, so no-rotate rule does not apply) |
backlog |
normal |
coder-llmmsgsrv-cc |
2026-06-15 08:39 |
| MSG-50 |
llmmsg-srv |
dm-* send-authorization: reject non-owner/non-host-nw/non-Elazar sends to or origin_aro'd-as aro:dm-* |
backlog |
low |
coder-llmmsgsrv-cc |
2026-06-15 08:39 |
| MSG-49 |
llmmsg-srv |
Unknown /command errors back to sender (not silent-send); usage-error on malformed known verb |
backlog |
normal |
coder-llmmsgsrv-cc |
2026-06-15 08:39 |
| MSG-38 |
llmmsg-srv |
POST /unregister route: deregister permanence for VENUSINF waves - {agent,caller,[bearer]}; txn validate->capture-PM-AROs->deleteAroByAgent->electPm-each->deleteRosterRow; PRESERVE cursors (optional purge_cursor:true default false); idempotent 200 already_absent; auth self-dereg ungated + admin-dereg edge-bearer interim soft-dep #599; HTTP-only (no MCP tool). Replaces hand-SQL roster DELETE dereg-at-cutover. |
backlog |
high |
coder-llmmsgsrv-cc |
2026-06-15 08:39 |
| MSG-32 |
llmmsg-srv |
init-db.sh drift: stale messages schema (generated tag + phantom cols) contradicts hub.mjs self-create / live DB - reconcile or demote |
backlog |
high |
coder-llmmsgsrv-cc |
2026-06-15 08:39 |
| MSG-23 |
llmmsg-srv |
hub.mjs latent SQLITE_ERROR: 'no such column: ""' at Database.prepare (seen 00:47:15 pre-restart). Route interpolates empty string into query as = "" (SQLite parses "" as column id). Find the unparameterized query, convert to bound params. Route-triggered, not fixed by restart. Also tidy hub.mjs:1007 error string to match widened regex. |
backlog |
normal |
coder-llmmsgsrv-cc |
2026-06-15 08:39 |
| MSG-13 |
llmmsg-srv |
Hub leaks direct DMs into sender's home ARO: kind=dm fanned to origin_aro roster (cc-context-monitor-venus DMs reaching nw-venus-cc) |
backlog |
high |
coder-llmmsgsrv-cc |
2026-06-15 08:39 |
| MSG-5 |
llmmsg-srv |
Post-/compact re-register reliability: hook-fire blind spot + hook-independent shim re-register net |
backlog |
high |
coder-llmmsgsrv-cc |
2026-06-15 08:39 |
| #597 |
llmmsg-srv |
Hub cleanup traps (post-#594): systemd unit sets LLMMSG_SRV_DB but code reads LLMMSG_DB (no-op env var); stale llmmsg.sqlite + init-db.sh schema conflicts with live v2.sqlite |
backlog |
low |
coder-llmmsgsrv-cc |
2026-06-15 08:39 |
| #596 |
llmmsg-srv |
Refresh venus /opt/llmmsg-srv flat copy from whey (hub.mjs+shim) - stale May-18 scp caused misdiagnosis; do NOT delete (venus MCP shim runs from it) |
backlog |
low |
coder-llmmsgsrv-cc |
2026-06-15 08:39 |
| #540 |
llmmsg-srv |
Shim transport prefer-list: loopback -> ZT -> public DNS (defer until W3+W4 prove design) ↳#531 |
backlog |
low |
coder-llmmsgsrv-cc |
2026-06-15 08:39 |
| #634 |
llmmsg-srv |
Durable GC for stale bridge registrations (TTL prune) - no more retired-codex corpses in registrations.json |
deferred |
normal |
coder-llmmsgsrv-cc |
2026-06-15 08:39 |
| #621 |
llmmsg-srv |
WI592 nag: drop CronCreate /compact from emit_context_budget_nag interactive branch once send-keys watchdog verified fleet-wide ↳#617 |
backlog |
normal |
coder-llmmsgsrv-cc |
2026-06-15 08:39 |
| #616 |
llmmsg-srv |
Push llmmsg protocol mechanics into MCP send tool + hub (shrink model-held context) |
backlog |
normal |
coder-llmmsgsrv-cc |
2026-06-15 08:39 |
| #615 |
llmmsg-srv |
chat-duo-web 9704 to lezama: move off whey-initiated -R (VPN-dependent) to lezama-initiated -L over public route ↳#531 |
backlog |
normal |
coder-llmmsgsrv-cc |
2026-06-15 08:39 |
| #577 |
llmmsg-srv |
Fix static ~/.codex/config.toml footgun: wrong key LLMMSG_AGENT->LLMMSG_AGENT_NAME + LLMMSG_SRV_HOST 127.0.0.1->public; bare codex (not via ca.sh) currently falls back to cc= in /opt/llmmsg-srv = registers as pm-llmmsgsrv-cc on loopback. Non-blocking; ca.sh -c overrides already bypass it ↳#572 |
backlog |
normal |
coder-llmmsgsrv-cc |
2026-06-15 08:39 |
| #603 |
llmmsg-srv |
Alert when a CC session is blocked on interactive prompt (AskUserQuestion menu / permission approval / ExitPlanMode): wire CC Notification hook (or transcript-watcher fallback) to DM elazar via llmmsg-srv naming the blocked agent+host. Solves operator having to hunt tmux windows. Research dispatched to claude-code-guide. |
backlog |
high |
coder-llmmsgsrv-cc |
2026-06-15 08:39 |
| #599 |
llmmsg-srv |
Close aro_config auth gap: token-gate POST /aro_config + other privileged hub writes so a forged caller=elazar fails (coder-applog-cc exploited it to flip aro:applog PM). Elazar approved ship. |
backlog |
high |
coder-llmmsgsrv-cc |
2026-06-15 08:39 |
| #573 |
llmmsg-srv |
Design + LIVE-TEST ca.sh: reads ca= from .agent-name, codex --dangerously-bypass-approvals-and-sandbox, injects -c mcp_servers.llmmsg-srv.env.LLMMSG_AGENT_NAME + LLMMSG_HUB_URL; PROVE shim auto-registers under ca name (roster check) before calling done ↳#572 |
backlog |
high |
coder-llmmsgsrv-cc |
2026-06-15 08:39 |
| OPS-13 |
agent-ops |
Implement scrp-<script_name>-<host> sender naming: notify-elazar.sh + notify-nw.sh derive scrp-$(basename caller, strip ext, - to _)-<host> and stamp it as hub sender + email From-name/subject prefix; rename direct-hub-poster scripts (evolutiva-errscan errscan-whey-cc to scrp-evolutiva_errscan-whey, llmmsg-kpi-report llmmsg-srv-cc fallback to scrp-kpi_report-whey, sweep rest). -cc/-ca reserved for real agents. Convention: agent-conventions.md Script/Automated Sender Naming (Elazar 2026-06-10) |
done |
normal |
bin-whey-cc |
2026-06-15 08:32 |
| MSG-53 |
llmmsg-srv |
Hub-side script-rename impact confirm: nothing keys off old cc-context-monitor-<host> sender name (roster.host backfill, /fleet_health, routing) after rename to script-ctxmonitor-<host> |
done |
low |
hub-llmmsgsrv-cc |
2026-06-15 08:30 |
| OPS-19 |
agent-ops |
cc-context-monitor FIX#1+#2: idle-sense (last-ASSISTANT-ts not getmtime) + safe-compact REPL-ready marker |
done |
normal |
nw-whey-cc |
2026-06-15 08:29 |
| OPS-18 |
agent-ops |
monitor peer-watchdog: roster-presence→probe-age (post-wave-1 prune-churn fix) |
done |
normal |
nw-whey-cc |
2026-06-15 08:29 |
| PLUTO-131 |
pluto |
Email deliverability: Pluto-specific spam deltas vs mars/venus (from-identity noreply-class + 'BMF 1' display, text-only not multipart, Reply-To mismatch). F1 named-from, F2 auto-render html multipart (standing Elazar rule), F3 align Reply-To. Audit report audit-pluto-cc-mqdhup806iis. |
done |
normal |
— |
2026-06-15 08:20 |
| MSG-30 |
llmmsg-srv |
VENUSINF: venus infrastructure migration coordination (Phase 0-3) |
done |
high |
pm-llmmsgsrv-cc |
2026-06-15 08:08 |
| PLUTO-132 |
pluto |
feat(soporte): copy mars soporte into pluto |
deferred |
normal |
— |
2026-06-15 07:32 |
| VENUS-9 |
venus |
feat(soporte): copy mars soporte into venus |
deferred |
normal |
— |
2026-06-15 07:24 |
| MSG-48 |
llmmsg-srv |
Brainstorm sessions follow speaking-order protocol end-to-end (cdw+hub) + coach violators + terse AI-shorthand brainstorm protocol in llmmsg-protocol.md |
done |
normal |
pm-llmmsgsrv-cc |
2026-06-15 04:54 |
| MARS-30 |
mars |
Adopt .gitpush-strict marker in Mars repo root to prevent add -A peer-WIP sweeps |
done |
high |
coder02-mars-cc |
2026-06-15 03:56 |
| MSG-47 |
llmmsg-srv |
MSG-30 lezama: coordinated full-tree pull-forward (shim v2.9.47 + bootstrap v1.19 + package.json, atomic) - replaces nw-lezama hand-patch, un-dirties staged v1.18 bootstrap |
backlog |
low |
pm-llmmsgsrv-cc |
2026-06-15 03:37 |
| MSG-46 |
llmmsg-srv |
cdw PWA: make chat-duo-web installable (manifest+icons+service worker, Add-to-Home-Screen) |
backlog |
normal |
coder-chatduo-cc |
2026-06-15 02:51 |
| MSG-45 |
llmmsg-srv |
/setpm regex: tolerate optional space after slash ('/ setpm') - human typo-forgiveness on the cdw-facing command |
done |
normal |
hub-llmmsgsrv-cc |
2026-06-14 22:37 |
| MARS-126 |
mars |
Real-life-as-SSOT JTP attribution analysis: quantify divergence between start-of-year studentAssignments (error-prone excel import) and actual student JTP picks (práctica.jtpUserId). Two mismatch classes: (1) JTP students picked but aren't assigned to; (2) students assigned to a JTP who picked a different one. Analysis only first (no writes); evidence base for evidence-based reassignment (NOT admin-pick UI). Links MARS-43 + live-vs-snapshot rule. (Elazar 2026-06-14) |
backlog |
normal |
— |
2026-06-14 22:30 |
| MARS-125 |
mars |
Proactive unreviewed-práctica backlog outreach: identify top 3-4 teachers (JTPs) by sin-revisión backlog, the active JTP in each's comisión, the adjunto + titular; draft email to adjunto/titular asking how to address the backlog before it's insurmountable. Real-audience outbound — held for Elazar approval before send. (Elazar 2026-06-14) |
backlog |
normal |
— |
2026-06-14 22:24 |
| MSG-44 |
llmmsg-srv |
Hub control-verb /setpm <aro> <agent>: Elazar self-service PM reassignment from cdw chat (gated sender==elazar, roster-validated) |
done |
high |
hub-llmmsgsrv-cc |
2026-06-14 22:11 |
| MARS-98 |
mars |
Migrate 3 raw <select>s to the Select primitive (mobile-first debt) |
done |
low |
— |
2026-06-14 22:08 |
| MARS-49 |
mars |
KPI email templates emit full <!doctype> nested inside wrapHtml (double-chrome) — return inner-content-only like support-digest |
done |
low |
— |
2026-06-14 21:36 |
| MARS-113 |
mars |
Add global client-error handler (window.onerror + onunhandledrejection) to Mars for telemetry parity — currently only React-boundary + server errors are captured; async unhandled rejections / raw event-handler throws go uncaptured (no clientWindowError family exists). Additive coverage, not a defect. MUST serialize err.message/.name/.stack as discrete fields (NOT raw object → '[object Object]') per the venus fc69b24 lesson. Surfaced by cross-app applog review. |
done |
low |
— |
2026-06-14 21:36 |
| MARS-114 |
mars |
Delete dead code: SortableHeader component (zero usages; live tables go through DataTable) |
done |
someday |
— |
2026-06-14 21:26 |
| MARS-124 |
mars |
MARS-84 durability follow-up: move the ux-pain-digest hub-DM relay from agent-side CronCreate to the venus host-poller (systemd-grade) — curl /api/internal/latest-ux-pain-digest weekly + DM PM+Elazar; needs CRON_SECRET in the host store + maintainer coordination. CronCreate dies with the agent session (misses a week if down at fire time); email leg backstops but DM should be durable. |
done |
normal |
— |
2026-06-14 21:25 |
| #1 |
mars |
Drop comisionCode from vTeacherComisiones |
done |
low |
— |
2026-06-14 21:25 |
| MARS-115 |
mars |
Profile-image IDOR: /api/image/[id] open-proxies profile blobs when no practicaImages row matches; gate on profileImageId ownership (self+admin) else 404 |
done |
normal |
— |
2026-06-14 21:19 |
| MARS-105 |
mars |
appEvents severity misclassification: notify-email-failed + client/unhandled-error logged as warn (should be error); navigation/practica-link-dead logged as info (should be warn) |
done |
normal |
— |
2026-06-14 21:19 |
| MARS-93 |
mars |
sa-teachers-cascade over-flags needsManualReview on unresolvable ayudante (recurring warn). Scope needsManualReview to JTP slot only — ayudante is informational per JTP-only-grading rule; + make the cascade warn idempotent (skip re-emit when SA already needsManualReview) so one batch \!= N pager hits |
done |
normal |
— |
2026-06-14 21:19 |
| MARS-61 |
mars |
postgrado-progression.tsx Guardar lacks double-submit guard — bare async action (no useTransition), double-click fires two updatePostgradoProgression UPDATEs + two archive rows. Fix: wrap in useTransition + disabled={isPending} (~5 lines, same pattern as SupportReplyForm) |
done |
normal |
coder02-mars-cc |
2026-06-14 21:19 |
| MARS-59 |
mars |
Email outbox: persist + cron-retry user-facing sends so SMTP timeouts never block the user or drop mail |
done |
normal |
— |
2026-06-14 21:19 |
| MSG-41 |
llmmsg-srv |
VENUSINF-5: public cdw URL (cdw-t.pensanta.com) - native venus cdw deploy + Caddy edge w/ human-auth, replacing Tailscale-only :9704 |
done |
high |
pm-llmmsgsrv-cc |
2026-06-14 20:47 |
| MARS-123 |
mars |
Broaden skew auto-reload classifier to chunk-load TypeErrors (Load failed / Failed to fetch / ChunkLoadError / dynamic-import errors) so stale-chunk refs self-recover via one-shot cache-bust — gated on recurrence; error-report-block.tsx isVersionSkew currently matches only the exact RSC stale-bundle string. Low risk (bounded by sessionStorage one-reload-per-session + __rscRetry guard). Do NOT ship for a single transient; revisit if Load-failed/chunk-load warns recur with volume. |
backlog |
low |
— |
2026-06-14 16:43 |
| MSG-43 |
llmmsg-srv |
Rationalize errscan-vs-applog overlap fleet-wide (both = error->PM-DM; applog covers all 3 proj+now green, errscan mars-only, mars DOUBLE-covered) - decide consolidate-not-expand; needs PM/Elazar division-of-labor call |
deferred |
low |
pm-llmmsgsrv-cc |
2026-06-14 15:04 |
| MSG-42 |
llmmsg-srv |
Post-VENUSINF systemd-client bearer sweep: applog-pull/listen + errscan inject LLMMSG_HUB_BEARER (hubPost hardcoded bearerless, applog-pull.ts:121) + per-instance bearer env across hosts - restores fleet alerting (applog-pull@pluto unauthorized live) |
done |
high |
nw-venus-cc |
2026-06-14 14:57 |
| #553 |
llmmsg-srv |
chat-duo: rebuild Elazar Pending sidebar pane properly (removed v1.19.3) |
done |
low |
coder-chatduo-cc |
2026-06-14 14:18 |
| MSG-37 |
llmmsg-srv |
cdw periodic flicker: loadAgentStyles 60s poll triggers repaintStyles()->loadHistory() (feed.innerHTML='' + refetch = full feed teardown) on ANY agent_styles change. /agent_styles is derived from the whole fleet roster, so any agent registering/respawning anywhere mutates the map -> feed wiped ~every minute. Fix: repaintStyles must recolor names in-place, not reload the feed. |
done |
high |
pm-llmmsgsrv-cc |
2026-06-14 14:17 |
| MSG-40 |
llmmsg-srv |
SECURITY: rotate leaked LLMMSG_EDGE_BEARER (venus edge-bearer) - committed to PUBLIC GitHub (pluto feat/tenant-isolation commit 5ab8c34), history-purged+force-pushed but exposure window real = treat compromised. Fleet-wide blast: venus hub LLMMSG_EDGE_BEARER env + EVERY migrated agent .llmmsg-env (LLMMSG_HUB_BEARER, ~26) + cdw service env + possibly Caddy edge config. Method: dual-bearer grace (zero-outage) preferred over coordinated bounce. Owner pm-llmmsgsrv-cc coordinating; hub-llmmsgsrv hub-code, nw-whey .llmmsg-env sweep, nw-venus venus-host exec, coder-chatduo cdw. |
done |
high |
pm-llmmsgsrv-cc |
2026-06-14 14:15 |
| MSG-39 |
llmmsg-srv |
cc-context-monitor hub-aware unregistered-check: whey-only roster read false-flags every VENUSINF-migrated agent (off-host .llmmsg-env) as 'genuine registration failure' + auto-heal-then-reflag loop. Fix: check agent against the hub its launch-cwd .llmmsg-env names (or exclude off-host-.llmmsg-env agents from the whey-scoped check). Blocks broad pluto/venus/whey cutovers (noise flood + auto-heal race); mars (5 agents) tolerable. Owner bin-whey-cc (monitor script). |
done |
high |
bin-whey-cc |
2026-06-14 10:05 |
| OPS-17 |
agent-ops |
cc-context-monitor zombie-detector false-positives on reactive-idle agents: rule (turns>=2 && tool_calls==0 -> zombie) can't distinguish a self-armed-wakeup zombie from a reactive agent woken by inbound llmmsg DM that acked + stood down with no tools needed. At 05:00 it flagged audit-venus-cc (benign: empty CronList, zero ScheduleWakeup ever, 100% inbound-DM-driven) -> 2 dup alerts + cross-host investigation. Hits EVERY reactive agent (host nw between alerts, audit agents). Fix (nw-whey suggested): a wake is zombie-suspect only if NOT preceded by an inbound message in the window (self-triggered) AND/OR non-empty CronList; if wake correlates with inbound DM + empty CronList -> reactive-idle, suppress. Hub has inbound-msg timestamps to correlate. Related: OPS-11 last_turn stale-read. |
backlog |
normal |
bin-whey-cc |
2026-06-14 08:03 |
| PLUTO-130 |
pluto |
alumno->docente conversion leaves dangling studentAssignment (Elazar greenlit fix-the-flow). When a user is converted alumno->docente (alumno role soft-deleted + docente role added), the conversion does NOT soft-delete the user's active studentAssignment (enrollment) — so they remain a 'current student' of a comisión while being a docente. Found via Mariano Trigo (c8fe9bcb): active F-Sábado studentAssignment persists post-conversion. FIX: (1) coder — conversion code path must ALSO soft-delete the studentAssignment (archive-context, studentAssignments is trigger-archived); (2) db — clean existing stale stubs (all users with active studentAssignment + active docente role + no active alumno role) with archive-context+reason. SCOPE FIRST (db read-only): conversion code path + count/list inconsistent-state users. |
done |
high |
db-pluto-cc |
2026-06-14 07:39 |
| PLUTO-128 |
pluto |
PROD bug (Elazar blocked): no UI affordance to assign a teacher to a comisión. On /admin/usuarios/c8fe9bcb-03ac-45d1-8241-6e5d1420afe4 (a docente) there is NO button/link to add him to a comisión, nor to assign a comisión to him. Investigate: is the teacher->comisión assignment UI shipped anywhere (comisionJtps/comisionAdjuntos/titular write path) or absent (Stage 4 / PLUTO-133/136 blocked)? Missing-link vs missing-capability? Fix so an admin can assign. WRITE TARGET = fraud-sensitive assignment tables: soft-delete only + archive context + role-aware (titular/adjunto/jtp) + capability-gated. Likely unblocks PLUTO-61 (3 real unassigned docentes). Audit design-ping before implement (fraud-table write path). |
done |
high |
coder-pluto-cc |
2026-06-14 07:19 |
| PLUTO-129 |
pluto |
Hardening: roster-add forms allow adding a fraud-table membership into a NON-current/closed period — isPeriodoValid checks only deletedAt IS NULL, not isCurrent. Affects BOTH the new docente-detail add-form (PLUTO-128) AND the already-shipped list-page dialog (docentes/page.tsx) — PARITY, not a 128 regression. If cross-period roster-add is NOT an intended workflow (pre-stage future / correct past period), gate both forms on isCurrent. PENDING Elazar's intent call (is cross-period add a feature?). Surfaced by audit on PLUTO-128 pre-push review. |
backlog |
normal |
— |
2026-06-14 07:11 |
| MARS-121 |
mars |
DB: drop 18 unused indexes (8 practicaTeeth clinical-filter + 3 practicaToothConductos + 3 practicas demographic + comisionId/accessRequestId/entitySeq/support/lock dead indexes); KEEP ix_appEvents_category_action_createdAt (new, stats unpopulated); reduces write amplification; audit pre-apply migration |
done |
normal |
— |
2026-06-14 06:57 |
| PLUTO-38 |
pluto |
pg_cron pluto-drain-email-outbox fails 674/674: schema "net" does not exist (pg_net not installed) |
done |
normal |
db-pluto-cc |
2026-06-14 06:55 |
| MARS-120 |
mars |
DB hygiene sweep: pull Supabase security + perf/index advisors + log planes (postgres/auth/api/storage/edge); analyze real signals vs infra noise; keep/drop report to PM; DDL via audit pre-apply |
done |
normal |
— |
2026-06-14 06:51 |
| MARS-119 |
mars |
DB: search_path hardening (lint 0011) — audit SECURITY DEFINER fn subset FIRST (privesc priority), then pin SET search_path=public on flagged fns; behavior-preserving; DDL via audit pre-apply |
done |
normal |
— |
2026-06-14 06:51 |
| PLUTO-126 |
pluto |
Email retry/failure backstop gap (pre-existing, exposed by PLUTO-38 cron-drop): after dropping the dead drain-email-outbox cron, Pluto has NO email retry and NO failure alert. A failed send (SMTP timeout) strands the row 'pending' forever — no retry, no operator alert (the alert-after-5-attempts only ever fired from the now-dead drain, which never functioned anyway). Invisible today (0 pending). Live happy-path = Next.js after()-hook send. Restore options: (a) pg_net+pg_cron */5 GATED drain (sanctioned path; vercel.json CANNOT host sub-daily cron — fails the whole build); (b) external scheduler; (c) minimum cheap win = alert-on-strand observability (appEvents warn when a row sits pending > N min). Disposition: reliability vs cron-cost — Elazar's call. Not urgent. |
backlog |
normal |
db-pluto-cc |
2026-06-14 06:50 |
| PLUTO-122 |
pluto |
search_path hardening migration: pin SET search_path on all 36 public functions (function_search_path_mutable lint 0011). Behavior-preserving (most ref public -> SET search_path = public; do NOT use '' on any fn referencing public objects unqualified - verify each resolves identically). Additive/reversible. 0 SECURITY DEFINER fns so risk near-zero; Elazar greenlit anyway for a clean advisor. Audit pre-apply (schema DDL) -> apply -> db:export -> push via db exception lane. |
done |
normal |
— |
2026-06-14 06:47 |
| PLUTO-125 |
pluto |
Advisory (low pri): enable auth_leaked_password_protection (HaveIBeenPwned check) in Supabase auth — currently disabled. Low value for Pluto (allowlist-only, no open signup) but a free defense-in-depth toggle. From PLUTO-123 security sweep. |
backlog |
low |
— |
2026-06-14 06:44 |
| PLUTO-123 |
pluto |
Supabase security+logs analysis sweep (Elazar directive, all 3 apps): db agent pulls Supabase security advisor + logs (postgres/auth/api/storage/edge-function) and ANALYZES them - triage real signals (auth anomalies, error spikes, slow queries) vs known infra noise (JWKS, PostgREST probe, pool churn). Periodic DB-hygiene sweep per evolutiva-commons. Report findings to PM for consolidated report. |
done |
normal |
— |
2026-06-14 06:44 |
| OPS-15 |
agent-ops |
settings.json PostToolUse push-to-gdrive-canonical silently no-ops: basquetwi.md local edits did NOT propagate up to /gdrive/config/claude-shared/ (canonical stayed mtime May-18), so SessionStart cp re-pulled STALE over the edit. Hook's 'cp ... 2>/dev/null' swallows failures = silent doc drift fleet-wide. Audit why push no-ops + surface failures. |
done |
high |
nw-whey-cc |
2026-06-14 06:42 |
| BWI-10 |
basquetwi |
wi ask: drop hardcoded assignedTo='elazar' default + retire stale_elazar_questions_gt_7d doctor check (OPS-16 code part) |
todo |
normal |
coder-basquetwi-cc |
2026-06-14 06:40 |
| MARS-122 |
mars |
DB (deferred/cold): 24 unindexed FKs on forensic/audit/housekeeping columns (archivedBy/deletedBy/restoredBy/resolvedByUserId/surrogateUserId/actorUserId/createdUserId/assignedTeacherUserId); none in hot paths; track, index only if a real query path emerges |
backlog |
normal |
— |
2026-06-14 06:40 |
| OPS-16 |
agent-ops |
Scrub stale eq / Elazar Pending text from bwi-tool PROJECT canonical docs (MSG-36 followup): /home/rob/Documents/work/pensanta/projects/basquetWi/basquetWiInstructions.md + that project's CLAUDE.md still carry old eq/Pending wording. Not the global-rule SSOT (gdrive is, already fixed) but scrub for consistency. Owner: bwi-tool maintainer. |
backlog |
normal |
pm-basquetwi-cc |
2026-06-14 06:39 |
| PLUTO-121 |
pluto |
KPI-rework /informes (gathering inputs, do NOT implement yet): teacher-scoped report quality pass. Inputs so far: (a) wrap bare CohortAndProcedureCards grid (teacher-report.tsx:818) in titled ReportSection; (b) Moda operador/asistente cards mislabeled (modal per-student count, not most-frequent person) + redundant beside Promedio -> cut or relabel; (c) EPI RE-WEIGHT: Puia wants MORE epidemiology on pluto+venus -> KEEP/EXPAND porSexo/porProvincia/etc (REVERSES earlier generic-remove rec; do NOT cut epi buckets). Grounding: judge on ACTUAL teacher-scoped values via audit-venus KPI->source-view map + db-pluto value pull, NOT admin-proxy shape. Awaiting full KPI->view map (~20-30min from audit-venus) + Elazar per-item rulings before WI splits into coder/db work. |
backlog |
normal |
— |
2026-06-14 06:25 |
| PLUTO-127 |
pluto |
└─ /informes top summary cards grouping (Elazar GO now): wrap the bare top-of-report totals cards — Total prácticas, Como operador (%), Como asistente (%), Alumnos activos — in a single titled ReportSection matching the sibling pattern (same as PLUTO-124's 'Resumen de cohorte y procedimientos'). Wrapper/title only, values+logic unchanged. teacher-report.tsx. UI-only, post-push PTD. |
done |
high |
coder-pluto-cc |
2026-06-14 06:55 |
| PLUTO-124 |
pluto |
└─ /informes immediate UI fixes (Elazar GO now): (a) wrap bare CohortAndProcedureCards grid (teacher-report.tsx:818) in a titled ReportSection matching sibling sections; (b) CUT 'Moda operador/asistente' cards (mislabeled modal-per-student count, redundant beside Promedio) + remove now-dead computeMode/opCounts plumbing ~1199-1201, keep Promedio. UI-only, post-push audit PTD. Rest of KPI-rework held under parent 121. |
done |
high |
coder-pluto-cc |
2026-06-14 06:47 |
| MSG-36 |
llmmsg-srv |
Strip eq / 'Elazar Pending' feature fleet-wide (Elazar directive 2026-06-14): hub routes, MCP eq_* tools, cdw web + chat-duo GTK panes, DB table, all docs/CLAUDE.md/memory. Replacement rule everywhere: ask Elazar via llmmsg-srv DM. Stale eq_add call -> hard 'eq retired' error. |
done |
high |
pm-llmmsgsrv-cc |
2026-06-14 06:19 |
| PLUTO-118 |
pluto |
Demo-data UI+route gating behind SHOW_DEMO_TOOLS flag (server-side, default FALSE, byte-identical fleet-wide). Conditional-render not CSS-hide (no DOM/view-source leak) for ALL roles incl admin; gate demo UI surfaces AND seed/teardown server actions/routes (403/404 when off — seal the injection path, not just the button). Keep code: flag-gated in main, CI typecheck touch so demo path compiles, one-line README. Pluto surfaces: createdVia='demo_seed', demo teardown route, @demo.pluto allowlist (email-allowlist.ts), seed-demo script, any isDemo/demo badge/filter/nav. Existing demo ROWS = separate db-op, Elazar's call (Pluto LIVE → purge demo-labeled only w/ archive-context, or leave hidden). BLOCKED on Elazar greenlight + nw-whey's cross-app enumeration checklist. |
done |
normal |
coder-pluto-cc |
2026-06-14 06:13 |
| #578 |
llmmsg-srv |
hub nudge to drive eq adoption: when an agent DMs Elazar a prose blocking-question and hasn't filed a matching eq, hub nudges sender to use eq_add (sibling to reply-nudger/idle-alert; conservative heuristic; env-disable flag) |
done |
normal |
hub-llmmsgsrv-cc |
2026-06-14 06:11 |
| MSG-19 |
llmmsg-srv |
eq stale-removal: one-click dismiss/stale in chat-duo Pending pane + auto-stale sweep (auto-dismiss when ref_bwi closes / N-day age) |
done |
normal |
coder-chatduo-cc |
2026-06-14 06:11 |
| MSG-18 |
llmmsg-srv |
chat-duo-web: auto-expire/hide eq entries when no longer relevant (stale Elazar questions clutter the Pending panel — e.g. the lezama cert/kernel eq Elazar just flagged 'this is old'). Hook to wi doctor's >7d Elazar-Q drift + an age TTL or resolve-on-supersede. |
done |
normal |
— |
2026-06-14 06:11 |
| PLUTO-115 |
pluto |
Venus R2 Dim-8 perf findings (fec7fc4, read-only — db must EXPLAIN-verify each on live plans before fix; rank by absolute ms/day not label). HIGH: F1 adjuntoNames correlated subquery ×270 (vActiveRoster + vPracticasHierarchyRollup + getPracticasTeamStats queries.ts~1840) → pre-agg CTE/LEFT JOIN; F2 getDocenteProductivity MIN(createdAt) correlated subquery ×118 (queries.ts~1698) → reviewDates CTE; F3 missing btree practicaReviews.practicaId → CREATE INDEX CONCURRENTLY; F4 vUserLastLogin appEvents full-scan every admin page → partial idx (actorUserId,createdAt DESC) WHERE category=auth AND action=login. MED: F5 getCorrelationReport nested correlated (~1785); F6 getYoyComparison 6 scalar correlated → conditional agg. LOW: F7 getAnomalyReport UNION-ALL opportunity (~1450); F8 vUsersWithRoles 3 correlated/user (admin-only). |
done |
normal |
— |
2026-06-14 06:07 |
| PLUTO-120 |
pluto |
Phase-2 demo cleanup (BLOCKED on demo-row purge): strip the now-unneeded demo filters/labels/tab once Elazar purges demo rows. These are PROTECTIVE while rows exist — removing earlier leaks demo data into real reports. Sites: admin/page.tsx:11 (@demo pendingUsers filter), informes/page.tsx:117-121 + practicas/page.tsx:139-142 ('Demo ' comision filter), admin-user-detail.tsx:68/127 + audit-log.tsx:122 (isDemo/demo_seed label map), complication-rate/dificultad-distribution/procedure-type cards '(no demo)' text, admin/usuarios 'Usuarios demo' tab. Coupled to PLUTO-118 phase-1 + the row purge. |
backlog |
low |
— |
2026-06-14 06:00 |
| PLUTO-119 |
pluto |
Code sweep: retire stale eventType-based appEvents queries (pre-migration schema paths still running, 35-37ms × 112-257 calls/day). Surfaced in PLUTO-115 EXPLAIN. Find + update to the current level/category/action schema. Coder sweep. |
backlog |
normal |
— |
2026-06-14 05:55 |
| PLUTO-114 |
pluto |
Venus R2 findings (fec7fc4, none high): R2-1 send-email 502 path leaks raw err.message (email-admin.ts:156→route.ts:126); R2-2 reviewUserDocumento (admin-actions:318) raw leak + NO logCaughtError (silent); R2-3 reactivateInactiveUser (admin-actions:1211) same; R2-4 LOW consistency (email.ts:483/legacy-export:145/poll-security-alerts:205 logged-first); R2-5 LOW getInactiveUsersPage:1147 bounded per-row subquery. Apply UserFacingError gate + logCaughtError to the MED leaks. |
done |
normal |
— |
2026-06-14 05:55 |
| PLUTO-109 |
pluto |
Bridge CTA: from /admin/usuarios/[id] Roles card deep-link to /administrar/docentes/[id] (teaching role) + /administrar/alumnos/[id] (alumno) when that role is present |
done |
normal |
coder-pluto-cc |
2026-06-14 05:45 |
| MARS-118 |
mars |
Audit PTD render-GET tooling: enable exercising authed routes (dedicated test-user + stored session, OR a server-side render-self-check route) — Mars leg of the cross-project gap that let Pluto's /informes 500 ship unexercised (audit unauth render-GET -> 302/login, authed routes never actually rendered in PTD) |
backlog |
normal |
— |
2026-06-14 05:35 |
| PLUTO-108 |
pluto |
Archive-reason gap: require typed reason on silent human soft-deletes (periodo + comision soft-delete, access-request reject) via promptReason; no-double-ask (compliant paths untouched) |
done |
high |
coder-pluto-cc |
2026-06-14 05:34 |
| PLUTO-117 |
pluto |
Harden getInformesBundle fn-output↔consumer contract (durable fix beyond the 112 runtime guard). Root lesson: Pluto's fn emits UNTYPED jsonb (jsonb_build_object) that TS only CASTS — a key rename (porLookup vs porAnestesia) compiles clean and crashes at runtime. A bare 'as' cast gives FALSE confidence (compiles while runtime JSON lacks the key). Fix: zod-parse (or equivalent runtime validate) the RPC return at the queries.ts:3897 boundary so fn↔consumer key drift fails LOUDLY at the boundary with a clear error, not a deep .map crash. Contrast venus: its reshapes build typed objects in TS code, so key drop fails COMPILE — Pluto's SQL-built JSON can't be compile-checked that way, hence runtime validation. |
backlog |
normal |
— |
2026-06-14 05:33 |
| PLUTO-116 |
pluto |
Real-time error tee: appEvents AFTER-INSERT pg_notify trigger on Pluto Supabase (error→PM DM, warn stays in digest). GATED on nw-venus's exact spec (channel name, WHEN-clause, payload — byte-identical channel+payload across 3 apps; host listener LISTENs + DMs PM). Pluto level vocab = error|warn|info (NO fatal) so WHEN-clause = level='error'. Pre-apply audit review per DDL discipline. Additive/reversible. Do NOT start until spec lands + 112 done. |
backlog |
high |
db-pluto-cc |
2026-06-14 05:31 |
| PLUTO-113 |
pluto |
Dead-code removal: softDeletePeriodo + softDeleteComision (admin-actions.ts:443/534) are exports with ZERO callers; live paths are removePeriodo/removeComision. Remove the dead exports. |
backlog |
low |
— |
2026-06-14 05:25 |
| PLUTO-112 |
pluto |
Live 500 on /informes — fn_getInformesBundle returns porAnestesia (and likely sibling array keys) undefined for sparse/zero-row scope; client .map crashes. PLUTO-97 regression. Fix fn to COALESCE every array key to [] + client null-guard. PTD must GET /informes for the failing scope, not log-tail. |
backlog |
urgent |
db-pluto-cc |
2026-06-14 05:24 |
| OPS-14 |
agent-ops |
whey↔lezama global ~/.claude/CLAUDE.md §-level reconcile: lezama missing entire sections whey has (was missing ## Collaborate — added 2026-06-14; also lacks Permission, Communication, others). Audit all 3 hosts' global CLAUDE.md section sets, decide canonical fleet-neutral set, mirror missing sections per-host. Surfaced during the log-review-autonomy global-line rollout. |
backlog |
normal |
nw-whey-cc |
2026-06-14 05:21 |
| PLUTO-110 |
pluto |
Page title prefix: 'BMF 1 | <page>' -> 'P | <page>' (layout.tsx template literal; do NOT touch CATEDRA_SHORT which drives email branding) |
done |
normal |
coder-pluto-cc |
2026-06-14 05:20 |
| PLUTO-106 |
pluto |
R1 cross-audit app fixes: send-email err.message leak + UserFacingError class + perfil ImageApiError + completar-asignacion actor + bulk-ops batched UPDATE |
done |
high |
coder-pluto-cc |
2026-06-14 05:18 |
| PLUTO-111 |
pluto |
Observability: log /api/image 401/403 auth-denials to appEvents (category auth/authz, level info) so denial-storms are diagnosable; route currently logs only proxy-failures, not the gate denials |
backlog |
low |
coder-pluto-cc |
2026-06-14 05:18 |
| PLUTO-107 |
pluto |
R1 cross-audit db fixes: appEvents retention auth/session >=365d floor + notifications prune cron (read >30d) |
done |
high |
db-pluto-cc |
2026-06-14 05:08 |
| MSG-35 |
llmmsg-srv |
Spurious unread-poke loop: read_unread cursor-ack is fire-and-forget (race) + drain-on-other-tools acks only on next poll + poker lacks debounce/idle-gate |
backlog |
high |
pm-llmmsgsrv-cc |
2026-06-14 04:58 |
| PLUTO-105 |
pluto |
Replace native window.prompt/confirm with app-styled promise-based dialog primitive (promptReason/confirmAction) |
done |
high |
coder-pluto-cc |
2026-06-14 04:55 |
| MSG-34 |
llmmsg-srv |
VENUSINF cutover-prereq: add LLMMSG_HUB_BEARER Authorization header to llmmsg-bootstrap-session.sh (/register + /aro/join curls 401 against bearer-gated venus hub; no-op when unset = additively safe) |
done |
high |
pm-llmmsgsrv-cc |
2026-06-14 04:49 |
| PLUTO-97 |
pluto |
Collapse /informes 24-query fan-out into one set-based Postgres query (view/RPC) |
done |
normal |
— |
2026-06-14 04:47 |
| MSG-33 |
llmmsg-srv |
Agent color+emoji recognition (cdw + hub): role-color taxonomy + override store |
done |
normal |
pm-llmmsgsrv-cc |
2026-06-14 04:33 |
| PLUTO-104 |
pluto |
Email subject format: BMF 1 / Pluto / <subject> — centralized prefix |
done |
high |
coder-pluto-cc |
2026-06-14 04:31 |
| MARS-117 |
mars |
Mars: track index/DDL changes in-repo — schema.md omits indexes (0 index refs) and DDL is applied via Supabase MCP (recorded only in Supabase migrations table), so index changes like ix_appEvents_category_action_createdAt have no git-side record. Add index export to export-db.py OR adopt a db/migrations file convention so DDL is reproducible/reviewable from the repo. |
backlog |
low |
— |
2026-06-14 03:32 |
| PLUTO-103 |
pluto |
Hygiene: vPracticaParticipantFacts counts demo-practica-by-real-student in scoped teacher stats (pre-existing, surfaced during PLUTO-97 gate-A) |
backlog |
low |
— |
2026-06-14 03:30 |
| PLUTO-102 |
pluto |
D8 Tier-1: collapse fan-out-vs-pool on 4 hot pages (admin/usuarios:97 8-wide, a-solucionar:37 6-wide, practicas:188/249, alumnos/[id]:86) via bundle-RPC/CTE per PLUTO-97 ↳#98 |
backlog |
high |
db-pluto-cc |
2026-06-14 03:20 |
| PLUTO-101 |
pluto |
D8 views+indexes (db lane): a-solucionar 6-scan view, academic-hierarchy + practicas team-stats/hierarchy views; verify 8d index candidates (deletedAt partial, periodoId, assignment*Id, comisionId/jtpId/adjuntoId, appEvents.createdAt, authId) vs actual index inventory ↳#98 |
backlog |
normal |
— |
2026-06-14 03:20 |
| PLUTO-100 |
pluto |
D8 Tier-3: batch sequential per-row write loops (personas-actions:378/388 role add/remove) into set-based INSERT VALUES / UPDATE WHERE id=ANY ↳#98 |
backlog |
low |
— |
2026-06-14 03:20 |
| PLUTO-99 |
pluto |
D8 Tier-2: compute-in-Node over DB rows (cron practicas-kpi-report:277/330/146/208, legacy-export-actions:68-88, hierarchy-utils:22-74/team-stats) -> SQL GROUP BY/ORDER BY ↳#98 |
backlog |
normal |
— |
2026-06-14 03:20 |
| PLUTO-98 |
pluto |
PLUTO D8 compute-placement remediation (self-scan) |
backlog |
normal |
— |
2026-06-14 03:20 |
| PLUTO-95 |
pluto |
Raw error text in HTTP response/UI — sanitize + log eventId (5 sites: log-404:45, cron/drain-email-outbox:34, api/image/[id]:76, administrar-actions:1527/1648). Return generic message + logged eventId, never raw err.name/message/String(err). From P0 cross-team error-handling audit, rubric #5. |
done |
normal |
coder-pluto-cc |
2026-06-14 03:12 |
| PLUTO-76 |
pluto |
F-3: practicaCreateFailed 9 hits Jun 3-4, detail=null (error thrown but not captured into logEvent). Add error-detail capture to the practica-create failure handler, then identify+fix the underlying create failure (check git log ~Jun 3 for practica changes). |
done |
normal |
coder-pluto-cc |
2026-06-14 03:12 |
| PLUTO-72 |
pluto |
appEvents logging-coverage + severity-correctness remediation (audit-pluto scan) |
done |
normal |
— |
2026-06-14 03:12 |
| PLUTO-25 |
pluto |
Pluto P3: denyAccess logs accessDenied at ERROR not info — errscan pager noise (info helper exists logger.ts:230) |
done |
low |
— |
2026-06-14 03:12 |
| PLUTO-96 |
pluto |
api-images blob orphan on profile/documento photo replace + user soft-delete (Pluto EVO-2 class). image-api.ts has NO deleteImage fn -> old blob orphans forever when /perfil replaces a photo or a user is deleted. coder-apiimages confirms api-images DELETE endpoint exists (->_trash 90d). Add best-effort deleteImage() cascade on photo-replace + user soft-delete. Confirm endpoint contract first. Low-impact data hygiene, found in P0 cross-app audit. |
canceled |
low |
coder-pluto-cc |
2026-06-14 02:53 |
| PLUTO-93 |
pluto |
/informes pool-acquire timeout: page fires ~24-query Promise.all (page.tsx:219-346) against deliberate pool max:2 / connectionTimeoutMillis:5s (pool.ts:11-17, WI#194 serverless conn-storm tuning). Heavy comisión (…006) drain >5s → trailing waiters throw 'timeout exceeded when trying to connect'; client echo surfaces Next digest 1177967776. Reproducible on any heavy comisión filter. Fix: bounded-concurrency wrapper on the fan-out (app/coder) and/or modest pool bump (db owns, trades vs conn-storm). 2 events/30d but reproducible. |
done |
normal |
— |
2026-06-14 02:44 |
| #115 |
pluto |
'Realizada por docente' tracking — métrica separada |
done |
someday |
— |
2026-06-14 02:43 |
| MARS-116 |
mars |
Mars logging structural hardening (R1 follow-up): middleware-injected requestId correlation + actor de-anon in onRequestError (F-3/F-4), isCritical sync-write for auth/authz/security cats (F-5), log-error 5min digest dedup (F-6) — audit design-review first (middleware is auth-adjacent) |
backlog |
normal |
— |
2026-06-14 02:36 |
| PLUTO-74 |
pluto |
F-1 LIVE crash: clientError:global-error @ /mi-cursada (alumno landing), 4 hits 2026-06-12, no stack in appEvents. React global error boundary firing on student landing. Pull Vercel runtime logs for today's hits to get exception; fix root fetch/render. |
done |
high |
coder-pluto-cc |
2026-06-14 02:26 |
| PLUTO-94 |
pluto |
/solicitar-acceso fully broken: every access-request submission 500s. chk_accessRequests_requesterRole CHECK allows only legacy ('estudiante','docente','otro') but PLUTO-7 changed requesterRole to literal DB role names (SELF_REQUESTABLE_ROLES: alumno/docente_adjunto/docente_jtp/docente_ayudante_primera). Constraint never migrated w/ PLUTO-7 → all new submissions violate it. Real user cecilia.tebes blocked+retried (appEvents submitAccessRequestFailed 18:51 UTC). FIX (db): drop the CHECK (commons bans CHECK on enumerated label sets = native-enum-in-disguise; app already validates via isSelfRequestableRole) OR union legacy+new (49 legacy rows must not trip ALTER). Audit pre-reviews DDL. PUBLIC FRONT DOOR. |
done |
normal |
— |
2026-06-13 19:29 |
| PLUTO-92 |
pluto |
App-wide recurrence of PLUTO-90: clicking a student/user NAME in a clickable row does nothing (hover-card trigger stopPropagation+preventDefault swallows the click) while clicking elsewhere in the row navigates. Seen on /practicas?jtp=...&comisiones=.... Audit to enumerate every table/list with name-inside-trigger pattern; coder fixes each to bubble name-click to row onClick. |
done |
normal |
— |
2026-06-13 11:43 |
| PLUTO-89 |
pluto |
createPractica duplicate-prevention guard (2-tier): TIER1 same fecha+operador+asistente+pieza → hard redirect to existing práctica (no override); TIER2 same fecha+same 2 people swapped roles → soft dialog ir-a-existente vs crear-nueva. Idempotent return-existing, not 500 |
done |
normal |
— |
2026-06-13 11:04 |
| MARS-109 |
mars |
/practicas?alumno tighten to per-student SA cross-check (not comision-level scope) |
done |
low |
— |
2026-06-13 10:59 |
| PLUTO-91 |
pluto |
PLUTO-89 fast-follow hardening: multi-pieza dup-guard is order-sensitive ('11,12' vs '12,11' evades tier-1 because piezas keep insertion order). Canonicalize the pieza set for the dedup KEY only (sorted), preserving as-entered display/storage order. Needs functional index or normalized key column |
backlog |
low |
— |
2026-06-13 10:57 |
| PLUTO-90 |
pluto |
/alumnos: clicking the student NAME does nothing; clicking elsewhere on the row navigates to /practicas?alumno=<id>. Name click should navigate too (likely hover-card/link swallows the click) |
done |
normal |
— |
2026-06-13 10:51 |
| PLUTO-88 |
pluto |
Teacher login landing → /practicas (was /informes) for docente_* roles; default-sort the prácticas list by Pendiente hace (días) desc so oldest-pending surfaces first. Keep reportes→/informes, admin/alumno/bedelia unchanged |
done |
normal |
— |
2026-06-13 10:19 |
| PLUTO-87 |
pluto |
Remove inline grade dropdown from prácticas list; per-row button: Calificar (sin calificar) / Ver detalles (graded), both route to detail view so teachers grade only after seeing content |
done |
normal |
— |
2026-06-13 10:02 |
| PLUTO-86 |
pluto |
/alumnos?verComision=N shows '(día)' instead of the comisión name |
done |
normal |
— |
2026-06-13 09:54 |
| PLUTO-84 |
pluto |
Admin 'Ver como [usuario]' view-as: read-only impersonation of ANY docente (not just owned personas) so admin sees a teacher's exact PLUTO-77-scoped view. Separate viewAsUserId cookie, admin-cap-gated startViewAs/stopViewAs, getCurrentUser resolves target (isViewAs, realUserId=admin), single read-only guard at requireAuthForAction (blocks all writes), benign view-load writes (markComentarioNotificationsRead) no-op under view-as, red banner + Volver a mi cuenta, start/stop audit-logged (authz). No schema change. Scope/grade-gates unchanged. Authz-sensitive: audit design-review + pre-push diff. |
done |
normal |
— |
2026-06-13 09:30 |
| PLUTO-85 |
pluto |
public/formulario-practica.pdf rides unrelated commits — byte re-touch (identical size, no content change) re-touches in the push window, not present in pre-push git status. Recurring since PLUTO-77, again on PLUTO-84. Find what regenerates it (build step / file watcher) and either .gitignore it or normalize so it stops riding unrelated commits. Harmless but persistent noise. |
backlog |
low |
— |
2026-06-13 09:29 |
| PLUTO-83 |
pluto |
client-error serializer: global-error.tsx/error.tsx + logClientError discard error.message/name/stack — appEvents clientError rows are opaque ({path,digest:null}), undiagnosable. Forward message/name/stack(trunc ~2KB) like venus VENUS-8 fix. Surfaced by applog: 1 crash @/mi-cursada + 3 @/login (anon, ~28s cluster, possibly stale-deploy Server-Action-not-found). |
done |
normal |
— |
2026-06-13 09:07 |
| EVO-3 |
evolutiva |
api-images: immediate-erasure endpoint (GDPR/right-to-erasure) — DELETE /{id}?purge=1 or /erase/{id} that skips _trash + unlinks immediately, tenant-scoped, audit-logged. |
backlog |
low |
coder-apiimages-cc |
2026-06-13 09:05 |
| VENUS-5 |
venus |
Centralized log-analysis plane on venus (pull+analyze app events) |
done |
high |
nw-venus-cc |
2026-06-13 08:57 |
| VENUS-8 |
venus |
client-error serializer: window.onerror/onunhandledrejection logged '[object Object]' with NULL errorName/stack |
done |
normal |
coder-venus-cc |
2026-06-13 08:35 |
| MARS-112 |
mars |
api-images: 67 orphan files in shared flat uploads/2026/ with no DB owner (mars nor pluto) post tenant-isolation backfill — cross-app reconciliation pass: identify (pluto-deleted-file-remains / pre-DB test / stray), decide trash-vs-assign. Not Mars-exclusive; coordinate with pm-pluto + coder-apiimages. Mars set confirmed complete (5,690), so none are Mars's. |
canceled |
someday |
— |
2026-06-13 08:29 |
| EVO-2 |
evolutiva |
api-images: reconcile 67 orphan images in flat uploads/2026/ with no mars/pluto DB owner — decide trash vs reassign |
backlog |
low |
— |
2026-06-13 08:29 |
| EVO-1 |
evolutiva |
api-images tenant isolation: key->tenant binding, scoped serve/delete, per-tenant storage + stats, _trash TTL, server-side EXIF strip, backup (closes cross-tenant IDOR) |
done |
high |
coder-apiimages-cc |
2026-06-13 08:29 |
| MARS-110 |
mars |
api-images tenant-isolation cutover: hand owned image-id list for backfill + verify Mars images resolve post-cutover + confirm API_KEY_MARS scoped |
done |
normal |
— |
2026-06-13 08:28 |
| PLUTO-80 |
pluto |
numeroHC edit UI/server permission mismatch: canEditHC UI offers HC-edit to all teachers but server gate always denied non-participant/non-admin teachers (latent assignmentComisionId-never-selected bug); decide intended HC-edit permission (enable graders via canGradePractica vs drop isTeacher from UI canEditHC) |
done |
normal |
— |
2026-06-13 08:22 |
| PLUTO-82 |
pluto |
Historial de cambios rows appear duplicated (~4x) on practica change history; investigate root cause (view join fan-out / archive double-write / query) and fix at source - data should not be stored 4x |
backlog |
normal |
— |
2026-06-13 08:14 |
| MSG-31 |
llmmsg-srv |
memory-lint.sh: refuse implicit host-wide scan as push gate (require explicit scope; only cron sweeps host-wide) |
done |
high |
pm-llmmsgsrv-cc |
2026-06-13 08:10 |
| PLUTO-79 |
pluto |
Historial de cambios: full-width component + CAMBIOS column not truncated; audit surveys all change-history tables, coder fixes the set |
done |
normal |
— |
2026-06-13 07:48 |
| VENUS-7 |
venus |
practica-actions: unguarded pre-tx reads in sumarme/quitar/archivePractica/completarComplicaciones |
done |
normal |
coder-venus-cc |
2026-06-13 07:47 |
| PLUTO-77 |
pluto |
F-6/voice-note: jefe-de-TP cross-linking via ayudante role drags wrong roster. Real teacher (Ale): sees his own ~8-10 alumnos OK, but ALSO sees ALL alumnos of ANOTHER jefa from a different group/day, because he is ayudante of that jefa on Wednesday -> the vinculation links him to the Wed jefa and surfaces her students in his correction view (~20+ total -> confusion). PROD real user. Same class as PLUTO-70 (resolveTeacherFilterIds dual-role); investigate the jtpAyudantes->jefa linking path - is this a PLUTO-70 gap (ayudante path uncovered) or new. He CAN evaluate his own; the bug is the extra roster bleed-in. |
done |
high |
coder-pluto-cc |
2026-06-13 07:43 |
| VENUS-6 |
venus |
Server-side 404 detection/logging (request instrumentation) |
done |
normal |
coder-venus-cc |
2026-06-13 07:42 |
| PLUTO-81 |
pluto |
PLUTO-77 v1 LOW followup: comision-day secondary list capped at limit-200 first-page (no cursor pagination); add cursor paging if an ayudante's assisted-comision roster exceeds 200 |
backlog |
normal |
— |
2026-06-13 07:40 |
| MARS-111 |
mars |
Teacher /alumnos redesign: row-click to student's practicas (active-periodo, JTP/ayudante-scoped) + drop email/inline-JTP-select + isStudentInScope ayudante-gate fix + denyAccess on /alumnos/[id] |
done |
normal |
— |
2026-06-13 07:18 |
| MARS-108 |
mars |
Teacher-facing student reassignment surface (JTP/Ayudante self-service, NOT on /alumnos) |
backlog |
normal |
— |
2026-06-13 06:46 |
| PLUTO-78 |
pluto |
Duplicate practicas: operador + asistente each create the SAME clinical event picking each other as counterpart -> 2 mirror practica rows for 1 real práctica. Need duplicate-detection + canonical-record rule (natural key candidates: fecha+comision+paciente/tratamiento+the operador/asistente pair). Design WITH Elazar; covers (a) prevent new dupes at create, (b) reconcile existing dupes in prod. Cross-team lessons-learned for mars/venus. |
backlog |
normal |
— |
2026-06-13 05:59 |
| PLUTO-75 |
pluto |
F-2 LIVE crash: serverError+clientError @ /administrar/alumnos/[id] (digest 3278366549), 26 hits Jun 9-11. Server crash on GET student detail; paired 7 sendEmailFailed ETIMEDOUT are the alert-emails for this crash. Pull Vercel logs for digest, fix render/server-action. |
done |
high |
coder-pluto-cc |
2026-06-13 05:27 |
| VENUS-3 |
venus |
D2 relay leg (appEvents→agent): (1) commit db/migrations uxPainDigestRelay sidecar (eventId PK→appEvents.id, deliveredAt) — already applied on prod but uncommitted, parity; (2) latest-ux-pain-digest INSERT-based claim route (descoped from D1); (3) wire venus to the shared whey host relay daemon. BLOCKED on canonical SSOT sidecar shape + Elazar relay-owner pick. |
canceled |
normal |
— |
2026-06-13 05:15 |
| BWI-9 |
basquetwi |
kpi-report.py digest-integration polish for kpi-weekly-report.sh: (1) add explicit --markdown flag alias (default stdout already md); (2) off-vocab line as count/total (e.g. 14/47) for the digest health metric. Section anchors ## 1/2/3 already grep-stable. |
backlog |
low |
db-basquetwi |
2026-06-13 02:50 |
| BWI-8 |
basquetwi |
kpi-report.py canonical eventType set is stale vs wi-http SSOT (titleChanged/audit-finding/packet false-flagged OFF-VOCAB). Fix: fetch canonical list from wi-http (or /utcp) instead of hardcoding, so it never drifts |
done |
low |
db-basquetwi |
2026-06-13 02:47 |
| MARS-107 |
mars |
Mars appEvents conform to fleet standard (evolutiva-appevents-standard.md): add categoryId uuid FK->lookupOptions + seed appEventCategory group (16 canonical + practica/studentAssignment/assignment) + backfill 18 free-text values w/ mapping; add 4 promoted cols (httpStatus/durationMs/path/failureCode); add logError/logWarn/logInfo wrappers + pickKnown + isCritical sync-bypass; append-only trigger (GUC-bypass) AFTER appEventRelays sidecar cutover (replace detail.relay.delivered UPDATE pattern); replace level-only prune with 5-cat-security tiered retention; canonical v_appEvents_* views; legacy_events sink. Staged db+coder. BLOCKED on committed SSOT + Elazar priority call. |
backlog |
normal |
— |
2026-06-13 02:41 |
| VENUS-4 |
venus |
Venus appEvents conform to fleet standard: categoryId uuid FK->lookupOptions + seed appEventCategory group + backfill w/ renames (access->authz, app->system, client-env->client); add 4 promoted cols (httpStatus/durationMs/path/failureCode); canonical logError/logWarn/logInfo wrappers + pickKnown + isCritical sync-bypass; canonical v_appEvents_* views; error-tier retention job (180d, GUC-bypass); re-level 1435 perf/warn rows->info; legacy_events sink decision for ~1552 rows. BLOCKED on committed SSOT + Elazar priority call. |
backlog |
normal |
— |
2026-06-13 02:36 |
| PLUTO-71 |
pluto |
error-tier appEvents digest (mars MARS-81 port): daily error-digest email cron + internal relay-claim routes |
done |
high |
coder-pluto-cc |
2026-06-13 02:35 |
| PLUTO-73 |
pluto |
conform appEvents to fleet SSOT (categoryId FK, promoted cols, append-only+GUC, appEventRelays sidecar, retention guard, logger, views) |
blocked |
normal |
— |
2026-06-13 02:32 |
| MARS-106 |
mars |
No-404 directive: navigation/practica-link-dead fired 3x — find and eliminate the dead practica link source (broken link/route), not just relabel the event |
backlog |
normal |
— |
2026-06-13 02:23 |
| PLUTO-70 |
pluto |
Informes filter by jefe-de-TP returns wrong/doubled student set (cross-jefe contamination) - was working before, regression |
done |
high |
audit-pluto-cc |
2026-06-12 17:41 |
| PLUTO-69 |
pluto |
Access regression: students who previously logged in are now blocked (agujero negro / blocked-user landing) - PROD, real users |
inProgress |
urgent |
coder-pluto-cc |
2026-06-12 17:29 |
| PLUTO-68 |
pluto |
/practicas/nueva form: lay fields side-by-side to save vertical space (currently stacked one-below-the-other) |
inProgress |
normal |
coder-pluto-cc |
2026-06-12 17:24 |
| MARS-104 |
mars |
Vercel edge-request cost: kill <Link> prefetch fan-out into force-dynamic routes (Mars was 42.6% of 1M Pro cap) |
done |
high |
pm-mars-cc |
2026-06-12 16:40 |
| AYUD-13 |
ayudarg |
UX /admin/usuarios: page looks bad — visual cleanup (Elazar report 2026-06-12). CR32 restyled buttons but page reads as broken/ugly. proxy visual capture first, then coder fix. Mobile-first. |
done |
high |
coder-ayudarg-cc |
2026-06-12 12:27 |
| #343 |
ayudarg |
Admin UI notification for new /sumate solicitudes (currently only email to Belén) |
done |
high |
— |
2026-06-12 10:56 |
| AYUD-6 |
ayudarg |
CR21: implement person-data erasure (hard-delete cascade or anonymize) for cases/needs/events per data-protection req; reconcile with existing #290/#339/#345 |
done |
high |
db-ayudarg-cc |
2026-06-12 10:42 |
| AYUD-11 |
ayudarg |
Admin delete UI (CR21): route/buttons calling db's deletePersona/deleteEvento/deleteNecesidad hard-delete functions; show jsonb count summary of what was removed; admin-role gated; confirm dialog (irreversible) |
done |
high |
coder-ayudarg-cc |
2026-06-12 10:42 |
| AYUD-12 |
ayudarg |
Org delete UI: wire deleteOrganizationAction (exists, 0 callers) to a delete/archive control on /admin/organizaciones with confirm dialog |
done |
normal |
coder2-ayudarg-cc |
2026-06-12 10:36 |
| AYUD-9 |
ayudarg |
Add app version to an /api/health endpoint (return package.json version) so auditor/PM can curl prod and confirm which app version is live on Vercel |
done |
normal |
coder2-ayudarg-cc |
2026-06-12 10:36 |
| AYUD-7 |
ayudarg |
CR23: aspirant /sumate signup creates a PENDING account awaiting admin authorization (today only emails admin) + admin accept/authorize UI — client: 'no puedo aceptar voluntarios' |
done |
high |
coder-ayudarg-cc |
2026-06-12 10:36 |
| #291 |
ayudarg |
ABM de prestaciones por entidad |
done |
high |
coder2-ayudarg-cc |
2026-06-12 10:30 |
| AYUD-8 |
ayudarg |
CR28: add 'where am I' geolocation button on the map (center/locate user) |
done |
normal |
coder2-ayudarg-cc |
2026-06-12 10:20 |
| AYUD-10 |
ayudarg |
Regen schema.md (stale on personaEventPhotos line) — export-db.py blocked on venus (psycopg2 missing); run elsewhere or fix venv |
backlog |
low |
db-ayudarg-cc |
2026-06-12 10:18 |
| AYUD-5 |
ayudarg |
CR24-full: DROP personaEventPhotos table + stored photo rows (destructive, Elazar-confirmed) — ONLY after display code removed + deployed |
done |
normal |
db2-ayudarg-cc |
2026-06-12 10:18 |
| AYUD-4 |
ayudarg |
CR24-full: remove photo DISPLAY code (listEventPhotosQuery, EventPhotoRow, any /personas/[id] photo render) — Elazar confirmed full erasure |
backlog |
normal |
coder2-ayudarg-cc |
2026-06-12 10:10 |
| AYUD-2 |
ayudarg |
Login: harden Google OAuth against PKCE-verifier-missing failure (in-app browser / WhatsApp) |
done |
high |
coder-ayudarg-cc |
2026-06-12 10:10 |
| #340 |
ayudarg |
CRITICAL: cannot log in (client report via pluto) |
done |
urgent |
coder-ayudarg-cc |
2026-06-12 10:04 |
| AYUD-3 |
ayudarg |
Observability: add success-path logging (login success, key page loads) — currently only error branches log |
backlog |
normal |
coder-ayudarg-cc |
2026-06-12 10:04 |
| AYUD-1 |
ayudarg |
URGENT: app logger dead since 2026-05-28 — restore logging (logs table) so we have troubleshooting data |
done |
urgent |
coder-ayudarg-cc |
2026-06-12 10:00 |
| #303 |
ayudarg |
Fotos |
done |
normal |
coder-ayudarg-cc |
2026-06-12 09:55 |
| MSG-28 |
llmmsg-srv |
Elazar DM-guard (reject-v1): send-time reject of untagged DMs to Elazar + silent dm_guard_rejects counter + KPI line + kill-switch; bundle cursor-lag shim fix same deploy. Spec: docs/superpowers/specs/2026-06-12-elazar-dm-guard-design.md |
done |
high |
hub-llmmsgsrv-cc |
2026-06-12 09:16 |
| MSG-29 |
llmmsg-srv |
cc-context-monitor.sh: redirect send target OFF elazar-the-user-human-llmmsg-srv to the host nw relay (nw-<host>-cc). ~2650 untagged DMs to Elazar = his #1 inbox clutter; DM-guard MSG-28 will drop them once enforced. Fix canonical script send-call (host-parameterized); nw-venus-cc + nw-lezama-cc pull to their host copies. Elazar approved 2026-06-12. |
done |
high |
bin-whey-cc |
2026-06-12 09:11 |
| PLUTO-62 |
pluto |
fn_detectRateSpike index-starved: add archivedAt indexes to 6 archive tables (32% of DB time) |
done |
normal |
— |
2026-06-12 07:56 |
| PLUTO-67 |
pluto |
fn_detectRateSpike cadence: every-2min cron is 91% of DB-time (frequency-driven, ~7.6s/day absolute) - weigh fraud-detection latency vs cost |
backlog |
low |
— |
2026-06-12 07:53 |
| PLUTO-66 |
pluto |
log-toast ingest: no server-side rate limit (anon-flood appEvents amplification) |
backlog |
low |
— |
2026-06-12 07:26 |
| PLUTO-63 |
pluto |
Regenerate stale src/db/schema.sql (2 generations behind prod; carries banned chk_appEvents_eventType CHECK) |
done |
low |
— |
2026-06-12 07:26 |
| PLUTO-64 |
pluto |
Toast to appEvent UX-friction capture (port Mars pattern + Pluto deltas) |
done |
normal |
— |
2026-06-12 07:26 |
| MARS-103 |
mars |
/notificaciones modest payload trim: paginate the 100-row list + replace 100 per-row server-action-bound <form>s with one delegated action/link nav (smaller RSC payload + less hydration). Not a perf bug — cold-start was the 6s cause; this is opportunistic. No DB/infra change. |
backlog |
low |
— |
2026-06-12 07:25 |
| PLUTO-34 |
pluto |
Pluto P3: 7 of 21 fn_archive* functions use explicit VALUES (not to_jsonb) — MARS-78/88 dropped-column-in-trigger latent class; convert to to_jsonb, prioritize fn_archivePracticaDocenteNotaChange (8 domain cols) |
done |
low |
— |
2026-06-12 07:23 |
| PLUTO-65 |
pluto |
PLUTO-34 contract step: DROP flat columns on 7 archive tables after jsonb expand verified in prod (irreversible) |
backlog |
low |
— |
2026-06-12 07:12 |
| MARS-102 |
mars |
Weekly ux-pain digest delivery: move to Vercel-cron→authenticated-POST-to-hub→PM-drains-on-reconnect (remove relay-row/always-on-agent dependency). Blocked on llmmsg-maintainer answers: (1) can Vercel POST to hub from outside the reverse tunnel with an auth key, (2) unread-buffer retention/TTL must exceed weekly digest interval so an offline PM still receives it. Applies to mars (replace MARS-84 relay-row) + venus + pluto toast-ports. db agents are NOT 24/7 so a db-host cron is not viable; only nw agents + maybe PMs run 24/7. |
backlog |
low |
— |
2026-06-12 07:08 |
| MARS-101 |
mars |
/practicas/[id] detail-grid: 25px overflow @768 (nowrap dt labels force 1fr tracks past tooth-panel) + label truncation @360 ('Restauraci…') — needs live-DOM-measured fix |
backlog |
normal |
— |
2026-06-12 06:40 |
| MARS-100 |
mars |
/informes table overflows 43px @360 (861px table-wrap) — needs mobile card/scroll mode |
backlog |
low |
— |
2026-06-12 06:37 |
| #70 |
pluto |
CR 51: /solicitar-acceso: los docentes completan campos pensados para alumnos (comision/jtp/adjunto), lo cual confunde y demora la aprobación. Move |
done |
normal |
— |
2026-06-12 06:37 |
| PLUTO-61 |
pluto |
Stop writing dot-stripped gmail form to users.email (commons Email-Norm violation, cosmetic) |
backlog |
normal |
— |
2026-06-12 06:34 |
| PLUTO-56 |
pluto |
Onboarding: allowlisted-but-no-profile users (loginDeniedNoProfile) should be routed to request access, not dead-bounced |
done |
normal |
— |
2026-06-12 06:28 |
| PLUTO-54 |
pluto |
Blind logging: capture detail in practicaCreateFailed, user-context in serverError, email in loginDeniedNoProfile |
done |
normal |
— |
2026-06-12 06:27 |
| PLUTO-60 |
pluto |
Retire residual /login?error=no-profile UI path |
backlog |
low |
— |
2026-06-12 06:26 |
| PLUTO-59 |
pluto |
Convenience VIEW joining clientError.digest -> serverError.detail (full message+stack) for client-error diagnosis |
backlog |
low |
— |
2026-06-12 06:17 |
| PLUTO-52 |
pluto |
404: /administrar/docentes/[id] dead link from /admin/solicitudes (live, 3 real-user hits) |
done |
normal |
— |
2026-06-12 06:11 |
| PLUTO-58 |
pluto |
Table convergence: drop server page-size oddball 15 (->[10,25,50,100] fleet baseline); later adopt Mars-style column-config API over Pluto server stack |
backlog |
low |
— |
2026-06-12 06:09 |
| PLUTO-55 |
pluto |
Investigate clientError:error (101 events / 20 distinct users) + access-denied UI link-leak |
done |
normal |
— |
2026-06-12 06:08 |
| PLUTO-57 |
pluto |
UX: pre-filter practica list-row links by viewer scope so out-of-scope rows aren't clickable (avoids working-as-designed scope-deny on /practicas/[id]) |
backlog |
low |
— |
2026-06-12 06:08 |
| MARS-68 |
mars |
Audit Next.js/Node compute that should be pushed to Postgres (aggregations/filters/joins done in JS that belong in SQL or a view) |
inProgress |
normal |
— |
2026-06-12 05:56 |
| MARS-73 |
mars |
└─ Rewrite teacher-practicas CTE: kill seq-scan on practicas (18.4% DB time) — LATERAL/direct JOIN from studentAssignments, est. 60-70% wall-time cut. Sites: weekly-kpi.ts + reporting.ts. See db/pg-stat-statements-report.md |
done |
normal |
— |
2026-06-14 22:56 |
| MARS-74 |
mars |
└─ Cache unread-notifications count (5.1% DB time, 41k calls): SELECT count(*) FROM notifications WHERE userId AND readAt IS NULL fires every page load — counter column on users or 30s sessionStorage TTL. See db/pg-stat-statements-report.md |
done |
normal |
— |
2026-06-14 22:37 |
| PLUTO-53 |
pluto |
404: /notificaciones dead route — UI link points to nonexistent page (active Jun 3+9) |
backlog |
normal |
— |
2026-06-12 05:50 |
| PLUTO-51 |
pluto |
Proxy viewport tooling: chrome-devtools-mcp (CDP) for Pluto needs an auth path — Pluto is OAuth-only |
backlog |
low |
— |
2026-06-12 04:21 |
| PLUTO-47 |
pluto |
Proxy viewport tooling: chrome-devtools-mcp (CDP) for Pluto needs an auth path — Pluto is OAuth-only |
canceled |
normal |
— |
2026-06-12 04:21 |
| PLUTO-50 |
pluto |
__probe__ |
canceled |
someday |
— |
2026-06-12 04:21 |
| PLUTO-49 |
pluto |
__probe__ |
canceled |
low |
— |
2026-06-12 04:21 |
| PLUTO-48 |
pluto |
__probe__ |
canceled |
normal |
— |
2026-06-12 04:21 |
| MARS-99 |
mars |
Multi-tooth RX tagging UX: passive-strong signal, not nag. (a) dropdown already lists only the práctica's selected teeth [live]; (b) untagged RX card gets red border + 'elegí la pieza' placeholder as primary passive cue; (c) auto-open+flash ONLY the last-added image's dropdown (never all — batch-add of N would fire N opens); (d) submit-with-untagged scrolls to+opens first offender instead of a toast. No modal. Single-tooth keeps silent auto-pick. Brainstorm: coder-mars+audit-mars-cc, approved Elazar 2026-06-12. Build after B2 edit-path. |
done |
normal |
— |
2026-06-12 04:18 |
| MARS-95 |
mars |
Edit-form RX upload parity (mi-cursada/[id]/editar): image-upload-area.tsx still has accept='image/jpeg' — same silent HEIC-drop class as SOP-13/MARS-94 but on the EDIT path. Apply the MARS-94 add-time fix: widen accept jpeg/png/heic/heif, de-silence with named toast, native HEIC->JPEG convert. Verify whether edit-form uses image-upload-area or its own handler first. Client-only fast-follow. |
done |
normal |
— |
2026-06-12 04:14 |
| PLUTO-46 |
pluto |
Vercel log-drain setup: Elazar greenlit (2026-06-12) true 24h+ runtime-log retention (currently logs are point-in-time only via Vercel MCP). Scope: pick drain destination (log service/endpoint), configure Vercel log-drain, implementer is infra (nw-whey/nw-venus) not coder. PM owes Elazar the concrete scoped plan before dispatch. |
backlog |
normal |
— |
2026-06-12 03:35 |
| PLUTO-45 |
pluto |
KPI weekly-cron staleness alert: last-success-timestamp check that pages if no kpiCronReport appEvent in >8 days. Weekly crons (0 9 * * 1) can fail silently for ~7d before anyone notices (PLUTO-39 showed how easily a weekly gap reads as 'dead'). Defensive observability add, NOT a bugfix. Touches email/alert path → audit pre-push. |
backlog |
low |
— |
2026-06-12 03:17 |
| PLUTO-39 |
pluto |
KPI cron (Vercel) silent since 2026-06-08: no kpiCronReport appEvent on Jun 9/10/11 — daily comisión reports missing |
done |
normal |
— |
2026-06-12 03:17 |
| PLUTO-43 |
pluto |
/administrar/alumnos/[id] throws 500 (Sin permisos) instead of graceful 403 for docente_titular w/ viewStudents but not manageUsers; list shows links into a detail page the user can't enter (list<->detail cap mismatch) — fix 500-handling + resolve cap shape |
done |
high |
coder-pluto-cc |
2026-06-12 02:00 |
| PLUTO-44 |
pluto |
Defense-in-depth: render-path requireCapForAction throw should render graceful acceso-denegado, not 500 + admin error-email storm (generic error-boundary / convert render-path cap checks to redirect variant). Surfaced by PLUTO-43 (dead-fetch was the trigger; this guards the class). |
backlog |
normal |
— |
2026-06-12 01:54 |
| PLUTO-42 |
pluto |
/practicas mobile card is read-only: teachers cannot change practica estado/grade from a phone — handleChangeEstado control is desktop-table-only; add it to the md:hidden mobile card |
backlog |
normal |
— |
2026-06-12 01:44 |
| PLUTO-41 |
pluto |
Migrate all touch primitives (Button/Select/Input) to uniform pointer-coarse:min-h-11 for 44px touch targets — replaces the 3-way convention (Button h-11 sm:h-9 / Select flat h-11 / Input sm:-gated); keys on input modality not viewport so a narrowed desktop window stays 36px. Ref Venus impl. Do AFTER PLUTO-40 lands. |
backlog |
low |
— |
2026-06-12 01:39 |
| MARS-97 |
mars |
EPIC mobile-first refactor (Elazar directive, all 3 apps): Mars is desktop-CSS-with-patches, not mobile-first. Staged base-up rework. Stage0 foundation (44px tap floor + search/form fixes, mobile-only media blocks, desktop density unchanged); Stage1 DataTable mobile card mode (fixes /practicas + /docentes); Stage2 /mi-cursada; Stage3 /practicas/nueva form (+tooth-selector tap targets, +undefined .conducto-* classes latent bug); Stage4 filter-bar accordion; Stage5 practica detail (/practicas/[id]+/mi-cursada/[id]: info-bar, changelog, comentarios, review-form, image-viewer pinch-zoom currently broken on mobile); Stage6 secondary (soporte thread, notificaciones, perfil, postgrado-progression). Order 0>1>2>3>5>4>6. Owners: coder-mars 0/3/5, audit-mars-ca 1/6. Held on proxy-mars BEFORE baseline (Elazar launching). Admin wide-tables=P3 tail/defer. |
backlog |
normal |
pm-mars-cc |
2026-06-12 01:36 |
| MARS-96 |
mars |
errscan noise: login-unknown mis-leveled (callback/route.ts) pages the frequent tier; re-level warn->info + make errscan spike detection signature-aware so credential-stuffing volume still alerts independent of level (same class as Pluto P3-2) |
done |
normal |
— |
2026-06-12 01:32 |
| PLUTO-40 |
pluto |
Mobile-first refactor (Elazar all-app directive): audit + base-up redesign of layouts/nav/forms/touch-targets/breakpoints |
backlog |
high |
coder-pluto-cc |
2026-06-12 01:29 |
| #96 |
pluto |
/admin/usuarios route audit — list shaping y filtros duplicados |
done |
low |
— |
2026-06-11 03:22 |
| PLUTO-37 |
pluto |
Pluto: Supabase free-plan egress fix (backup 30min→8h + data-only ephemeral excludes) + DB hygiene (notifications TTL, cron.job_run_details prune, drop stray bench schema) |
done |
normal |
— |
2026-06-11 02:59 |
| MARS-94 |
mars |
SOP-13: práctica /nueva RX upload — iPhone HEIC 'Pre' RX silently dropped at add-time (accept=image/jpeg + silent non-JPEG continue); student submits incomplete 3-RX sets. Fix shipped v2.15.17 (f43733d): widen accept jpeg/png/heic/heif, de-silence w/ named toast, native HEIC->JPEG convert via createImageBitmap, + adaptive recompress for secondary aggregate-cap mode. Client-only. |
done |
normal |
coder-mars-cc |
2026-06-11 00:15 |
| MSG-27 |
llmmsg-srv |
Schema drift: persist messages.expects_reply + roster.role; self-healing view-migration on hub startup |
done |
high |
hub-llmmsgsrv-cc |
2026-06-10 23:15 |
| PLUTO-35 |
pluto |
Pluto: audit email normalization for non-gmail dot-stripping bug (gmail dots-ignored rule is gmail/googlemail-only; Workspace custom domains treat dots as significant) |
done |
high |
audit-pluto-cc |
2026-06-10 13:21 |
| PLUTO-36 |
pluto |
Pluto P3: canonicalizeEmail JS/DB parity edge — JS lastIndexOf('@') vs DB SPLIT_PART first-'@'; diverge only on malformed multi-@ input (dedup-parity, not dot-strip). Align the @-split semantics. |
backlog |
low |
— |
2026-06-10 13:16 |
| PLUTO-22 |
pluto |
Pluto P2: accessRequests.status unconstrained text — add CHECK IN (pending/needs_info/approved/rejected) |
done |
normal |
— |
2026-06-10 07:44 |
| PLUTO-33 |
pluto |
Pluto: logger info-gate drops isCritical events before force-sync + prod LOG_LEVEL=1 = security-observability hole. logger.ts:83-85 early-returns (skips appEvents INSERT) for level=info when logLevel<3, BEFORE the isCritical force-sync block (:119-124, auth/authz+forceSync = must-persist). Prod LOG_LEVEL empty→parseInt=1<3, so ALL info events (incl. info-level auth/authz security signals that pluto-commons retains >=365d) are NOT persisted in prod. Two-part fix: (a) code — exempt isCritical (auth/authz/forceSync) from the info-gate so security events always persist; (b) ops — decide prod LOG_LEVEL>=3 (Elazar/Vercel env, also unlocks PLUTO-24 nav-event queryability). Found via PLUTO-24. Needs audit severity-confirm (how many live security events are info-level vs ERROR per PLUTO-25) before Elazar escalation. logger.ts = coder lane. |
done |
normal |
— |
2026-06-10 07:18 |
| PLUTO-26 |
pluto |
Pluto P3: global-error.tsx leaks raw error.message + internal appEvents SQL to end-users |
done |
low |
— |
2026-06-10 07:04 |
| PLUTO-23 |
pluto |
Pluto P2: missing indexes practicas.assignmentComisionId + comisiones.periodoId |
done |
normal |
— |
2026-06-10 06:47 |
| PLUTO-24 |
pluto |
Pluto P3: bare notFound() on missing practica (MARS-89/90 class) — port friendly not-found, /practicas/[id]:27 + /mi-cursada/[id]:30 |
done |
low |
— |
2026-06-10 06:41 |
| PLUTO-32 |
pluto |
Pluto P3 residual: bulkInviteUsers welcome-email loop bypasses the /send-email HTTP rate limiter (PLUTO-20) — uncapped in-process sends on bulk invite. Decide cap (e.g. 100/batch or inter-send delay) vs accept (admin-initiated, low-freq, in-process-mail-undroppable per PLUTO-20 design). From audit round-1. |
backlog |
low |
— |
2026-06-10 06:37 |
| PLUTO-21 |
pluto |
Pluto P2: edit-lock cols (006/007) added to practicas but not practicasArchive/trigger — edit-lock state unarchived |
done |
normal |
— |
2026-06-10 06:37 |
| PLUTO-18 |
pluto |
Pluto P2: isDemo-in-archive-trigger time-bomb (fn_archivePracticaChange + fn_archivePracticaReviewChange) — convert to to_jsonb (MARS-78/88 class) |
done |
normal |
— |
2026-06-10 06:37 |
| PLUTO-10 |
pluto |
Audit all DateDmyField required usages: required is inert on hidden input, each caller must validate explicitly |
done |
normal |
— |
2026-06-10 06:15 |
| MARS-92 |
mars |
Drop legacy accessRequests.status text col — statusOptionId FK is the enforced gate; plain text col is unconstrained dead weight (surfaced during Pluto PLUTO-22 cross-app alignment) |
backlog |
low |
— |
2026-06-10 06:14 |
| PLUTO-19 |
pluto |
Pluto P2: updateEstadoRevision post-commit email-throw → false 'Error' on committed grade + dup review/email — add inner try/catch |
done |
normal |
— |
2026-06-10 06:11 |
| PLUTO-16 |
pluto |
Pluto P1: IDOR on /api/image/[id] — add access-scope check (patient photos fetchable by any authed user) |
done |
high |
pm-mars-cc |
2026-06-10 06:11 |
| PLUTO-20 |
pluto |
Pluto P2: send-email in-memory rate limiter resets on cold start — persistent store or document dedupeKey as throttle |
done |
normal |
— |
2026-06-10 06:05 |
| PLUTO-17 |
pluto |
Pluto P1: vActiveStudentAssignments + vActiveRoster missing isDemo=false (demo bleed into teacher views) |
done |
high |
pm-mars-cc |
2026-06-10 05:35 |
| PLUTO-31 |
pluto |
Pluto P3: cold audit FK cols (createdBy/updatedBy) unindexed — defer to post-go-live advisor run |
backlog |
low |
— |
2026-06-10 05:12 |
| PLUTO-30 |
pluto |
Pluto P3: periodos.isCurrent no uniqueness constraint — two isCurrent=true rows possible |
backlog |
low |
— |
2026-06-10 05:12 |
| PLUTO-29 |
pluto |
Pluto P3: vPracticas* views don't filter isDemo — demo inflates grader stats (fix at vPracticas base) |
backlog |
low |
— |
2026-06-10 05:12 |
| PLUTO-28 |
pluto |
Pluto P3: denyAccess UUID-in-URL + deny-vs-404 — practica-existence probe |
backlog |
low |
— |
2026-06-10 05:12 |
| PLUTO-27 |
pluto |
Pluto P3: getCurrentPeriodoId + getComisionesForCurrentPeriodo no auth guard — comision enumeration |
backlog |
low |
— |
2026-06-10 05:12 |
| MSG-25 |
llmmsg-srv |
retired_aros tombstone gate: stop deleted AROs resurrecting via stale .aro bootstrap rejoins. Table retired_aros(aro PK, retired_at, retired_by); gate in /aro/join returns aro_retired before INSERT; POST /aro_retire + GET /aro_retire_ls (Elazar-only auth, mirrors /aro_allow); CLI aro-retire.sh; schema in init-db.sh + hub.mjs migration. Migration seeds the 7 dead -core/-small names. Un-retire via action=remove (reversible). Rides next restart. Durable fix for MSG-24 resurrection whack-a-mole. |
done |
normal |
hub-llmmsgsrv-cc |
2026-06-10 04:09 |
| MSG-24 |
llmmsg-srv |
Retire -core/-small AROs fleet-wide (Elazar 2026-06-10): DELETED all 7 (llmmsg-srv-engineering-core, mars-core, venus-core/-small, pluto-core/-small, mba-l-small) from aros (19 rows) + aro_config (8, incl orphan mars-small). Unanimous PM consent, zero deps. Already inert via MSG-17 default-deny (token win banked); deletion=hygiene. OPEN: (1) per-project .aro scrubs to prevent bootstrap resurrection - our .aro done, mars/venus/pluto/mba-l notified (pluto acked); (2) chat-duo-web 2-tier collapse (Ctrl+Enter -core lane dead) - pending Elazar yes, owner coder-chatduo-cc ~20min. |
done |
normal |
pm-llmmsgsrv-cc |
2026-06-10 04:09 |
| MSG-26 |
llmmsg-srv |
llmmsg-kpi-report.sh: strip dead -small ARO branch from §PM .aro action list (lanes retired MSG-17) |
backlog |
low |
pm-llmmsgsrv-cc |
2026-06-10 04:04 |
| MSG-22 |
llmmsg-srv |
hub.mjs:574 isValidAgentName widen ^[a-z0-9][a-z0-9_-]{1,63}$ to allow _ in scrp- sender ids (OPS-13 word-joiner grammar); rides MSG-20/21 batch+restart; verified no _-sensitive hub routing (nw-whey). Blocks bin-whey errscan rename until live. |
done |
normal |
hub-llmmsgsrv-cc |
2026-06-10 03:49 |
| MSG-21 |
llmmsg-srv |
hub.mjs:1606 cold-start announce stops fanning to Elazar's inbox (team-internal event noise); hub keeps its own fixed sender llmmsg-srv-hub (exempt from scrp- per convention). Part of scrp- sender-naming rollout (agent-conventions.md, Elazar 2026-06-10) |
done |
normal |
pm-llmmsgsrv-cc |
2026-06-10 03:49 |
| MSG-20 |
llmmsg-srv |
Human/spectator client silently stripped from AROs by pruneStale on presence lapse - no rejoin path, PM ARO replies stop reaching Elazar |
done |
high |
hub-llmmsgsrv-cc |
2026-06-10 03:49 |
| MARS-90 |
mars |
Unauthenticated /practicas/[id] click → notFound() (bare 404) instead of /login?returnTo; MARS-89 friendly branch is session-gated so logged-out email-clicks bypass it |
done |
normal |
— |
2026-06-10 01:26 |
| MARS-91 |
mars |
Optional: carry returnTo through OAuth round-trip (login-button + callback/route.ts) so a logged-out deep-link lands on the EXACT path post-login, not just home. Auth-gate path — needs audit design-ping |
done |
low |
— |
2026-06-10 01:15 |
| MARS-89 |
mars |
UX: stale-bookmark 404 on /practicas/<deleted-id> should redirect student to their cursada/practica list, not a dead 404 (one student hit a months-deleted practica 10x in a day) |
done |
low |
— |
2026-06-09 23:29 |
| MARS-88 |
mars |
PROD-DOWN: práctica create fails — studentAssignmentsArchive trigger fn still INSERTs dropped isDemo column (MARS-78 class, slipped table) |
done |
urgent |
db-mars-cc |
2026-06-09 19:20 |
| PLUTO-15 |
pluto |
Fix 500 on /informes?adjunto= — getComparativaBundle jtpExtra param pushed unconditionally when wantJtp=false |
done |
normal |
— |
2026-06-09 18:25 |
| MARS-85 |
mars |
docentes/[id]: add 'Equipo a su cargo' section showing supervised JTPs/ayudantes under an Adjunto (split from MARS-6 defect 1). No supervisor FK exists — derive supervision as: teachers (role jtp/ayudante) sharing a comisión where THIS user has role=adjunto. Active-periodo scoped (teacher-views-active-periodo convention). Repro: Belén Montoya must appear under Nicolás Alfie in comisión F. Design ratified by PM: new nested section, same-comisión adjunto→jtp/ayudante derivation, active-periodo only. Open Q for Elazar: adjunto-only supervisor, or also titular? |
done |
normal |
coder-mars-cc |
2026-06-09 18:09 |
| MARS-87 |
mars |
EPIC: shift /users /estudiantes /docentes from admin-dashboard mgmt to self-managed roster (JTP/Ayudante/Adjunto/students self-pick relationships + self-confirmation workflow) |
backlog |
normal |
— |
2026-06-09 18:03 |
| MARS-86 |
mars |
Disable 107 orphan-auth users (auth huerfanas, never logged in) |
backlog |
normal |
— |
2026-06-09 18:03 |
| MARS-6 |
mars |
docentes detail page: supervised ayudantes/JTPs must appear under their Adjunto (Belén Montoya missing under Nicolás Alfie in comisión F; alumnos-a-cargo all old year-comisiones, none from F) |
done |
normal |
— |
2026-06-09 17:55 |
| MARS-84 |
mars |
Weekly hub-DM relay for the ux-pain-digest: a recurring agent-side step (CronCreate or proxy poll) reads the fresh appEvents action=ux-pain-digest row (detail.textReport, detail.relay) and DMs the report to PM + Elazar on the llmmsg hub, then flips detail.relay.delivered=true. Needed because the Vercel cron can't reach the tunnelled hub. Wire BEFORE first digest fires Mon 2026-06-15 13:00 UTC. Satisfies Elazar's 'dm you, me, email' bar (email+appEvents already done by MARS-83). |
backlog |
high |
pm-mars-cc |
2026-06-09 17:41 |
| MARS-83 |
mars |
Weekly info-event analyzer: NEW recurring job scanning INFO-level appEvents for UX pain points (600+ 'Seleccioná la pieza' nags etc) + useful data, DMs a report. Operationalizes MARS-70; consumes re-added info-level toast logging (A1). Elazar 06-09. |
done |
high |
coder-mars-cc |
2026-06-09 17:41 |
| MARS-82 |
mars |
Frequent analyzer (errscan ~2h) scope to error+warn ONLY — confirm/adjust errscan's event-level filter so the high-freq sweep ignores info. errscan owned by bin-whey-cc (cross-host); PM coordinates the change. Elazar 06-09. |
done |
high |
pm-mars-cc |
2026-06-09 17:40 |
| MARS-81 |
mars |
Logger severity-correctness audit: every appEvents write uses the right level (info/warn/error). Sweep all logEvent/appEvent call sites; flag mis-leveled signatures (user-correctable validation toasts at error, real failures at info, etc). Precondition for the two-tier analyzer. Elazar 06-09. |
done |
high |
db-mars-cc |
2026-06-09 17:32 |
| MARS-65 |
mars |
Weekly-KPI inline sends silently drop on transient SMTP 421: no retry + batch completion counter falsely reports fail:0 (5 teachers missed Monday digest 2026-06-08) |
done |
normal |
--agent |
2026-06-09 17:22 |
| MARS-66 |
mars |
Práctica identification: folio-primary UI polish — add Folio column to student/alumno práctica tables, lead changelog with folio, enable search-by-folio (keep HC as clinical secondary) |
done |
normal |
--agent |
2026-06-09 17:16 |
| MARS-79 |
mars |
MARS-78 follow-ups: (A) log-hygiene fixes — toast/error-shown drop-or-downgrade from error (540 noise rows), practica/edit-image-upload-failed downgrade to warn (MARS-75 parity, 78 rows), navigation/404 capture pathname in detail (currently NULL — can't diagnose), client/unhandled-error add error.stack fallback for null-message entries (56 undiagnosable). (B) clean up 11 api-images orphaned by today's isDemo trigger regression (db supplies the image IDs; delete via image-api DELETE). Elazar approved both 06-09. |
done |
normal |
coder-mars-cc |
2026-06-09 17:07 |
| MARS-72 |
mars |
updatePostgradoProgression: wrap in withTransaction + setArchiveContext so studentPostgradoProgression archive rows carry archivedBy/archiveReason (currently NULL — actor signal lost once its appEvent is cut in Phase A) |
done |
normal |
--agent |
2026-06-09 17:05 |
| PLUTO-14 |
pluto |
KPI cron sends N duplicate emails per recipient with multiple comision memberships — deduplicate per recipient before sending |
done |
normal |
— |
2026-06-09 17:04 |
| MARS-38 |
mars |
Codex audit — P0 security/forensics: resume-link fail-closed + appEvents storage-key strip (7 sites) + userRoles role-change changelog |
backlog |
high |
--agent |
2026-06-09 17:03 |
| MARS-80 |
mars |
errscan failed to alert on a real 6h prod outage (isDemo regression 2026-06-09): 43 error-events + 2 unhandled-server-error met BOTH spike-≥10 AND prod-down triggers, yet neither Elazar nor pm-mars-cc got a DM. errscan state is whey-local (NOT in Mars Supabase — db confirmed no seen_signatures table there). Diagnose on whey: did the cron/daemon fire today? did it connect to Mars DB + read appEvents? is alert-routing/DM broken? Owner bin-whey-cc (was offline when filed). Elazar 06-09. |
done |
high |
bin-whey-cc |
2026-06-09 17:00 |
| PLUTO-13 |
pluto |
Fix Gmail Android /n/ prefix: add next.config redirect /n/:path* → /:path* (preserve query params) |
done |
normal |
— |
2026-06-09 16:57 |
| MARS-78 |
mars |
Investigate /administrar/logs errors: full triage of appEvents error/warn rows. Deliver (a) each error class + root cause + actionable fix, (b) logging hygiene audit — what is logged that should NOT be (noise/benign warns) + what is NOT logged that SHOULD be (coverage gaps). db categorizes appEvents; audit cross-checks Vercel runtime logs for failures never reaching appEvents. Elazar 06-09, explicitly wants real findings not reassurance. |
done |
high |
db-mars-cc |
2026-06-09 16:51 |
| PLUTO-12 |
pluto |
Fix timezone hydration flash: replace bare toLocaleString/toLocaleDateString (no timeZone) with formatDateTimeEsAr/formatDateEsAr from date-format.ts across 8 files |
done |
normal |
— |
2026-06-09 16:41 |
| PLUTO-11 |
pluto |
Email durable outbox (replicate MARS-76): emailOutbox table + pg_cron */5 drain + exp backoff maxAttempts=10 alert@5 |
done |
normal |
— |
2026-06-09 16:41 |
| #12 |
mars |
claude-in-chrome on /administrar/alumnos |
done |
low |
— |
2026-06-09 16:38 |
| #11 |
mars |
User dedupes: Tavolaro + Olexen |
done |
normal |
— |
2026-06-09 16:38 |
| MARS-77 |
mars |
Sidebar/navbar per-role regroup (Stage A): execute the holistic restructure the /sidebars-preview diagnostic (75ad66f, 2026-06-04) was built to inform. Per-role nav still cluttered/inconsistent. Use the preview tool (renders real sidebar per role side-by-side) to design grouping, then regroup. Only piecemeal edits landed since (MARS-33/34, WI#327, WI#214); holistic cleanup dropped + untracked until now (Elazar 06-09). |
backlog |
normal |
— |
2026-06-09 16:17 |
| MARS-76 |
mars |
Practica notification delivery gap: @odontologia.uba.ar SMTP CONN-ETIMEDOUT failures are permanent (no retry) — teachers silently miss new-practica emails (8+ active unreviewed, some 5+ wks). Need retry queue and/or in-app pending-practica fallback so delivery never depends on a single SMTP attempt. See db email triage 2026-06-09 |
done |
normal |
— |
2026-06-09 06:45 |
| MARS-75 |
mars |
Downgrade image validation-rejection log level error→warn (size/dimension too small) so it self-excludes from the actual-error watcher; keep genuine upload-infra failures (image-API 500/PROCESSING_FAILED/timeout) at error. Sites: image upload + edit-image-upload-failed paths |
done |
normal |
— |
2026-06-09 05:32 |
| MARS-71 |
mars |
Demo sample-image generation broken: missing a-/b- sanitized fixtures + pm/sample-images not traced into Vercel bundle |
done |
normal |
— |
2026-06-09 05:21 |
| ADRIANAP-9 |
adriana-pavon |
Recuperación de Correos Históricos (condicional: requiere localizar la computadora) |
blocked |
low |
— |
2026-06-09 04:24 |
| ADRIANAP-13 |
adriana-pavon |
└─ Generar informe de volumen y fechas de correos recuperados |
backlog |
low |
— |
2026-06-09 04:24 |
| ADRIANAP-12 |
adriana-pavon |
└─ Importar mensajes recuperados a cuenta activa actual via IMAP |
backlog |
low |
— |
2026-06-09 04:24 |
| ADRIANAP-11 |
adriana-pavon |
└─ Extraer almacén local de correos — Apple Mail: ~/Library/Mail/, o .pst si era Outlook |
backlog |
low |
— |
2026-06-09 04:24 |
| ADRIANAP-10 |
adriana-pavon |
└─ Evaluar estado del equipo y del disco (¿bootea? ¿disco legible?) |
backlog |
low |
— |
2026-06-09 04:24 |
| ADRIANAP-1 |
adriana-pavon |
Recuperación de Correos Históricos |
canceled |
normal |
— |
2026-06-09 04:23 |
| ADRIANAP-3 |
adriana-pavon |
Normalización de Ambiente de Correos |
backlog |
high |
rob |
2026-06-09 04:23 |
| ADRIANAP-8 |
adriana-pavon |
└─ Coordinate handoff to IT tech who will apply IMAP config on devices |
backlog |
normal |
— |
2026-06-09 04:23 |
| ADRIANAP-7 |
adriana-pavon |
└─ Write IMAP config guide for all 6 accounts (prensa@, hola@, 3x Gmail, iCloud) for iPhone + Mac |
backlog |
normal |
— |
2026-06-09 04:23 |
| ADRIANAP-6 |
adriana-pavon |
└─ Fix Cloudflare DNS: merge duplicate SPF records, add DKIM key from DonWeb, add DMARC record |
backlog |
normal |
— |
2026-06-09 04:23 |
| ADRIANAP-5 |
adriana-pavon |
└─ Disable POP3 on prensa@ and hola@ in DonWeb cPanel |
backlog |
normal |
— |
2026-06-09 04:23 |
| ADRIANAP-4 |
adriana-pavon |
└─ Audit all accounts/devices: map which client (iPhone, Mac, old PC) has which account and protocol (POP vs IMAP) |
backlog |
normal |
— |
2026-06-09 04:23 |
| ADRIANAP-2 |
adriana-pavon |
Asesoramiento en SEO |
backlog |
normal |
— |
2026-06-09 04:23 |
| ADRIANAP-20 |
adriana-pavon |
└─ Informe escrito con plan de acción priorizado + llamada de presentación |
backlog |
normal |
— |
2026-06-09 04:24 |
| ADRIANAP-19 |
adriana-pavon |
└─ Recomendaciones Schema.org: Organization, Event, DanceSchool/LocalBusiness por página |
backlog |
normal |
— |
2026-06-09 04:24 |
| ADRIANAP-18 |
adriana-pavon |
└─ Recomendaciones de contenido: fix Cartelera (2024 events visible in 2026), expandir páginas de academias, proponer 3 landing pages SEO |
backlog |
normal |
— |
2026-06-09 04:24 |
| ADRIANAP-17 |
adriana-pavon |
└─ Revisión on-page: title tags, H1 (homepage no tiene), meta descriptions, alt text de imágenes |
backlog |
normal |
— |
2026-06-09 04:24 |
| ADRIANAP-16 |
adriana-pavon |
└─ Keyword research y análisis de competencia para flamenco Buenos Aires |
backlog |
normal |
— |
2026-06-09 04:24 |
| ADRIANAP-15 |
adriana-pavon |
└─ Auditoría técnica: Core Web Vitals, canonicals, errores 404, velocidad, mobile |
backlog |
normal |
— |
2026-06-09 04:24 |
| ADRIANAP-14 |
adriana-pavon |
└─ Configurar accesos: Google Search Console, verificar sitemap.xml, revisar robots.txt |
backlog |
normal |
— |
2026-06-09 04:24 |
| OPS-12 |
agent-ops |
Recover lost 2026-05-26 evolutiva-commons patch: §Shared MD Flow + §Versioning + §Boundaries B1/B4/B5 — check llmmsg message DB for original content |
backlog |
high |
bin-whey-cc |
2026-06-09 04:04 |
| MARS-69 |
mars |
UX Friction (epic): reduce user pain points surfaced by toast/error telemetry |
backlog |
normal |
— |
2026-06-09 03:44 |
| MARS-70 |
mars |
└─ Analyze all toast/error-shown messages in appEvents to map UX pain points (e.g. 600+ 'Seleccioná la pieza' nags on /practicas/nueva) and propose form/flow fixes |
done |
normal |
db-mars-cc |
2026-06-12 04:26 |
| HOAC-1 |
ha |
Vanilla rebuild: replace Divi/WordPress static export with hand-authored HTML/CSS/JS — 100% local, no jQuery, no external CDN, no wp-content/wp-includes |
inProgress |
normal |
webmaster-hormigonacero-cc |
2026-06-09 03:36 |
| HOAC-6 |
ha |
└─ Rebuild index.html as vanilla semantic HTML (header/nav/main/footer, single h1, reserve space to kill CLS) on the new design system |
inProgress |
normal |
— |
2026-06-09 05:02 |
| HOAC-10 |
ha |
└─ Teardown: delete wp-content/ + wp-includes/ once unreferenced; strip wp-* cache rules from vercel.json; update sitemap.xml/robots.txt |
inProgress |
normal |
— |
2026-06-09 03:36 |
| HOAC-7 |
ha |
└─ Rebuild the 4 landing pages (peritaje-estructural, regularizacion-de-obra, honorarios-calculo-estructural, steel-frame-requisitos) on the shared vanilla template |
done |
normal |
— |
2026-06-09 03:00 |
| HOAC-9 |
ha |
└─ Vanilla JS (script.js): mobile nav toggle + anchor-scroll-with-offset + any motion; remove jquery.min.js, jquery-migrate, Divi scripts.min.js/common.js/motion-effects.js |
done |
normal |
— |
2026-06-09 03:00 |
| HOAC-5 |
ha |
└─ Images: relocate wp-content/uploads -> /img/, recompress, correct responsive srcset/sizes, preload LCP hero, drop unused variants |
done |
normal |
— |
2026-06-09 03:00 |
| HOAC-2 |
ha |
└─ Content & asset inventory: extract real copy, sections, links, images from all 6 Divi pages into a content map (pm/docs/content-map.md) |
done |
normal |
— |
2026-06-09 03:00 |
| HOAC-4 |
ha |
└─ Self-host fonts: download Open Sans + Kanit woff2 subsets locally, @font-face font-display:swap; replace Divi/FontAwesome icon font with inline SVG; remove all fonts.googleapis.com CDN links |
done |
normal |
— |
2026-06-09 03:00 |
| HOAC-3 |
ha |
└─ Design system: author one vanilla style.css (CSS custom properties, responsive flex/grid, breakpoints, typography, colors) — zero Divi classes |
done |
normal |
— |
2026-06-09 03:00 |
| HOAC-13 |
ha |
└─ Phase 2 (ONLY after vanilla index.html ships + verifies): build index-new.html as a from-scratch redesign PROPOSAL to present to client; keep noindex,nofollow until client approves |
backlog |
low |
webmaster-hormigonacero-cc |
2026-06-09 02:37 |
| HOAC-8 |
ha |
└─ Resolve index-new.html vs index.html: pick canonical home, fold the winning content in, delete the other |
canceled |
normal |
— |
2026-06-09 02:37 |
| HOAC-12 |
ha |
└─ Accessibility pass (DEFERRED per Elazar 2026-06-08): fix viewport user-scalable=0, footer contrast, heading-order, add main landmark |
backlog |
normal |
— |
2026-06-08 18:06 |
| HOAC-11 |
ha |
└─ Verify: re-run PageSpeed mobile+desktop (target 90+ mobile), visual-parity check vs current live, confirm all internal links + sitemap resolve under cleanUrls |
backlog |
normal |
— |
2026-06-08 18:06 |
| OPS-11 |
agent-ops |
cc-context-monitor last_turn() v2.14 residual stale-read: agent force-compacted 'for no reason' every other session. Verified 2026-06-09 nw-whey-cc reported 184k while live /context=63.6k (3x phantom). last_turn (~line 312) reads transcript's last usage block = summarizer's pre-compact cache_read until next real turn; compact_boundary reverse-walk skip has a hole (boundary outside TAIL_BYTES, or pre-compact reading sampled in the gap before boundary written). Fix: gate actuator on LIVE window occupancy, not stale transcript estimate. NOT a cap problem - do NOT bump nw ROLE_CAP (Elazar explicit). Recurring user-facing churn. |
inProgress |
high |
bin-whey-cc |
2026-06-09 03:22 |
| MARS-67 |
mars |
Index cold FK columns deferred from advisor sweep |
backlog |
low |
— |
2026-06-09 02:53 |
| BWI-7 |
basquetwi |
Migrate bwi PG + wi-http from whey to venus |
deferred |
low |
— |
2026-06-09 02:51 |
| BWI-6 |
basquetwi |
Improve 400 error for priority<=1: tell user to pass --agent <name> instead of bare "agent required" |
done |
low |
coder-basquetwi |
2026-06-09 02:41 |
| BWI-5 |
basquetwi |
wi rename/edit-title: wi rename <id> "<new title>" (logs titleChanged event) |
done |
normal |
coder-basquetwi |
2026-06-09 02:41 |
| BWI-4 |
basquetwi |
KPI report generator (phase-1 read-only PG script) |
done |
high |
db-basquetwi |
2026-06-09 02:40 |
| BWI-1 |
basquetwi |
null |
canceled |
normal |
coder-basquetwi-cc |
2026-06-09 02:40 |
| VENUSINF-5 |
venusinfra |
EPIC: whey + lezama thin-client cutover |
backlog |
normal |
nw-whey-cc |
2026-06-09 02:20 |
| VENUSINF-26 |
venusinfra |
└─ Per-cutover rollback plan + burn-in verification gates |
backlog |
normal |
— |
2026-06-09 02:21 |
| VENUSINF-25 |
venusinfra |
└─ Define what stays local on whey vs moves to venus (role redefinition) |
backlog |
normal |
— |
2026-06-09 02:21 |
| VENUSINF-24 |
venusinfra |
└─ lezama → thin client via public venus (simplify the whey-VPN dependency) |
backlog |
normal |
— |
2026-06-09 02:21 |
| VENUSINF-23 |
venusinfra |
└─ whey → thin client (hub/pg/smtp point to venus) |
backlog |
normal |
— |
2026-06-09 02:21 |
| VENUSINF-4 |
venusinfra |
EPIC: venus hardening (public-IP attack surface) — GATES service exposure |
backlog |
high |
nw-whey-cc |
2026-06-09 02:20 |
| VENUSINF-22 |
venusinfra |
└─ unattended-upgrades + basic intrusion/monitoring on venus |
backlog |
low |
— |
2026-06-09 02:21 |
| VENUSINF-21 |
venusinfra |
└─ Per-service bind/least-exposure audit (pg/hub/smtp listen only where needed) |
backlog |
normal |
— |
2026-06-09 02:21 |
| VENUSINF-20 |
venusinfra |
└─ ssh lockdown (key-only, no root login) + fail2ban |
backlog |
normal |
— |
2026-06-09 02:21 |
| VENUSINF-19 |
venusinfra |
└─ nftables/ufw default-deny + per-service allow rules |
backlog |
normal |
— |
2026-06-09 02:21 |
| VENUSINF-3 |
venusinfra |
EPIC: Self-hosted SMTP on venus |
backlog |
normal |
nw-whey-cc |
2026-06-09 02:20 |
| VENUSINF-18 |
venusinfra |
└─ Repoint notify-elazar.sh to venus SMTP; verify delivery to Elazar inbox |
backlog |
normal |
— |
2026-06-09 02:21 |
| VENUSINF-17 |
venusinfra |
└─ PTR/reverse-DNS + SPF/DKIM/DMARC for deliverability |
backlog |
normal |
— |
2026-06-09 02:21 |
| VENUSINF-16 |
venusinfra |
└─ Install + configure MTA (postfix) on venus |
backlog |
normal |
— |
2026-06-09 02:21 |
| VENUSINF-2 |
venusinfra |
EPIC: llmmsg hub + runtime DB → venus |
backlog |
high |
nw-whey-cc |
2026-06-09 02:20 |
| VENUSINF-15 |
venusinfra |
└─ Burn-in then decommission whey hub |
backlog |
low |
— |
2026-06-09 02:21 |
| VENUSINF-14 |
venusinfra |
└─ Point llmmsg-hub.pensanta.com (DNS) at venus public IP |
backlog |
normal |
— |
2026-06-09 02:21 |
| VENUSINF-13 |
venusinfra |
└─ Repoint whey + lezama MCP shim + bootstrap to venus hub endpoint |
backlog |
normal |
— |
2026-06-09 02:21 |
| VENUSINF-12 |
venusinfra |
└─ Migrate runtime DB v2.sqlite whey→venus (quiesce, copy, integrity-check) |
backlog |
normal |
— |
2026-06-09 02:21 |
| VENUSINF-11 |
venusinfra |
└─ Stand up llmmsg hub service on venus (v2-hub.mjs, port 9703, systemd) |
backlog |
normal |
— |
2026-06-09 02:21 |
| VENUSINF-1 |
venusinfra |
EPIC: ONEDB target flip — telemetry consolidation onto venus-pg (supersede whey-pg) |
backlog |
urgent |
nw-whey-cc |
2026-06-09 02:20 |
| VENUSINF-10 |
venusinfra |
└─ Cross-update ONEDB WIs (ONEDB-12 ingestion, ONEDB-10 pg-write flip) for new target host |
backlog |
normal |
— |
2026-06-09 02:21 |
| VENUSINF-9 |
venusinfra |
└─ Repoint venus-kpi-collect + whey/lezama remote writers to venus-pg |
backlog |
normal |
— |
2026-06-09 02:21 |
| VENUSINF-8 |
venusinfra |
└─ pg_hba + network: allow whey + lezama as remote writers to venus-pg |
backlog |
normal |
— |
2026-06-09 02:21 |
| VENUSINF-7 |
venusinfra |
└─ Provision postgres17 on venus (data dir, listen_addresses, telemetry db + telemetry_rw role) |
backlog |
normal |
— |
2026-06-09 02:21 |
| VENUSINF-6 |
venusinfra |
└─ Confirm + record: venus-pg is the consolidation target; supersede whey-pg in ONEDB-12/10 + one-db/DESIGN.md |
backlog |
normal |
— |
2026-06-09 02:21 |
| #65 |
pluto |
CR 46: Mostrar apellidos en vez de nombres en tablas/avatars |
done |
normal |
— |
2026-06-08 15:57 |
| MARS-64 |
mars |
Archive trigger captures NEW not OLD on UPDATE — verify forensic recovery coverage across audited tables (db) |
backlog |
normal |
— |
2026-06-07 10:56 |
| MSG-17 |
llmmsg-srv |
ARO fan-out default-deny: allowlist gate at /send aro-expansion (Elazar-managed) |
done |
high |
hub-llmmsgsrv-cc |
2026-06-07 09:57 |
| MARS-62 |
mars |
Audit DateDmyField required-enforcement (parallel to Pluto PLUTO-10): src/components/form/date-dmy-field.tsx puts required on a HIDDEN input → browsers never constraint-validate it, so required is silently inert. Every caller relying on it for required-date enforcement has a validation gap (only explicit JS/server check actually blocks). 8 caller files in src. Audit each required DateDmyField caller, confirm an explicit check exists, add where missing. Root cause discovered via Pluto práctica DOB empty-date DB error. |
canceled |
normal |
— |
2026-06-07 09:39 |
| MARS-63 |
mars |
Cross-app: port Mars error-digest cron (errores 24h digest email) to Pluto + Venus — Elazar greenlit 2026-06-07, NOT now. Each app gets its own daily digest cron + threshold + recipient. Pluto/Venus PMs mirror in their backlogs when picked up; this is the tracking SSOT. |
backlog |
low |
— |
2026-06-07 09:37 |
| PLUTO-9 |
pluto |
Práctica create: empty-date string reaches DB (invalid input syntax for type date) |
done |
normal |
— |
2026-06-07 09:28 |
| MARS-57 |
mars |
Disable SupportReplyForm submit while pending (double-submit guard) |
done |
normal |
coder02-mars-cc |
2026-06-07 08:38 |
| MARS-60 |
mars |
SOP-7 A: override-ayudante UI — authorized role can correct/remove the auto-added ayudante on a práctica (Romina complaint; auto-add is by-design, gap = no override path) |
backlog |
normal |
coder-mars-cc |
2026-06-07 08:34 |
| OPS-10 |
agent-ops |
attach-tmux.sh nests tmux/stacks extra login shell on switch-client path (recurring, 'fixed 5x') |
backlog |
high |
bin-whey-cc |
2026-06-07 08:31 |
| PLUTO-8 |
pluto |
Notification email: malformed link URL (trailing \n in NEXT_PUBLIC_APP_URL) + label/route mismatch |
done |
normal |
— |
2026-06-07 07:06 |
| PLUTO-7 |
pluto |
Solicitud form: require comision + adjunto (mandatory pulldowns) for teacher-role access requests — block submit without them (client + server validation) |
done |
normal |
— |
2026-06-07 06:42 |
| MARS-58 |
mars |
Prod: support-reply action hangs on Enviando (no SMTP timeouts) |
done |
normal |
— |
2026-06-07 06:41 |
| MARS-56 |
mars |
Stop the recurring push stash-dance: gitignore untracked auditor scaffolding + resolve parked pm/codex-says.md |
backlog |
low |
— |
2026-06-07 06:21 |
| MARS-55 |
mars |
MARS-48-D rework: prominent top no-reply banner (not footer) on 6 auth/onboarding emails |
done |
normal |
— |
2026-06-07 06:20 |
| PLUTO-6 |
pluto |
Solicitud detail: relabel id field to 'ID de Solicitud de ingreso' + make id a self-link (cross-app UI tweak, Elazar via pm-mars) |
done |
normal |
— |
2026-06-07 06:13 |
| MARS-48 |
mars |
Standardize 'no respondas a este email — respondé en la app' banner + in-app CTA across ALL Mars outbound emails |
done |
normal |
— |
2026-06-07 06:12 |
| MARS-52 |
mars |
solicitud detail /administrar/solicitudes/[id]: add 'ID de Solicitud de ingreso' label + self-link value (mirror MARS-51) |
done |
normal |
— |
2026-06-07 06:12 |
| MARS-54 |
mars |
práctica detail Comentarios: remove redundant 'Nuevo comentario' heading (placeholder already says it), preserve input a11y label |
done |
normal |
— |
2026-06-07 05:36 |
| MARS-51 |
mars |
práctica detail: relabel Código → ID de práctica + make código value a self-link to /practicas/[id] |
done |
normal |
— |
2026-06-07 05:36 |
| MARS-50 |
mars |
Prod: práctica create broke — MARS-40 column drop left fn_archiveStudentAssignmentChange referencing dropped studentAssignments.jtpUserId; trigger rewritten in prod, must capture in repo SSOT + sweep for other stale refs |
done |
normal |
— |
2026-06-07 05:36 |
| MARS-46 |
mars |
Support: replySupportTicket — mid-thread reply-to-reporter action (email free-text + log appEvent, no status change) |
done |
normal |
coder-mars-cc |
2026-06-07 05:36 |
| MSG-16 |
llmmsg-srv |
Shim/hub: auto re-register on reconnect after tunnel blip (roster-drop-until-manual-rrll) |
done |
high |
hub-llmmsgsrv-cc |
2026-06-07 04:56 |
| MSG-15 |
llmmsg-srv |
CC idle/launch auto-drain: unread-gated send-keys poke + bootstrap unread-reminder hook (CC-only, Codex auto-excluded via cmd!=claude guard) |
done |
high |
hub-llmmsgsrv-cc |
2026-06-07 04:56 |
| MARS-53 |
mars |
Graceful handling of stale server-action-ID (deploy-skew) in global error boundary |
backlog |
low |
coder02-mars-cc |
2026-06-06 23:12 |
| PLUTO-5 |
pluto |
appEvents category model (OWASP-aligned, NO native enum/CHECK) + retention prune-by-category job |
done |
normal |
db-pluto-cc |
2026-06-06 20:04 |
| PLUTO-4 |
pluto |
appEvents views: add semantic vAppEventsRelevant24h (deduped, all-levels) + consolidate 6 redundant LIMIT-N error views + schema.md; drop import% workaround in vAppErrorsRecent after source fix |
done |
normal |
db-pluto-cc |
2026-06-06 20:04 |
| PLUTO-3 |
pluto |
Events-table hygiene review (last 24h): labeling correctness, keep-vs-drop per event type, recent-events view |
done |
normal |
coder-pluto-cc |
2026-06-06 20:04 |
| ONEDB-13 |
one-db |
cc-context-monitor v3.0 M1 sys.exit(1) aborts MANUAL venus/lezama runs before pg-mirror write when CCM_HUB_URL=127.0.0.1 default. Unattended unaffected (service unit exports LLMMSG_HUB_URL ZT/tunnel). Fix post-ONEDB-12: document manual-run env requirement (export LLMMSG_HUB_URL) over per-host CCM_HUB_URL remap. Bump VERSION. |
backlog |
low |
— |
2026-06-06 20:04 |
| PLUTO-2 |
pluto |
SC 500 on /admin/solicitudes/[id] — getAccessRequestMergeCandidates throws on NULL legajo (untyped $2 IS NOT NULL) |
done |
normal |
coder-pluto-cc |
2026-06-06 13:02 |
| MSG-14 |
llmmsg-srv |
ccs.sh:183 launcher gate fix: swap --dangerously-load-development-channels -> --channels server:KEY so team-launch needs no per-agent gate-accept + no manual rrll |
done |
high |
pm-llmmsgsrv-cc |
2026-06-06 13:02 |
| MARS-47 |
mars |
Práctica Historial leaks raw archiveReason codes to users (admin:backfill-practicaCodigo, admin:sa-update-replay) |
done |
normal |
— |
2026-06-06 12:55 |
| MARS-45 |
mars |
supportTickets human-readable ref (SOP-NNNN) in UI+email+links + fix Estado raw-UUID leak |
done |
normal |
— |
2026-06-06 12:33 |
| MARS-44 |
mars |
Human-readable práctica reference code (YYMMDD-NN, per-student-daily) |
done |
normal |
— |
2026-06-06 11:53 |
| MARS-39 |
mars |
Schema cleanup drops — accessRequests.correoAlternativo (100% null), helpArticles+helpArticleTags+vHelpArticles (0-row never-used), vErrorsLast5/10/20 (keep vErrorsLast25), dead tickets+ticketEvents (16 closed rows/0 events vs live supportTickets). Verify zero src refs before each drop. |
done |
normal |
— |
2026-06-06 11:53 |
| MARS-43 |
mars |
11 active studentAssignments rows with NULL assignedTeacherUserId — students with no teacher assigned (pre-dates 2026-06-06, surfaced during MARS-40). Fix path: evidence-based auto-assign per no-operator model (NOT an admin-pick UI). Triage when bandwidth allows. |
backlog |
low |
— |
2026-06-06 09:01 |
| MARS-40 |
mars |
SA.jtpUserId live split-brain — coordinated 4-step fix (reconcile 40 rows → create/import writes+3 reads switch to assignedTeacherUserId → vStudentAssignments jtpName join+back-compat alias → drop legacy col+move partial index). Folds in vPracticasSinEvaluar + vComisionAyudantesByJtp snapshot-view leaks. Root of MARS-21/28/Montoya bug family. |
done |
high |
coder-mars-cc |
2026-06-06 09:01 |
| MARS-41 |
mars |
Audit quick HIGH wins — solicitudes N+1 (vAccessRequestsForReview LATERAL, 500q/load to 1) + analyzeModeOn=false (stop imageUploadAnalysisEvents +600/day growth) + practicas/[id] serial-await to Promise.all (mirror mi-cursada sibling). |
done |
high |
coder02-mars-cc |
2026-06-06 08:57 |
| MARS-42 |
mars |
Check size of Mars images on Hostinger (api-images file store) — measure total disk + file count used by Mars JPEGs on the api.pensanta.com/mars FTP-jail host; report bytes + count, flag if cleanup/retention needed. |
backlog |
normal |
— |
2026-06-06 08:41 |
| #509 |
agent-ops |
evolutiva-backup down for mars+pluto: Supabase removed legacy db.<ref>.supabase.co direct hostnames (NXDOMAIN) - DSNs need pooler connection strings |
done |
high |
nw-whey-cc |
2026-06-06 08:36 |
| MARS-37 |
mars |
Codex audit — MED quick-wins: lang es-AR + image-route private cache + AR-tz format trio |
done |
normal |
— |
2026-06-06 08:20 |
| OPS-9 |
agent-ops |
cc-context-monitor path-B/wind-down DM mis-targeting: db-mars-cc remediation delivered to nw-venus-cc |
backlog |
high |
nw-whey-cc |
2026-06-06 07:17 |
| #588 |
llmmsg-srv |
lezama hub tunnel stale-bind restart thrash (llmmsg-lezama-tunnel.service, counter 3124) |
done |
high |
pm-llmmsgsrv-cc |
2026-06-06 07:00 |
| MSG-12 |
llmmsg-srv |
Make context-budget nag idempotent: stop re-nagging every turn + stop stacking /compact crons after compact |
backlog |
high |
pm-llmmsgsrv-cc |
2026-06-06 06:53 |
| MSG-10 |
llmmsg-srv |
Codex receive-bridge: sidecar tmux-poke so Codex agents auto-drain llmmsg unread (no live push) |
backlog |
high |
pm-llmmsgsrv-cc |
2026-06-06 06:24 |
| MSG-11 |
llmmsg-srv |
└─ HARD PREREQ: derive + test a Codex-specific ready-prompt regex for idle-gating (CC matcher will NOT transfer; wrong matcher = corrupted-buffer poke). No send-keys goes live until validated. |
backlog |
high |
nw-whey-cc |
2026-06-06 06:24 |
| #510 |
mars |
Comb entire app for raw UUID/ID shown in UI instead of label; fix all (reported on /informes JTP/Ayudante column) |
done |
high |
coder02-mars-cc |
2026-06-06 06:10 |
| MARS-32 |
mars |
/practicas redesign (Elazar brainstorm 2026-06-06): unify list+grading into one role-aware page |
done |
normal |
pm-mars-cc |
2026-06-06 06:09 |
| MARS-34 |
mars |
└─ /practicas (b) role-aware JTP sectioned view: 1-line KPIs (getJtpStats), Por revisar tuyas, Por revisar en tus comisiones (NEW excludeJtpUserId param), Prácticas en tus comisiones (default scope); filters collapse to flat list; simplify BACKLOG_LANDING_ROLES landing. Builds on a/c/d |
done |
normal |
coder-mars-cc |
2026-06-06 06:09 |
| MARS-36 |
mars |
└─ Implement sidebar regroup from /sidebars-preview (Elazar 06-06): adopt the previewed per-role nav as the LIVE app-sidebar, preserving MARS-33/34 /practicas changes (merged Prácticas, no Por-calificar link, Nueva-práctica as button). Shares app-sidebar.tsx with MARS-34 -> coder-mars owns, sequence AFTER MARS-34. coderhelp to define concrete current->proposed diff first. |
done |
normal |
coder-mars-cc |
2026-06-06 06:04 |
| MARS-33 |
mars |
└─ /practicas a/c/d quick patch: (a) Nueva-práctica header button + drop teacher sidebar link; (c) drop Fecha-de-Carga col, student-name first; (d) inline Calificar button on sin-calificar rows -> /practicas/[id]#calificar, gated canReview(reviewPractica|fullAccess)&&noRevisado; graded rows show reviewedAt (Calificada el…) |
done |
normal |
coder-mars-cc |
2026-06-06 05:59 |
| MARS-35 |
mars |
Adjunto oversight/governability landing: adjunto logs in -> lands on a page showing comisión health, which JTPs need help, pending workload (Elazar 06-06, q3). NEEDS DESIGN/BRAINSTORM - distinct surface from /practicas |
backlog |
normal |
pm-mars-cc |
2026-06-06 05:50 |
| MARS-31 |
mars |
Animated/moving notification badge: make the notification bell badge pulse/animate to draw attention to unread notifications |
backlog |
low |
pm-mars-cc |
2026-06-06 05:18 |
| MARS-28 |
mars |
/practicas: add visible teacher filter scoped to JTP-role only — show prácticas where the selected teacher is the JTP (assignedTeacherUserId, live), exclude prácticas where they're the ayudante. Surface the MARS-23 JTP-only ?jtp= drill as a first-class filter control. ↳#686 |
done |
normal |
coder-mars-cc |
2026-06-06 05:09 |
| MARS-29 |
mars |
Block JTP unassign-to-null in /alumnos dropdown: remove the empty '-' option for the JTP (assignedTeacherUserId) column so a student's JTP can only be reassigned to another teacher, never cleared to none. KEEP '-' for the ayudante column (ayudante is optional). Add server-side guard in reassignTeacher rejecting null when field=assignedTeacherUserId. ↳#686 |
done |
normal |
coder02-mars-cc |
2026-06-06 05:09 |
| MARS-27 |
mars |
Clean mislabeled appEvents: remove form-validation toast logger (toast/error-shown, level=error noise) + recategorize sa-teachers-cascade category admin→system ↳#686 |
done |
high |
coder-mars-cc |
2026-06-06 05:03 |
| MSG-9 |
llmmsg-srv |
venus /opt/llmmsg-srv is NOT a git checkout - no sync path for maintainer pushes (forces manual /gdrive/temp hops; v1.16 bootstrap had to be hand-installed). Make it a proper git checkout of origin/main like lezama (project_lezama_code_drift) so future pushes land via git pull. Care: venus dir has live local files (.agent-name, service config) - clone-in-place or backup+clone, don't clobber runtime config. |
backlog |
normal |
— |
2026-06-06 04:56 |
| OPS-8 |
agent-ops |
Fleet model audit: many agents still pinned Opus 4.7; move to default-tracks-latest (verify default=Opus 4.8 + future models) or pin Opus 4.8; review model choice per agent by role |
backlog |
normal |
nw-whey-cc |
2026-06-06 04:25 |
| BWI-3 |
basquetwi |
Ship wi-web browsable UI on bwi.pensanta.com:8765 (HTTP-mode -> wi-http -> PG, systemd Restart=always) |
done |
high |
coder-basquetwi |
2026-06-06 04:17 |
| OPS-7 |
agent-ops |
attach-tmux.sh: list OFFLINE agents too; selecting one launches its ccs session and attaches you to it |
backlog |
normal |
nw-whey-cc |
2026-06-06 03:53 |
| MARS-26 |
mars |
Re-add ayudante notify at práctica creation as INFORMATIONAL (new type practicaAyudanteAsignada, in-app only, no email); JTP keeps grading practicaToReview+email. Elazar follow-up to MARS-23/25 — notify whoever was PICKED as JTP/ayudante, nobody else; no grading semantics for ayudante. ↳#686 |
done |
high |
coder-mars-cc |
2026-06-06 03:45 |
| ONEDB-1 |
one-db |
one-db: 5 telemetry sqlite -> Postgres17 consolidation (umbrella) |
backlog |
high |
nw-whey-cc |
2026-06-06 03:42 |
| ONEDB-2 |
one-db |
└─ No dual-write: cutover = flip reporter (netreport.sh) to pg + drop sqlite writes after parity. Per Elazar 2026-06-06. |
done |
high |
bin-whey-cc |
2026-06-06 21:03 |
| ONEDB-11 |
one-db |
│ └─ GATE#1 step iv: drop sqlite writes in 6 collectors after readers repointed+proven — pg-primary, JSONL-spool = resilience cache (Elazar: NO sqlite write-ahead). cc-context-monitor keeps LOCAL rolling cache for its own over-cap loop + pg mirror |
done |
high |
bin-whey-cc |
2026-06-06 21:03 |
| ONEDB-10 |
one-db |
│ └─ GATE#1 step iii: flip venus-kpi-collect.sh to pg-write (telemetry_rw via metrics_write) — kills kpi.sqlite split-brain co-writer; nw lane (cross-host) |
blocked |
high |
nw-whey-cc |
2026-06-06 19:35 |
| ONEDB-12 |
one-db |
│ └─ GATE#1 step v: remote-monitor ingestion — venus/lezama write whey-pg DIRECTLY per-host (NO ssh-pull). Transport: venus=ZeroTier 172.27.178.27 or Tailscale; lezama=ssh -w L3 tunnel only (GCABA blocks ZT+TS), pg client→172.30.0.1. whey: listen_addresses + pg_hba for both + telemetry_rw role. nw co-owns |
backlog |
high |
nw-whey-cc |
2026-06-06 13:11 |
| ONEDB-9 |
one-db |
│ └─ GATE#1 step ii: repoint 5 sqlite readers to pg telemetry_ro — netreport.sh, testnetwork --report, ccusage-daily-kpi.sh, llmmsg-kpi-report.sh, memory-lint.sh |
backlog |
high |
bin-whey-cc |
2026-06-06 13:11 |
| ONEDB-8 |
one-db |
│ └─ GATE#1 step i: add reporter-set pg views to schema.sql (network v_history/v_report/v_by_wifi; kpi 3-day window) — distinct from coder's dashboard views; back the 5 sqlite readers |
backlog |
high |
bin-whey-cc |
2026-06-06 13:11 |
| ONEDB-3 |
one-db |
└─ Telemetry collector registry: lazy-load .md - per source list systemd unit/timer -> collector script -> what data -> which reporter DMs Elazar+aro. |
done |
normal |
nw-whey-cc |
2026-06-06 09:02 |
| ONEDB-5 |
one-db |
└─ kpi.pensanta.com dashboard on whey (chat-duo-web model): single-file Node .mjs reads telemetry views -> static KPI pages. |
todo |
normal |
coder-chatduo-cc |
2026-06-06 08:45 |
| ONEDB-14 |
one-db |
│ └─ kpi-web MANIFEST: add Track A views (usage.v_kpi_tokens_7d + context.v_kpi_compact_7d) to server.mjs allowlist + restart |
done |
normal |
coder-chatduo-cc |
2026-06-16 02:11 |
| ONEDB-6 |
one-db |
│ └─ DECISION (Elazar): kpi.pensanta.com exposure - Tailscale-only (team rec: bind whey tailnet IP, no TLS/cert ops, no public attack surface) vs public-TLS |
backlog |
high |
nw-whey-cc |
2026-06-06 04:24 |
| ONEDB-4 |
one-db |
└─ SELECT * views: one wide view per table (+rollups) so agents never guess columns - default SELECT *, not named fields. |
done |
normal |
bin-whey-cc |
2026-06-06 08:45 |
| ONEDB-7 |
one-db |
└─ DECISION (Elazar): make ~/Documents/terminal/one-db its own git repo? bin (PM) owns the call |
backlog |
high |
bin-whey-cc |
2026-06-06 04:24 |
| OPS-2 |
agent-ops |
one-db: consolidate all whey telemetry/KPI sqlite into one local Postgres 17 db (telemetry), schema-per-domain, SELECT*-friendly views, reporting web UI. Goal: one place for all KPIs/perf/context data + Elazar can actually find/read them. |
canceled |
high |
bin-whey-cc |
2026-06-06 03:40 |
| OPS-6 |
agent-ops |
└─ one-db: cutover (NO dual-write — Elazar dropped it 2026-06-06). Collectors write straight to pg via metrics_write (spools to JSONL on pg-down, so no data loss); backfill already loaded full history. Flip 5 collectors + netreport off sqlite, retire sqlite files once pg-proven. |
canceled |
high |
bin-whey-cc |
2026-06-06 03:40 |
| OPS-5 |
agent-ops |
└─ one-db: kpi.pensanta.com web UI on whey — small read-only server (chat-duo-web model, single-file .mjs) that reads the SELECT* views and renders KPI pages, so Elazar has one habit-friendly place to glance at all KPIs and drill into any metric when something looks off. |
canceled |
normal |
coder-chatduo-cc |
2026-06-06 03:40 |
| OPS-4 |
agent-ops |
└─ one-db: views layer — every table gets enough pg views (latest / daily / report rollups) so agents query a view with SELECT * (never name fields). Goal: zero token waste guessing columns. Document view list in telemetry-inventory.md. |
canceled |
high |
bin-whey-cc |
2026-06-06 03:40 |
| OPS-3 |
agent-ops |
└─ one-db: lazy-load telemetry-inventory.md — single doc agents read on demand listing, per data stream: which systemd unit/timer/cron collects it, which script the unit runs, which table it writes, and which script reports to Elazar + which aro. Keep it the SSOT map of the whole telemetry pipeline. |
canceled |
high |
bin-whey-cc |
2026-06-06 03:40 |
| MSG-8 |
llmmsg-srv |
ARO display-metadata: sort_order + emoji on aro_config (/sort + /emoji, web sidebar) |
done |
normal |
— |
2026-06-06 02:38 |