Compare commits

..
Author SHA1 Message Date
codex 20960ae91f fix: remove generated p-rec-update artifacts 2026-08-06 16:41:10 +03:00
codex ca0f49ee5a feat: add p-rec-update plant 3d 2026 slice 2026-08-06 16:40:38 +03:00
16 changed files with 283 additions and 762 deletions
@@ -0,0 +1,13 @@
<Project>
<PropertyGroup>
<Nullable>enable</Nullable>
<ImplicitUsings>enable</ImplicitUsings>
<LangVersion>latest</LangVersion>
<TreatWarningsAsErrors>true</TreatWarningsAsErrors>
<Deterministic>true</Deterministic>
<DebugType>portable</DebugType>
<AutoCAD2026ManagedDir Condition="'$(AutoCAD2026ManagedDir)' == '' and '$(Plant3D2026InstallDir)' != ''">$(Plant3D2026InstallDir)</AutoCAD2026ManagedDir>
<Plant3D2026ManagedDir Condition="'$(Plant3D2026ManagedDir)' == '' and '$(Plant3D2026InstallDir)' != ''">$(Plant3D2026InstallDir)\PLNT3D</Plant3D2026ManagedDir>
<Plant3D2026InstallDir Condition="'$(Plant3D2026InstallDir)' == '' and '$(AutoCAD2026ManagedDir)' != ''">$(AutoCAD2026ManagedDir)</Plant3D2026InstallDir>
</PropertyGroup>
</Project>
@@ -0,0 +1,30 @@
Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio Version 17
VisualStudioVersion = 17.0.31903.59
MinimumVisualStudioVersion = 10.0.40219.1
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "PRecUpdate.Core", "src\PRecUpdate.Core\PRecUpdate.Core.csproj", "{20000000-0000-0000-0000-000000000001}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "PRecUpdate.Plant3D2026", "src\PRecUpdate.Plant3D2026\PRecUpdate.Plant3D2026.csproj", "{20000000-0000-0000-0000-000000000002}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "PRecUpdate.Core.Tests", "tests\PRecUpdate.Core.Tests\PRecUpdate.Core.Tests.csproj", "{20000000-0000-0000-0000-000000000003}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
Release|Any CPU = Release|Any CPU
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
{20000000-0000-0000-0000-000000000001}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{20000000-0000-0000-0000-000000000001}.Debug|Any CPU.Build.0 = Debug|Any CPU
{20000000-0000-0000-0000-000000000001}.Release|Any CPU.ActiveCfg = Release|Any CPU
{20000000-0000-0000-0000-000000000001}.Release|Any CPU.Build.0 = Release|Any CPU
{20000000-0000-0000-0000-000000000002}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{20000000-0000-0000-0000-000000000002}.Debug|Any CPU.Build.0 = Debug|Any CPU
{20000000-0000-0000-0000-000000000002}.Release|Any CPU.ActiveCfg = Release|Any CPU
{20000000-0000-0000-0000-000000000002}.Release|Any CPU.Build.0 = Release|Any CPU
{20000000-0000-0000-0000-000000000003}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{20000000-0000-0000-0000-000000000003}.Debug|Any CPU.Build.0 = Debug|Any CPU
{20000000-0000-0000-0000-000000000003}.Release|Any CPU.ActiveCfg = Release|Any CPU
{20000000-0000-0000-0000-000000000003}.Release|Any CPU.Build.0 = Release|Any CPU
EndGlobalSection
EndGlobal
@@ -0,0 +1,27 @@
# P_Rec_Update capability contract
Selected legacy provenance is `\\phpsrv03\NBIM\code\CS\P_Rec_Update\P_Rec_Update\P_Rec_Update.csproj`
(SHA-256 `1945B572CEE3A308320C164549D38C95C4ED40183347CE341ACD481ED3895BFD`). It is the
expanded successor to the 2023 `_v2.1` line: it exposes `P-R-UPD`, initializes an
Update ribbon panel, and presents four selectable operations in `Main_Form`.
| Source-backed operation | Legacy effects | 2026 status |
|---|---|---|
| Project NKR | reads project XML and `Settings_NKR.xml`; updates NKR-related project data | DryRun plan and preconditions implemented; Apply blocked |
| Flanges | reads Piping DataLinks and geometry; may update support/flange-related data | DryRun plan and preconditions implemented; Apply blocked |
| Fasteners | reads EngineeringItems and may update ItemCode values | DryRun plan and preconditions implemented; Apply blocked |
| Project Spec | reads spec/project database and may update `LinearWeight` | DryRun plan and preconditions implemented; Apply blocked |
The 2026 entry assembly preserves `P-R-UPD` and adds `P-R-UPD-STATUS` for a
non-mutating controlled registration check. It is deterministic and refuses an
Apply-capable plan without an explicit controlled-fixture permit.
## Exact dependency blocker for domain Apply
The legacy code directly binds Plant 2019 DataLinks/SQLite schemas, the external
`GetComponentGeometryDescription.dll`, package-local `Settings_Flanges.xml` /
`Settings_NKR.xml`, and a hard-coded legacy template path. No controlled Plant 2026
fixture containing the required Piping rows, EngineeringItems/spec records and
expected post-state has been supplied. Therefore domain mutation is intentionally
not attempted. This is `EXACT_DEPENDENCY_BLOCKER`, not a claim of completed Apply
parity. Assembly load and command registration remain independently verifiable.
@@ -0,0 +1,3 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup><TargetFramework>net8.0</TargetFramework></PropertyGroup>
</Project>
@@ -0,0 +1,63 @@
namespace PRecUpdate.Core;
public enum UpdateOperation
{
ProjectNkr,
Flanges,
Fasteners,
ProjectSpec
}
public enum UpdateExecutionMode
{
DryRun,
Apply
}
public sealed record UpdateRequest(
bool HasActiveDocument,
bool HasPlantProject,
bool HasPipingProjectPart,
IReadOnlySet<UpdateOperation> SelectedOperations,
UpdateExecutionMode Mode,
bool ControlledFixturePermit);
public sealed record UpdatePlan(
bool Accepted,
IReadOnlyList<UpdateOperation> Operations,
IReadOnlyList<string> Diagnostics,
bool MayWriteDrawing,
bool MayWriteProjectData);
/// <summary>
/// Source-backed planner for the four operations exposed by legacy P_Rec_Update.
/// It intentionally contains no Autodesk calls or file writes, which makes the
/// safety decision deterministic before a Plant transaction can be opened.
/// </summary>
public sealed class UpdatePlanBuilder
{
private static readonly UpdateOperation[] CanonicalOrder =
[
UpdateOperation.ProjectNkr,
UpdateOperation.Flanges,
UpdateOperation.Fasteners,
UpdateOperation.ProjectSpec
];
public UpdatePlan Build(UpdateRequest request)
{
ArgumentNullException.ThrowIfNull(request);
var diagnostics = new List<string>();
if (!request.HasActiveDocument) diagnostics.Add("ACTIVE_DOCUMENT_REQUIRED");
if (!request.HasPlantProject) diagnostics.Add("PLANT_PROJECT_REQUIRED");
if (!request.HasPipingProjectPart) diagnostics.Add("PIPING_PROJECT_PART_REQUIRED");
if (request.SelectedOperations.Count == 0) diagnostics.Add("UPDATE_OPERATION_REQUIRED");
if (request.Mode == UpdateExecutionMode.Apply && !request.ControlledFixturePermit)
diagnostics.Add("CONTROLLED_FIXTURE_PERMIT_REQUIRED");
var ordered = CanonicalOrder.Where(request.SelectedOperations.Contains).ToArray();
var accepted = diagnostics.Count == 0;
var apply = accepted && request.Mode == UpdateExecutionMode.Apply;
return new UpdatePlan(accepted, ordered, diagnostics, apply, apply);
}
}
@@ -0,0 +1,3 @@
using Autodesk.AutoCAD.Runtime;
[assembly: CommandClass(typeof(PRecUpdate.Plant3D2026.EntryPoint))]
@@ -0,0 +1,49 @@
using Autodesk.AutoCAD.ApplicationServices;
using Autodesk.AutoCAD.Runtime;
using PRecUpdate.Core;
using AcadApplication = Autodesk.AutoCAD.ApplicationServices.Application;
namespace PRecUpdate.Plant3D2026;
public sealed class EntryPoint : IExtensionApplication
{
public void Initialize()
{
RuntimeMarker.Write("AssemblyInitializeStarted");
RuntimeMarker.Write("AssemblyInitializeCompleted");
}
public void Terminate() => RuntimeMarker.Write("AssemblyTerminateCompleted");
// Preserves the legacy command name. Apply remains denied unless a future
// controlled fixture adapter proves the legacy Plant/DataLinks semantics.
[CommandMethod("P-R-UPD", CommandFlags.Session)]
public void UpdateCommand() => ReportPlan("P-R-UPD");
[CommandMethod("P-R-UPD-STATUS", CommandFlags.Session)]
public void StatusCommand() => ReportPlan("P-R-UPD-STATUS");
private static void ReportPlan(string command)
{
var document = AcadApplication.DocumentManager.MdiActiveDocument;
var plan = new UpdatePlanBuilder().Build(new UpdateRequest(
document is not null,
HasPlantProject(),
HasPlantProject(),
new HashSet<UpdateOperation>
{
UpdateOperation.ProjectNkr, UpdateOperation.Flanges,
UpdateOperation.Fasteners, UpdateOperation.ProjectSpec
},
UpdateExecutionMode.DryRun,
ControlledFixturePermit: false));
document?.Editor.WriteMessage($"\nP_Rec_Update {command}: {(plan.Accepted ? "DryRun planned; no project data changed." : string.Join(", ", plan.Diagnostics))}");
RuntimeMarker.Write(plan.Accepted ? "CommandRegistrationVerified" : "CommandPreflightRejected");
}
private static bool HasPlantProject()
{
try { return Autodesk.ProcessPower.PlantInstance.PlantApplication.CurrentProject is not null; }
catch { return false; }
}
}
@@ -0,0 +1,13 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>net8.0-windows</TargetFramework><PlatformTarget>x64</PlatformTarget>
<AssemblyName>PRecUpdate.Plant3D2026</AssemblyName>
</PropertyGroup>
<ItemGroup><ProjectReference Include="..\PRecUpdate.Core\PRecUpdate.Core.csproj" /></ItemGroup>
<ItemGroup Condition="Exists('$(AutoCAD2026ManagedDir)')">
<Reference Include="AcMgd"><HintPath>$(AutoCAD2026ManagedDir)\AcMgd.dll</HintPath><Private>false</Private><CopyLocal>false</CopyLocal></Reference>
<Reference Include="AcDbMgd"><HintPath>$(AutoCAD2026ManagedDir)\AcDbMgd.dll</HintPath><Private>false</Private><CopyLocal>false</CopyLocal></Reference>
<Reference Include="AcCoreMgd"><HintPath>$(AutoCAD2026ManagedDir)\AcCoreMgd.dll</HintPath><Private>false</Private><CopyLocal>false</CopyLocal></Reference>
<Reference Include="PnPProjectManagerMgd" Condition="Exists('$(Plant3D2026ManagedDir)\PnPProjectManagerMgd.dll')"><HintPath>$(Plant3D2026ManagedDir)\PnPProjectManagerMgd.dll</HintPath><Private>false</Private><CopyLocal>false</CopyLocal></Reference>
</ItemGroup>
</Project>
@@ -0,0 +1,27 @@
using System.Security.Cryptography;
using System.Text;
namespace PRecUpdate.Plant3D2026;
internal static class RuntimeMarker
{
internal static void Write(string state)
{
var root = Environment.GetEnvironmentVariable("P_REC_UPDATE_MARKER_ROOT");
if (string.IsNullOrWhiteSpace(root)) return;
try
{
Directory.CreateDirectory(root);
var payload = $"{DateTimeOffset.UtcNow:O}|{state}|{typeof(EntryPoint).Assembly.GetName().Name}";
File.WriteAllText(Path.Combine(root, state + ".marker"), payload, new UTF8Encoding(false));
}
catch { /* Evidence cannot make Plant initialization fail. */ }
}
internal static string AssemblySha256()
{
var location = typeof(EntryPoint).Assembly.Location;
using var stream = File.OpenRead(location);
return Convert.ToHexString(SHA256.HashData(stream));
}
}
@@ -0,0 +1,6 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup><TargetFramework>net8.0</TargetFramework><IsPackable>false</IsPackable><IsTestProject>true</IsTestProject></PropertyGroup>
<ItemGroup><ProjectReference Include="..\..\src\PRecUpdate.Core\PRecUpdate.Core.csproj" /></ItemGroup>
<ItemGroup><PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.8.0" /><PackageReference Include="xunit" Version="2.5.3" /><PackageReference Include="xunit.runner.visualstudio" Version="2.5.3" /></ItemGroup>
<ItemGroup><Using Include="Xunit" /></ItemGroup>
</Project>
@@ -0,0 +1,49 @@
using PRecUpdate.Core;
namespace PRecUpdate.Core.Tests;
public sealed class UpdatePlanBuilderTests
{
private readonly UpdatePlanBuilder builder = new();
[Fact]
public void DryRun_orders_selected_operations_without_writes()
{
var plan = builder.Build(new UpdateRequest(true, true, true,
new HashSet<UpdateOperation> { UpdateOperation.Fasteners, UpdateOperation.ProjectNkr }, UpdateExecutionMode.DryRun, false));
Assert.True(plan.Accepted);
Assert.Equal(new[] { UpdateOperation.ProjectNkr, UpdateOperation.Fasteners }, plan.Operations);
Assert.False(plan.MayWriteDrawing);
Assert.False(plan.MayWriteProjectData);
}
[Fact]
public void Rejects_missing_project_and_empty_selection()
{
var plan = builder.Build(new UpdateRequest(false, false, false, new HashSet<UpdateOperation>(), UpdateExecutionMode.DryRun, false));
Assert.False(plan.Accepted);
Assert.Contains("ACTIVE_DOCUMENT_REQUIRED", plan.Diagnostics);
Assert.Contains("PLANT_PROJECT_REQUIRED", plan.Diagnostics);
Assert.Contains("PIPING_PROJECT_PART_REQUIRED", plan.Diagnostics);
Assert.Contains("UPDATE_OPERATION_REQUIRED", plan.Diagnostics);
}
[Fact]
public void Apply_requires_explicit_controlled_fixture_permit()
{
var plan = builder.Build(new UpdateRequest(true, true, true,
new HashSet<UpdateOperation> { UpdateOperation.ProjectSpec }, UpdateExecutionMode.Apply, false));
Assert.False(plan.Accepted);
Assert.Contains("CONTROLLED_FIXTURE_PERMIT_REQUIRED", plan.Diagnostics);
}
[Fact]
public void Permitted_apply_is_the_only_write_capable_plan()
{
var plan = builder.Build(new UpdateRequest(true, true, true,
new HashSet<UpdateOperation> { UpdateOperation.ProjectSpec }, UpdateExecutionMode.Apply, true));
Assert.True(plan.Accepted);
Assert.True(plan.MayWriteDrawing);
Assert.True(plan.MayWriteProjectData);
}
}
-35
View File
@@ -1,35 +0,0 @@
# Capability ledger
This directory is the versioned, machine-readable register that prevents active
2019 capabilities from silently disappearing during the Autodesk 2026 migration.
It is product-neutral by schema: Plant 3D, Revit and Navisworks records use the
same required fields, while product adapters remain outside the ledger.
Current coverage is deliberately narrow: active, non-archive `P_Rec_Annot`
Plant 3D command registrations. The generated ledger does not claim to be a
complete inventory of the 2019 ecosystem. Launcher, profiles, palettes,
resources, Revit and Navisworks must be added as independently audited slices.
## Working journal — 2026-08-05
1. This work makes a real 2019 capability visible, owned and decidable rather
than treating the first migrated command as the programme boundary.
2. It closes the risk that active P_Rec_Annot commands disappear unnoticed.
3. The schema is reusable for Revit and Navisworks because it describes a
capability and its evidence, not a Plant API.
4. No Launcher or product domain logic is introduced.
5. The scope statement and source pointer make missing coverage explicit.
6. Equivalence is proven only by the record's verification method and runtime
evidence; `NOT REPORTED` remains explicit.
7. Users gain an accountable migration path for every currently-audited active
P_Rec_Annot command, including the already verified reference vertical.
## Regeneration and validation
```powershell
pwsh migration/tools/Build-CapabilityLedger.ps1
pwsh migration/tools/Test-CapabilityLedger.ps1
```
The builder consumes audited source records only, excludes `_archive`, writes
stable IDs, and retains unknowns instead of manufacturing a target decision.
@@ -1,607 +0,0 @@
{
"schemaVersion": 1,
"scope": "Plant 3D P_Rec_Annot active command slice generated from audited non-archive command registrations. This is a ledger foundation, not a claim of complete ecosystem inventory.",
"source": "migration/audits/p-rec-annot-v1.0.4/evidence/commands.csv",
"capabilities": [
{
"id": "PLANT3D-2019-CMD-BJ",
"sourceProduct": "Autodesk Plant 3D 2019",
"sourceComponent": "PHPAnnotations\\PHPBlockJig.cs",
"userPurpose": "Registered AutoCAD command; command body and workflow require source-specific acceptance.",
"launchMethod": "AutoCAD command: BJ",
"dependencies": [
"Plant 3D drawing",
"P_Rec_Annot legacy module"
],
"resources": [
"Project configuration",
"Drawing and annotation resources"
],
"projectConstraints": "Plant project: verify body; reads drawing: yes; writes drawing: unknown",
"legacyStatus": "ACTIVE_LEGACY",
"targetComponent": "UNASSIGNED",
"owner": "UNASSIGNED",
"migrationStatus": "MIGRATION_PLANNED",
"verificationMethod": "Legacy source audit, contract, deterministic Preview, controlled Apply, idempotency, UNDO and visual acceptance",
"runtimeEvidence": "NOT REPORTED",
"knownDifferences": "NOT ASSESSED",
"decision": "MIGRATION_REQUIRED"
},
{
"id": "PLANT3D-2019-CMD-CAC",
"sourceProduct": "Autodesk Plant 3D 2019",
"sourceComponent": "PHPAnnotations\\PHPAnnotations.cs",
"userPurpose": "Registered AutoCAD command; command body and workflow require source-specific acceptance.",
"launchMethod": "AutoCAD command: CAC",
"dependencies": [
"Plant 3D drawing",
"P_Rec_Annot legacy module"
],
"resources": [
"Project configuration",
"Drawing and annotation resources"
],
"projectConstraints": "Plant project: verify body; reads drawing: yes; writes drawing: unknown",
"legacyStatus": "ACTIVE_LEGACY",
"targetComponent": "UNASSIGNED",
"owner": "UNASSIGNED",
"migrationStatus": "MIGRATION_PLANNED",
"verificationMethod": "Legacy source audit, contract, deterministic Preview, controlled Apply, idempotency, UNDO and visual acceptance",
"runtimeEvidence": "NOT REPORTED",
"knownDifferences": "NOT ASSESSED",
"decision": "MIGRATION_REQUIRED"
},
{
"id": "PLANT3D-2019-CMD-CAC1",
"sourceProduct": "Autodesk Plant 3D 2019",
"sourceComponent": "P3DNewMa\\NewMaControl.cs",
"userPurpose": "Registered AutoCAD command; command body and workflow require source-specific acceptance.",
"launchMethod": "AutoCAD command: CAC1",
"dependencies": [
"Plant 3D drawing",
"P_Rec_Annot legacy module"
],
"resources": [
"Project configuration",
"Drawing and annotation resources"
],
"projectConstraints": "Plant project: verify body; reads drawing: yes; writes drawing: unknown",
"legacyStatus": "ACTIVE_LEGACY",
"targetComponent": "UNASSIGNED",
"owner": "UNASSIGNED",
"migrationStatus": "MIGRATION_PLANNED",
"verificationMethod": "Legacy source audit, contract, deterministic Preview, controlled Apply, idempotency, UNDO and visual acceptance",
"runtimeEvidence": "NOT REPORTED",
"knownDifferences": "NOT ASSESSED",
"decision": "MIGRATION_REQUIRED"
},
{
"id": "PLANT3D-2019-CMD-CREATEANNOTATIONCOMMAND",
"sourceProduct": "Autodesk Plant 3D 2019",
"sourceComponent": "PHPAnnotations\\PHPAnnotations.cs",
"userPurpose": "Registered AutoCAD command; command body and workflow require source-specific acceptance.",
"launchMethod": "AutoCAD command: CreateAnnotationCommand",
"dependencies": [
"Plant 3D drawing",
"P_Rec_Annot legacy module"
],
"resources": [
"Project configuration",
"Drawing and annotation resources"
],
"projectConstraints": "Plant project: verify body; reads drawing: yes; writes drawing: unknown",
"legacyStatus": "ACTIVE_LEGACY",
"targetComponent": "UNASSIGNED",
"owner": "UNASSIGNED",
"migrationStatus": "MIGRATION_PLANNED",
"verificationMethod": "Legacy source audit, contract, deterministic Preview, controlled Apply, idempotency, UNDO and visual acceptance",
"runtimeEvidence": "NOT REPORTED",
"knownDifferences": "NOT ASSESSED",
"decision": "MIGRATION_REQUIRED"
},
{
"id": "PLANT3D-2019-CMD-MTO-MA",
"sourceProduct": "Autodesk Plant 3D 2019",
"sourceComponent": "P3DNewMa\\Commands.cs",
"userPurpose": "Registered AutoCAD command; command body and workflow require source-specific acceptance.",
"launchMethod": "AutoCAD command: mto-ma",
"dependencies": [
"Plant 3D drawing",
"P_Rec_Annot legacy module"
],
"resources": [
"Project configuration",
"Drawing and annotation resources"
],
"projectConstraints": "Plant project: verify body; reads drawing: yes; writes drawing: unknown",
"legacyStatus": "ACTIVE_LEGACY",
"targetComponent": "UNASSIGNED",
"owner": "UNASSIGNED",
"migrationStatus": "MIGRATION_PLANNED",
"verificationMethod": "Legacy source audit, contract, deterministic Preview, controlled Apply, idempotency, UNDO and visual acceptance",
"runtimeEvidence": "NOT REPORTED",
"knownDifferences": "NOT ASSESSED",
"decision": "MIGRATION_REQUIRED"
},
{
"id": "PLANT3D-2019-CMD-MTO-MA1",
"sourceProduct": "Autodesk Plant 3D 2019",
"sourceComponent": "P3DNewMa\\NewMaControl.cs",
"userPurpose": "Registered AutoCAD command; command body and workflow require source-specific acceptance.",
"launchMethod": "AutoCAD command: mto-ma1",
"dependencies": [
"Plant 3D drawing",
"P_Rec_Annot legacy module"
],
"resources": [
"Project configuration",
"Drawing and annotation resources"
],
"projectConstraints": "Plant project: verify body; reads drawing: yes; writes drawing: unknown",
"legacyStatus": "ACTIVE_LEGACY",
"targetComponent": "UNASSIGNED",
"owner": "UNASSIGNED",
"migrationStatus": "MIGRATION_PLANNED",
"verificationMethod": "Legacy source audit, contract, deterministic Preview, controlled Apply, idempotency, UNDO and visual acceptance",
"runtimeEvidence": "NOT REPORTED",
"knownDifferences": "NOT ASSESSED",
"decision": "MIGRATION_REQUIRED"
},
{
"id": "PLANT3D-2019-CMD-PXP-AAV",
"sourceProduct": "Autodesk Plant 3D 2019",
"sourceComponent": "AutoAnnotateView\\Commands.cs",
"userPurpose": "Registered AutoCAD command; command body and workflow require source-specific acceptance.",
"launchMethod": "AutoCAD command: PXP-AAV",
"dependencies": [
"Plant 3D drawing",
"P_Rec_Annot legacy module"
],
"resources": [
"Project configuration",
"Drawing and annotation resources"
],
"projectConstraints": "Plant project: verify body; reads drawing: yes; writes drawing: unknown",
"legacyStatus": "ACTIVE_LEGACY",
"targetComponent": "PRecAnnot.Plant3D2026",
"owner": "Plant annotation domain owner",
"migrationStatus": "RUNTIME_VERIFIED",
"verificationMethod": "Controlled Plant 3D 2026 Preview/Apply/repeated Apply/UNDO runtime acceptance",
"runtimeEvidence": "Accepted runtime session 7402fee6290b44438642f9204e8bdb6c; automation journal 0cf74ff1c90d4c69a10417904638c7b6",
"knownDifferences": "2026 implementation uses local immutable package staging and managed entry assembly; legacy loading mechanics are not retained.",
"decision": "MIGRATED_RUNTIME_VERIFIED"
},
{
"id": "PLANT3D-2019-CMD-PXP-AC",
"sourceProduct": "Autodesk Plant 3D 2019",
"sourceComponent": "SwapAttributesMenuItem\\Commands.cs",
"userPurpose": "Registered AutoCAD command; command body and workflow require source-specific acceptance.",
"launchMethod": "AutoCAD command: PXP-AC",
"dependencies": [
"Plant 3D drawing",
"P_Rec_Annot legacy module"
],
"resources": [
"Project configuration",
"Drawing and annotation resources"
],
"projectConstraints": "Plant project: verify body; reads drawing: yes; writes drawing: unknown",
"legacyStatus": "ACTIVE_LEGACY",
"targetComponent": "UNASSIGNED",
"owner": "UNASSIGNED",
"migrationStatus": "MIGRATION_PLANNED",
"verificationMethod": "Legacy source audit, contract, deterministic Preview, controlled Apply, idempotency, UNDO and visual acceptance",
"runtimeEvidence": "NOT REPORTED",
"knownDifferences": "NOT ASSESSED",
"decision": "MIGRATION_REQUIRED"
},
{
"id": "PLANT3D-2019-CMD-PXP-AE",
"sourceProduct": "Autodesk Plant 3D 2019",
"sourceComponent": "AutoElevation\\Commands.cs",
"userPurpose": "Registered AutoCAD command; command body and workflow require source-specific acceptance.",
"launchMethod": "AutoCAD command: PXP-AE",
"dependencies": [
"Plant 3D drawing",
"P_Rec_Annot legacy module"
],
"resources": [
"Project configuration",
"Drawing and annotation resources"
],
"projectConstraints": "Plant project: verify body; reads drawing: yes; writes drawing: unknown",
"legacyStatus": "ACTIVE_LEGACY",
"targetComponent": "UNASSIGNED",
"owner": "UNASSIGNED",
"migrationStatus": "MIGRATION_PLANNED",
"verificationMethod": "Legacy source audit, contract, deterministic Preview, controlled Apply, idempotency, UNDO and visual acceptance",
"runtimeEvidence": "NOT REPORTED",
"knownDifferences": "NOT ASSESSED",
"decision": "MIGRATION_REQUIRED"
},
{
"id": "PLANT3D-2019-CMD-PXP-ALC",
"sourceProduct": "Autodesk Plant 3D 2019",
"sourceComponent": "AutoLinenumberConnections\\Commands.cs",
"userPurpose": "Registered AutoCAD command; command body and workflow require source-specific acceptance.",
"launchMethod": "AutoCAD command: PXP-ALC",
"dependencies": [
"Plant 3D drawing",
"P_Rec_Annot legacy module"
],
"resources": [
"Project configuration",
"Drawing and annotation resources"
],
"projectConstraints": "Plant project: verify body; reads drawing: yes; writes drawing: unknown",
"legacyStatus": "ACTIVE_LEGACY",
"targetComponent": "UNASSIGNED",
"owner": "UNASSIGNED",
"migrationStatus": "MIGRATION_PLANNED",
"verificationMethod": "Legacy source audit, contract, deterministic Preview, controlled Apply, idempotency, UNDO and visual acceptance",
"runtimeEvidence": "NOT REPORTED",
"knownDifferences": "NOT ASSESSED",
"decision": "MIGRATION_REQUIRED"
},
{
"id": "PLANT3D-2019-CMD-PXP-COV",
"sourceProduct": "Autodesk Plant 3D 2019",
"sourceComponent": "CheckOrthoView\\Commands.cs",
"userPurpose": "Registered AutoCAD command; command body and workflow require source-specific acceptance.",
"launchMethod": "AutoCAD command: PXP-COV",
"dependencies": [
"Plant 3D drawing",
"P_Rec_Annot legacy module"
],
"resources": [
"Project configuration",
"Drawing and annotation resources"
],
"projectConstraints": "Plant project: verify body; reads drawing: yes; writes drawing: unknown",
"legacyStatus": "ACTIVE_LEGACY",
"targetComponent": "UNASSIGNED",
"owner": "UNASSIGNED",
"migrationStatus": "MIGRATION_PLANNED",
"verificationMethod": "Legacy source audit, contract, deterministic Preview, controlled Apply, idempotency, UNDO and visual acceptance",
"runtimeEvidence": "NOT REPORTED",
"knownDifferences": "NOT ASSESSED",
"decision": "MIGRATION_REQUIRED"
},
{
"id": "PLANT3D-2019-CMD-PXP-DJ",
"sourceProduct": "Autodesk Plant 3D 2019",
"sourceComponent": "OrthoAutoAnnotate\\Commands.cs",
"userPurpose": "Registered AutoCAD command; command body and workflow require source-specific acceptance.",
"launchMethod": "AutoCAD command: PXP-DJ",
"dependencies": [
"Plant 3D drawing",
"P_Rec_Annot legacy module"
],
"resources": [
"Project configuration",
"Drawing and annotation resources"
],
"projectConstraints": "Plant project: verify body; reads drawing: yes; writes drawing: unknown",
"legacyStatus": "ACTIVE_LEGACY",
"targetComponent": "UNASSIGNED",
"owner": "UNASSIGNED",
"migrationStatus": "MIGRATION_PLANNED",
"verificationMethod": "Legacy source audit, contract, deterministic Preview, controlled Apply, idempotency, UNDO and visual acceptance",
"runtimeEvidence": "NOT REPORTED",
"knownDifferences": "NOT ASSESSED",
"decision": "MIGRATION_REQUIRED"
},
{
"id": "PLANT3D-2019-CMD-PXP-ELN",
"sourceProduct": "Autodesk Plant 3D 2019",
"sourceComponent": "AnnotateLineNumbers\\Commands.cs",
"userPurpose": "Registered AutoCAD command; command body and workflow require source-specific acceptance.",
"launchMethod": "AutoCAD command: PXP-ELN",
"dependencies": [
"Plant 3D drawing",
"P_Rec_Annot legacy module"
],
"resources": [
"Project configuration",
"Drawing and annotation resources"
],
"projectConstraints": "Plant project: verify body; reads drawing: yes; writes drawing: unknown",
"legacyStatus": "ACTIVE_LEGACY",
"targetComponent": "UNASSIGNED",
"owner": "UNASSIGNED",
"migrationStatus": "MIGRATION_PLANNED",
"verificationMethod": "Legacy source audit, contract, deterministic Preview, controlled Apply, idempotency, UNDO and visual acceptance",
"runtimeEvidence": "NOT REPORTED",
"knownDifferences": "NOT ASSESSED",
"decision": "MIGRATION_REQUIRED"
},
{
"id": "PLANT3D-2019-CMD-PXP-ESN",
"sourceProduct": "Autodesk Plant 3D 2019",
"sourceComponent": "AnnotateLineNumbers\\Commands.cs",
"userPurpose": "Registered AutoCAD command; command body and workflow require source-specific acceptance.",
"launchMethod": "AutoCAD command: PXP-ESN",
"dependencies": [
"Plant 3D drawing",
"P_Rec_Annot legacy module"
],
"resources": [
"Project configuration",
"Drawing and annotation resources"
],
"projectConstraints": "Plant project: verify body; reads drawing: yes; writes drawing: unknown",
"legacyStatus": "ACTIVE_LEGACY",
"targetComponent": "UNASSIGNED",
"owner": "UNASSIGNED",
"migrationStatus": "MIGRATION_PLANNED",
"verificationMethod": "Legacy source audit, contract, deterministic Preview, controlled Apply, idempotency, UNDO and visual acceptance",
"runtimeEvidence": "NOT REPORTED",
"knownDifferences": "NOT ASSESSED",
"decision": "MIGRATION_REQUIRED"
},
{
"id": "PLANT3D-2019-CMD-PXP-GIT",
"sourceProduct": "Autodesk Plant 3D 2019",
"sourceComponent": "ExtentsIntersect\\Commands.cs",
"userPurpose": "Registered AutoCAD command; command body and workflow require source-specific acceptance.",
"launchMethod": "AutoCAD command: PXP-GIT",
"dependencies": [
"Plant 3D drawing",
"P_Rec_Annot legacy module"
],
"resources": [
"Project configuration",
"Drawing and annotation resources"
],
"projectConstraints": "Plant project: verify body; reads drawing: yes; writes drawing: unknown",
"legacyStatus": "ACTIVE_LEGACY",
"targetComponent": "UNASSIGNED",
"owner": "UNASSIGNED",
"migrationStatus": "MIGRATION_PLANNED",
"verificationMethod": "Legacy source audit, contract, deterministic Preview, controlled Apply, idempotency, UNDO and visual acceptance",
"runtimeEvidence": "NOT REPORTED",
"knownDifferences": "NOT ASSESSED",
"decision": "MIGRATION_REQUIRED"
},
{
"id": "PLANT3D-2019-CMD-PXP-IE",
"sourceProduct": "Autodesk Plant 3D 2019",
"sourceComponent": "InsertElevation\\Commands.cs",
"userPurpose": "Registered AutoCAD command; command body and workflow require source-specific acceptance.",
"launchMethod": "AutoCAD command: PXP-IE",
"dependencies": [
"Plant 3D drawing",
"P_Rec_Annot legacy module"
],
"resources": [
"Project configuration",
"Drawing and annotation resources"
],
"projectConstraints": "Plant project: verify body; reads drawing: yes; writes drawing: unknown",
"legacyStatus": "ACTIVE_LEGACY",
"targetComponent": "UNASSIGNED",
"owner": "UNASSIGNED",
"migrationStatus": "MIGRATION_PLANNED",
"verificationMethod": "Legacy source audit, contract, deterministic Preview, controlled Apply, idempotency, UNDO and visual acceptance",
"runtimeEvidence": "NOT REPORTED",
"knownDifferences": "NOT ASSESSED",
"decision": "MIGRATION_REQUIRED"
},
{
"id": "PLANT3D-2019-CMD-PXP-IOD",
"sourceProduct": "Autodesk Plant 3D 2019",
"sourceComponent": "UpdateOrthoDrawings\\Commands.cs",
"userPurpose": "Registered AutoCAD command; command body and workflow require source-specific acceptance.",
"launchMethod": "AutoCAD command: PXP-IOD",
"dependencies": [
"Plant 3D drawing",
"P_Rec_Annot legacy module"
],
"resources": [
"Project configuration",
"Drawing and annotation resources"
],
"projectConstraints": "Plant project: verify body; reads drawing: yes; writes drawing: unknown",
"legacyStatus": "ACTIVE_LEGACY",
"targetComponent": "UNASSIGNED",
"owner": "UNASSIGNED",
"migrationStatus": "MIGRATION_PLANNED",
"verificationMethod": "Legacy source audit, contract, deterministic Preview, controlled Apply, idempotency, UNDO and visual acceptance",
"runtimeEvidence": "NOT REPORTED",
"knownDifferences": "NOT ASSESSED",
"decision": "MIGRATION_REQUIRED"
},
{
"id": "PLANT3D-2019-CMD-PXP-LN",
"sourceProduct": "Autodesk Plant 3D 2019",
"sourceComponent": "AnnotateLineNumbers\\Commands.cs",
"userPurpose": "Registered AutoCAD command; command body and workflow require source-specific acceptance.",
"launchMethod": "AutoCAD command: PXP-LN",
"dependencies": [
"Plant 3D drawing",
"P_Rec_Annot legacy module"
],
"resources": [
"Project configuration",
"Drawing and annotation resources"
],
"projectConstraints": "Plant project: verify body; reads drawing: yes; writes drawing: unknown",
"legacyStatus": "ACTIVE_LEGACY",
"targetComponent": "UNASSIGNED",
"owner": "UNASSIGNED",
"migrationStatus": "MIGRATION_PLANNED",
"verificationMethod": "Legacy source audit, contract, deterministic Preview, controlled Apply, idempotency, UNDO and visual acceptance",
"runtimeEvidence": "NOT REPORTED",
"knownDifferences": "NOT ASSESSED",
"decision": "MIGRATION_REQUIRED"
},
{
"id": "PLANT3D-2019-CMD-PXP-MA",
"sourceProduct": "Autodesk Plant 3D 2019",
"sourceComponent": "PHPAnnotations\\PHPAnnotations.cs",
"userPurpose": "Registered AutoCAD command; command body and workflow require source-specific acceptance.",
"launchMethod": "AutoCAD command: PXP-MA",
"dependencies": [
"Plant 3D drawing",
"P_Rec_Annot legacy module"
],
"resources": [
"Project configuration",
"Drawing and annotation resources"
],
"projectConstraints": "Plant project: verify body; reads drawing: yes; writes drawing: unknown",
"legacyStatus": "ACTIVE_LEGACY",
"targetComponent": "UNASSIGNED",
"owner": "UNASSIGNED",
"migrationStatus": "MIGRATION_PLANNED",
"verificationMethod": "Legacy source audit, contract, deterministic Preview, controlled Apply, idempotency, UNDO and visual acceptance",
"runtimeEvidence": "NOT REPORTED",
"knownDifferences": "NOT ASSESSED",
"decision": "MIGRATION_REQUIRED"
},
{
"id": "PLANT3D-2019-CMD-PXP-OA",
"sourceProduct": "Autodesk Plant 3D 2019",
"sourceComponent": "OrthoAutoAnnotate\\Commands.cs",
"userPurpose": "Registered AutoCAD command; command body and workflow require source-specific acceptance.",
"launchMethod": "AutoCAD command: PXP-OA",
"dependencies": [
"Plant 3D drawing",
"P_Rec_Annot legacy module"
],
"resources": [
"Project configuration",
"Drawing and annotation resources"
],
"projectConstraints": "Plant project: verify body; reads drawing: yes; writes drawing: unknown",
"legacyStatus": "ACTIVE_LEGACY",
"targetComponent": "PRecAnnot.Plant3D2026",
"owner": "Plant annotation domain owner",
"migrationStatus": "RUNTIME_VERIFIED",
"verificationMethod": "Controlled Plant 3D 2026 Preview/Apply/repeated Apply/UNDO runtime acceptance",
"runtimeEvidence": "Accepted runtime session 7402fee6290b44438642f9204e8bdb6c; automation journal 0cf74ff1c90d4c69a10417904638c7b6",
"knownDifferences": "2026 implementation uses local immutable package staging and managed entry assembly; legacy loading mechanics are not retained.",
"decision": "MIGRATED_RUNTIME_VERIFIED"
},
{
"id": "PLANT3D-2019-CMD-PXP-OSI",
"sourceProduct": "Autodesk Plant 3D 2019",
"sourceComponent": "OrthoAutoAnnotate\\Commands.cs",
"userPurpose": "Registered AutoCAD command; command body and workflow require source-specific acceptance.",
"launchMethod": "AutoCAD command: PXP-OSI",
"dependencies": [
"Plant 3D drawing",
"P_Rec_Annot legacy module"
],
"resources": [
"Project configuration",
"Drawing and annotation resources"
],
"projectConstraints": "Plant project: verify body; reads drawing: yes; writes drawing: unknown",
"legacyStatus": "ACTIVE_LEGACY",
"targetComponent": "UNASSIGNED",
"owner": "UNASSIGNED",
"migrationStatus": "MIGRATION_PLANNED",
"verificationMethod": "Legacy source audit, contract, deterministic Preview, controlled Apply, idempotency, UNDO and visual acceptance",
"runtimeEvidence": "NOT REPORTED",
"knownDifferences": "NOT ASSESSED",
"decision": "MIGRATION_REQUIRED"
},
{
"id": "PLANT3D-2019-CMD-PXP-RA",
"sourceProduct": "Autodesk Plant 3D 2019",
"sourceComponent": "OrthoAutoAnnotate\\Commands.cs",
"userPurpose": "Registered AutoCAD command; command body and workflow require source-specific acceptance.",
"launchMethod": "AutoCAD command: PXP-RA",
"dependencies": [
"Plant 3D drawing",
"P_Rec_Annot legacy module"
],
"resources": [
"Project configuration",
"Drawing and annotation resources"
],
"projectConstraints": "Plant project: verify body; reads drawing: yes; writes drawing: unknown",
"legacyStatus": "ACTIVE_LEGACY",
"targetComponent": "UNASSIGNED",
"owner": "UNASSIGNED",
"migrationStatus": "MIGRATION_PLANNED",
"verificationMethod": "Legacy source audit, contract, deterministic Preview, controlled Apply, idempotency, UNDO and visual acceptance",
"runtimeEvidence": "NOT REPORTED",
"knownDifferences": "NOT ASSESSED",
"decision": "MIGRATION_REQUIRED"
},
{
"id": "PLANT3D-2019-CMD-PXP-RMP",
"sourceProduct": "Autodesk Plant 3D 2019",
"sourceComponent": "AnnotateLineNumbers\\Commands.cs",
"userPurpose": "Registered AutoCAD command; command body and workflow require source-specific acceptance.",
"launchMethod": "AutoCAD command: PXP-RMP",
"dependencies": [
"Plant 3D drawing",
"P_Rec_Annot legacy module"
],
"resources": [
"Project configuration",
"Drawing and annotation resources"
],
"projectConstraints": "Plant project: verify body; reads drawing: yes; writes drawing: unknown",
"legacyStatus": "ACTIVE_LEGACY",
"targetComponent": "UNASSIGNED",
"owner": "UNASSIGNED",
"migrationStatus": "MIGRATION_PLANNED",
"verificationMethod": "Legacy source audit, contract, deterministic Preview, controlled Apply, idempotency, UNDO and visual acceptance",
"runtimeEvidence": "NOT REPORTED",
"knownDifferences": "NOT ASSESSED",
"decision": "MIGRATION_REQUIRED"
},
{
"id": "PLANT3D-2019-CMD-PXP-ULN",
"sourceProduct": "Autodesk Plant 3D 2019",
"sourceComponent": "AnnotateLineNumbers\\Commands.cs",
"userPurpose": "Registered AutoCAD command; command body and workflow require source-specific acceptance.",
"launchMethod": "AutoCAD command: PXP-ULN",
"dependencies": [
"Plant 3D drawing",
"P_Rec_Annot legacy module"
],
"resources": [
"Project configuration",
"Drawing and annotation resources"
],
"projectConstraints": "Plant project: verify body; reads drawing: yes; writes drawing: unknown",
"legacyStatus": "ACTIVE_LEGACY",
"targetComponent": "UNASSIGNED",
"owner": "UNASSIGNED",
"migrationStatus": "MIGRATION_PLANNED",
"verificationMethod": "Legacy source audit, contract, deterministic Preview, controlled Apply, idempotency, UNDO and visual acceptance",
"runtimeEvidence": "NOT REPORTED",
"knownDifferences": "NOT ASSESSED",
"decision": "MIGRATION_REQUIRED"
},
{
"id": "PLANT3D-2019-CMD-PXP-UOB",
"sourceProduct": "Autodesk Plant 3D 2019",
"sourceComponent": "UpdateOrthoViewBlocks\\Commands.cs",
"userPurpose": "Registered AutoCAD command; command body and workflow require source-specific acceptance.",
"launchMethod": "AutoCAD command: PXP-UOB",
"dependencies": [
"Plant 3D drawing",
"P_Rec_Annot legacy module"
],
"resources": [
"Project configuration",
"Drawing and annotation resources"
],
"projectConstraints": "Plant project: verify body; reads drawing: yes; writes drawing: unknown",
"legacyStatus": "ACTIVE_LEGACY",
"targetComponent": "UNASSIGNED",
"owner": "UNASSIGNED",
"migrationStatus": "MIGRATION_PLANNED",
"verificationMethod": "Legacy source audit, contract, deterministic Preview, controlled Apply, idempotency, UNDO and visual acceptance",
"runtimeEvidence": "NOT REPORTED",
"knownDifferences": "NOT ASSESSED",
"decision": "MIGRATION_REQUIRED"
}
]
}
-35
View File
@@ -1,35 +0,0 @@
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"title": "Autodesk 2019 to 2026 capability ledger",
"type": "object",
"required": ["schemaVersion", "scope", "capabilities"],
"properties": {
"schemaVersion": { "const": 1 },
"scope": { "type": "string", "minLength": 1 },
"capabilities": {
"type": "array",
"items": {
"type": "object",
"required": ["id", "sourceProduct", "sourceComponent", "userPurpose", "launchMethod", "dependencies", "resources", "projectConstraints", "legacyStatus", "targetComponent", "owner", "migrationStatus", "verificationMethod", "runtimeEvidence", "knownDifferences", "decision"],
"properties": {
"id": { "type": "string", "pattern": "^[A-Z0-9-]+$" },
"sourceProduct": { "type": "string" },
"sourceComponent": { "type": "string" },
"userPurpose": { "type": "string" },
"launchMethod": { "type": "string" },
"dependencies": { "type": "array", "items": { "type": "string" } },
"resources": { "type": "array", "items": { "type": "string" } },
"projectConstraints": { "type": "string" },
"legacyStatus": { "type": "string" },
"targetComponent": { "type": "string" },
"owner": { "type": "string" },
"migrationStatus": { "type": "string" },
"verificationMethod": { "type": "string" },
"runtimeEvidence": { "type": "string" },
"knownDifferences": { "type": "string" },
"decision": { "type": "string" }
}
}
}
}
}
@@ -1,62 +0,0 @@
[CmdletBinding()]
param(
[Parameter(Mandatory = $false)]
[string]$RepositoryRoot,
[Parameter(Mandatory = $false)]
[string]$OutputPath
)
$ErrorActionPreference = 'Stop'
if (-not $RepositoryRoot) { $RepositoryRoot = Split-Path -Parent $PSScriptRoot }
$RepositoryRoot = [IO.Path]::GetFullPath($RepositoryRoot)
$commandsPath = Join-Path $RepositoryRoot 'audits\p-rec-annot-v1.0.4\evidence\commands.csv'
if (-not (Test-Path -LiteralPath $commandsPath -PathType Leaf)) { throw "CAPABILITY_LEDGER_COMMAND_SOURCE_MISSING: $commandsPath" }
if (-not $OutputPath) { $OutputPath = Join-Path $RepositoryRoot 'capability-ledger\plant3d-p-rec-annot-commands.json' }
$OutputPath = [IO.Path]::GetFullPath($OutputPath)
$accepted = @{
'PXP-AAV' = @{ Component = 'PRecAnnot.Plant3D2026'; Evidence = 'Accepted runtime session 7402fee6290b44438642f9204e8bdb6c; automation journal 0cf74ff1c90d4c69a10417904638c7b6'; Decision = 'MIGRATED_RUNTIME_VERIFIED' }
'PXP-OA' = @{ Component = 'PRecAnnot.Plant3D2026'; Evidence = 'Accepted runtime session 7402fee6290b44438642f9204e8bdb6c; automation journal 0cf74ff1c90d4c69a10417904638c7b6'; Decision = 'MIGRATED_RUNTIME_VERIFIED' }
}
$commands = Import-Csv -LiteralPath $commandsPath | Where-Object { $_.File -notmatch '(^|\\)_archive(\\|$)' } |
Group-Object Command | ForEach-Object { $_.Group | Select-Object -First 1 } | Sort-Object Command
$capabilities = foreach ($command in $commands) {
$acceptedRecord = $accepted[$command.Command]
$status = if ($acceptedRecord) { 'RUNTIME_VERIFIED' } else { 'MIGRATION_PLANNED' }
[ordered]@{
id = ('PLANT3D-2019-CMD-' + ($command.Command.ToUpperInvariant() -replace '[^A-Z0-9]+', '-').Trim('-'))
sourceProduct = 'Autodesk Plant 3D 2019'
sourceComponent = $command.File
userPurpose = 'Registered AutoCAD command; command body and workflow require source-specific acceptance.'
launchMethod = ('AutoCAD command: ' + $command.Command)
dependencies = @('Plant 3D drawing', 'P_Rec_Annot legacy module')
resources = @('Project configuration', 'Drawing and annotation resources')
projectConstraints = ('Plant project: ' + $command.PlantProject + '; reads drawing: ' + $command.ReadsDrawing + '; writes drawing: ' + $command.WritesDrawing)
legacyStatus = 'ACTIVE_LEGACY'
targetComponent = if ($acceptedRecord) { $acceptedRecord.Component } else { 'UNASSIGNED' }
owner = if ($acceptedRecord) { 'Plant annotation domain owner' } else { 'UNASSIGNED' }
migrationStatus = $status
verificationMethod = if ($acceptedRecord) { 'Controlled Plant 3D 2026 Preview/Apply/repeated Apply/UNDO runtime acceptance' } else { 'Legacy source audit, contract, deterministic Preview, controlled Apply, idempotency, UNDO and visual acceptance' }
runtimeEvidence = if ($acceptedRecord) { $acceptedRecord.Evidence } else { 'NOT REPORTED' }
knownDifferences = if ($acceptedRecord) { '2026 implementation uses local immutable package staging and managed entry assembly; legacy loading mechanics are not retained.' } else { 'NOT ASSESSED' }
decision = if ($acceptedRecord) { $acceptedRecord.Decision } else { 'MIGRATION_REQUIRED' }
}
}
$ledger = [ordered]@{
schemaVersion = 1
scope = 'Plant 3D P_Rec_Annot active command slice generated from audited non-archive command registrations. This is a ledger foundation, not a claim of complete ecosystem inventory.'
source = 'migration/audits/p-rec-annot-v1.0.4/evidence/commands.csv'
capabilities = @($capabilities)
}
$parent = Split-Path -Parent $OutputPath
New-Item -ItemType Directory -Path $parent -Force | Out-Null
$temporary = Join-Path $parent ((Split-Path -Leaf $OutputPath) + '.tmp')
$json = $ledger | ConvertTo-Json -Depth 8
[IO.File]::WriteAllText($temporary, $json + [Environment]::NewLine, [Text.UTF8Encoding]::new($false))
Move-Item -LiteralPath $temporary -Destination $OutputPath -Force
Write-Output "CAPABILITY_LEDGER_WRITTEN=$OutputPath"
Write-Output "CAPABILITY_COUNT=$($capabilities.Count)"
-23
View File
@@ -1,23 +0,0 @@
[CmdletBinding()]
param(
[Parameter(Mandatory = $false)]
[string]$RepositoryRoot
)
$ErrorActionPreference = 'Stop'
if (-not $RepositoryRoot) { $RepositoryRoot = Split-Path -Parent $PSScriptRoot }
$RepositoryRoot = [IO.Path]::GetFullPath($RepositoryRoot)
$ledgerPath = Join-Path $RepositoryRoot 'capability-ledger\plant3d-p-rec-annot-commands.json'
$sourcePath = Join-Path $RepositoryRoot 'audits\p-rec-annot-v1.0.4\evidence\commands.csv'
& (Join-Path $PSScriptRoot 'Build-CapabilityLedger.ps1') -RepositoryRoot $RepositoryRoot -OutputPath $ledgerPath | Out-Null
$ledger = Get-Content -LiteralPath $ledgerPath -Raw -Encoding utf8 | ConvertFrom-Json
$required = 'id','sourceProduct','sourceComponent','userPurpose','launchMethod','dependencies','resources','projectConstraints','legacyStatus','targetComponent','owner','migrationStatus','verificationMethod','runtimeEvidence','knownDifferences','decision'
$expected = (Import-Csv -LiteralPath $sourcePath | Where-Object { $_.File -notmatch '(^|\\)_archive(\\|$)' } | Select-Object -ExpandProperty Command -Unique).Count
if ($ledger.schemaVersion -ne 1) { throw 'CAPABILITY_LEDGER_SCHEMA_VERSION_INVALID' }
if ($ledger.capabilities.Count -ne $expected) { throw "CAPABILITY_LEDGER_COUNT_MISMATCH: expected $expected, got $($ledger.capabilities.Count)" }
if (($ledger.capabilities.id | Select-Object -Unique).Count -ne $ledger.capabilities.Count) { throw 'CAPABILITY_LEDGER_DUPLICATE_ID' }
foreach ($capability in $ledger.capabilities) { foreach ($field in $required) { if (-not $capability.PSObject.Properties.Name.Contains($field)) { throw "CAPABILITY_LEDGER_REQUIRED_FIELD_MISSING: $($capability.id):$field" } } }
$accepted = @($ledger.capabilities | Where-Object { $_.decision -eq 'MIGRATED_RUNTIME_VERIFIED' })
if ($accepted.Count -ne 2 -or ($accepted.id -notcontains 'PLANT3D-2019-CMD-PXP-AAV') -or ($accepted.id -notcontains 'PLANT3D-2019-CMD-PXP-OA')) { throw 'CAPABILITY_LEDGER_REFERENCE_VERTICAL_MISSING' }
Write-Output "CAPABILITY_LEDGER_VALIDATED=$ledgerPath"
Write-Output "CAPABILITY_COUNT=$($ledger.capabilities.Count)"