ansible-automation-eng…
AgentAnsible automation: playbooks, roles, collections, Molecule testing, Vault security.
Flag exported struct types that should be unexported because only their interface is public.
Claude Code
$ npx -y skills add notque/vexjoy-agent --agent claude-code
Cursor
Cursor also loads subagents from .claude/agents, so copy this file there to use it in Cursor.
Flag exported struct types that should be unexported because only their interface is public.
**Check**: "Is this type only used through an interface? If yes, unexport it."
// FLAGGED: exported type only used through interface
type FileBackingStore struct { ... }
func NewFileBackingStore(...) BackingStore { return &FileBackingStore{...} }
// CORRECT: unexported concrete, exported interface
type fileBackingStore struct { ... }
func NewFileBackingStore(...) BackingStore { return &fileBackingStore{...} }**Severity**: HIGH — leaks implementation details, expands public API unnecessarily.
Flag functions wrapping a single stdlib/library call without adding value.
**Checks**:
// FLAGGED:
func mustGetUser(t *testing.T, db *DB, id string) User {
u, err := db.GetUser(id)
if err != nil { t.Fatal(err) }
return u
}
// Convention: use must.ReturnT
user := must.ReturnT(db.GetUser(id))(t)**must vs assert**:
**Severity**: MEDIUM
Flag `Option[T]` persisting beyond parse/config into runtime structs.
// FLAGGED: Option in runtime struct
type fileBackingStore struct {
MaxFileSize Option[int64] // checked on every write
}
// CORRECT: resolve at parse time
store := fileBackingStore{
MaxFileSize: cfg.MaxFileSize.UnwrapOr(10 << 20),
}**Severity**: HIGH — forces every method to handle None when decision was made at init.
Flag separate pools when shared should be passed. Flag heavy imports when go-bits alternatives exist.
**Checks**:
**Severity**: HIGH for transitive dep pollution, MEDIUM for resource management.
Flag abstractions adding complexity without value.
**Checks**:
**Severity**: MEDIUM general, HIGH when creating maintenance burden.
Flag names blocking future siblings.
**Checks**:
**Severity**: MEDIUM — compounds as siblings added.
Flag manual implementations of patterns go-bits provides.
| Manual Pattern | go-bits Replacement | Package | |----------------|---------------------|---------| | `rows.Next()` + `rows.Scan()` | `sqlext.ForeachRow()` | sqlext | | `if err != nil { t.Fatal(err) }` | `must.SucceedT(t, err)` | must | | Manual DB test setup | `easypg.WithTestDB()` | easypg | | Manual error collection | `errext.ErrorSet` | errext | | `log.Printf` | `logg.Info()` | logg | | `json.Marshal` + `w.Write` | `respondwith.JSON()` | respondwith | | `os.Getenv` without validation | `osext.MustGetenv()` | osext | | Manual factory maps | `pluggable.Registry[T]` | pluggable | | Manual HTTP server lifecycle | `httpext.ListenAndServeContext()` | httpext |
// FLAGGED: manual row iteration
rows, err := db.Query(query, args...)
defer rows.Close()
for rows.Next() { ... }
// Convention: use sqlext.ForeachRow
err := sqlext.ForeachRow(db, query, args, func(rows *sql.Rows) error {
return rows.Scan(&item.ID, &item.Name)
})**Severity**: MEDIUM, HIGH when manual version has bugs go-bits avoids.
**Checks**:
// Convention: testWithEachTypeOf
func testWithEachBackingStore(t *testing.T, action func(*testing.T, BackingStore)) {
t.Run("with file store", func(t *testing.T) { action(t, newTestFileBackingStore(t)) })
t.Run("with SQL store", func(t *testing.T) {
easypg.WithTestDB(t, func(t *testing.T, db *sql.DB) { action(t, newTestSQLBackingStore(t, db)) })
})
}**Severity**: HIGH for missing multi-implementation coverage, MEDIUM for structural issues.
Constants, error sentinels, validation functions must live with their owning interface.
**Checks**:
**Test**: If you can name which interface owns it, it lives in that interface's file.
**Acceptable in util.go**: Cross-cutting utilities serving multiple unrelated types.
**Severity**: MEDIUM for new violations (move during this PR). LOW for pre-existing in untouched code.
**Cross-repo**: Appears in 4+ sapcc repos — NON-NEGOTIABLE per Tier 1.
Essays and writing behind this toolkit live at vexjoy.com. VexJoy Agent connects plain-English requests to specialist agents, skills, and workflows. /do selects the knowledge and tools needed for your task.
Ansible automation: playbooks, roles, collections, Molecule testing, Vault security.
**Scope**: Module selection patterns, builtin vs command/shell decisions, collection modules, and version-specific module changes…
**Scope**: Molecule test scenarios, ansible-lint rules, idempotency validation, and check-mode patterns **Version range**:…
Universal rules injected by /do at dispatch. Each agent's .md file supplies domain rules.
**Scope**: Failure modes in agent output style — over-reporting, self-congratulation, verbose narration, and hedging. Covers what…
Zero-dependency combat visual upgrades: CSS particle replacement, Framer Motion combat juice, CSS 3D card transforms.
Surgical 1-2 file edit. Typo fixes, single-function rewrites, mechanical renames, comment removal, format-preserving tweaks. Hard…