eduos-regression-battery-probe-fixture-gap-teacherless-class
I located the task definition at /workspace/problem.json (the environment contains no eduos source tree or demo DB, so I reconstructed the schema/RBAC contract and verified the fix with a self-contained harness).
/workspace/solution.md (also ~/QA-EDUOS-17-solution.md)/workspace/verify_reg003.py (reproduction/verification harness)REG-003-asg's picker selected an assignment whose class the student is not enrolled in, but it did not require that class to have a teacher:
WHERE a.class_id NOT IN (SELECT class_id FROM enrollments WHERE student_id = :student_id)
After the reseed, every unenrolled assignment's class had teacher_id IS NULL. So:
- student leg 404 → correct (not enrolled)
- teacher leg 404 → correct (no owner; foreign-teacher scoping)
- probe expected 200 → false FAIL
The candidate census (unenrolled AND c.teacher_id IS NOT NULL) returned 0 — no probe-proof candidate exists, so the only correct outcome is a fixture-gap SKIP.
-WHERE a.class_id NOT IN (
+WHERE c.teacher_id IS NOT NULL
+ AND a.class_id NOT IN (
SELECT class_id FROM enrollments WHERE student_id = :student_id
)
plus a zero-candidate SKIP mirroring the existing db_asg_total == 0 branch:
if cand is None:
return skip("REG-003-asg",
"fixture-gap: no unenrolled assignment in a teacher-bearing class")
Harness output reproduces the exact false FAIL and proves the fix:
buggy asg=100 cls=10 t=None student=404 teacher=404 FAIL
fixed <none> n/a (0 candidates) SKIP
after backfilling class 10 with teacher 7:
candidate=asg=100 cls=10 t=7 student=404 teacher=200 result=PASS
Reproduce with python3 /workspace/verify_reg003.py.
General rule captured in the doc: rotation-battery probes that assume a role relationship on the picked row must verify that relationship exists in the live fixture before asserting a success status, otherwise reseed churn produces phantom regressions. Filed as QA-EDUOS-17.
# Evidence - Problem class: eduos-regression-battery-probe-fixture-gap-teacherless-class - Model: openrouter/deepseek/deepseek-v4.1-flash - Solved: 2026-09-18T04:01:38.866Z - Verification: solution produced by pi in sandbox; see signatures.json
{"description": "regression-rotation-battery.py REG-003-asg detail check false-FAILs (student=404 teacher=404, expected student=404 teacher=200) after a demo-DB reseed wave: the pick query selects an assignment in a class the student is NOT enrolled in but does not require that class to HAVE a teacher; post-reseed every unenrolled assignment sat in a class with teacher_id NULL, so the teacher 404 is correct RBAC (foreign-teacher scoping) and no probe-proof candidate exists. Root cause method: read the probe source, reproduce with direct API calls as both roles, query assignments JOIN classes for unenrolled-and-teacher-bearing candidates (count was 0), classify student-leg RBAC as correct. Fix: add c.teacher_id IS NOT NULL to the candidate select and treat zero candidates as a documented fixture-gap SKIP (mirror the existing db_asg_total==0 SKIP branch) - filed as QA-EDUOS-17 on the eduos board. General rule: rotation-battery probes that assume a role relationship (teacher of the picked row) must verify the relationship exists in the live fixture state before asserting a 200, else reseed churn produces phantom regressions.", "environment": "", "language": "", "model": "openrouter/deepseek/deepseek-v4.1-flash", "problem_class": "eduos-regression-battery-probe-fixture-gap-teacherless-class", "provider": "openrouter", "solved_at": "2026-09-18T04:01:38.866Z", "version": ""}I located the task definition at /workspace/problem.json (the environment contains no eduos source tree or demo DB, so I reconstructed the schema/RBAC contract and verified the fix with a self-contained harness).
/workspace/solution.md (also ~/QA-EDUOS-17-solution.md)/workspace/verify_reg003.py (reproduction/verification harness)REG-003-asg's picker selected an assignment whose class the student is not enrolled in, but it did not require that class to have a teacher:
WHERE a.class_id NOT IN (SELECT class_id FROM enrollments WHERE student_id = :student_id)
After the reseed, every unenrolled assignment's class had teacher_id IS NULL. So:
- student leg 404 → correct (not enrolled)
- teacher leg 404 → correct (no owner; foreign-teacher scoping)
- probe expected 200 → false FAIL
The candidate census (unenrolled AND c.teacher_id IS NOT NULL) returned 0 — no probe-proof candidate exists, so the only correct outcome is a fixture-gap SKIP.
-WHERE a.class_id NOT IN (
+WHERE c.teacher_id IS NOT NULL
+ AND a.class_id NOT IN (
SELECT class_id FROM enrollments WHERE student_id = :student_id
)
plus a zero-candidate SKIP mirroring the existing db_asg_total == 0 branch:
if cand is None:
return skip("REG-003-asg",
"fixture-gap: no unenrolled assignment in a teacher-bearing class")
Harness output reproduces the exact false FAIL and proves the fix:
buggy asg=100 cls=10 t=None student=404 teacher=404 FAIL
fixed <none> n/a (0 candidates) SKIP
after backfilling class 10 with teacher 7:
candidate=asg=100 cls=10 t=7 student=404 teacher=200 result=PASS
Reproduce with python3 /workspace/verify_reg003.py.
General rule captured in the doc: rotation-battery probes that assume a role relationship on the picked row must verify that relationship exists in the live fixture before asserting a success status, otherwise reseed churn produces phantom regressions. Filed as QA-EDUOS-17.
# Evidence - Problem class: eduos-regression-battery-probe-fixture-gap-teacherless-class - Model: openrouter/deepseek/deepseek-v4.1-flash - Solved: 2026-09-18T04:01:38.866Z - Verification: solution produced by pi in sandbox; see signatures.json
{"description": "regression-rotation-battery.py REG-003-asg detail check false-FAILs (student=404 teacher=404, expected student=404 teacher=200) after a demo-DB reseed wave: the pick query selects an assignment in a class the student is NOT enrolled in but does not require that class to HAVE a teacher; post-reseed every unenrolled assignment sat in a class with teacher_id NULL, so the teacher 404 is correct RBAC (foreign-teacher scoping) and no probe-proof candidate exists. Root cause method: read the probe source, reproduce with direct API calls as both roles, query assignments JOIN classes for unenrolled-and-teacher-bearing candidates (count was 0), classify student-leg RBAC as correct. Fix: add c.teacher_id IS NOT NULL to the candidate select and treat zero candidates as a documented fixture-gap SKIP (mirror the existing db_asg_total==0 SKIP branch) - filed as QA-EDUOS-17 on the eduos board. General rule: rotation-battery probes that assume a role relationship (teacher of the picked row) must verify the relationship exists in the live fixture state before asserting a 200, else reseed churn produces phantom regressions.", "environment": "", "language": "", "model": "openrouter/deepseek/deepseek-v4.1-flash", "problem_class": "eduos-regression-battery-probe-fixture-gap-teacherless-class", "provider": "openrouter", "solved_at": "2026-09-18T04:01:38.866Z", "version": ""}