Skip to main content

Workload Rename — Implementation Plan

Date: 2026-02-17 Status: Superseded by doc 12 — W1 Unified Implementation Plan (which incorporates this rename as Phase 0) Decision: Rename entity_type: "automation" to entity_type: "workload" across all layers.


1. Decision Summary

The naming collision

The word "automation" referred to two scopes:

  • Narrow (entity): A single code artifact (Business Rule, Script Include, Flow, Scheduled Job)
  • Broad (concept): "Automation Definition" — the full configured behavior chain

5-agent analysis result

AgentRecommendationKey reasoning
CISOexecution_surfaceRisk-native, self-documenting, board-ready
DeveloperKeep automationFix collision at concept layer, zero migration
Product OwnerKeep automation + subtypesUse subtypes in UI, no new vocabulary needed
Target AnalystworkloadIndustry standard (Wiz, Orca, Defender), zero learning curve
ArchitectworkloadActive noun for active entity, clean taxonomy, natural code ergonomics

Why workload wins

  1. The "IS a" test passes: "A Business Rule IS a workload" — natural and correct
  2. No vocabulary collision: Unlike "surface" vs "attack surface", "workload" has no competing security meaning
  3. Industry standard: Wiz, Orca, Microsoft Defender for Cloud, GCP Security Command Center all use "workload" for compute artifacts
  4. Market positioning: "We show you the automation workloads that cloud security tools miss"
  5. Code ergonomics: WORKLOAD_SUBTYPES, workloadSubtype, entity_type: "workload" all read naturally
  6. Active noun: Workloads execute, call, invoke — matches the entity's behavior

Final vocabulary

ConceptNameWhere
Atomic code artifact entityWorkload (entity_type: "workload")Data model, code, API, graph
Full configured behaviorAutomation DefinitionPage titles, docs, UX
Derived structural pathAuthority PathDocs, internal/debug UI
Runtime instance (W2)Automation RunGlossary as planned
Raw proof eventExecution EvidenceEverywhere
W1 finding rowExposureW1 UX
W1 surface groupingRisk ClusterW1 UX
W1 governance assertionStanding AuthorityW1 UX

2. Scope — All Changes by File

Phase 1: Platform Core (sv0-platform/src)

FileLine(s)Change
src/domain/entities/types.ts3"automation""workload" in ENTITY_TYPES array
src/domain/graph/identity-subtypes.ts11, 38, 44AUTOMATION_SUBTYPESWORKLOAD_SUBTYPES, AutomationSubtypeWorkloadSubtype
src/ingestion/types.ts3, 5"automation""workload" in NormalizedNodeType; update deprecation comment
src/ingestion/graph-transformer.ts14, 39, 55, 60Import rename, case "workload", property access workloadSubtype, reclassify return "workload"
src/ingestion/path-materializer.ts14PATH_MATERIALIZABLE_TYPES: "automation""workload"
src/ingestion/chain-builder.ts136, 139Comment + entityType: "workload"
src/storage/mongo/adapter.ts12, 102, 179, 792, 805Import rename, workloadSubtype property checks, WORKLOAD_SUBTYPE_SET
src/evaluator/rules/dormant-authority.ts48, 68=== "workload", label "Workload"
src/evaluator/rules/privilege-justification-gap.ts64, 118Same pattern
src/evaluator/rules/scope-drift.ts19, 45Same pattern
src/evaluator/rules/orphaned-ownership.ts65"workload" label
src/evaluator/rules/unresolved-auth.ts51workloadSubtype property access
src/api/routes/ingest.ts12, 14"workload" in valid types; update deprecation comment
src/api/routes/paths.ts8BLAST_RADIUS_TYPES: "automation""workload"

Backward compatibility in ingestion: Accept "automation" as deprecated alias in NormalizedNodeType and remap to "workload" in mapNodeType() — same pattern as existing "autonomous_identity" handling.

Phase 2: Platform Tests (sv0-platform/test)

