docs: define Autodesk launcher next architecture

This commit is contained in:
codex
2026-07-31 14:30:19 +03:00
parent 36178374db
commit 1127a8376f
30 changed files with 298 additions and 0 deletions
+7
View File
@@ -0,0 +1,7 @@
# Autodesk Launcher architecture
This section is the single architecture record for the corporate Autodesk launcher, its legacy P_Rec_Annot loading path, and the parallel Launcher Next foundation. Statements are labelled `CONFIRMED`, `HIGH_CONFIDENCE`, `INFERRED`, or `UNKNOWN` and link to the audit evidence map.
The AS-IS flow is a locally synchronized legacy deployment with generated AutoLISP loading. Launcher Next is a .NET 8, one-visible-EXE design that stages signed-by-hash local packages and loads one managed entry assembly. It is a design/foundation only: production configuration, AutoCAD profiles, trusted paths, network roots and deploys were not changed.
See [AS-IS](as-is/system-context.md), [target](target/architecture.md), [ADRs](adr/ADR-001-parallel-rewrite.md), and [evidence map](evidence-map.csv).
@@ -0,0 +1,3 @@
# ADR-001: Parallel rewrite
**Decision:** build Launcher Next beside legacy. **Status:** accepted. **Why:** legacy installer performs destructive synchronization and runtime bootstrap remains partly unknown. **Consequence:** Legacy remains default and rollback is immediate.
@@ -0,0 +1,3 @@
# ADR-002: Single managed entrypoint
**Decision:** NETLOAD only `PRecAnnot.Plant3D2026.dll`. **Status:** accepted. **Why:** removes orchestration of 20 independent loads and centralizes commands/Ribbon. **Consequence:** internal dependencies must be packaged as CLR dependencies, not NETLOAD targets.
@@ -0,0 +1,3 @@
# ADR-003: Local versioned cache
**Decision:** activate immutable local versions through a pointer. **Status:** accepted. **Why:** avoids in-use DLL replacement and supports offline starts. **Consequence:** retain current/previous versions and clean staging separately.
@@ -0,0 +1,3 @@
# ADR-004: Atomic update
**Decision:** stage, validate, rename then switch pointer. **Status:** accepted. **Why:** prevents partial activation. **Consequence:** locked/cancelled updates retain current version and report diagnostics.
@@ -0,0 +1,3 @@
# ADR-005: Legacy fallback
**Decision:** mode flag defaults to Legacy; NextPilot requires explicit selection. **Status:** accepted. **Why:** startup evidence is incomplete and production configuration must not be changed implicitly. **Consequence:** launcher must not start AutoCAD twice after a Next failure.
@@ -0,0 +1,3 @@
# ADR-006: No direct UNC assembly loading
**Decision:** validate and load only local package copies. **Status:** accepted. **Why:** network availability and mid-session replacement are unreliable; direct UNC loading is not proven as a required legacy contract. **Consequence:** a local cache is mandatory for Next packages.
@@ -0,0 +1,10 @@
# AS-IS component model
`All_Serv_InstallUpdater` updates and launches `All_Serv_Install`; `All_Serv_Install` is the confirmed visible installer/synchronizer. `All_Serv_Load` is an independent historical/alternate executable. `P_Serv_Starter` is a separate bootstrap repository selected through installer configuration, not a project reference.
```text
Updater (optional) -> Visible installer -> local Applications cache -> P_Serv_Starter
P_Serv_Starter -> generated LISP + local batch -> Plant 3D -> OrthoLoader -> module settings -> 20 DLL
```
Network access is established for installation/update. Legacy module loading is intended from local Applications, not proven to be direct UNC loading. The installed state was absent on the audited workstation.
@@ -0,0 +1,11 @@
# AS-IS configuration contracts
| Contract | Format / owner | Consumer | Validation / fallback | Versioning / machine behavior | Confidence |
|---|---|---|---|---|---|
| Installer Settings.xml | XML, All_Serv_Install | installer and P_Serv_Starter | parse errors stop bootstrap; detailed fallback unknown | hard-coded server/local paths and machine rules | CONFIRMED |
| Plugin catalog/install | XML fields | generated LISP | only existing local catalog emits load | order follows configuration | CONFIRMED |
| OrthoLoader Settings.xml | XML, P_Rec deployment | OrthoLoader | per-module behavior partially known | ordered 20 module list | CONFIRMED |
| AutoCAD executable/version | batch/source/config | local batch | exact current version unknown | machine-specific | HIGH_CONFIDENCE |
| Profile/autoload | workstation AutoCAD config | AutoCAD | unknown | machine-specific | UNKNOWN |
| Ribbon resources | deployed module resources/network possible | legacy modules | absence behavior unknown | unknown | UNKNOWN |
| Offline mode | implicit local files | launcher/user | no proven policy | network dependent at sync | UNKNOWN |
@@ -0,0 +1,12 @@
# AS-IS failure modes
| Failure | Detection | Current handling | User-visible result | Data risk | Recovery | Target handling |
|---|---|---|---|---|---|---|
| Network unavailable | filesystem/XML operation | incomplete evidence | install/update may fail | stale files | unknown | use valid local cache |
| Partial copy / version skew | no proven transaction | copy/delete code | missing module | load failure | reinstall | staging + atomic pointer |
| Missing DLL / corrupted Settings.xml | generated load or loader parse | warnings/behavior varies | command/ribbon missing | none to DWG at load | manual repair | manifest validation |
| One of 20 modules incompatible | ._netload result | sequential continuation unknown | partial functionality | inconsistent UI | manual repair | one entry package compatibility check |
| Repeated NETLOAD / duplicate ribbon | runtime | module-specific | duplicate UI possible | UI only | restart | idempotent registry |
| No write permission / AV lock | file operations | errors/messages vary | launch blocked | partial install | manual repair | diagnostics and no activation |
| AutoCAD already running / profile missing / LISP/BAT absent | not fully proven | unknown | bootstrap may not execute | none | manual | explicit duplicate policy/preflight |
| Update during use | legacy copy model | unknown | locked or mixed files | runtime instability | manual | versioned immutable directories |
@@ -0,0 +1,13 @@
# AS-IS file flow
| File | Created/copied by | Source -> destination | Read/executed by | Generated | Required phase | Mutable | Failure impact | Target |
|---|---|---|---|---|---|---|---|---|
| P_Serv_Starter.exe | installer | configured local support location | installer | static | install | replaced by updater | no bootstrap | Next EXE workflow |
| start_plant_3d.bat | external local support | expected local location | P_Serv_Starter | static | startup | external | Plant not started | ProcessStartInfo |
| launcher_starter.lsp | P_Serv_Starter | bootstrap output -> Applications | AutoCAD (mechanism unknown) | copied | startup | overwritten | generated loader not activated | temporary Next script |
| _app_netload.lsp | P_Serv_Starter | generated in Applications | launcher_starter | generated | startup | overwritten | no plugin load | temporary Next script |
| app_netload.lsp | launcher_starter | renamed local generated file | AutoCAD | generated | startup | mutable | no selected plugin load | one NETLOAD script |
| OrthoLoader.dll | installer | network catalog -> local Applications/P_Rec_Annot | AutoCAD | static | startup | versioned only by legacy copy | P_Rec chain fails | PRecAnnot entry assembly |
| Settings.xml | legacy deployment | adjacent to loader | OrthoLoader | static | startup | network/local unknown | modules unavailable | versioned manifest |
| P_Rec DLL / icons / help / templates / project XML | legacy catalog | network -> local catalog | modules | static | command dependent | varies | feature-specific failure | explicit optional resources |
| AutoCAD profile references | workstation | external configuration | AutoCAD | static | startup | external | bootstrap may not run | explicit validated profile |
@@ -0,0 +1,17 @@
# AS-IS installation sequence
```mermaid
sequenceDiagram
participant U as User
participant I as All_Serv_Install
participant N as Corporate network
participant C as Local Applications
participant S as P_Serv_Starter
U->>I: select product/plugins
I->>N: read Settings.xml and selected files
I->>C: recursively copy catalogs
I->>S: start with product, target, settings, project, workdir
S->>C: create _app_netload.lsp and launcher_starter.lsp
```
Partial-copy recovery and all offline branches are not fully proven.
@@ -0,0 +1,8 @@
# Known unknowns
- `UNKNOWN_BOOTSTRAP`: automatic `launcher_starter.lsp` activation through `acaddoc.lsp`.
- Actual runtime files and local cache were absent on the audited workstation.
- Exact startup mechanism for every AutoCAD/Plant release and profile.
- Network-offline behavior across all installer/updater/module branches.
- Full per-module failure continuation, duplicate-load handling, resources and command-time network dependencies.
- Actual deployed updater shortcut and current Plant executable arguments.
@@ -0,0 +1,3 @@
# AS-IS performance profile
The startup path performs network-dependent synchronization when installer/update is used, writes generated LISP files, starts a batch and may load 20 assemblies sequentially. No timings were collected; claims about latency, parallelism, cache hit rate, or behavior under unavailable network are `UNKNOWN`. Launcher Next must measure these rather than infer them.
@@ -0,0 +1,3 @@
# AS-IS security model
Legacy code writes local support files and uses generated LISP plus `NETLOAD`. It relies on the corporate local trusted support convention, but this audit did not change or verify `TRUSTEDPATHS`, profiles, registry demand loading, or deployment permissions. Network source access occurs during installation/update. The audit does not establish code signing, strong validation, complete hash coverage, or secret handling. Treat all of those as gaps.
@@ -0,0 +1,24 @@
# AS-IS startup sequence
```mermaid
sequenceDiagram
participant U as User
participant I as All_Serv_Install
participant S as P_Serv_Starter
participant B as start_plant_3d.bat
participant A as Plant 3D
participant L as launcher_starter.lsp
participant O as OrthoLoader.dll
U->>I: select Plant product/project
I->>S: start configured bootstrap
S->>S: create _app_netload.lsp; copy LISP
S->>B: Process.Start
B->>A: launch (details UNKNOWN)
Note over A,L: UNKNOWN_BOOTSTRAP: automatic LISP invocation not observed
L->>L: rename/load app_netload.lsp
L->>O: NETLOAD local OrthoLoader.dll
O->>O: read Settings.xml; ._netload ordered modules
O->>A: create PluginsOrtho ribbon
```
The lower sequence is conditional on `launcher_starter.lsp` being started; the initiating AutoCAD configuration is unknown.
@@ -0,0 +1,19 @@
# AS-IS system context
| Component | Owner / repository | Process / runtime | Inputs / outputs | Side effects | Replacement | Evidence / confidence |
|---|---|---|---|---|---|---|
| User | Engineering | desktop | selects product and project | starts launcher | retained | launcher audit / CONFIRMED |
| All_Serv_Install | `All_Serv_Install` | .NET Framework WinForms | server Settings.xml; local Applications; starts bootstrap | synchronizes and deletes local files | Launcher Next replaces gradually | launcher audit / CONFIRMED |
| P_Serv_Starter | `P_Serv_Starter` | .NET Framework EXE | settings + paths; generated LISP | writes loader files; starts batch | Next startup builder | source audit / CONFIRMED |
| start_plant_3d.bat | local support directory | cmd/batch | local support files | starts Plant process | direct ProcessStartInfo when viable | source reference only / HIGH_CONFIDENCE |
| launcher_starter.lsp | P_Serv_Starter content | AutoLISP | `_app_netload.lsp` | updates SupportPath; loads generated LISP | temporary pilot script | source audit / CONFIRMED |
| app_netload.lsp | generated locally | AutoLISP | plugin catalog/install entries | NETLOADs selected local modules | one entry NETLOAD | source audit / CONFIRMED |
| AutoCAD Plant 3D | Autodesk | acad.exe, Plant runtime | profile, drawing, local plugin | executes commands | retained | product discovery / CONFIRMED |
| OrthoLoader.dll | legacy P_Rec_Annot | managed AutoCAD extension | adjacent Settings.xml | loads 20 modules, ribbon | PRecAnnot.Plant3D2026.dll | legacy audit / CONFIRMED |
| 20 legacy DLL | legacy deployment | managed extensions | Settings.xml ordered list | commands and ribbon behavior | consolidated dependencies | legacy audit / CONFIRMED |
| Network root | corporate file share | SMB | legacy installation source | read at install/update | catalog source only | audits / CONFIRMED |
| Local support directory | workstation | filesystem | cache, scripts and applications | local writes | configurable cache root | source audit / CONFIRMED |
| AutoCAD profile / autoload registration | workstation configuration | AutoCAD startup | startup LISP | unknown | explicit Next configuration | no installed proof / UNKNOWN |
| Plant project / Ribbon | Plant runtime | Plant/AutoCAD APIs | project and UI context | commands/transactions | retained through one entry assembly | legacy audit / CONFIRMED |
`UNKNOWN_BOOTSTRAP`: source comments name `acaddoc.lsp`, but its deployed content and registration were not observed. It must not be represented as confirmed automatic startup.
@@ -0,0 +1,14 @@
# AS-IS update sequence
```mermaid
sequenceDiagram
participant N as Network
participant U as All_Serv_InstallUpdater
participant I as All_Serv_Install
U->>N: compare MD5/control-sum data
U->>U: delete/copy local installer files
U->>I: start local installer
Note over U,I: Actual deployed updater entrypoint is INFERRED
```
The updater source performs MD5 comparison and replacement. It was not run and its complete recovery behavior is not established.
@@ -0,0 +1,6 @@
Claim,Evidence,Location,Confidence
Installer is visible synchronizer,Launcher source audit,migration/audits/launcher-source-architecture/architecture-summary.md,CONFIRMED
P_Serv_Starter generates NETLOAD LISP,Launcher source audit,migration/audits/launcher-source-architecture/launcher-to-p-rec-annot.md,CONFIRMED
OrthoLoader reads Settings and loads 20 modules,Legacy loading audit,migration/audits/p-rec-annot-legacy-loading/loading-chain.md,CONFIRMED
Automatic acaddoc startup,No deployed proof,architecture/autodesk-launcher/as-is/known-unknowns.md,UNKNOWN
Target local package/atomic activation,Design decision,architecture/autodesk-launcher/adr,ACCEPTED
1 Claim Evidence Location Confidence
2 Installer is visible synchronizer Launcher source audit migration/audits/launcher-source-architecture/architecture-summary.md CONFIRMED
3 P_Serv_Starter generates NETLOAD LISP Launcher source audit migration/audits/launcher-source-architecture/launcher-to-p-rec-annot.md CONFIRMED
4 OrthoLoader reads Settings and loads 20 modules Legacy loading audit migration/audits/p-rec-annot-legacy-loading/loading-chain.md CONFIRMED
5 Automatic acaddoc startup No deployed proof architecture/autodesk-launcher/as-is/known-unknowns.md UNKNOWN
6 Target local package/atomic activation Design decision architecture/autodesk-launcher/adr ACCEPTED
@@ -0,0 +1,13 @@
# Launcher Next target architecture
Launcher Next is a parallel .NET 8 foundation: one visible x64 application, immutable versioned local packages, manifest/hash validation, atomic activation, rollback pointer, explicit dry-run Plant launch preparation and structured local logs. It does not deploy, alter profiles, start AutoCAD or change legacy files in this foundation.
```text
Launcher.Next.App -> Application orchestration -> Infrastructure adapters
-> product discovery (registry abstraction)
-> package catalog / local synchronizer / versioned store
-> manifest validation / SHA-256
-> startup script builder -> Process launcher dry-run
```
For P_Rec_Annot, one local entry `PRecAnnot.Plant3D2026.dll` replaces legacy `OrthoLoader -> Settings.xml -> 20 NETLOAD` orchestration. Its internal dependencies are CLR dependencies; Autodesk assemblies remain supplied by AutoCAD.
@@ -0,0 +1,11 @@
# Compatibility matrix
| Dimension | Legacy | Next foundation | Pilot decision |
|---|---|---|---|
| UI | WinForms installer | WPF shell | parallel |
| Runtime | .NET Framework 4.7 | .NET 8 x64 | separate EXE |
| Plugin load | generated multi-NETLOAD | one local NETLOAD | validate first |
| Package source | network copy | manifest + local cache | no production UNC client yet |
| Offline | unknown | last valid local version | design policy |
| Rollback | manual/unknown | previous pointer | foundation tested |
| AutoCAD version | historical 2019 evidence | discovery for Plant 2026 | require runtime confirmation |
@@ -0,0 +1,12 @@
# Target component model
| Component | Responsibility | Boundary | Side effects |
|---|---|---|---|
| Launcher.Next.App | minimal WPF shell and view model | UI only | none until explicit action |
| Core | contracts, manifest models, validation policy | no WPF/registry/process/filesystem/Autodesk | none |
| Application | synchronize/activate/prepare workflows | ports only | none directly |
| Infrastructure | local files, hashes, catalog implementation | filesystem/network behind interfaces | staging/cache writes |
| Autodesk | registry discovery, script construction, ProcessStartInfo | OS/process boundary | dry-run only in foundation |
| Observability | redacted JSONL events | local logging | log file write |
Feature flag: `Legacy`, `NextPilot`, `NextPreferred`; default is `Legacy`. No production configuration changes occur without explicit authorization.
@@ -0,0 +1,11 @@
# Local cache
The configurable root defaults by policy to the corporate local support root:
```text
<SupportRoot>/Launcher/{config,logs,state,staging,rollback}
<SupportRoot>/Applications/<PackageId>/versions/<version>/
<SupportRoot>/Applications/<PackageId>/current.json
```
Keep `current`, `previous` and incomplete `staging` separate. Activated directories are immutable; do not overwrite a DLL used by AutoCAD. A valid cache permits offline use; an invalid or partial staging directory never becomes current.
@@ -0,0 +1,9 @@
# Migration strategy
1. Preserve legacy unchanged and default `LauncherMode=Legacy`.
2. Pilot an isolated group with `NextPilot`, local cache and one P_Rec entry assembly.
3. Validate package/hash/rollback and dry-run launch preparation before any runtime use.
4. Test actual bootstrap only with separate authorization and non-production Plant data.
5. Move to `NextPreferred` only after operational evidence; retain immediate Legacy fallback.
No AppLoader, registry demand-loading or direct UNC deployment decision is implied by this foundation.
@@ -0,0 +1,5 @@
# Observability
Write best-effort JSONL records under `%LOCALAPPDATA%\Promhimproekt\LauncherNext\Logs`. Events: `LauncherStarted`, `ConfigurationLoaded`, `ProductDiscoveryStarted`, `ProductDiscovered`, `CatalogReadStarted`, `CatalogReadCompleted`, `PackageValidationStarted`, `PackageValidationCompleted`, `SynchronizationStarted`, `SynchronizationCompleted`, `ActivationCompleted`, `RollbackStarted`, `RollbackCompleted`, `LaunchPrepared`, `LaunchBlocked`, `LauncherFailed`.
Records exclude user identity, tokens, passwords, full Plant project paths, project numbers and engineering-file content. Logs must never block a launch decision.
@@ -0,0 +1,26 @@
# Package manifest
```json
{
"schemaVersion": 1,
"packageId": "P_Rec_Annot",
"version": "2026.1.0",
"product": "Plant3D",
"productYear": 2026,
"architecture": "x64",
"minimumLauncherVersion": "1.0.0",
"compatibleAutoCadSeries": ["R25.1"],
"requiredRuntime": ".NET 8",
"entryAssembly": "PRecAnnot.Plant3D2026.dll",
"files": [{ "path": "PRecAnnot.Plant3D2026.dll", "length": 0, "sha256": "<64 hex>" }],
"dependencies": [],
"optionalResources": [],
"rolloutChannel": "pilot",
"disabled": false,
"rollbackSafe": true,
"releaseNotesReference": "relative-release-notes.md",
"startup": { "type": "netload", "command": "PHP_REC_ANNOT" }
}
```
Validation rejects absolute/traversal/duplicate paths, missing entry assembly, incompatible product/year/architecture, and Autodesk/Plant managed assemblies (`AcMgd`, `AcDbMgd`, `AcCoreMgd`, `AdWindows`, `PnP*`, `Autodesk.ProcessPower*`). No absolute paths belong in a manifest.
@@ -0,0 +1,5 @@
# Plugin bootstrap
Generate a temporary, locally stored startup script only from a validated package root. It contains exactly one escaped `NETLOAD` for the entry assembly and no separate dependency loads. The script is not executed by foundation tests.
`PRecAnnot.Plant3D2026.dll` is the only managed entry. `PRecAnnot.Application`, `PRecAnnot.Core` and allowed third-party libraries resolve as CLR dependencies. Autodesk managed assemblies are neither copied nor included in package manifests; they load from the installed AutoCAD/Plant runtime.
@@ -0,0 +1,9 @@
# Target security model
- Load managed assemblies only from validated local version directories, never directly from UNC.
- Hash every packaged file with SHA-256 before activation.
- Validate package paths against traversal and package-root escape.
- Forbid Autodesk runtime DLLs in packages.
- Detect Autodesk installations through a read-only registry abstraction with configuration override for diagnostics.
- Do not change `TRUSTEDPATHS`, registry, profiles or production deployment without explicit approval.
- Keep credentials/secrets out of source, manifests and telemetry.
@@ -0,0 +1,22 @@
# Target startup sequence
```mermaid
sequenceDiagram
participant U as User
participant L as Launcher Next
participant D as Product discovery
participant C as Package catalog
participant S as Local store
participant A as Plant 3D
participant P as PRecAnnot entry
U->>L: Prepare launch (NextPilot)
L->>D: discover installed Plant 3D
L->>C: read package manifest when network is available
L->>S: stage, hash-validate, activate package atomically
L->>L: build one validated NETLOAD startup script
L->>A: ProcessStartInfo (explicit profile/script)
A->>P: one NETLOAD local PRecAnnot.Plant3D2026.dll
P->>A: commands and Ribbon registry
```
Foundation performs through `LaunchPrepared`; real process start remains dry-run only.
@@ -0,0 +1,10 @@
# Atomic update and rollback
1. Read and validate manifest.
2. Copy/download into a new staging directory with cancellation and bounded parallelism.
3. Validate file length, SHA-256, required files, entry metadata and forbidden DLLs.
4. Write local manifest, close streams and rename staging to `versions/<version>`.
5. Atomically replace `current.json`; preserve prior pointer.
6. On bootstrap failure, offer rollback by atomically restoring the prior pointer.
Never update an active directory in place. Locked files leave the current version intact and yield a diagnostic status. Network failure uses the last valid local version; when none exists, policy is to launch Plant without the corporate plugin or offer Legacy fallback, never a partial Next package.