mirror of
https://github.com/YspCoder/clawgo.git
synced 2026-05-13 18:37:30 +08:00
autonomy anti-loop hardening: keep completed tasks stable and suppress markdown todos already marked done
This commit is contained in:
@@ -251,9 +251,6 @@ func (e *Engine) tick() {
|
|||||||
st.DueAt = t.DueAt
|
st.DueAt = t.DueAt
|
||||||
st.DedupeHits = t.DedupeHits
|
st.DedupeHits = t.DedupeHits
|
||||||
st.ResourceKeys = deriveResourceKeys(t.Content)
|
st.ResourceKeys = deriveResourceKeys(t.Content)
|
||||||
if st.Status == "completed" {
|
|
||||||
st.Status = "idle"
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// completed when removed from todo source
|
// completed when removed from todo source
|
||||||
@@ -537,10 +534,21 @@ func (e *Engine) scanTodos() []todoItem {
|
|||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
merged := map[string]todoItem{}
|
merged := map[string]todoItem{}
|
||||||
|
storedItems, _ := e.taskStore.Load()
|
||||||
|
doneIDs := map[string]bool{}
|
||||||
|
for _, it := range storedItems {
|
||||||
|
status := strings.ToLower(strings.TrimSpace(it.Status))
|
||||||
|
if status == "done" || status == "completed" {
|
||||||
|
doneIDs[strings.TrimSpace(it.ID)] = true
|
||||||
|
}
|
||||||
|
}
|
||||||
merge := func(it todoItem) {
|
merge := func(it todoItem) {
|
||||||
if strings.TrimSpace(it.ID) == "" || strings.TrimSpace(it.Content) == "" {
|
if strings.TrimSpace(it.ID) == "" || strings.TrimSpace(it.Content) == "" {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
if doneIDs[strings.TrimSpace(it.ID)] {
|
||||||
|
return
|
||||||
|
}
|
||||||
if cur, ok := merged[it.ID]; ok {
|
if cur, ok := merged[it.ID]; ok {
|
||||||
if priorityWeight(it.Priority) > priorityWeight(cur.Priority) {
|
if priorityWeight(it.Priority) > priorityWeight(cur.Priority) {
|
||||||
cur.Priority = it.Priority
|
cur.Priority = it.Priority
|
||||||
@@ -582,26 +590,24 @@ func (e *Engine) scanTodos() []todoItem {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// 2) Merge structured tasks.json items (manual injections / prior state).
|
// 2) Merge structured tasks.json items (manual injections / prior state).
|
||||||
if items, err := e.taskStore.Load(); err == nil {
|
for _, it := range storedItems {
|
||||||
for _, it := range items {
|
status := strings.ToLower(strings.TrimSpace(it.Status))
|
||||||
status := strings.ToLower(strings.TrimSpace(it.Status))
|
if status == "done" {
|
||||||
if status == "done" {
|
continue
|
||||||
continue
|
|
||||||
}
|
|
||||||
content := it.Content
|
|
||||||
if content == "" {
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
id := strings.TrimSpace(it.ID)
|
|
||||||
if id == "" {
|
|
||||||
id = hashID(content)
|
|
||||||
}
|
|
||||||
priority := strings.TrimSpace(it.Priority)
|
|
||||||
if priority == "" {
|
|
||||||
priority = "normal"
|
|
||||||
}
|
|
||||||
merge(todoItem{ID: id, Content: content, Priority: priority, DueAt: it.DueAt})
|
|
||||||
}
|
}
|
||||||
|
content := it.Content
|
||||||
|
if content == "" {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
id := strings.TrimSpace(it.ID)
|
||||||
|
if id == "" {
|
||||||
|
id = hashID(content)
|
||||||
|
}
|
||||||
|
priority := strings.TrimSpace(it.Priority)
|
||||||
|
if priority == "" {
|
||||||
|
priority = "normal"
|
||||||
|
}
|
||||||
|
merge(todoItem{ID: id, Content: content, Priority: priority, DueAt: it.DueAt})
|
||||||
}
|
}
|
||||||
|
|
||||||
out := make([]todoItem, 0, len(merged))
|
out := make([]todoItem, 0, len(merged))
|
||||||
|
|||||||
Reference in New Issue
Block a user