Skip to content

Commit 27e3d88

Browse files
committed
Clean up resolved growth pressures
1 parent a343ae6 commit 27e3d88

2 files changed

Lines changed: 93 additions & 0 deletions

File tree

internal/app/growth.go

Lines changed: 69 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -235,6 +235,7 @@ func deriveGrowthPressures(records []memoryRecord) []growthPressure {
235235
Sources: sources,
236236
})
237237
}
238+
pressures = suppressResolvedFailurePressures(pressures, records)
238239
sort.Slice(pressures, func(i, j int) bool {
239240
if pressures[i].Score == pressures[j].Score {
240241
if pressures[i].Kind == pressures[j].Kind {
@@ -262,12 +263,80 @@ func growthRecordAllowed(record memoryRecord) bool {
262263
if signal == "" || isNoisyGrowthSignal(signal) {
263264
return false
264265
}
266+
if activeCapabilityExecutionSignal(signal) {
267+
return false
268+
}
265269
if quality == "weak" {
266270
return usefulValidationSignal(signal) || hasAny(normalizeSentence(signal), "before every", "before each", "repeatable")
267271
}
268272
return true
269273
}
270274

275+
func activeCapabilityExecutionSignal(signal string) bool {
276+
normalized := normalizeSentence(signal)
277+
return hasAny(normalized, "active validator", "active harness", "active capability") &&
278+
hasAny(normalized, "passed before packet handoff", "passed for goal", "ran for goal", "blocked because", "record active capability")
279+
}
280+
281+
func suppressResolvedFailurePressures(pressures []growthPressure, records []memoryRecord) []growthPressure {
282+
filtered := make([]growthPressure, 0, len(pressures))
283+
for _, pressure := range pressures {
284+
if pressureOpenFailure(pressure) && pressureResolvedByLaterMemory(pressure, records) {
285+
continue
286+
}
287+
filtered = append(filtered, pressure)
288+
}
289+
return filtered
290+
}
291+
292+
func pressureResolvedByLaterMemory(pressure growthPressure, records []memoryRecord) bool {
293+
latest := latestSourceGoal(pressure.Sources)
294+
if latest == "" {
295+
return false
296+
}
297+
for _, record := range records {
298+
goalID := memoryGoalID(record.Text)
299+
if compareGoalID(goalID, latest) <= 0 {
300+
continue
301+
}
302+
signal := memorySignal(record.Text)
303+
if failureClosureSignal(signal) && failureClosureOverlaps(pressure.Signal, signal) {
304+
return true
305+
}
306+
}
307+
return false
308+
}
309+
310+
func latestSourceGoal(sources []string) string {
311+
latest := ""
312+
for _, source := range sources {
313+
if compareGoalID(source, latest) > 0 {
314+
latest = source
315+
}
316+
}
317+
return latest
318+
}
319+
320+
func failureClosureSignal(signal string) bool {
321+
normalized := normalizeSentence(signal)
322+
if hasAny(normalized, "not fixed", "not resolved", "not closed", "still open") {
323+
return false
324+
}
325+
return hasAny(normalized, "closed by", "is closed", "now closed", "resolved", "fixed", "no longer", "now handled", "now configurable")
326+
}
327+
328+
func failureClosureOverlaps(failure, closure string) bool {
329+
failureTokens := tokenSet(pressureTokens(failure))
330+
closureTokens := tokenSet(pressureTokens(closure))
331+
overlap := 0
332+
for token := range failureTokens {
333+
if closureTokens[token] {
334+
overlap++
335+
}
336+
}
337+
return overlap >= 2 || tokenJaccard(failureTokens, closureTokens) >= 0.35
338+
}
339+
271340
func readinessEvidenceContributesToGrowth(text string) bool {
272341
normalized := normalizeSentence(text)
273342
prefix := "readiness evidence:"

internal/app/main_test.go

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1626,6 +1626,30 @@ func TestGrowthTreatsRemainingGapFailureAsImplementationPressure(t *testing.T) {
16261626
}
16271627
}
16281628

1629+
func TestGrowthIgnoresActiveValidatorPassAsNewValidationPressure(t *testing.T) {
1630+
pressures := deriveGrowthPressures([]memoryRecord{
1631+
{Kind: "pattern", Text: "GOAL-0005 pressure signals: Active validator `validator-go-test` passed before packet handoff.", Confidence: 0.7, Quality: "weak"},
1632+
{Kind: "pattern", Text: "GOAL-0006 pressure signals: Active validator `validator-go-test` passed before packet handoff.", Confidence: 0.7, Quality: "weak"},
1633+
{Kind: "pattern", Text: "GOAL-0007 pressure signals: Active validator `validator-go-test` passed before packet handoff.", Confidence: 0.7, Quality: "weak"},
1634+
})
1635+
if len(pressures) != 0 {
1636+
t.Fatalf("active validator execution evidence should not create a new validator pressure, got %+v", pressures)
1637+
}
1638+
}
1639+
1640+
func TestGrowthSuppressesFailurePressureClosedByLaterEvidence(t *testing.T) {
1641+
pressures := deriveGrowthPressures([]memoryRecord{
1642+
{Kind: "failure", Text: "GOAL-0005 learn failure: Fixed port `:8080` is a deployment friction for future operations.", Confidence: 0.8, Quality: "durable"},
1643+
{Kind: "failure", Text: "GOAL-0006 learn failure: Fixed port `:8080` remains deployment/operations friction.", Confidence: 0.8, Quality: "durable"},
1644+
{Kind: "pattern", Text: "GOAL-0007 pressure signals: Fixed port deployment friction is closed by `MINIAPI_ADDR`.", Confidence: 0.75, Quality: "durable"},
1645+
})
1646+
for _, pressure := range pressures {
1647+
if pressureOpenFailure(pressure) && strings.Contains(pressure.Signal, "Fixed port") {
1648+
t.Fatalf("resolved fixed-port failure should not remain as open pressure, got %+v", pressures)
1649+
}
1650+
}
1651+
}
1652+
16291653
func TestGrowthGroupsRepeatedValidationByCommand(t *testing.T) {
16301654
pressures := deriveGrowthPressures([]memoryRecord{
16311655
{Kind: "pattern", Text: "GOAL-0001 reusable patterns: Use `./check.sh` as the narrow local smoke command for the add/list flow.", Confidence: 0.75, Quality: "durable"},

0 commit comments

Comments
 (0)