FileChanges
test/evaluator/automation-evaluation.test.tsentity_type: "automation""workload", automationSubtypeworkloadSubtype
test/evaluator/dormant-authority.test.tsentity_type values
test/evaluator/privilege-justification-gap.test.tsentity_type values
test/ingestion/graph-transformer.test.tsnodeType: "automation""workload", automationSubtypeworkloadSubtype
test/ingestion/chain-builder.test.tsentity_type + automationSubtypeworkloadSubtype (~20 locations)
test/ingestion/path-materializer.test.tsentity_type + automationSubtypeworkloadSubtype (~6 locations)
test/api/paths.test.tsentity fixtures
test/integration/helpers/mock-data.tsentity factories
test/integration/storage/entity-crud.test.tsentity_type + property names (~10 locations)
test/integration/storage/subgraph.test.tsentity_type + property names (~5 locations)

Note: Consider renaming automation-evaluation.test.tsworkload-evaluation.test.ts for consistency.

Phase 3: UI (sv0-platform/ui/src)

FileChanges
ui/src/api/api-types.tsEntityType union: "automation""workload"
ui/src/hooks/use-automations.tsRename to use-workloads.ts, useAutomationsuseWorkloads, AUTOMATION_SUBTYPESWORKLOAD_SUBTYPES, entity_type: "workload"
ui/src/components/AutomationBadges.tsxRename to WorkloadBadges.tsx, AutomationTypeBadgeWorkloadTypeBadge
ui/src/components/ExecutionFlowDiagram.tsxImport rename, workloadSubtype property access
ui/src/components/graph/GraphLegend.tsxlabel: "Automation"label: "Workload"
ui/src/components/graph/GraphFilterSidebar.tsx"automation""workload" in types and color map
ui/src/components/graph/EntityNode.tsxautomation:workload: in color map
ui/src/components/graph/layout.tsAUTOMATION_SUBTYPESWORKLOAD_SUBTYPES, "automation""workload"
ui/src/components/graph/GraphNodeDetailsDrawer.tsx"automation""workload" in BLAST_RADIUS_TYPES and EXEC_ENTITY_TYPES
ui/src/components/shared/EntityBadge.tsxautomation:workload: in color map
ui/src/pages/AutomationsPage.tsxRename to WorkloadsPage.tsx, update imports, labels, page title
ui/src/pages/AutomationDetailPage.tsxRename to WorkloadDetailPage.tsx, update imports, labels
ui/src/pages/Dashboard.tsxImport rename, useWorkloads, UI labels
ui/src/pages/EntitiesListPage.tsx"automation""workload" in type options
ui/src/pages/GraphExplorerPage.tsx"automation""workload" in ALL_ENTITY_TYPES
ui/src/components/Layout.tsxNav: "/automations""/workloads", label "Workloads"
ui/src/App.tsxRoutes: automationsworkloads, import renames

Phase 4: Connectors (sv0-connectors)

FileChanges
integrations/entra-servicenow/src/.../transformer.pynode_type="automation"node_type="workload", automationSubtypeworkloadSubtype, _enrich_automation_properties_enrich_workload_properties
integrations/entra-servicenow/src/.../correlator.pyVariable names, comments
integrations/entra-servicenow/src/.../origin_classifier.pyComments/docstrings
integrations/entra-servicenow/src/.../egress_classifier.pyComments/docstrings
integrations/entra-servicenow/src/.../risk_grouper.pyComments/docstrings
integrations/entra-servicenow/src/.../ownership_validator.pyComments/docstrings
integrations/entra-servicenow/tests/unit/test_transformer.pynode_type assertions, property names
integrations/entra-servicenow/tests/unit/test_transform_entities.pySame

Backward compatibility in connector: The connector should emit workloadSubtype as the property name. The platform ingestion layer should also accept automationSubtype (remap to workloadSubtype) for any older connector payloads in the pipeline.

Phase 5: Database Migration

// MongoDB migration script
db.entities.updateMany(
{ entity_type: "automation" },
[{ $set: {
entity_type: "workload",
"properties.workloadSubtype": "$properties.automationSubtype"
}}]
);

// Also update entity_versions collection
db.entity_versions.updateMany(
{ entity_type: "automation" },
[{ $set: {
entity_type: "workload",
"properties.workloadSubtype": "$properties.automationSubtype"
}}]
);

// Execution chains reference entity_type in entity_refs (NOT steps — steps field does not exist)
db.execution_chains.updateMany(
{ "entity_refs.entity_type": "automation" },
{ $set: { "entity_refs.$[elem].entity_type": "workload" } },
{ arrayFilters: [{ "elem.entity_type": "automation" }] }
);

