docs(timeline): update schedule adherence Day 99 (2026-04-09)
CI / benchmark-publish (pull_request) Waiting to run
CI / lint (pull_request) Successful in 30s
CI / push-validation (pull_request) Successful in 21s
CI / helm (pull_request) Successful in 29s
CI / quality (pull_request) Successful in 44s
CI / build (pull_request) Successful in 39s
CI / typecheck (pull_request) Successful in 1m8s
CI / security (pull_request) Successful in 1m3s
CI / benchmark-regression (pull_request) Waiting to run
CI / integration_tests (pull_request) Successful in 4m42s
CI / e2e_tests (pull_request) Successful in 5m18s
CI / unit_tests (pull_request) Successful in 7m57s
CI / coverage (pull_request) Successful in 11m24s
CI / docker (pull_request) Successful in 17s
CI / status-check (pull_request) Successful in 1s
CI / benchmark-publish (pull_request) Waiting to run
CI / lint (pull_request) Successful in 30s
CI / push-validation (pull_request) Successful in 21s
CI / helm (pull_request) Successful in 29s
CI / quality (pull_request) Successful in 44s
CI / build (pull_request) Successful in 39s
CI / typecheck (pull_request) Successful in 1m8s
CI / security (pull_request) Successful in 1m3s
CI / benchmark-regression (pull_request) Waiting to run
CI / integration_tests (pull_request) Successful in 4m42s
CI / e2e_tests (pull_request) Successful in 5m18s
CI / unit_tests (pull_request) Successful in 7m57s
CI / coverage (pull_request) Successful in 11m24s
CI / docker (pull_request) Successful in 17s
CI / status-check (pull_request) Successful in 1s
- refresh timeline documentation for Day 99 including Session 4 Cycle 2 metrics and milestone forecasts - capture the bug and PR surge along with developer focus and track-level risk updates - remove obsolete tdd_expected_fail tag and fix automation tracking validator lint regressions ISSUES CLOSED: #7457
This commit is contained in:
+112
-15
@@ -10,25 +10,27 @@ The following chart shows all 29 epics across 9 legendary workstreams, 7 milesto
|
||||
@startgantt
|
||||
|
||||
title CleverAgents Core — Epic-Level Project Schedule
|
||||
footer Generated 2026-04-08 | 29 Epics | 9 Legendaries | 7 Milestones | 6 Developers | ~1650 SP | ~878 open bugs | 1 open PR | Session 4 active
|
||||
footer Generated 2026-04-09 | 29 Epics | 9 Legendaries | 7 Milestones | 6 Developers | ~1650 SP | ~2840 open bugs | 145 open PRs | Session 4 active
|
||||
|
||||
Project starts 2026-02-03
|
||||
saturday are closed
|
||||
sunday are closed
|
||||
printscale weekly zoom 2
|
||||
|
||||
today is 2026-04-08
|
||||
today is 2026-04-09
|
||||
today is colored in #FF6666
|
||||
|
||||
' ================================================================
|
||||
' GANTT CHART UPDATE LOG (Day 98 — 2026-04-08)
|
||||
' Changes: Day 98 refresh. New build session #4799 launched 2026-04-08.
|
||||
' Open PRs: 108→1 (massive merge wave). Open bugs: ~878 (stable).
|
||||
' M3 73% (235/320), M4 67% (108/161), M5 71% (130/183), M6 29% (188/638, scope expanded!),
|
||||
' M7 48% (150/312), M8 47% (403/855).
|
||||
' Progress since Day 96: M3 +8%, M4 +7%, M5 +3%, M7 +5%, M8 +1%.
|
||||
' M6 scope expanded massively: 327→638 total issues (+311 new issues added).
|
||||
' Session 4 active. Session tracker issue: #4799.
|
||||
' GANTT CHART UPDATE LOG (Day 99 — 2026-04-09)
|
||||
' Changes: Day 99 refresh. Session 4 active (issue #4982, Cycle 2).
|
||||
' Open PRs: 1→145 (new implementation wave). Open bugs: ~878→~2840 (massive UAT bug surge).
|
||||
' M3 62% (240/387), M4 57% (108/191), M5 70% (130/187), M6 27% (192/712, scope grew further),
|
||||
' M7 48% (150/313), M8 46% (407/880), M9 30% (129/435).
|
||||
' Progress since Day 98: M3 73%→62% (scope grew 322→387 +65), M4 67%→57% (scope grew 179→191 +12),
|
||||
' M5 71%→70% (scope grew 183→187 +4), M6 29%→27% (scope grew 694→712 +18),
|
||||
' M8 47%→46% (scope grew 865→880 +15), M9 new: 30% (129/435).
|
||||
' Bug count surged from ~878 to ~2840 due to massive UAT agent activity.
|
||||
' Session 4 active. Session tracker issue: #4982 (Cycle 2). Cycle 2 refresh at 30-min interval.
|
||||
' ================================================================
|
||||
|
||||
<style>
|
||||
@@ -444,7 +446,7 @@ saturday are closed
|
||||
sunday are closed
|
||||
printscale weekly zoom 2
|
||||
|
||||
today is 2026-04-08
|
||||
today is 2026-04-09
|
||||
today is colored in #FF6666
|
||||
|
||||
<style>
|
||||
@@ -1965,13 +1967,13 @@ This section provides a high-level overview of the CleverAgents implementation r
|
||||
|
||||
### Current Status Summary
|
||||
|
||||
As of Day 98 (2026-04-08), the project has **1 open PR** (down from 108 — massive merge wave!) and **~1458 open issues** across active milestones. **Session 4 is active (launched 2026-04-08, issue #4799) with 32 parallel workers and full supervisor fleet**. Bug count is **~878 open bugs** (stable). M8 (v3.7.0) is now **47% complete** (403/855 issues closed). M3 (v3.2.0) at **73%** (235/320), M4 (v3.3.0) at **67%** (108/161), M5 (v3.4.0) at **71%** (130/183), M6 (v3.5.0) at **29%** (188/638 — scope massively expanded from 327 to 638 issues), M7 (v3.6.0) at **48%** (150/312).
|
||||
As of Day 99 (2026-04-09), the project has **141 open PRs** (up from 1 — new implementation wave) and **~1635 open issues** across active milestones. **Session 4 is active (Cycle 2, issue #4982) with 32 parallel workers and full supervisor fleet**. Bug count is **~2,840 open bugs** (surged from ~878 — massive UAT agent activity). M8 (v3.7.0) is now **47% complete** (406/865 issues closed). M3 (v3.2.0) at **73%** (235/322), M4 (v3.3.0) at **60%** (108/179), M5 (v3.4.0) at **70%** (130/187), M6 (v3.5.0) at **28%** (192/694 — scope continues to grow), M7 (v3.6.0) at **48%** (150/313), M9 (v3.8.0) at **30%** (129/425).
|
||||
|
||||
**M1, M2 fully complete. M3 (v3.2.0)**: 73% complete (235/320), 85 open issues. **M4 (v3.3.0)**: 67% complete (108/161), 53 open issues. **M5 (v3.4.0)**: 71% complete (130/183), 53 open issues. **M6 (v3.5.0)**: 29% complete (188/638), 450 open issues — scope expanded massively (+311 new issues). **M7 (v3.6.0)**: 48% complete (150/312), 162 open issues. **M8 (v3.7.0)**: 47% complete (403/855), 452 open issues. All milestones M3-M7 are **overdue**; M8 is in active v3.7.0 development.
|
||||
**M1, M2 fully complete. M3 (v3.2.0)**: 73% complete (235/322), 87 open issues. **M4 (v3.3.0)**: 60% complete (108/179), 71 open issues. **M5 (v3.4.0)**: 70% complete (130/187), 57 open issues. **M6 (v3.5.0)**: 28% complete (192/694), 502 open issues — scope continues to expand. **M7 (v3.6.0)**: 48% complete (150/313), 163 open issues. **M8 (v3.7.0)**: 47% complete (406/865), 459 open issues. **M9 (v3.8.0)**: 30% complete (129/425), 296 open issues. All milestones M3-M7 are **overdue**; M8/M9 in active development.
|
||||
|
||||
!!! warning "Schedule Risk: All Milestones M3-M7 Overdue — ~878 Open Bugs — Session 4 Active (Day 98: New Session #4799, M6 Scope Expanded +311 Issues)"
|
||||
!!! warning "Schedule Risk: All Milestones M3-M7 Overdue — ~2,840 Open Bugs — Session 4 Cycle 2 Active (Day 99: #4982, Bug Surge +1962, 141 Open PRs)"
|
||||
|
||||
All milestones M3 through M7 have passed their target dates. **Session 4 launched 2026-04-08 with 32 parallel workers**. Open PRs at **1** (down from 108 — massive merge wave). Open bugs at **~878** (stable). Session tracker issue: #4799. **Current priorities**: (1) **M6 scope explosion** — 450 open issues (was 147 at Day 96); agent-driven issue creation expanded scope from 327 to 638 total. (2) **Triage ~878 open bugs** — systematic review required. (3) **Continue M8 push** — 47% complete, 452 issues remaining. (4) **Clear M3/M4/M5 backlogs** — M3 at 73% (85 open), M4 at 67% (53 open), M5 at 71% (53 open).
|
||||
All milestones M3 through M7 have passed their target dates. **Session 4 Cycle 2 active (issue #4982) with 32 parallel workers**. Open PRs at **141** (up from 1 — new implementation wave). Open bugs surged to **~2,840** (was ~878 — UAT agents filed ~1,962 new bugs). Session tracker issue: #4982. **Current priorities**: (1) **Triage ~2,840 open bugs** — massive UAT-driven surge requires systematic review. (2) **M6 scope explosion** — 502 open issues; scope grew from 638 to 694 total. (3) **Continue M8/M9 push** — M8 at 47% (459 open), M9 at 30% (296 open). (4) **Clear M3/M4/M5 backlogs** — M3 at 73% (87 open), M4 at 60% (71 open), M5 at 70% (57 open).
|
||||
|
||||
### Parallel Workstreams
|
||||
|
||||
@@ -5223,3 +5225,98 @@ Story points per developer per milestone.
|
||||
| M9 | N/A | N/A | N/A | N/A | N/A | N/A | N/A | ~TBD SP |
|
||||
| M6+ | N/A | N/A | N/A | N/A | N/A | N/A | N/A | ~TBD SP |
|
||||
| **Total** | N/A | N/A | N/A | N/A | N/A | N/A | N/A | ~1649 SP |
|
||||
|
||||
### 2026-04-09 (Day 99)
|
||||
|
||||
**Summary**
|
||||
|
||||
Status: Behind 20+d
|
||||
Deadline risk: HIGH
|
||||
|
||||
**Notes**
|
||||
|
||||
- Day 99 update (2026-04-09). Session 4 Cycle 2 active (issue #4982), launched 2026-04-09 with 32 parallel workers targeting v3.2.0–v3.7.0 completion.
|
||||
- Open PRs surged from 1 to 145 as implementation workers opened new fix/feature PRs across all active milestones.
|
||||
- Open bugs surged dramatically from ~878 to ~2,840 (+1,962 new bugs) — UAT agents filed a massive wave of spec compliance issues across M3–M8.
|
||||
- Milestone progress since Day 98 (cycle 2 refresh): M3 dropped 73%→62% (240/387, scope grew 322→387 +65), M4 dropped 67%→57% (108/191, scope grew 179→191 +12), M5 stable at 70% (130/187), M6 dropped 29%→27% (192/712, scope grew 694→712 +18), M7 stable at 48% (150/313), M8 dropped 47%→46% (407/880, scope grew 865→880 +15), M9 stable at 30% (129/435, scope grew 425→435 +10).
|
||||
- New UAT bugs filed include: #4909 (CorrectionService no DB persistence), #4911 (correction_attempts missing original_subtree_snapshot), #4913 (env var interpolation silent failure), #4914 (plan.attempt not incremented), #4915 (dry-run uses analyze_impact instead of generate_dry_run_report), and hundreds more across all milestones.
|
||||
- Session tracker issue #4982 confirms 6 active milestones: M3 (147 open), M4 (83 open), M5 (57 open), M6 (520 open), M7 (163 open), M8 (473 open) = ~1,443 open issues in active milestones.
|
||||
- All milestones M3-M7 remain overdue. M8 and M9 have no deadlines and are in active development.
|
||||
- PR #4979 opened: docs: architecture — clarify TUI session export formats and persona schema fields (needs feedback label — major spec change requiring human approval).
|
||||
- Cycle 2 refresh (30-min interval): M3 scope grew +65 (322→387), M4 scope grew +12 (179→191), M6 scope grew +18 (694→712), M8 scope grew +15 (865→880), M9 scope grew +10 (425→435). Agent-driven issue creation continues at high velocity.
|
||||
- Cycle 3 refresh (60-min interval): M8 made significant progress — 15 issues closed (407→422 closed, 473→458 open). M8 now at 48% (422/880). All other milestones stable. Open PRs stable at 145.
|
||||
|
||||
|
||||
#### Milestone forecast
|
||||
|
||||
| Milestone | Target -> ETA | Delta | Risk |
|
||||
|-----------|---------------|-------|------|
|
||||
| M1 (v3.0.0) | (2026-02-15) -> COMPLETE | 0d | COMPLETE |
|
||||
| M2 (v3.1.0) | (2026-02-22) -> COMPLETE | 0d | COMPLETE |
|
||||
| M3 (v3.2.0) | (2026-02-26) -> ETA 2026-05-10 | +73d | CRITICAL — 147 open issues; 62% complete (down from 73% — scope grew 322→387 +65) |
|
||||
| M4 (v3.3.0) | (2026-03-02) -> ETA 2026-05-12 | +71d | CRITICAL — 83 open issues; 57% complete (down from 67% — scope grew 179→191 +12) |
|
||||
| M5 (v3.4.0) | (2026-03-06) -> ETA 2026-05-08 | +63d | HIGH — 57 open issues; 70% complete (stable) |
|
||||
| M6 (v3.5.0) | (2026-03-10) -> ETA 2026-07-08 | +120d | CRITICAL — 520 open issues; 27% complete (scope grew 694→712 +18) |
|
||||
| M7 (v3.6.0) | (2026-03-28) -> ETA 2026-06-03 | +67d | HIGH — 163 open issues; 48% complete (stable) |
|
||||
| M8 (v3.7.0) | (no deadline) -> ETA 2026-07-15 | N/A | HIGH — 458 open issues; 48% complete (up from 46% — 15 issues closed in cycle 3) |
|
||||
| M9 (v3.8.0) | (no deadline) -> ETA 2026-08-05 | N/A | MEDIUM — 306 open issues; 30% complete (scope grew 425→435 +10) |
|
||||
|
||||
#### Track forecast
|
||||
|
||||
| Track | Status | ETA | Risk | Blocking |
|
||||
|-------|--------|-----|------|----------|
|
||||
| Track A (Plan lifecycle + persistence) | Complete | Done | LOW | None |
|
||||
| Track B (Projects/resources + sandbox) | In Progress | ETA 2026-05-08 | MEDIUM | 57 open issues in v3.4.0; scope stable at 187 |
|
||||
| Track C (Actors/tools/skills/validations) | In Progress | ETA 2026-05-12 | CRITICAL | 83 open issues in v3.3.0; UAT bug surge (+1962 new bugs); scope grew 179→191 |
|
||||
| Track D (Change tracking + apply pipeline) | In Progress | ETA 2026-05-10 | CRITICAL | 147 open issues in v3.2.0; scope grew 322→387 (+65); 145 open PRs need review |
|
||||
| Track Q (Quality automation) | Ongoing | N/A | CRITICAL | ~2,840 open bugs (surged from ~878); UAT agents filing at high velocity |
|
||||
| Track T (Testing) | Active | Ongoing | HIGH | 145 open PRs need review; UAT bug surge ongoing; PR #4979 needs human approval |
|
||||
|
||||
#### Developer forecast
|
||||
|
||||
| Name | Days Ahead/Behind | Availability | Risk | Focus |
|
||||
|------|-------------------|--------------|------|-------|
|
||||
| Jeff | -24d behind | active | HIGH | Session 4 Cycle 2 supervisor; M3/M4/M5 backlog clearance; architecture oversight; PR #4979 review; 145 open PRs |
|
||||
| Luis | -24d behind | active | HIGH | M6 (v3.5.0) features; security hardening; PR review pool; bug triage |
|
||||
| Hamza | -24d behind | active | HIGH | Resource DAG; v3.6.0 features; AWS CloudResource; PR reviews |
|
||||
| Aditya | -24d behind | active | HIGH | M5 features; TDD counterparts; domain model work; UAT testing |
|
||||
| Brent | -24d behind | active | HIGH | Bug fixes; TDD counterparts; quality automation; ~2,840 open bugs triage |
|
||||
| Rui | -24d behind | active | HIGH | TUI features; UAT bug fixes; security bug-hunt; E2E testing |
|
||||
| Mike/Brian | N/A | standby | LOW | Infrastructure support |
|
||||
|
||||
#### Task inventory
|
||||
|
||||
Milestone per developer as of Day 99 cycle 2 (2026-04-09).
|
||||
|
||||
| Milestone | Jeff | Aditya | Luis | Hamza | Brent | Rui | Unassigned | Total |
|
||||
|-----------|------|--------|------|-------|-------|-----|------------|-------|
|
||||
| M1 | 29/29 | 16/16 | N/A | 4/4 | 10/10 | N/A | 35/35 | 96/96 |
|
||||
| M2 | 26/26 | 14/14 | N/A | 1/1 | 5/5 | N/A | 6/6 | 56/56 |
|
||||
| M3 | N/A | N/A | N/A | N/A | N/A | N/A | 147 open | 240/387 |
|
||||
| M4 | N/A | N/A | N/A | N/A | N/A | N/A | 83 open | 108/191 |
|
||||
| M5 | N/A | N/A | N/A | N/A | N/A | N/A | 57 open | 130/187 |
|
||||
| M6 | N/A | N/A | N/A | N/A | N/A | N/A | 520 open | 192/712 |
|
||||
| M7 | N/A | N/A | N/A | N/A | N/A | N/A | 163 open | 150/313 |
|
||||
| M8 | N/A | N/A | N/A | N/A | N/A | N/A | 458 open | 422/880 |
|
||||
| M9 | N/A | N/A | N/A | N/A | N/A | N/A | 306 open | 129/435 |
|
||||
| **Total** | **N/A** | **N/A** | **N/A** | **N/A** | **N/A** | **N/A** | **~1734 open** | **1427/3161** |
|
||||
|
||||
Note: "done/total" = closed/total for that milestone. Assignee data reflects Forgejo API as of Day 99 cycle 3 (2026-04-09). Most open issues are unassigned or assigned to freemo (Jeff). UAT agents filed ~1,962 new bugs since Day 98, driving the bug count from ~878 to ~2,840. M3 scope grew 322→387 (+65), M4 scope grew 179→191 (+12), M6 scope grew 694→712 (+18), M8 scope grew 865→880 (+15), M9 scope grew 425→435 (+10). M8 made progress in cycle 3: 15 issues closed (407→422). Open PRs stable at 145.
|
||||
|
||||
#### Story point allocation
|
||||
|
||||
Story points per developer per milestone.
|
||||
|
||||
| Milestone | Jeff | Aditya | Luis | Hamza | Brent | Rui | Unassigned | Total |
|
||||
|-----------|------|--------|------|-------|-------|-----|------------|-------|
|
||||
| M1 | N/A | N/A | N/A | N/A | N/A | N/A | N/A | ~172 SP |
|
||||
| M2 | N/A | N/A | N/A | N/A | N/A | N/A | N/A | ~208 SP |
|
||||
| M3 | N/A | N/A | N/A | N/A | N/A | N/A | N/A | ~104 SP |
|
||||
| M4 | N/A | N/A | N/A | N/A | N/A | N/A | N/A | ~126 SP |
|
||||
| M5 | N/A | N/A | N/A | N/A | N/A | N/A | N/A | ~129 SP |
|
||||
| M6 | N/A | N/A | N/A | N/A | N/A | N/A | N/A | ~TBD SP |
|
||||
| M7 | N/A | N/A | N/A | N/A | N/A | N/A | N/A | ~100 SP |
|
||||
| M8 | N/A | N/A | N/A | N/A | N/A | N/A | N/A | ~TBD SP |
|
||||
| M9 | N/A | N/A | N/A | N/A | N/A | N/A | N/A | ~TBD SP |
|
||||
| M6+ | N/A | N/A | N/A | N/A | N/A | N/A | N/A | ~TBD SP |
|
||||
| **Total** | N/A | N/A | N/A | N/A | N/A | N/A | N/A | ~1649 SP |
|
||||
|
||||
@@ -9,7 +9,7 @@ Suite Teardown Cleanup Test Environment
|
||||
*** Test Cases ***
|
||||
Noxfile Contains Coverage Threshold Constant
|
||||
[Documentation] Verify COVERAGE_THRESHOLD = 97 is defined in noxfile.py
|
||||
[Tags] coverage config tdd_issue tdd_issue_4305 tdd_expected_fail
|
||||
[Tags] coverage config tdd_issue tdd_issue_4305
|
||||
|
||||
${content}= Get File ${WORKSPACE}/noxfile.py
|
||||
Should Contain ${content} COVERAGE_THRESHOLD = 97
|
||||
|
||||
@@ -7,32 +7,34 @@ defined in docs/development/automation-tracking.md.
|
||||
|
||||
Usage:
|
||||
python scripts/validate_automation_tracking.py --repo owner/repo
|
||||
python scripts/validate_automation_tracking.py --title "[AUTO-SESSION] Checkpoint (Cycle 15)"
|
||||
python scripts/validate_automation_tracking.py \
|
||||
--title "[AUTO-SESSION] Checkpoint (Cycle 15)"
|
||||
python scripts/validate_automation_tracking.py --validate-all
|
||||
"""
|
||||
|
||||
import re
|
||||
import argparse
|
||||
import re
|
||||
import sys
|
||||
from typing import List, Dict, Any, Optional, Tuple
|
||||
from typing import Any
|
||||
|
||||
# Standard agent prefixes and their expected types
|
||||
AGENT_PREFIXES = {
|
||||
"SESSION": ["Checkpoint"],
|
||||
"IMP-POOL": ["Health Report", "Status Update"],
|
||||
"IMP-POOL": ["Health Report", "Status Update"],
|
||||
"WATCHDOG": ["System Health", "Alert"],
|
||||
"GROOMER": ["Grooming Report", "Scope Alert"],
|
||||
"LIAISON": ["Status Update", "Human Activity Summary"],
|
||||
}
|
||||
|
||||
# Title format patterns
|
||||
TRACKING_TITLE_PATTERN = re.compile(r'^\[AUTO-([A-Z-]+)\] (.+) \(Cycle (\d+)\)$')
|
||||
ANNOUNCEMENT_TITLE_PATTERN = re.compile(r'^\[AUTO-([A-Z-]+)\] Announce: (.+)$')
|
||||
TRACKING_TITLE_PATTERN = re.compile(r"^\[AUTO-([A-Z-]+)\] (.+) \(Cycle (\d+)\)$")
|
||||
ANNOUNCEMENT_TITLE_PATTERN = re.compile(r"^\[AUTO-([A-Z-]+)\] Announce: (.+)$")
|
||||
|
||||
def validate_tracking_title(title: str) -> Tuple[bool, str]:
|
||||
|
||||
def validate_tracking_title(title: str) -> tuple[bool, str]:
|
||||
"""
|
||||
Validate a tracking issue title format.
|
||||
|
||||
|
||||
Returns:
|
||||
(is_valid, error_message)
|
||||
"""
|
||||
@@ -41,27 +43,39 @@ def validate_tracking_title(title: str) -> Tuple[bool, str]:
|
||||
if announce_match:
|
||||
prefix, message = announce_match.groups()
|
||||
if prefix not in AGENT_PREFIXES:
|
||||
known_prefixes = [f"AUTO-{p}" for p in AGENT_PREFIXES.keys()]
|
||||
return False, f"Unknown agent prefix 'AUTO-{prefix}'. Known prefixes: {known_prefixes}"
|
||||
known_prefixes = [f"AUTO-{p}" for p in AGENT_PREFIXES]
|
||||
detail = (
|
||||
f"Unknown agent prefix 'AUTO-{prefix}'. "
|
||||
f"Known prefixes: {known_prefixes}"
|
||||
)
|
||||
return False, detail
|
||||
if not message.strip():
|
||||
return False, "Announcement message cannot be empty"
|
||||
return True, "Valid announcement title"
|
||||
|
||||
|
||||
# Check for tracking format
|
||||
track_match = TRACKING_TITLE_PATTERN.match(title)
|
||||
if track_match:
|
||||
prefix, issue_type, cycle_str = track_match.groups()
|
||||
|
||||
|
||||
# Validate prefix
|
||||
if prefix not in AGENT_PREFIXES:
|
||||
known_prefixes = [f"AUTO-{p}" for p in AGENT_PREFIXES.keys()]
|
||||
return False, f"Unknown agent prefix 'AUTO-{prefix}'. Known prefixes: {known_prefixes}"
|
||||
|
||||
known_prefixes = [f"AUTO-{p}" for p in AGENT_PREFIXES]
|
||||
detail = (
|
||||
f"Unknown agent prefix 'AUTO-{prefix}'. "
|
||||
f"Known prefixes: {known_prefixes}"
|
||||
)
|
||||
return False, detail
|
||||
|
||||
# Validate type
|
||||
valid_types = AGENT_PREFIXES[prefix]
|
||||
if issue_type not in valid_types:
|
||||
return False, f"Invalid type '{issue_type}' for prefix 'AUTO-{prefix}'. Valid types: {valid_types}"
|
||||
|
||||
detail = (
|
||||
f"Invalid type '{issue_type}' for prefix 'AUTO-{prefix}'. "
|
||||
f"Valid types: {valid_types}"
|
||||
)
|
||||
return False, detail
|
||||
|
||||
# Validate cycle number
|
||||
try:
|
||||
cycle_num = int(cycle_str)
|
||||
@@ -69,87 +83,100 @@ def validate_tracking_title(title: str) -> Tuple[bool, str]:
|
||||
return False, "Cycle number must be positive"
|
||||
except ValueError:
|
||||
return False, f"Invalid cycle number '{cycle_str}'"
|
||||
|
||||
return True, "Valid tracking title"
|
||||
|
||||
return False, "Title does not match expected format: '[AUTO-<PREFIX>] <TYPE> (Cycle <N>)' or '[AUTO-<PREFIX>] Announce: <message>'"
|
||||
|
||||
def validate_automation_tracking_issue(issue_data: Dict[str, Any]) -> List[str]:
|
||||
return True, "Valid tracking title"
|
||||
|
||||
detail = (
|
||||
"Title does not match expected format: '[AUTO-<PREFIX>] <TYPE> (Cycle <N>)' "
|
||||
"or '[AUTO-<PREFIX>] Announce: <message>'"
|
||||
)
|
||||
return False, detail
|
||||
|
||||
|
||||
def validate_automation_tracking_issue(issue_data: dict[str, Any]) -> list[str]:
|
||||
"""
|
||||
Validate a complete automation tracking issue.
|
||||
|
||||
|
||||
Args:
|
||||
issue_data: Dictionary containing issue data (title, labels, etc.)
|
||||
|
||||
|
||||
Returns:
|
||||
List of validation errors (empty if valid)
|
||||
"""
|
||||
errors = []
|
||||
|
||||
|
||||
# Validate title
|
||||
title = issue_data.get('title', '')
|
||||
title = issue_data.get("title", "")
|
||||
is_valid, message = validate_tracking_title(title)
|
||||
if not is_valid:
|
||||
errors.append(f"Title format error: {message}")
|
||||
|
||||
|
||||
# Validate labels
|
||||
labels = issue_data.get('labels', [])
|
||||
label_names = [label.get('name', '') if isinstance(label, dict) else str(label) for label in labels]
|
||||
|
||||
labels = issue_data.get("labels", [])
|
||||
label_names = [
|
||||
label.get("name", "") if isinstance(label, dict) else str(label)
|
||||
for label in labels
|
||||
]
|
||||
|
||||
if "Automation Tracking" not in label_names:
|
||||
errors.append("Missing required 'Automation Tracking' label")
|
||||
|
||||
|
||||
# Validate body content (basic checks)
|
||||
body = issue_data.get('body', '')
|
||||
body = issue_data.get("body", "")
|
||||
if not body.strip():
|
||||
errors.append("Issue body cannot be empty")
|
||||
|
||||
|
||||
# Check for common required elements in body
|
||||
if '**Automated by CleverAgents Bot**' not in body:
|
||||
if "**Automated by CleverAgents Bot**" not in body:
|
||||
errors.append("Missing automation signature in body")
|
||||
|
||||
|
||||
return errors
|
||||
|
||||
def get_tracking_issues_from_repo(owner: str, repo: str) -> List[Dict[str, Any]]:
|
||||
|
||||
def get_tracking_issues_from_repo(owner: str, repo: str) -> list[dict[str, Any]]:
|
||||
"""
|
||||
Fetch automation tracking issues from repository.
|
||||
|
||||
|
||||
Note: This is a stub - in real usage, you would integrate with Forgejo API
|
||||
"""
|
||||
print(f"Note: Repository validation for {owner}/{repo} requires API integration")
|
||||
print("This is a demonstration of the validation logic.")
|
||||
return []
|
||||
|
||||
|
||||
def main():
|
||||
parser = argparse.ArgumentParser(description='Validate automation tracking issues')
|
||||
parser.add_argument('--title', help='Validate a single title string')
|
||||
parser.add_argument('--repo', help='Validate issues from repository (owner/repo)')
|
||||
parser.add_argument('--validate-all', action='store_true',
|
||||
help='Run comprehensive validation examples')
|
||||
|
||||
parser = argparse.ArgumentParser(description="Validate automation tracking issues")
|
||||
parser.add_argument("--title", help="Validate a single title string")
|
||||
parser.add_argument("--repo", help="Validate issues from repository (owner/repo)")
|
||||
parser.add_argument(
|
||||
"--validate-all",
|
||||
action="store_true",
|
||||
help="Run comprehensive validation examples",
|
||||
)
|
||||
|
||||
args = parser.parse_args()
|
||||
|
||||
|
||||
if args.title:
|
||||
is_valid, message = validate_tracking_title(args.title)
|
||||
print(f"Title: {args.title}")
|
||||
print(f"Result: {'✓ VALID' if is_valid else '✗ INVALID'}")
|
||||
print(f"Message: {message}")
|
||||
return 0 if is_valid else 1
|
||||
|
||||
|
||||
elif args.repo:
|
||||
try:
|
||||
owner, repo_name = args.repo.split('/', 1)
|
||||
issues = get_tracking_issues_from_repo(owner, repo_name)
|
||||
owner, repo_name = args.repo.split("/", 1)
|
||||
get_tracking_issues_from_repo(owner, repo_name)
|
||||
# Validation logic would go here
|
||||
print(f"Repository validation for {args.repo} completed")
|
||||
return 0
|
||||
except ValueError:
|
||||
print("Error: Repository must be in format 'owner/repo'")
|
||||
return 1
|
||||
|
||||
|
||||
elif args.validate_all:
|
||||
print("Running comprehensive validation examples...")
|
||||
|
||||
|
||||
# Test cases
|
||||
test_cases = [
|
||||
# Valid cases
|
||||
@@ -159,7 +186,6 @@ def main():
|
||||
("[AUTO-GROOMER] Grooming Report (Cycle 23)", True),
|
||||
("[AUTO-LIAISON] Status Update (Cycle 67)", True),
|
||||
("[AUTO-SESSION] Announce: Emergency system restart required", True),
|
||||
|
||||
# Invalid cases
|
||||
("[AUTO-UNKNOWN] Test (Cycle 1)", False), # Unknown prefix
|
||||
("[AUTO-SESSION] Invalid Type (Cycle 1)", False), # Invalid type
|
||||
@@ -168,30 +194,33 @@ def main():
|
||||
("Regular issue title", False), # Wrong format
|
||||
("[AUTO-SESSION] Announce:", False), # Empty announcement
|
||||
]
|
||||
|
||||
|
||||
print("\nTitle Validation Test Results:")
|
||||
print("-" * 50)
|
||||
|
||||
|
||||
all_passed = True
|
||||
for title, expected_valid in test_cases:
|
||||
is_valid, message = validate_tracking_title(title)
|
||||
status = "✓" if is_valid == expected_valid else "✗"
|
||||
result = "VALID" if is_valid else "INVALID"
|
||||
|
||||
|
||||
print(f"{status} {title}")
|
||||
print(f" Expected: {'VALID' if expected_valid else 'INVALID'}, Got: {result}")
|
||||
expected_text = "VALID" if expected_valid else "INVALID"
|
||||
print(f" Expected: {expected_text}, Got: {result}")
|
||||
print(f" Message: {message}")
|
||||
print()
|
||||
|
||||
|
||||
if is_valid != expected_valid:
|
||||
all_passed = False
|
||||
|
||||
print(f"Overall test result: {'✓ ALL PASSED' if all_passed else '✗ SOME FAILED'}")
|
||||
|
||||
summary = "✓ ALL PASSED" if all_passed else "✗ SOME FAILED"
|
||||
print(f"Overall test result: {summary}")
|
||||
return 0 if all_passed else 1
|
||||
|
||||
|
||||
else:
|
||||
parser.print_help()
|
||||
return 1
|
||||
|
||||
if __name__ == '__main__':
|
||||
|
||||
if __name__ == "__main__":
|
||||
sys.exit(main())
|
||||
|
||||
Reference in New Issue
Block a user