Source identity
| Field | Recorded value |
|---|---|
| Source type | GitHub source |
| Original record | Janady13/missionmatch / cmd/embed-backfill/main.go |
| Date | Not specified in source |
| Repository | Janady13/missionmatch |
| Revision | 1e9249840a4302ec82e123b9c9cb6f75badea3e4 |
| Branch | master |
| Path or archive member | cmd/embed-backfill/main.go |
| Original SHA-256 | 19b356dac2d1d3ce45a2e62fa4874bcade92d1b5f8e07018b1f6e484f2e6c7aa |
| Git blob SHA | 251bf97008f0b63843091ce8ccf51423c9ed3437 |
| Reading-copy SHA-256 | 19b356dac2d1d3ce45a2e62fa4874bcade92d1b5f8e07018b1f6e484f2e6c7aa |
Every recorded occurrence
These 41 records contain identical original source bytes. Their paths and revisions remain part of the archive.
| Original record | Branch or archive | Revision / identifier | Original location |
|---|---|---|---|
| Janady13/missionmatch / cmd/embed-backfill/main.go | master | 1e9249840a4302ec82e123b9c9cb6f75badea3e4 | Open original |
| Janady13/missionmatch / cmd/embed-backfill/main.go | m5-price-to-win | 41000ad30fff4129fdaf5ec84e15ba14c27d4890 | Open original |
| Janady13/missionmatch / cmd/embed-backfill/main.go | ws3-clearance | 4b8e7ce594c068621867f9c9deed0ec64ae6c553 | Open original |
| Janady13/missionmatch / cmd/embed-backfill/main.go | collision-deconfliction | 4ee5a09972608ed89f8377c6665542d5f450f0a6 | Open original |
| Janady13/missionmatch / cmd/embed-backfill/main.go | ws7-federal-signal | 6a9f6ce9cfb13345ffb47770d4960e7c2d9c17c2 | Open original |
| Janady13/missionmatch / cmd/embed-backfill/main.go | ws6-retrieval | 6c56e29231ec05735927fa265c97d517499dfeaf | Open original |
| Janady13/missionmatch / cmd/embed-backfill/main.go | per-tenant-routing | 9bde0f9a74b89d01980fa658e5253acda7528d0c | Open original |
| Janady13/missionmatch / cmd/embed-backfill/main.go | ai-brain-live | aac32fc49c878cc5bca099459307611562d0bac1 | Open original |
| Janady13/missionmatch / cmd/embed-backfill/main.go | graphrag-foundation | b0ddeb9f633fd138d09309d1a17b7d13bc3a67f7 | Open original |
| Janady13/missionmatch / cmd/embed-backfill/main.go | ws1-ontology-sync | b596f449a32a1016fbd403c36505cc00a1ac9ee6 | Open original |
| Janady13/missionmatch / cmd/embed-backfill/main.go | time-to-fill-survival | b66e1e505863d4f17741a4b9ede73509e45bd6c6 | Open original |
| Janady13/missionmatch / cmd/embed-backfill/main.go | mag-substrate | b82c7100a492dec67dfd1eda6b3f53def859be35 | Open original |
| Janady13/missionmatch / cmd/embed-backfill/main.go | capture-readiness | bae6af7cb2997e819174a9e9cfff5e16067a1975 | Open original |
| Janady13/missionmatch / cmd/embed-backfill/main.go | deploy-and-ops | bdacd9d0b4d5998d25fc74bf4007f4c3ec538c7a | Open original |
| Janady13/missionmatch / cmd/embed-backfill/main.go | ws8-teaching-loop | c823f0fb6bb2aba0f39001eb6de96f4000d9321f | Open original |
| Janady13/missionmatch / cmd/embed-backfill/main.go | phase2-eval-fairness | d361af254701975fe239927656ababb56374655e | Open original |
| Janady13/missionmatch / cmd/embed-backfill/main.go | phase2-connectors | e038d4c687aec16f8bd9bc4d907eea14d91f8704 | Open original |
| Janady13/missionmatch / cmd/embed-backfill/main.go | ws2-alias-relationship | e4dada4601c6eb101830f9d223a9655dfa120616 | Open original |
| Janady13/missionmatch / cmd/embed-backfill/main.go | presentation-readiness | eb574acaa29d71ce4d0f852572e87c275c79fdb7 | Open original |
| Janady13/missionmatch / cmd/embed-backfill/main.go | ws9-bench-ingestion | f585a9ef32fa554663ce1fba9a414a54b6e49cf0 | Open original |
| Janady13/missionmatch / cmd/embed-backfill/main.go | vendor-intelligence | fe9796a19c261951d3f2565206c0c1b5ac294465 | Open original |
| Janady13/missionmatch / cmd/embed-backfill/main.go | per-tenant-routing | 9bde0f9a74b89d01980fa658e5253acda7528d0c | Open original |
| Janady13/missionmatch / cmd/embed-backfill/main.go | collision-deconfliction | 4ee5a09972608ed89f8377c6665542d5f450f0a6 | Open original |
| Janady13/missionmatch / cmd/embed-backfill/main.go | ws6-retrieval | 6c56e29231ec05735927fa265c97d517499dfeaf | Open original |
| Janady13/missionmatch / cmd/embed-backfill/main.go | m5-price-to-win | 41000ad30fff4129fdaf5ec84e15ba14c27d4890 | Open original |
| Janady13/missionmatch / cmd/embed-backfill/main.go | ws1-ontology-sync | b596f449a32a1016fbd403c36505cc00a1ac9ee6 | Open original |
| Janady13/missionmatch / cmd/embed-backfill/main.go | master | 1e9249840a4302ec82e123b9c9cb6f75badea3e4 | Open original |
| Janady13/missionmatch / cmd/embed-backfill/main.go | ws8-teaching-loop | c823f0fb6bb2aba0f39001eb6de96f4000d9321f | Open original |
| Janady13/missionmatch / cmd/embed-backfill/main.go | mag-substrate | b82c7100a492dec67dfd1eda6b3f53def859be35 | Open original |
| Janady13/missionmatch / cmd/embed-backfill/main.go | ws3-clearance | 4b8e7ce594c068621867f9c9deed0ec64ae6c553 | Open original |
| Janady13/missionmatch / cmd/embed-backfill/main.go | phase2-eval-fairness | d361af254701975fe239927656ababb56374655e | Open original |
| Janady13/missionmatch / cmd/embed-backfill/main.go | time-to-fill-survival | b66e1e505863d4f17741a4b9ede73509e45bd6c6 | Open original |
| Janady13/missionmatch / cmd/embed-backfill/main.go | graphrag-foundation | b0ddeb9f633fd138d09309d1a17b7d13bc3a67f7 | Open original |
| Janady13/missionmatch / cmd/embed-backfill/main.go | deploy-and-ops | bdacd9d0b4d5998d25fc74bf4007f4c3ec538c7a | Open original |
| Janady13/missionmatch / cmd/embed-backfill/main.go | ws9-bench-ingestion | f585a9ef32fa554663ce1fba9a414a54b6e49cf0 | Open original |
| Janady13/missionmatch / cmd/embed-backfill/main.go | ws2-alias-relationship | e4dada4601c6eb101830f9d223a9655dfa120616 | Open original |
| Janady13/missionmatch / cmd/embed-backfill/main.go | presentation-readiness | eb574acaa29d71ce4d0f852572e87c275c79fdb7 | Open original |
| Janady13/missionmatch / cmd/embed-backfill/main.go | ws7-federal-signal | 6a9f6ce9cfb13345ffb47770d4960e7c2d9c17c2 | Open original |
| Janady13/missionmatch / cmd/embed-backfill/main.go | ai-brain-live | aac32fc49c878cc5bca099459307611562d0bac1 | Open original |
| Janady13/missionmatch / cmd/embed-backfill/main.go | phase2-connectors | e038d4c687aec16f8bd9bc4d907eea14d91f8704 | Open original |
| Janady13/missionmatch / cmd/embed-backfill/main.go | capture-readiness | bae6af7cb2997e819174a9e9cfff5e16067a1975 | Open original |
Recovered source transcript
Download complete source text ↓235 lines · 7.9 KB
// Command embed-backfill populates the embedding columns that the audit found dead: skills.embedding
// (0 of 61) and candidates.resume_embedding (sparse). It composes a contents profile per row, embeds it
// through the stateless MEGAMIND inference plane (384 dim, matching the vector(384) columns), L2
// normalizes, and writes it back. After a run the HNSW indexes and the SearchSkillsByEmbedding /
// SearchCandidatesHybrid queries become live.
//
// It targets ONE database (a tenant database under the database per tenant model, or the current shared
// database). It writes only embeddings, never identifiers off box: text goes to the plane, vectors come
// back. It writes a single append only AEDT audit summary at the end (counts and model only, no PII).
//
// Usage:
//
// embed-backfill -dsn $MM_MIGRATOR_DATABASE_URL -megamind $MM_MEGAMIND_URL -what all [-org <uuid>] [-only-missing]
package main
import (
"context"
"encoding/json"
"flag"
"fmt"
"log"
"math"
"os"
"strconv"
"strings"
"time"
"github.com/jackc/pgx/v5/pgxpool"
"github.com/missionworkforce/missionmatch/internal/platform/embeddings"
"github.com/missionworkforce/missionmatch/internal/platform/inference"
)
func main() {
dsn := flag.String("dsn", os.Getenv("MM_MIGRATOR_DATABASE_URL"), "target database DSN (defaults to MM_MIGRATOR_DATABASE_URL)")
mega := flag.String("megamind", os.Getenv("MM_MEGAMIND_URL"), "MEGAMIND gateway base URL")
model := flag.String("model", envDefault("MM_MEGAMIND_EMBED_MODEL", "qllama/bge-small-en-v1.5"), "384 dim embed model")
what := flag.String("what", "all", "what to embed: skills | candidates | all")
org := flag.String("org", "", "optional organization_id filter (for the shared database)")
onlyMissing := flag.Bool("only-missing", false, "embed only rows whose embedding is currently NULL")
batch := flag.Int("batch", 32, "embedding batch size")
flag.Parse()
if *dsn == "" || *mega == "" {
log.Fatal("embed-backfill: -dsn and -megamind are required")
}
ctx := context.Background()
pool, err := pgxpool.New(ctx, *dsn)
if err != nil {
log.Fatalf("db: %v", err)
}
defer pool.Close()
client, err := inference.New(inference.Config{BaseURL: *mega, EmbedModel: *model, Dimension: 384, Timeout: 60 * time.Second, MaxRetries: 2})
if err != nil {
log.Fatalf("inference: %v", err)
}
if err := client.Health(ctx); err != nil {
log.Fatalf("MEGAMIND not reachable at %s: %v", *mega, err)
}
var nSkills, nCands int
if *what == "skills" || *what == "all" {
if nSkills, err = backfillSkills(ctx, pool, client, *onlyMissing, *batch); err != nil {
log.Fatalf("skills: %v", err)
}
log.Printf("embed-backfill: embedded %d skills", nSkills)
}
if *what == "candidates" || *what == "all" {
if nCands, err = backfillCandidates(ctx, pool, client, *org, *onlyMissing, *batch); err != nil {
log.Fatalf("candidates: %v", err)
}
log.Printf("embed-backfill: embedded %d candidates", nCands)
}
writeAudit(ctx, pool, *org, *model, nSkills, nCands)
log.Printf("embed-backfill: DONE (skills=%d candidates=%d model=%s)", nSkills, nCands, *model)
}
func backfillSkills(ctx context.Context, pool *pgxpool.Pool, client *inference.Client, onlyMissing bool, batch int) (int, error) {
q := "SELECT id, name, COALESCE(category,'') FROM skills"
if onlyMissing {
q += " WHERE embedding IS NULL"
}
q += " ORDER BY id"
rows, err := pool.Query(ctx, q)
if err != nil {
return 0, err
}
type item struct {
id string
text string
}
var items []item
for rows.Next() {
var id, name, cat string
if err := rows.Scan(&id, &name, &cat); err != nil {
rows.Close()
return 0, err
}
items = append(items, item{id: id, text: embeddings.SkillEmbedText(name, cat)})
}
rows.Close()
return embedAndWrite(ctx, pool, client, batch, len(items),
func(i int) (string, string) { return items[i].id, items[i].text },
"UPDATE skills SET embedding = $1::vector WHERE id = $2")
}
func backfillCandidates(ctx context.Context, pool *pgxpool.Pool, client *inference.Client, org string, onlyMissing bool, batch int) (int, error) {
// Compose a contents profile per candidate from headline, skills, certs, customer agencies, and
// clearance, so the embedding represents what the candidate can do, not just a name.
q := `
SELECT c.id,
trim(coalesce(c.headline,'')
|| ' | skills: ' || coalesce(s.skills,'')
|| ' | certs: ' || coalesce(ce.certs,'')
|| ' | agencies: '|| coalesce(cu.agencies,'')
|| ' | clearance: '|| c.clearance_level
|| ' | years: ' || c.years_experience)
FROM candidates c
LEFT JOIN (SELECT cs.candidate_id, string_agg(sk.name, ', ') skills
FROM candidate_skills cs JOIN skills sk ON sk.id = cs.skill_id GROUP BY cs.candidate_id) s ON s.candidate_id = c.id
LEFT JOIN (SELECT candidate_id, string_agg(name, ', ') certs
FROM candidate_certifications GROUP BY candidate_id) ce ON ce.candidate_id = c.id
LEFT JOIN (SELECT candidate_id, string_agg(agency, ', ') agencies
FROM candidate_customer_experience GROUP BY candidate_id) cu ON cu.candidate_id = c.id
WHERE c.deleted_at IS NULL AND c.anonymized_at IS NULL`
args := []any{}
if org != "" {
args = append(args, org)
q += " AND c.organization_id = $1"
}
if onlyMissing {
q += " AND c.resume_embedding IS NULL"
}
q += " ORDER BY c.id"
rows, err := pool.Query(ctx, q, args...)
if err != nil {
return 0, err
}
type item struct{ id, text string }
var items []item
for rows.Next() {
var id, text string
if err := rows.Scan(&id, &text); err != nil {
rows.Close()
return 0, err
}
items = append(items, item{id: id, text: text})
}
rows.Close()
return embedAndWrite(ctx, pool, client, batch, len(items),
func(i int) (string, string) { return items[i].id, items[i].text },
"UPDATE candidates SET resume_embedding = $1::vector, updated_at = now() WHERE id = $2")
}
// embedAndWrite batches the embed calls and writes each normalized vector back via the given UPDATE.
func embedAndWrite(ctx context.Context, pool *pgxpool.Pool, client *inference.Client, batch, n int, at func(int) (id, text string), update string) (int, error) {
if batch < 1 {
batch = 32
}
written := 0
for start := 0; start < n; start += batch {
end := start + batch
if end > n {
end = n
}
ids := make([]string, end-start)
texts := make([]string, end-start)
for i := start; i < end; i++ {
ids[i-start], texts[i-start] = at(i)
}
res, err := client.Embed(ctx, texts)
if err != nil {
return written, fmt.Errorf("embed batch [%d,%d): %w", start, end, err)
}
for j, vec := range res.Embeddings {
normalize(vec)
if _, err := pool.Exec(ctx, update, vectorLiteral(vec), ids[j]); err != nil {
return written, fmt.Errorf("write %s: %w", ids[j], err)
}
written++
}
log.Printf("embed-backfill: %d/%d", written, n)
}
return written, nil
}
func writeAudit(ctx context.Context, pool *pgxpool.Pool, org, model string, nSkills, nCands int) {
payload, _ := json.Marshal(map[string]any{"skills": nSkills, "candidates": nCands, "model": model})
var orgArg any
if org != "" {
orgArg = org
}
_, _ = pool.Exec(ctx,
"INSERT INTO audit_logs (organization_id, action, entity_type, new_values) VALUES ($1, 'aedt.embedding.backfill', 'embedding', $2)",
orgArg, payload)
}
// vectorLiteral formats a vector as a pgvector text literal for the $::vector cast.
func vectorLiteral(v []float32) string {
var b strings.Builder
b.WriteByte('[')
for i, x := range v {
if i > 0 {
b.WriteByte(',')
}
b.WriteString(strconv.FormatFloat(float64(x), 'f', -1, 32))
}
b.WriteByte(']')
return b.String()
}
// normalize L2 normalizes in place so cosine distance over the column is meaningful, matching the
// embeddings package contract.
func normalize(v []float32) {
var sum float64
for _, x := range v {
sum += float64(x) * float64(x)
}
if sum == 0 {
return
}
inv := float32(1.0 / math.Sqrt(sum))
for i := range v {
v[i] *= inv
}
}
func envDefault(k, def string) string {
if v := os.Getenv(k); v != "" {
return v
}
return def
}