Strategy: Run migration AFTER deploying code that accepts both old and new values. The ingestion layer's backward-compat alias means the migration can happen at any point after the code deploy.

Phase 6: Documentation

FileChanges
sv0-documentation/docs/glossary.mdUpdate entity type table, disambiguation section, all "automation" entity references
sv0-documentation/docs/architecture/01-data-model.mdEntity type definitions
sv0-documentation/docs/architecture/03-database.mdSchema examples
sv0-documentation/docs/architecture/04-api-layer.mdAPI parameter examples
sv0-documentation/docs/architecture/decisions/adr-006-entity-type-reclassification.mdUpdate to reference "workload"
sv0-platform/docs/maintenance.mdMongoDB query examples
sv0-platform/CLAUDE.mdEntity type references

3. Property Name Decision

The connector currently emits automationSubtype as a property on entities. Two options:

  • Connector emits workloadSubtype
  • Platform reads workloadSubtype
  • Migration renames existing properties.automationSubtypeproperties.workloadSubtype
  • Backward compat: platform ingestion also accepts automationSubtype and remaps

Option B: Keep automationSubtype property name

  • Less migration work
  • Creates mismatch: entity_type: "workload" with property automationSubtype
  • Every new developer will ask "why does a workload have an automationSubtype?"

Decision: Option A. The migration is a one-line $rename in MongoDB. The mismatch would persist forever.


4. Backward Compatibility Strategy

The rename touches a cross-repo contract (NormalizedNodeType). To avoid requiring simultaneous deployment:

  1. Platform deploys first with backward-compat alias:

    • NormalizedNodeType accepts both "workload" and "automation"
    • mapNodeType() maps both to "workload"
    • Property remapping: accepts both automationSubtype and workloadSubtype
  2. Connector deploys second emitting new names:

    • node_type="workload", workloadSubtype
  3. DB migration runs third after both are deployed:

    • Converts existing stored entities
  4. Cleanup (optional, later): Remove "automation" from the deprecated alias list in platform.


5. URL Route Decision

Current URL paths: /automations, /automations/:id

Option A: Rename routes to /workloads — consistent with data model Option B: Keep /automations routes — avoids breaking bookmarks, external links

Recommendation: Rename to /workloads with a client-side redirect from /automations/*/workloads/* for bookmark compatibility. The redirect is a single React Router entry.


6. Execution Order

Phase 1: Platform core (src/)           — type defs, ingestion, storage, evaluator, API
Phase 2: Platform tests (test/) — update fixtures and assertions
Phase 3: UI (ui/src/) — components, pages, hooks, routes
→ Run: npm test + npx tsc --noEmit + cd ui && npm run build
Phase 4: Connectors (sv0-connectors/) — transformer, correlator, tests
→ Run: pytest
Phase 5: Database migration — entities, entity_versions, execution_chains
Phase 6: Documentation — glossary, architecture docs, CLAUDE.md

Estimated file count: ~45 files across platform + connectors + docs.


7. Verification Checklist

  • npm test — all unit tests pass
  • npm run test:integration — all integration tests pass (with migrated DB)
  • npx tsc --noEmit — typecheck clean
  • cd ui && npm run build — UI builds
  • pytest (connectors) — all tests pass
  • Grep for leftover "automation" (excluding deprecated-alias code and comments)
  • Local docker compose up --build — UI displays "Workload" in graph legend, entity list
  • Ingest a test payload with node_type: "workload" — entity stored correctly
  • Ingest a test payload with node_type: "automation" (deprecated) — backward compat works
  • Evaluator findings say "Workload has..." for workload entities

8. What Does NOT Change

  • "Automation Definition" — the broad concept name stays
  • "Automation Run" — the W2 runtime instance name stays
  • Page concept — the detail page is still an "Automation Definition" view
  • RUNS_AS relationship — unchanged, workloads still delegate to identities
  • Finding typesdormant_authority, orphaned_ownership, etc. unchanged
  • Execution chains collection — structure unchanged, just entity_type values in steps
  • API endpoint paths/api/v1/entities, /api/v1/findings etc. unchanged (entity_type is a query param)