Skip to content

Plan Manifest Schema ​

Reopenable projects ​

Save project downloads a separate project format with kind: "azurelocal-surveyor-project", numeric schemaVersion: 1, stateVersion: 11, appVersion, name, savedAt, planningArea and inputs. The optional area tag is storage or workload; legacy files without it default to workload planning. State version 11 (2.9.0) adds the optional hardware.rackAware flag and the four-way-mirror resiliency value; both are additive, so version 10 files open unchanged and schemaVersion stays 1. Importers that read schemaVersion keep working; they should map four-way-mirror and note rackAware.

Open projects in their matching area using Open / Compare. Preview comparisons before restoring. Storage projects exclude workload demand. The existing manifest format below remains supported in Workload Planning. See the planning guide for explicit transfers between areas.

Report manifests ​

The Export JSON button on the Reports page produces a SurveyorPlan JSON file. This file is the primary handoff artifact for Ranger and any downstream automation.

File name ​

azure-local-plan-YYYY-MM-DD.json

Schema versioning ​

The schemaVersion field uses "MAJOR.MINOR" string format.

  • Ranger (and any other consumer) checks only the major version: schemaVersion.split('.')[0] === '1'
  • MAJOR bumps when a field is removed or its type changes incompatibly — consumers must reject the file
  • MINOR bumps when new optional fields are added — consumers may safely ignore unknown fields

The current version is "1.0".

Top-level structure ​

json
{
  "schemaVersion": "1.0",
  "surveyorVersion": "1.4.0",
  "generatedAt": "2026-04-14T12:00:00.000Z",
  "provenance": { ... },
  "inputs": { ... },
  "outputs": { ... }
}
FieldTypeDescription
schemaVersion"1.0"Manifest schema version — check major only
surveyorVersionstringSurveyor app version that generated the file
generatedAtstringISO 8601 UTC timestamp of export
provenanceobjectHow and by whom the plan was created
inputsobjectVerbatim snapshot of all user-entered inputs
outputsobjectFrozen computed results at export time

provenance ​

json
{
  "source": "manual",
  "notes": "Pre-deployment sizing for customer Site A",
  "approvedBy": "engineer@example.com",
  "approvedAt": "2026-04-14T15:30:00.000Z",
  "baselineLabel": "Pre-deployment baseline — Site A"
}
FieldTypeRequiredDescription
source"manual" | "imported" | "url-share"yesHow inputs were created
notesstringnoFree-text annotation
approvedBystringnoApprover name or email — set by Ranger or hand-edit
approvedAtstringnoISO 8601 UTC approval timestamp
baselineLabelstringnoHuman-readable baseline label for Ranger display

For v1.7.0 there is no UI for stamping approval. Set approvedBy, approvedAt, and baselineLabel by editing the JSON directly or via Ranger.

inputs ​

A verbatim copy of all Zustand store slices at export time. All type definitions live in src/engine/types.ts and use kebab-case enum values (e.g. "three-way-mirror", not "Three-Way Mirror").

FieldTypeDescription
hardwareHardwareInputsCluster node, drive, CPU, and RAM config
advancedAdvancedSettingsEfficiency factor, infra volume, overrides
volumesVolumeSpec[]User-defined planned volumes
volumeMode"workload" | "generic"Volume suggestion mode
avdEnabledbooleanWhether AVD scenario is active
avdAvdInputsAVD session host and FSLogix inputs
sofsEnabledbooleanWhether SOFS scenario is active
sofsSofsInputsSOFS guest cluster inputs
mabsEnabledbooleanWhether MABS scenario is active
mabsMabsInputsMABS backup server inputs
aksAksInputsAKS cluster inputs (aks.enabled is the toggle)
virtualMachinesVmScenarioVM workload inputs (virtualMachines.enabled is the toggle)
servicePresetsServicePresetInstance[]Arc-enabled service preset instances
customWorkloadsCustomWorkload[]User-defined custom workload entries

outputs ​

Computed at export time and frozen. Ranger can consume these directly without re-running the engine. Per-scenario fields (avd, sofs, aks, mabs) are only present when the scenario was enabled at export time.

FieldTypeAlways presentDescription
capacityCapacityResultyesRaw pool, usable, reserve, effective usable
computeComputeResultyesvCPU, memory, N+1 failover analysis
volumeSummaryVolumeSummaryResultyesPlanned volumes, utilization
workloadTotalsWorkloadSummaryResultyesAggregate vCPU, memory, storage across all scenarios
healthHealthCheckResultyesVolume and compute health check results
avdAvdResultwhen avdEnabledSession host count, storage breakdown
sofsSofsResultwhen sofsEnabledProfile demand, IOPS, auto-size result
aksAksResultwhen aks.enabledControl plane + worker node totals
mabsMabsResultwhen mabsEnabledBackup volume sizing, internal mirror factor

Ranger integration notes ​

  1. Version check first: reject files where schemaVersion.split('.')[0] !== '1'
  2. Trust outputs: the outputs section is a frozen snapshot — do not re-run the engine; use these values directly
  3. Baseline approval: set provenance.approvedBy, provenance.approvedAt, and provenance.baselineLabel before importing into Ranger as an approved baseline
  4. Enum values: all ResiliencyType, DriveMedia, and similar enum fields use kebab-case — "three-way-mirror" not "Three-Way Mirror"

Round-trip import ​

A plan exported as JSON can be loaded back into Surveyor in a future release. When loaded, provenance.source will be set to "imported" to distinguish it from a freshly-typed plan. This feature is not yet implemented in v1.7.0.

JSON Schemas ​

Machine-readable, versioned schemas ship in this folder and are checked by tests (src/state/schema.test.ts):

Both use JSON Schema 2020-12. The hardware block is strict (unknown keys are rejected) so typos are caught; other blocks allow additional properties. A schema change that rejects a previously valid file requires a new schemaVersion major.

Released under the MIT License.