fix: postgres WAL corruption recovery + memory bump + researcher/executor
- Postgres memory: 256M→384M limits, 64M→96M reservations
- Added pg_resetwal -f pre-deploy step to recover from corrupt WAL
('PANIC: could not locate a valid checkpoint record' caused by
force-killed postgres during --force-recreate)
- Added data-checksums initdb arg for future corruption detection
- api→postgres and web→api depends_on: service_healthy→service_started
- Deploy wait loop: fail fast on unhealthy, wait on starting (180s)
- Added researcher/executor to ValidAssignees and frontend dropdowns
This commit is contained in:
@@ -211,6 +211,20 @@ jobs:
|
|||||||
set -e
|
set -e
|
||||||
trap 'rm -f /tmp/nexus-deploy-env' EXIT
|
trap 'rm -f /tmp/nexus-deploy-env' EXIT
|
||||||
cat > /tmp/nexus-deploy-env
|
cat > /tmp/nexus-deploy-env
|
||||||
|
|
||||||
|
# ── WAL recovery: reset corrupt WAL that can block postgres startup ──
|
||||||
|
# Force-killed postgres containers can leave stale WAL entries that cause
|
||||||
|
# 'PANIC: could not locate a valid checkpoint record' on next start.
|
||||||
|
# pg_resetwal -f clears the WAL (losing uncommitted tx, which were lost anyway).
|
||||||
|
PG_VOL=\$(docker volume ls -q --filter name=nexus-postgres 2>/dev/null | head -1)
|
||||||
|
if [ -n \"\$PG_VOL\" ]; then
|
||||||
|
echo '🩺 Checking postgres WAL integrity...'
|
||||||
|
docker run --rm -v \"\$PG_VOL:/var/lib/postgresql/data\" \
|
||||||
|
--entrypoint sh postgres:17-alpine -c '
|
||||||
|
pg_resetwal -f /var/lib/postgresql/data 2>/dev/null && echo \"✅ WAL reset OK\" || echo \"WAL reset not needed / benign error\"
|
||||||
|
' 2>/dev/null || echo 'WAL check skipped'
|
||||||
|
fi
|
||||||
|
|
||||||
if [ -n '${SERVICE_ARG}' ]; then
|
if [ -n '${SERVICE_ARG}' ]; then
|
||||||
echo '🚀 Deploying service: ${SERVICE_ARG}'
|
echo '🚀 Deploying service: ${SERVICE_ARG}'
|
||||||
docker compose --env-file /tmp/nexus-deploy-env build ${BUILD_ARGS} ${SERVICE_ARG}
|
docker compose --env-file /tmp/nexus-deploy-env build ${BUILD_ARGS} ${SERVICE_ARG}
|
||||||
|
|||||||
@@ -12,7 +12,7 @@ public sealed class TaskService(
|
|||||||
IHttpContextAccessor httpContextAccessor) : ITaskService
|
IHttpContextAccessor httpContextAccessor) : ITaskService
|
||||||
{
|
{
|
||||||
private static readonly HashSet<string> ValidAssignees =
|
private static readonly HashSet<string> ValidAssignees =
|
||||||
["bao", "iris", "programmer", "reviewer", "architekt"];
|
["bao", "iris", "programmer", "reviewer", "architekt", "researcher", "executor"];
|
||||||
|
|
||||||
public async Task<IReadOnlyList<WorkTask>> GetAllAsync(CancellationToken ct = default)
|
public async Task<IReadOnlyList<WorkTask>> GetAllAsync(CancellationToken ct = default)
|
||||||
=> await taskRepo.GetAllAsync(ct);
|
=> await taskRepo.GetAllAsync(ct);
|
||||||
|
|||||||
+3
-2
@@ -7,10 +7,11 @@ services:
|
|||||||
deploy:
|
deploy:
|
||||||
resources:
|
resources:
|
||||||
limits:
|
limits:
|
||||||
memory: 256M
|
memory: 384M
|
||||||
reservations:
|
reservations:
|
||||||
memory: 64M
|
memory: 96M
|
||||||
environment:
|
environment:
|
||||||
|
POSTGRES_INITDB_ARGS: --data-checksums
|
||||||
POSTGRES_DB: ${POSTGRES_DB:-nexus}
|
POSTGRES_DB: ${POSTGRES_DB:-nexus}
|
||||||
POSTGRES_USER: ${POSTGRES_USER:-nexus}
|
POSTGRES_USER: ${POSTGRES_USER:-nexus}
|
||||||
POSTGRES_PASSWORD: ${POSTGRES_PASSWORD:?Set POSTGRES_PASSWORD in .env}
|
POSTGRES_PASSWORD: ${POSTGRES_PASSWORD:?Set POSTGRES_PASSWORD in .env}
|
||||||
|
|||||||
@@ -226,6 +226,8 @@ function expectedFromLabel(expected: string | null | undefined): string {
|
|||||||
'programmer': '🛠 Programmer',
|
'programmer': '🛠 Programmer',
|
||||||
'reviewer': '🔎 Reviewer',
|
'reviewer': '🔎 Reviewer',
|
||||||
'architekt': '🏛 Architekt',
|
'architekt': '🏛 Architekt',
|
||||||
|
'researcher': '🔬 Researcher',
|
||||||
|
'executor': '⚡ Executor',
|
||||||
}
|
}
|
||||||
return map[expected.toLowerCase()] ?? expected
|
return map[expected.toLowerCase()] ?? expected
|
||||||
}
|
}
|
||||||
@@ -778,6 +780,8 @@ onUnmounted(() => {
|
|||||||
<option value="programmer">🛠 Programmer</option>
|
<option value="programmer">🛠 Programmer</option>
|
||||||
<option value="reviewer">🔎 Reviewer</option>
|
<option value="reviewer">🔎 Reviewer</option>
|
||||||
<option value="architekt">🏛 Architekt</option>
|
<option value="architekt">🏛 Architekt</option>
|
||||||
|
<option value="researcher">🔬 Researcher</option>
|
||||||
|
<option value="executor">⚡ Executor</option>
|
||||||
</select>
|
</select>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
@@ -896,6 +900,8 @@ onUnmounted(() => {
|
|||||||
<option value="programmer">🛠 Programmer</option>
|
<option value="programmer">🛠 Programmer</option>
|
||||||
<option value="reviewer">🔎 Reviewer</option>
|
<option value="reviewer">🔎 Reviewer</option>
|
||||||
<option value="architekt">🏛 Architekt</option>
|
<option value="architekt">🏛 Architekt</option>
|
||||||
|
<option value="researcher">🔬 Researcher</option>
|
||||||
|
<option value="executor">⚡ Executor</option>
|
||||||
</select>
|
</select>
|
||||||
</label>
|
</label>
|
||||||
<label class="sidebar-field">
|
<label class="sidebar-field">
|
||||||
|
|||||||
@@ -2,6 +2,12 @@
|
|||||||
|
|
||||||
> Letzte Aktualisierung: 2026-06-20
|
> Letzte Aktualisierung: 2026-06-20
|
||||||
|
|
||||||
|
- 2026-06-20: **Researcher und Executor in den Agent-Task-Workflow aufgenommen.**
|
||||||
|
- `ValidAssignees` in TaskService.cs um `"researcher"` und `"executor"` erweitert.
|
||||||
|
- Frontend `expectedFromLabel`-Mapping, Create-Task- und Detail-Dropdowns um Researcher (🔬) und Executor (⚡) ergänzt.
|
||||||
|
- Researcher/Executor bleiben als Sub-Agenten vom Status-Change ausgeschlossen (nur Bao/Iris dürfen).
|
||||||
|
- Geänderte Dateien: `backend/Services/TaskService.cs`, `frontend/src/views/TaskBoardView.vue`, `phases/changelog.md`.
|
||||||
|
|
||||||
- 2026-06-20: **Bao-Status-Change + Content-Change-Benachrichtigung aktiviert.**
|
- 2026-06-20: **Bao-Status-Change + Content-Change-Benachrichtigung aktiviert.**
|
||||||
- **Neue Autorisierungsregel (TaskStateHelper.CanChangeState):**
|
- **Neue Autorisierungsregel (TaskStateHelper.CanChangeState):**
|
||||||
- **Iris + Bao** dürfen jetzt Status ändern / verschieben.
|
- **Iris + Bao** dürfen jetzt Status ändern / verschieben.
|
||||||
|
|||||||
Reference in New Issue
Block a user