Skip to content

Contract the legacy engine and verify the replacement #82

Description

@marcinpsk

Parent

#73

What to build

Complete the interface-family replacement by moving every remaining caller to the new family package, removing the legacy private family implementation, and proving behavioral and performance equivalence. The engine must finish as a compatibility facade with one authoritative family path behind it.

Acceptance criteria

  • Automatic installation, prediction, interactive preview and apply, bulk operations, virtual-chassis reapplication, conversion, and deferred reconciliation all use the new family package.
  • The engine contains only compatibility orchestration and unrelated rule behavior; it does not retain family discovery, planning, mutation, conversion, or reconciliation logic.
  • Legacy private family helpers, legacy family dictionaries and tuples, and alternate mutation paths are deleted.
  • The family package does not import the engine facade, and shared dependencies point only toward lower-level rule-selection and naming seams.
  • Existing public engine entry points remain compatible for downstream callers.
  • No compatibility layer remains for private helpers.
  • The project domain glossary, architectural decisions, and user-facing documentation describe the final interface-family behavior consistently.
  • The complete supported NetBox and Python test matrix is green, including real PostgreSQL transaction, signal, prediction, preview, bulk, conversion, and virtual-chassis coverage.
  • No test simulates an out-of-band rename with a queryset update on an interface name column. Each helper writes the row the way another actor would, through a model save with this plugin's own receivers muted, so the suite exercises the real write path and does not depend on an environment that permits raw bulk writes to interface rows.
  • Query-count and query-scaling checks are no worse than the existing-implementation baseline.
  • The exact manual performance scenarios from Record existing automatic naming performance #74 are rerun on the same hardware and controlled software environment.
  • The after artifact contains PostgreSQL work, raw wall-time and process-CPU samples, median, p95, and environment revisions in the same normalized format as the before artifact.
  • The comparison report shows no database-work or machine-time regression beyond the baseline's observed variance. Any detected regression is resolved before completion.
  • The before artifact, after artifact, and readable comparison summary are retained as review evidence.
  • No new plugin database schema or recurring machine-time CI gate is introduced.

Implementation note

engine.py is down from 1619 lines to 785 and holds no family discovery, planning or mutation.
Device-level renaming gained the revalidation and row locking it never had.

Three criteria are still open, all about the performance evidence rather than the code:

  • The after run was taken while the host was at load 17 to 44 from unrelated projects, so its wall
    and CPU samples are not evidence. The scenarios need rerunning on an idle host.
  • The database-work half is settled and needs no rerun. This plugin's own committed callback issues
    fewer or the same statements in every scenario, from unchanged where no rule matches to -36% on
    virtual-chassis reapplication of eight modules.
  • Two complete_model_save scenarios issue more statements than the baseline. The comparison
    attributes every added statement to core_objecttype, extras_customfield and
    extras_cachedvalue, which is NetBox's own per-save bookkeeping for the object types and custom
    fields the test database holds, and that population grew between the two runs. The control is the
    no-rule scenario, where this plugin returns before doing anything and its callback issues the same
    7 statements in both runs while the surrounding save costs 17 more. Neither increase is work this
    refactor added.

Evidence is in performance/baselines/ and performance/comparisons/.

Blocked by

Metadata

Metadata

Assignees

No one assigned

    Labels

    ready-for-agentSpecification is complete and ready for implementation

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions