ajhahn.de
← eeco
Go 50 lines
package workflow

import (
	"fmt"
	"sort"
)

// commentHygiene is a read-only gate: it scans every text file in the
// working tree (skipping .git and the gitignored workspace) for an
// AI-attribution fingerprint and fails if any shippable file carries
// one. It writes nothing and needs no external tool, so it is never
// blocked.
type commentHygiene struct{}

func (commentHygiene) Name() string { return "comment-hygiene" }

func (commentHygiene) Summary() string {
	return "scan source and docs for AI-attribution fingerprints (read-only)"
}

func (commentHygiene) Run(env Env) (Result, error) {
	cfg := env.Config
	det, err := NewDetector(cfg.AttributionPatterns)
	if err != nil {
		return Result{}, err
	}
	var findings []Finding
	err = walkText(cfg.RepoRoot, cfg.WorkspaceName, func(rel, content string) error {
		findings = append(findings, det.Scan(rel, content)...)
		return nil
	})
	if err != nil {
		return Result{}, fmt.Errorf("comment-hygiene: walk: %w", err)
	}
	if len(findings) == 0 {
		return Result{Code: CodeClean, Summary: "no attribution fingerprints found"}, nil
	}
	sort.Slice(findings, func(i, j int) bool {
		if findings[i].Path != findings[j].Path {
			return findings[i].Path < findings[j].Path
		}
		return findings[i].Line < findings[j].Line
	})
	return Result{
		Code:     CodeFinding,
		Summary:  fmt.Sprintf("%d attribution fingerprint(s) in tracked tree", len(findings)),
		Findings: findings,
	}, nil
}