gastownhall/beads · warning

issue %s is not eligible for Tier 1 compaction

Error message

issue %s is not eligible for Tier 1 compaction

What it means

Same policy rejection as the reasoned variant, but CheckEligibility returned eligible=false with an empty reason, so only the generic ineligibility message is produced. The store declined the compaction without explaining why.

Source

Thrown at internal/compact/compactor.go:102

	}, nil
}

// CompactTier1 compacts a single issue at Tier 1 (basic summarization).
func (c *Compactor) CompactTier1(ctx context.Context, issueID string) error {
	if ctx.Err() != nil {
		return ctx.Err()
	}

	// Check eligibility before fetching issue (fail fast)
	eligible, reason, err := c.store.CheckEligibility(ctx, issueID, 1)
	if err != nil {
		return fmt.Errorf("failed to verify eligibility: %w", err)
	}
	if !eligible {
		if reason != "" {
			return fmt.Errorf("issue %s is not eligible for Tier 1 compaction: %s", issueID, reason)
		}
		return fmt.Errorf("issue %s is not eligible for Tier 1 compaction", issueID)
	}

	issue, err := c.store.GetIssue(ctx, issueID)
	if err != nil {
		return fmt.Errorf("failed to fetch issue: %w", err)
	}

	// Calculate original size
	originalSize := len(issue.Description) + len(issue.Design) + len(issue.Notes) + len(issue.AcceptanceCriteria)

	if c.config.DryRun {
		return fmt.Errorf("dry-run: would compact %s (original size: %d bytes)", issueID, originalSize)
	}

	// Get summary from AI
	summary, err := c.summarizer.SummarizeTier1(ctx, issue)
	if err != nil {
		return fmt.Errorf("failed to summarize: %w", err)

View on GitHub (pinned to 71377f2769)

Solutions

  1. Check the issue's state/size/compaction history manually to determine why it was rejected
  2. Call CheckEligibility directly to confirm the (bool, string) return values
  3. Upgrade or fix the store implementation so it populates the reason string
  4. Treat as a benign skip in batch workflows
Defensive patterns

Strategy: validation

Validate before calling

eligible, reason, err := store.CheckEligibility(ctx, issueID, 1)
if err == nil && !eligible {
    // inspect the issue manually: closed? already compacted? too small?
    iss, _ := store.GetIssue(ctx, issueID)
    log.Printf("skip %s (reason empty, status=%v)", issueID, iss)
}

Try / catch

if err := c.CompactTier1(ctx, id); err != nil {
    if strings.Contains(err.Error(), "not eligible for Tier 1 compaction") {
        return nil
    }
    return err
}

Prevention

When it happens

Trigger: Calling CompactTier1 on an issue where store.CheckEligibility(ctx, issueID, 1) returns (false, "", nil) — the default rejection path when the store provides no detailed reason.

Common situations: Storage backends that implement eligibility checks but return no reason string; older store implementations without detailed reason reporting; issue fails a rule the backend does not describe.

Related errors


AI-assisted analysis of gastownhall/beads@71377f2769 (2026-08-30). Data as JSON: /api/errors/4ed1d2ab7c46d696. Report an issue: GitHub.