Les enseignants ont besoin de moyennes à jour immédiatement après la publication ou modification des notes, sans attendre un batch nocturne. Le système recalcule via Domain Events synchrones : statistiques d'évaluation (min/max/moyenne/médiane), moyennes matières pondérées (normalisation /20), et moyenne générale par élève. Les résultats sont stockés dans des tables dénormalisées avec cache Redis (TTL 5 min). Trois endpoints API exposent les données avec contrôle d'accès par rôle. Une commande console permet le backfill des données historiques au déploiement.
371 lines
9.2 KiB
Markdown
371 lines
9.2 KiB
Markdown
---
|
|
name: 'step-04c-aggregate'
|
|
description: 'Aggregate subagent outputs and complete ATDD test infrastructure'
|
|
outputFile: '{test_artifacts}/atdd-checklist-{story_id}.md'
|
|
nextStepFile: './step-05-validate-and-complete.md'
|
|
---
|
|
|
|
# Step 4C: Aggregate ATDD Test Generation Results
|
|
|
|
## STEP GOAL
|
|
|
|
Read outputs from parallel subagents (API + E2E failing test generation), aggregate results, verify TDD red phase compliance, and create supporting infrastructure.
|
|
|
|
---
|
|
|
|
## MANDATORY EXECUTION RULES
|
|
|
|
- 📖 Read the entire step file before acting
|
|
- ✅ Speak in `{communication_language}`
|
|
- ✅ Read subagent outputs from temp files
|
|
- ✅ Verify all tests are marked with test.skip() (TDD red phase)
|
|
- ✅ Generate shared fixtures based on fixture needs
|
|
- ✅ Write all generated test files to disk
|
|
- ❌ Do NOT remove test.skip() (that's done after feature implementation)
|
|
- ❌ Do NOT run tests yet (that's step 5 - verify they fail)
|
|
|
|
---
|
|
|
|
## EXECUTION PROTOCOLS:
|
|
|
|
- 🎯 Follow the MANDATORY SEQUENCE exactly
|
|
- 💾 Record outputs before proceeding
|
|
- 📖 Load the next step only when instructed
|
|
|
|
## CONTEXT BOUNDARIES:
|
|
|
|
- Available context: config, subagent outputs from temp files
|
|
- Focus: aggregation and TDD validation
|
|
- Limits: do not execute future steps
|
|
- Dependencies: Step 4A and 4B subagent outputs
|
|
|
|
---
|
|
|
|
## MANDATORY SEQUENCE
|
|
|
|
**CRITICAL:** Follow this sequence exactly. Do not skip, reorder, or improvise.
|
|
|
|
### 1. Read Subagent Outputs
|
|
|
|
**Read API test subagent output:**
|
|
|
|
```javascript
|
|
const apiTestsPath = '/tmp/tea-atdd-api-tests-{{timestamp}}.json';
|
|
const apiTestsOutput = JSON.parse(fs.readFileSync(apiTestsPath, 'utf8'));
|
|
```
|
|
|
|
**Read E2E test subagent output:**
|
|
|
|
```javascript
|
|
const e2eTestsPath = '/tmp/tea-atdd-e2e-tests-{{timestamp}}.json';
|
|
const e2eTestsOutput = JSON.parse(fs.readFileSync(e2eTestsPath, 'utf8'));
|
|
```
|
|
|
|
**Verify both subagents succeeded:**
|
|
|
|
- Check `apiTestsOutput.success === true`
|
|
- Check `e2eTestsOutput.success === true`
|
|
- If either failed, report error and stop (don't proceed)
|
|
|
|
---
|
|
|
|
### 2. Verify TDD Red Phase Compliance
|
|
|
|
**CRITICAL TDD Validation:**
|
|
|
|
**Check API tests:**
|
|
|
|
```javascript
|
|
apiTestsOutput.tests.forEach((test) => {
|
|
// Verify test.skip() is present
|
|
if (!test.content.includes('test.skip(')) {
|
|
throw new Error(`ATDD ERROR: ${test.file} missing test.skip() - tests MUST be skipped in red phase!`);
|
|
}
|
|
|
|
// Verify not placeholder assertions
|
|
if (test.content.includes('expect(true).toBe(true)')) {
|
|
throw new Error(`ATDD ERROR: ${test.file} has placeholder assertions - must assert EXPECTED behavior!`);
|
|
}
|
|
|
|
// Verify expected_to_fail flag
|
|
if (!test.expected_to_fail) {
|
|
throw new Error(`ATDD ERROR: ${test.file} not marked as expected_to_fail!`);
|
|
}
|
|
});
|
|
```
|
|
|
|
**Check E2E tests:**
|
|
|
|
```javascript
|
|
e2eTestsOutput.tests.forEach((test) => {
|
|
// Same validation as API tests
|
|
if (!test.content.includes('test.skip(')) {
|
|
throw new Error(`ATDD ERROR: ${test.file} missing test.skip() - tests MUST be skipped in red phase!`);
|
|
}
|
|
|
|
if (test.content.includes('expect(true).toBe(true)')) {
|
|
throw new Error(`ATDD ERROR: ${test.file} has placeholder assertions!`);
|
|
}
|
|
|
|
if (!test.expected_to_fail) {
|
|
throw new Error(`ATDD ERROR: ${test.file} not marked as expected_to_fail!`);
|
|
}
|
|
});
|
|
```
|
|
|
|
**If validation passes:**
|
|
|
|
```
|
|
✅ TDD Red Phase Validation: PASS
|
|
- All tests use test.skip()
|
|
- All tests assert expected behavior (not placeholders)
|
|
- All tests marked as expected_to_fail
|
|
```
|
|
|
|
---
|
|
|
|
### 3. Write All Test Files to Disk
|
|
|
|
**Write API test files:**
|
|
|
|
```javascript
|
|
apiTestsOutput.tests.forEach((test) => {
|
|
fs.writeFileSync(test.file, test.content, 'utf8');
|
|
console.log(`✅ Created (RED): ${test.file}`);
|
|
});
|
|
```
|
|
|
|
**Write E2E test files:**
|
|
|
|
```javascript
|
|
e2eTestsOutput.tests.forEach((test) => {
|
|
fs.writeFileSync(test.file, test.content, 'utf8');
|
|
console.log(`✅ Created (RED): ${test.file}`);
|
|
});
|
|
```
|
|
|
|
---
|
|
|
|
### 4. Aggregate Fixture Needs
|
|
|
|
**Collect all fixture needs from both subagents:**
|
|
|
|
```javascript
|
|
const allFixtureNeeds = [...apiTestsOutput.fixture_needs, ...e2eTestsOutput.fixture_needs];
|
|
|
|
// Remove duplicates
|
|
const uniqueFixtures = [...new Set(allFixtureNeeds)];
|
|
```
|
|
|
|
---
|
|
|
|
### 5. Generate Fixture Infrastructure
|
|
|
|
**Create fixtures needed by ATDD tests:**
|
|
(Similar to automate workflow, but may be simpler for ATDD since feature not implemented)
|
|
|
|
**Minimal fixtures for TDD red phase:**
|
|
|
|
```typescript
|
|
// tests/fixtures/test-data.ts
|
|
export const testUserData = {
|
|
email: 'test@example.com',
|
|
password: 'SecurePass123!',
|
|
};
|
|
```
|
|
|
|
Note: More complete fixtures will be needed when moving to green phase.
|
|
|
|
---
|
|
|
|
### 6. Generate ATDD Checklist
|
|
|
|
**Create ATDD checklist document:**
|
|
|
|
```markdown
|
|
# ATDD Checklist: [Story Name]
|
|
|
|
## TDD Red Phase (Current)
|
|
|
|
✅ Failing tests generated
|
|
|
|
- API Tests: {api_test_count} tests (all skipped)
|
|
- E2E Tests: {e2e_test_count} tests (all skipped)
|
|
|
|
## Acceptance Criteria Coverage
|
|
|
|
{list all acceptance criteria with test coverage}
|
|
|
|
## Next Steps (TDD Green Phase)
|
|
|
|
After implementing the feature:
|
|
|
|
1. Remove `test.skip()` from all test files
|
|
2. Run tests: `npm test`
|
|
3. Verify tests PASS (green phase)
|
|
4. If any tests fail:
|
|
- Either fix implementation (feature bug)
|
|
- Or fix test (test bug)
|
|
5. Commit passing tests
|
|
|
|
## Implementation Guidance
|
|
|
|
Feature endpoints to implement:
|
|
{list endpoints from API tests}
|
|
|
|
UI components to implement:
|
|
{list UI flows from E2E tests}
|
|
```
|
|
|
|
**Save checklist:**
|
|
|
|
```javascript
|
|
fs.writeFileSync(`{test_artifacts}/atdd-checklist-{story-id}.md`, checklistContent, 'utf8');
|
|
```
|
|
|
|
---
|
|
|
|
### 7. Calculate Summary Statistics
|
|
|
|
**Aggregate test counts:**
|
|
|
|
```javascript
|
|
const resolvedMode = subagentContext?.execution?.resolvedMode; // Provided by Step 4's orchestration context
|
|
const subagentExecutionLabel =
|
|
resolvedMode === 'sequential'
|
|
? 'SEQUENTIAL (API → E2E)'
|
|
: resolvedMode === 'agent-team'
|
|
? 'AGENT-TEAM (API + E2E)'
|
|
: resolvedMode === 'subagent'
|
|
? 'SUBAGENT (API + E2E)'
|
|
: 'PARALLEL (API + E2E)';
|
|
const performanceGainLabel =
|
|
resolvedMode === 'sequential'
|
|
? 'baseline (no parallel speedup)'
|
|
: resolvedMode === 'agent-team' || resolvedMode === 'subagent'
|
|
? '~50% faster than sequential'
|
|
: 'mode-dependent';
|
|
|
|
const summary = {
|
|
tdd_phase: 'RED',
|
|
total_tests: apiTestsOutput.test_count + e2eTestsOutput.test_count,
|
|
api_tests: apiTestsOutput.test_count,
|
|
e2e_tests: e2eTestsOutput.test_count,
|
|
all_tests_skipped: true,
|
|
expected_to_fail: true,
|
|
fixtures_created: uniqueFixtures.length,
|
|
acceptance_criteria_covered: [
|
|
...apiTestsOutput.tests.flatMap((t) => t.acceptance_criteria_covered),
|
|
...e2eTestsOutput.tests.flatMap((t) => t.acceptance_criteria_covered),
|
|
],
|
|
knowledge_fragments_used: [...apiTestsOutput.knowledge_fragments_used, ...e2eTestsOutput.knowledge_fragments_used],
|
|
subagent_execution: subagentExecutionLabel,
|
|
performance_gain: performanceGainLabel,
|
|
};
|
|
```
|
|
|
|
**Store summary for Step 5:**
|
|
|
|
```javascript
|
|
fs.writeFileSync('/tmp/tea-atdd-summary-{{timestamp}}.json', JSON.stringify(summary, null, 2), 'utf8');
|
|
```
|
|
|
|
---
|
|
|
|
## OUTPUT SUMMARY
|
|
|
|
Display to user:
|
|
|
|
```
|
|
✅ ATDD Test Generation Complete (TDD RED PHASE)
|
|
|
|
🔴 TDD Red Phase: Failing Tests Generated
|
|
|
|
📊 Summary:
|
|
- Total Tests: {total_tests} (all with test.skip())
|
|
- API Tests: {api_tests} (RED)
|
|
- E2E Tests: {e2e_tests} (RED)
|
|
- Fixtures Created: {fixtures_created}
|
|
- All tests will FAIL until feature implemented
|
|
|
|
✅ Acceptance Criteria Coverage:
|
|
{list all covered criteria}
|
|
|
|
🚀 Performance: {performance_gain}
|
|
|
|
📂 Generated Files:
|
|
- tests/api/[feature].spec.ts (with test.skip())
|
|
- tests/e2e/[feature].spec.ts (with test.skip())
|
|
- tests/fixtures/test-data.ts
|
|
- {test_artifacts}/atdd-checklist-{story-id}.md
|
|
|
|
📝 Next Steps:
|
|
1. Implement the feature
|
|
2. Remove test.skip() from tests
|
|
3. Run tests → verify PASS (green phase)
|
|
4. Commit passing tests
|
|
|
|
✅ Ready for validation (Step 5 - verify tests fail as expected)
|
|
```
|
|
|
|
---
|
|
|
|
## EXIT CONDITION
|
|
|
|
Proceed to Step 5 when:
|
|
|
|
- ✅ All test files written to disk (API + E2E)
|
|
- ✅ All tests verified to have test.skip()
|
|
- ✅ All fixtures created
|
|
- ✅ ATDD checklist generated
|
|
- ✅ Summary statistics calculated and saved
|
|
- ✅ Output displayed to user
|
|
|
|
---
|
|
|
|
### 8. Save Progress
|
|
|
|
**Save this step's accumulated work to `{outputFile}`.**
|
|
|
|
- **If `{outputFile}` does not exist** (first save), create it with YAML frontmatter:
|
|
|
|
```yaml
|
|
---
|
|
stepsCompleted: ['step-04c-aggregate']
|
|
lastStep: 'step-04c-aggregate'
|
|
lastSaved: '{date}'
|
|
---
|
|
```
|
|
|
|
Then write this step's output below the frontmatter.
|
|
|
|
- **If `{outputFile}` already exists**, update:
|
|
- Add `'step-04c-aggregate'` to `stepsCompleted` array (only if not already present)
|
|
- Set `lastStep: 'step-04c-aggregate'`
|
|
- Set `lastSaved: '{date}'`
|
|
- Append this step's output to the appropriate section.
|
|
|
|
Load next step: `{nextStepFile}`
|
|
|
|
---
|
|
|
|
## 🚨 SYSTEM SUCCESS/FAILURE METRICS:
|
|
|
|
### ✅ SUCCESS:
|
|
|
|
- Both subagents succeeded
|
|
- All tests have test.skip() (TDD red phase compliant)
|
|
- All tests assert expected behavior (not placeholders)
|
|
- All test files written to disk
|
|
- ATDD checklist generated
|
|
|
|
### ❌ SYSTEM FAILURE:
|
|
|
|
- One or both subagents failed
|
|
- Tests missing test.skip() (would break CI)
|
|
- Tests have placeholder assertions
|
|
- Test files not written to disk
|
|
- ATDD checklist missing
|
|
|
|
**Master Rule:** TDD RED PHASE requires ALL tests to use test.skip() and assert expected behavior.
|