Keyboard shortcuts

Press ← or → to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

70 — Forgeyard Dependency Update Automation, Version Maintenance, Vulnerability Remediation & Upgrade Campaign System Architecture

Document type: Core Dependency Update Automation, Version Maintenance, Lockfile Refresh, Vulnerability Remediation, Upgrade Campaign, Compatibility Validation & Automated Change Proposal System Architecture
Project: Forgeyard CI/CD
Subsystem: dependency discovery, version update policy, lockfile maintenance, automated upgrade proposals, grouped dependency updates, security remediation, toolchain/runtime upgrades, compatibility gates, staged update campaigns, stale dependency detection, update windows, rollout/rollback, ownership, notifications, and upgrade evidence
Architecture style: Proposal-first automation, exact dependency identities, lockfile-centered reproducibility, policy-bound version selection, immutable update plans, compatibility/test evidence, explicit security urgency, grouped risk-aware campaigns, no silent source mutation, and no bypass of normal change/release authority
Status: Target production architecture extending the Forgeyard series beyond the original 01–26 plan
Relationship to prior work: Builds on Dependency/Registry/Mirror Governance, Static Analysis/Security Findings, Compatibility Governance, Change Proposal, Merge Queue, Pipeline/Testing, Release Lifecycle, Progressive Delivery, Preflight, Artifact Registry, Supply Chain, Developer Experience, and Incident Management. This subsystem automates the maintenance workflow around dependencies while preserving Forgeyard’s existing source and release governance.


1. Purpose

Modern projects depend on continuously changing ecosystems:

Rust crates
npm packages
Python packages
Maven/Gradle artifacts
Go modules
Dart/Flutter packages
system packages
container base images
SDKs
toolchains
compiler versions
Git dependencies
internal packages

Without structured maintenance, dependency updates often happen as:

developer notices old package
  ↓
manually edits manifest
  ↓
updates lockfile
  ↓
hopes CI catches problems

At scale, this creates:

security exposure
large painful upgrade jumps
stale lockfiles
unsupported runtimes
dependency conflicts
manual toil
unreviewed emergency patches

The central rule is:

Forgeyard may discover, plan, propose, and validate dependency changes automatically, but protected source and lockfiles change only through the normal Change Proposal / merge workflow.

A second rule is:

Version selection is policy- and compatibility-aware. “Newest available” is not automatically “best allowed.”

A third rule is:

Security urgency may accelerate cadence, but it never eliminates source review, reproducible lock resolution, compatibility evidence, or normal release identity.


2. Architectural Position

                Registry / Mirror / Advisory Data
                            │
                            ▼
                     Update Discovery
                            │
                            ▼
                      Update Candidate
                            │
                            ▼
                       Update Plan
                            │
            ┌───────────────┼───────────────┐
            ▼               ▼               ▼
       Compatibility      Security        Policy
            │               │               │
            └───────────────┼───────────────┘
                            ▼
                  Generated Change Proposal
                            │
                            ▼
                        Normal CI
                            │
                            ▼
                     Merge / Release

3. Goals

The subsystem MUST:

  1. define update-candidate identity;
  2. define update-plan identity;
  3. discover new dependency versions;
  4. support semver-aware selection;
  5. support exact lockfile regeneration;
  6. support security-only updates;
  7. support routine maintenance updates;
  8. support major-version campaigns;
  9. support grouped updates;
  10. support internal package updates;
  11. support compiler/toolchain updates;
  12. support base-image updates;
  13. support compatibility evaluation;
  14. support automated Change Proposal creation;
  15. support owner assignment;
  16. support update windows;
  17. support merge queue integration;
  18. support vulnerability deadlines;
  19. support rollback/revert;
  20. support stale dependency reporting;
  21. support dependency deprecation/EOL;
  22. support multi-repo campaigns;
  23. support monorepo campaigns;
  24. support tenant/project policies;
  25. support UI/API/CLI;
  26. support audit;
  27. support HA;
  28. support air-gap/internal mirrors;
  29. support evidence retention;
  30. never silently mutate protected source.

4. Non-Goals

This subsystem does not replace:

package managers
dependency resolvers
registries
security scanners
Change Proposal
Merge Queue
Release

It orchestrates maintenance across them.


5. Workspace Structure

crates/dependency-update/
├── forgeyard-dependency-update/
├── forgeyard-dependency-update-model/
├── forgeyard-dependency-update-discovery/
├── forgeyard-dependency-update-policy/
├── forgeyard-dependency-update-resolver/
├── forgeyard-dependency-update-lockfile/
├── forgeyard-dependency-update-security/
├── forgeyard-dependency-update-campaign/
├── forgeyard-dependency-update-proposal/
├── forgeyard-dependency-update-reconcile/
├── forgeyard-dependency-update-health/
└── forgeyard-dependency-update-testkit/

Ecosystem adapters:

ecosystems/
├── rust/
├── javascript-typescript/
├── python/
├── java-kotlin/
├── go/
├── dart-flutter/
├── swift/
├── c-cpp/
└── ...

Each ecosystem adapter provides dependency metadata/resolution semantics while core remains ecosystem-neutral.


6. DependencyCoordinate

#![allow(unused)]
fn main() {
pub struct DependencyCoordinate {
    pub ecosystem: EcosystemId,
    pub namespace: Option<BoundedString>,
    pub name: BoundedString,
}
}

7. DependencyVersionId

#![allow(unused)]
fn main() {
pub struct DependencyVersionId(Digest);
}

Canonical resolved version identity.


8. UpdateCandidateId

#![allow(unused)]
fn main() {
pub struct UpdateCandidateId(Digest);
}

Immutable candidate:

current dependency
target dependency
project/source snapshot
update policy

9. UpdatePlanId

#![allow(unused)]
fn main() {
pub struct UpdatePlanId(Digest);
}

Immutable exact proposed update plan.


10. Dependency Update Subject

#![allow(unused)]
fn main() {
pub enum DependencyUpdateSubject {
    Project(ProjectId),
    Component(SoftwareComponentId),
    Workspace(WorkspaceId),
    Repository(RepositoryId),
    ReleaseLine(ReleaseLineId),
}
}

11. Update Kinds

#![allow(unused)]
fn main() {
pub enum DependencyUpdateKind {
    Patch,
    Minor,
    Major,
    Security,
    Toolchain,
    Runtime,
    BaseImage,
    GitRevision,
    InternalPackage,
}
}

12. Patch / Minor / Major

Ecosystem semantics differ.


13. No Universal SemVer Assumption

Critical.

Adapters interpret ecosystem-specific version semantics.


14. Version Policy

#![allow(unused)]
fn main() {
pub struct DependencyVersionPolicyId(Digest);
}

15. VersionPolicy

#![allow(unused)]
fn main() {
pub struct DependencyVersionPolicy {
    pub allowed: VersionConstraint,
    pub denied: Vec<VersionConstraint>,
    pub prerelease: PrereleasePolicy,
    pub update_strategy: UpdateStrategy,
}
}

16. UpdateStrategy

#![allow(unused)]
fn main() {
pub enum UpdateStrategy {
    LatestAllowed,
    LowestCompatible,
    SecurityMinimum,
    PinExact,
    OrganizationApproved,
}
}

17. LatestAllowed

Newest version satisfying policy.


18. LowestCompatible

Useful for minimum-version testing.


19. SecurityMinimum

Smallest safe version satisfying advisory remediation.


20. PinExact

No range drift.


21. OrganizationApproved

Only versions on approved catalog.


22. Prerelease Policy

#![allow(unused)]
fn main() {
pub enum PrereleasePolicy {
    Deny,
    AllowExplicit,
    AllowChannel(ReleaseChannelRef),
}
}

23. No Accidental Alpha/Beta Upgrade

Critical.


24. Registry Data

Part 36/52 provide authoritative available package metadata.


25. Upstream Internet

Not required if internal mirror contains metadata.


26. Air-Gap

Update discovery works from imported mirror/advisory snapshots.


27. Registry Snapshot

#![allow(unused)]
fn main() {
pub struct RegistrySnapshotId(Digest);
}

28. Candidate Discovery

Binds registry snapshot.


29. Deterministic Discovery

Same inputs produce same candidate set.


30. Advisory Snapshot

#![allow(unused)]
fn main() {
pub struct VulnerabilityAdvisorySnapshotId(Digest);
}

31. Security Candidate

Contains:

affected version range
fixed versions
severity
exploitability if known
advisory evidence

32. Security Severity

From Part 37 findings/advisory normalization.


33. Exploitability

Separate from severity.


34. No “Critical CVE Means Auto-Merge”

Critical.


35. SecurityUrgency

#![allow(unused)]
fn main() {
pub enum SecurityUrgency {
    Routine,
    Elevated,
    Critical,
    Emergency,
}
}

36. Update Deadline

#![allow(unused)]
fn main() {
pub struct RemediationDeadline(Timestamp);
}

37. Deadline Policy

Based on:

severity
exploitability
internet exposure
runtime use
asset criticality

38. Deadline Expiry

Can block releases or require exception.


39. Security Exception

Explicit, scoped, expiring.


40. No Permanent Ignore

Critical.


41. Current Dependency Graph

Part 34/36.


42. Direct vs Transitive

#![allow(unused)]
fn main() {
pub enum DependencyRelation {
    Direct,
    Transitive,
    Build,
    Dev,
    Runtime,
    Optional,
}
}

43. Transitive Update

May be achieved by parent package update or lock refresh.


44. Lockfile Identity

#![allow(unused)]
fn main() {
pub struct LockfileSnapshotId(Digest);
}

45. Lockfile Regeneration

Performed by exact package-manager/toolchain version.


46. ResolverEnvironmentId

#![allow(unused)]
fn main() {
pub struct ResolverEnvironmentId(Digest);
}

47. Resolver Environment

Includes:

package manager version
registry snapshot/mirror
configuration
platform/target where relevant

48. No Developer Laptop Resolver Baseline

Critical.


49. Resolution Worker

Dedicated hermetic/reproducible job.


50. Lockfile Diff

First-class evidence.


51. LockfileDiff

#![allow(unused)]
fn main() {
pub struct LockfileDiff {
    pub added: Vec<ResolvedDependency>,
    pub removed: Vec<ResolvedDependency>,
    pub changed: Vec<ResolvedDependencyChange>,
}
}

52. Transitive Blast Radius

Visible.


53. No “Only One Package Changed” If Lockfile Changed 50

Critical.


54. Update Plan

#![allow(unused)]
fn main() {
pub struct DependencyUpdatePlan {
    pub id: UpdatePlanId,
    pub source: SourceSnapshotId,
    pub candidates: Vec<UpdateCandidateId>,
    pub resolver: ResolverEnvironmentId,
    pub policy: DependencyVersionPolicyId,
}
}

55. Plan Output

manifest edits
lockfile edits
compatibility findings
security findings
expected CI impact

56. Source Mutation

Generated as patch/diff artifact.


57. Forgeyard Does Not Push Directly To Protected Branch

Critical.


58. Change Proposal

Part 54/Change Proposal architecture.


59. Automated Proposal Actor

Service principal.


60. Proposal Metadata

update plan
reason
current/target versions
security advisory
generated lockfile
risk facts

61. Bot Authorship

Explicit.


62. Human Review

Policy-dependent.


63. Auto-Merge

Allowed only through normal Merge Queue/policy when all conditions explicitly permit.


64. No Special Bot Bypass

Critical.


65. Update Campaign

#![allow(unused)]
fn main() {
pub struct DependencyUpdateCampaignId(Ulid);
}

66. Campaign

Groups related update plans.


67. Campaign Types

#![allow(unused)]
fn main() {
pub enum DependencyUpdateCampaignKind {
    RoutineMaintenance,
    SecurityRemediation,
    MajorUpgrade,
    ToolchainUpgrade,
    RuntimeUpgrade,
    BaseImageUpgrade,
    EcosystemMigration,
}
}

68. Routine Maintenance

Small regular changes.


69. Security Remediation

Deadline-driven.


70. Major Upgrade

May involve source changes/API migration.


71. Toolchain Upgrade

Compiler/runtime ecosystem.


72. Base Image Upgrade

Links Part 58.


73. Campaign State

#![allow(unused)]
fn main() {
pub enum DependencyUpdateCampaignState {
    Planned,
    Discovering,
    Proposing,
    Validating,
    RollingOut,
    Paused,
    Succeeded,
    Failed,
    Cancelled,
}
}

74. Grouped Updates

Can reduce noise.

Examples:

all Tokio crates
all AWS SDK crates
all internal platform packages

75. GroupPolicyId

#![allow(unused)]
fn main() {
pub struct DependencyGroupPolicyId(Digest);
}

76. Grouping Rules

ecosystem
publisher
package family
shared compatibility
security advisory

77. Avoid Giant Unrelated Mega-Updates

Critical.


78. Group Risk

Higher if many unrelated packages.


79. Split Strategy

If grouped update fails:

bisect group
split by package family
split one-by-one

80. Automated Split

Can create smaller proposals.


81. No Endless Proposal Explosion

Bounded.


82. Proposal Budget

#![allow(unused)]
fn main() {
pub struct UpdateProposalBudget {
    pub max_open_per_project: u32,
    pub max_new_per_day: u32,
}
}

83. Noise Control

Important.


84. Update Window

#![allow(unused)]
fn main() {
pub struct DependencyUpdateWindow {
    pub timezone: TimeZoneId,
    pub schedule: CalendarSchedule,
}
}

85. Routine Updates

Can be scheduled weekly/monthly.


86. Security Updates

May bypass routine window under policy.


87. Freeze

Release/change freeze may defer routine updates.


88. Security Emergency

Explicit exception path.


89. Stale Dependency

#![allow(unused)]
fn main() {
pub struct DependencyStaleness {
    pub current: DependencyVersionId,
    pub latest_allowed: Option<DependencyVersionId>,
    pub age: Duration,
}
}

90. Staleness Policy

Can flag:

months behind
unsupported version
EOL runtime

91. Stale Does Not Mean Vulnerable

Critical.


92. Vulnerable Does Not Necessarily Mean Oldest

Separate dimensions.


93. Dependency Support State

#![allow(unused)]
fn main() {
pub enum DependencySupportState {
    Supported,
    Maintenance,
    Deprecated,
    EndOfLife,
    Unknown,
}
}

94. EOL

Can become policy blocker.


95. Deprecation

Warn/planning.


96. Toolchain Update

Examples:

Rust compiler
JDK
Node runtime
Python runtime
Android SDK/NDK
Swift toolchain

97. ToolchainDescriptorId

New version creates new descriptor.


98. No Mutating Existing Toolchain Descriptor

Critical.


99. Toolchain Campaign

Tests across projects.


100. Compatibility Preflight

Part 66.


101. Toolchain Rollout Rings

Possible:

pilot projects
internal projects
all projects

102. Project Opt-In

Optional.


103. Forced Security Upgrade

Policy may set deadline.


104. Build Image Update

Part 58.


105. Base Image Dependency

Could trigger runner-image generation.


106. Dependency Update System

Creates image update proposal/intent, not direct image mutation.


107. Container Base Image

OCI digest update.


108. Tag Movement

Never enough.

Resolve exact digest.


109. Git Dependency

Update exact commit/revision.


110. Mutable Git Branch Dependency

Discouraged.


111. Update Candidate

Resolves exact revision.


112. Internal Package Update

Part 52 registry.


113. Internal Dependency Release

Can trigger downstream campaign.


114. Cascading Update

Potentially huge.


115. DependencyImpactGraph

Part 34.


116. Campaign Wave

#![allow(unused)]
fn main() {
pub struct DependencyUpdateWaveId(Ulid);
}

117. Wave Example

core libraries
  ↓
internal services
  ↓
edge clients

118. Compatibility Order

Part 57 authoritative.


119. Upgrade Ordering

Explicit.


120. No Random Repository Order

Critical.


121. Multi-Repo Campaign

Each repo gets independent Change Proposal.


122. Campaign Aggregates

Status/evidence.


123. One Repo Failure

Policy can:

pause dependent repos
continue independent repos

124. Monorepo Campaign

One integrated proposal may update many components.


125. Affected Work

Part 34 selects validation.


126. Mandatory Floor

Security/critical tests cannot be reduced by affected-work optimization.


127. Compatibility

Part 57.


128. API Breakage

Major version candidate may require source migration.


129. Automated Code Modification

Possible adapter.


130. Example

Codemod/compiler fix suggestions.


131. Critical Rule

Automated source rewrite is proposal content only.


132. AI Assistance

Part 55 may draft migration changes.


133. AI-Generated Upgrade Patch

Same Change Proposal/policy/test path.


134. No AI Auto-Merge Privilege

Critical.


135. Update Validation

Normal Forgeyard CI.


136. Validation Evidence

build
unit tests
integration tests
compatibility
security scan
benchmark where required

137. Update-Specific Tests

Can include:

dependency API smoke
lockfile reproducibility
feature matrix
minimum supported version

138. Lockfile Reproducibility

Regenerate independently and compare.


139. Resolver Drift

If same plan yields different lockfile, investigate.


140. Yanked Version

Candidate invalidates.


141. Registry Mutation

If ecosystem allows mutable package content, digest mismatch is equivocation/security event.


142. Dependency Equivocation

Part 52/36.


143. Candidate Freshness

#![allow(unused)]
fn main() {
pub enum UpdateCandidateFreshness {
    Current,
    NewerAvailable,
    TargetYanked,
    AdvisoryChanged,
    PolicyChanged,
    RegistryChanged,
    Expired,
    Unknown,
}
}

144. Before Merge

Re-evaluate freshness where policy requires.


145. No Merge Of Yanked/Revoked Target

Critical.


146. Security Advisory Change

May make candidate insufficient.


147. Update Supersession

New candidate can supersede old open proposal.


148. Do Not Force-Push Human-Edited Proposal Blindly

Critical.


149. Proposal Ownership State

Detect human modifications.


150. Bot Update Strategy

Options:

open new proposal
comment/rebase
ask human

151. Human Changes

Preserved.


152. Rebase

Uses exact target base.


153. Merge Queue

Final integrated candidate validates.


154. Update Merge

Normal submit semantics.


155. Release Lifecycle

After merge, normal release train decides production progression.


156. No Dependency Bot Deploy

Critical.


157. Rollback

Source revert/new change proposal.


158. Release rollback

Part 62/67.


159. UpdateRollbackPlan

Can record prior lockfile/source state.


160. Revert Proposal

Generated if needed.


161. Do Not Rewrite History

Critical.


162. Security Regression

If update breaks production:

incident
  ↓
rollback/revert
  ↓
alternative fixed version

163. Vulnerability May Remain

Incident/security policy determines urgency.


164. Update Exception

#![allow(unused)]
fn main() {
pub struct DependencyUpdateExceptionId(Ulid);
}

165. Exception

#![allow(unused)]
fn main() {
pub struct DependencyUpdateException {
    pub dependency: DependencyCoordinate,
    pub constraint: VersionConstraint,
    pub reason: BoundedString,
    pub expires_at: Timestamp,
}
}

166. Examples

upstream regression
license issue
platform incompatibility
temporary vendor block

167. Expiration Mandatory

Baseline.


168. License Policy

Part 36.


169. New Version License Change

Can block update.


170. Package Provenance

New version may have weaker trust.


171. Supply-Chain Gate

Part 13.


172. Trusted Publisher

Policy.


173. New Maintainer/Publisher

Potential risk fact.


174. Package Signing/Attestation

Where ecosystem supports.


175. Dependency Confusion

Internal namespace rules.


176. Private Package

Never fallback public.


177. Candidate Discovery

Respects namespace trust.


178. Registry Mirrors

Preferred.


179. Network

Update resolver/fetch jobs use Part 59.


180. Hermetic Build

Downloaded content becomes fixed input.


181. Secret Access

Registry credential SecretRef.


182. No Production Deploy Secret In Update Worker

Critical.


183. Permissions

dependency_update.read
dependency_update.plan
dependency_update.propose
dependency_update.campaign.manage
dependency_update.exception.manage
dependency_update.security.override

184. Proposal Creation

Service principal scoped.


185. Cannot Merge Unless separate permission/policy path.


186. Audit

Audit:

security exception
deadline override
campaign cancellation
major update approval
automated proposal actor
candidate suppression

187. Routine Discovery

Operational event.


188. Dioxus UI

Pages:

Dependency Updates
Security Remediation
Upgrade Campaigns
Stale Dependencies
Update Policies
Exceptions

189. Dependency Dashboard

Shows:

current version
latest allowed
latest available
support state
vulnerability state
open proposal

190. Campaign View

Shows:

scope
waves
repos/components
proposal states
failures
deadlines

191. Update Detail

Shows:

manifest diff
lockfile diff
transitive changes
compatibility
security
tests

192. CLI

forgeyard deps scan
forgeyard deps outdated
forgeyard deps plan <package>
forgeyard deps propose
forgeyard deps campaign create
forgeyard deps campaign status
forgeyard deps exception add
forgeyard deps doctor

193. API

Potential:

GET  /v1/dependencies/outdated
POST /v1/dependency-updates/plan
POST /v1/dependency-updates/proposals
POST /v1/dependency-update-campaigns
GET  /v1/dependency-update-campaigns/{id}

194. Notifications

Examples:

critical dependency deadline
proposal ready
major campaign blocked
EOL runtime
update exception expiring

195. Notification Fatigue

Batch routine maintenance.


196. Security Critical

Immediate policy-driven notification.


197. Scheduling

Part 44.


198. Weekly Routine Scan

Possible.


199. Advisory Update

Event-driven where feed supports, plus periodic sweep.


200. Reconciliation

Checks:

open stale proposals
candidate freshness
campaign progress
deadline
exception expiry
registry/advisory changes

201. HA

Multiple discovery workers safe.


202. Candidate Identity

Dedupes same update.


203. Proposal Idempotency

One active proposal per plan/base policy unless explicitly allowed.


204. Concurrency

Part 60.

Campaign/proposal creation coordinated.


205. No Global Dependency Lock


206. Multi-Tenancy

Policies per tenant/project.


207. Shared Internal Package

Downstream tenant boundaries respected.


208. Cross-Tenant Update Campaign

Only system/public shared package metadata—not tenant source visibility.


209. Federation

Registry/advisory snapshots may replicate.


210. Site-Local Air-Gap

Campaign uses local snapshot.


211. Global Internal Package

Authority site controls canonical release.


212. Regional Proposal

Normal source authority.


213. Data Lifecycle

Retain:

update plans
proposal links
security deadline decisions
exceptions
campaign history

214. Registry Metadata

Lifecycle Part 46.


215. Cost

Part 45.

Update campaigns can consume substantial CI.


216. Cost Policy

Can batch routine changes.


217. Security Deadline

Cost cannot suppress mandatory remediation.


218. Preflight

Part 66.

Before proposal, can estimate:

affected components
CI cost
compatibility risks

219. Large Major Update

Preflight first.


220. Benchmark

Part 33 may be required for performance-critical dependencies.


221. Reliability

Update campaign itself can have SLO:

critical dependency remediation within deadline

222. Incident

Missed critical remediation can become incident/security escalation.


223. Release Train

Part 67.

Security update can enter security/hotfix train after merge.


224. Progressive Delivery

Part 62.

Risky dependency update uses staged rollout.


225. Database Migration

Dependency update that requires schema change creates separate migration plan; not hidden.


226. Config Migration

Separate config change.


227. No Hidden Side Effects

Critical.


228. Toolchain Compatibility

Part 57.

Compiler MSRV/target changes evaluated.


229. Rust Specific Example

Crate update may raise MSRV.


230. MSRV Change

Compatibility risk fact.


231. npm Example

Peer dependency changes.


232. Python Example

Requires-Python range.


233. JVM Example

Bytecode/JDK target.


234. Go Example

go/toolchain directive.


235. Ecosystem Adapter

Normalizes these facts.


236. UpdateTestMatrix

#![allow(unused)]
fn main() {
pub struct UpdateTestMatrix {
    pub required_platforms: Vec<PlatformId>,
    pub feature_sets: Vec<FeatureSetId>,
}
}

237. Major Upgrade

May expand matrix.


238. Minimal Versions

Optional compatibility testing.


239. Security Update

May require affected exploit-path test.


240. Package Removal

Best dependency is sometimes no dependency.


241. RemovalCandidate

Can be proposed when unused.


242. Unused Dependency Detection

Static/build graph evidence.


243. Removal Is Source Change

Normal proposal.


244. Dependency Consolidation

Multiple versions can be reduced.


245. But

Do not force if compatibility requires multiple.


246. Lockfile Hygiene

Detect:

duplicate versions
unused entries
stale git revisions
unexpected registry

247. Registry Origin Drift

Security finding.


248. Doctor

forgeyard deps doctor

Checks:

stale advisory snapshot
mirror metadata lag
open critical remediation overdue
expired exceptions
bot proposals stuck
resolver environment unavailable
EOL toolchains

249. Health

#![allow(unused)]
fn main() {
pub enum DependencyUpdateSubsystemHealth {
    Healthy,
    DiscoveryDegraded,
    ResolverDegraded,
    ProposalDegraded,
    SecurityRemediationDegraded,
    Unhealthy,
}
}

250. Observability Metrics

dependency_updates_discovered_total
dependency_update_proposals_total
dependency_update_merge_total
dependency_update_failures_total
dependency_security_overdue_total
dependency_update_campaign_active

251. Labels

Low cardinality:

ecosystem
update_kind
result
urgency

252. No package-name high-cardinality labels baseline.


253. Tracing

deps.discover
deps.resolve
deps.plan
deps.propose
deps.validate
deps.campaign
deps.reconcile

254. Testkit

forgeyard-dependency-update-testkit/src/
├── lib.rs
├── discovery.rs
├── policy.rs
├── resolver.rs
├── lockfile.rs
├── campaign.rs
├── proposal.rs
└── assertions.rs

255. Core Tests

Discovery

  • same registry/advisory snapshot yields deterministic candidates;
  • prerelease denied unless policy allows.

Resolver

  • exact package-manager version used;
  • public fallback denied for private namespace;
  • yanked target invalidates candidate.

Lockfile

  • full transitive diff surfaced;
  • independent regeneration deterministic where ecosystem permits.

Proposal

  • protected branch never directly mutated;
  • bot service principal cannot bypass merge policy;
  • human edits are not silently overwritten.

Security

  • critical advisory creates deadline;
  • expired exception becomes visible/blocking per policy.

Campaign

  • compatibility order respected;
  • failed repo blocks dependents but not unrelated repos.

Toolchain

  • new descriptor created; old descriptor immutable.

Rollback

  • revert becomes new proposal; history not rewritten.

256. Chaos Tests

Inject:

registry outage
mirror lag
advisory feed outage
resolver crash
proposal provider timeout
SCM conflict

Expected:

no source corruption
candidate freshness explicit
proposal creation idempotent
campaign can resume

257. Scale Tests

Test:

large monorepo dependency graphs
thousands of repositories
large internal package ecosystem
mass security advisory
toolchain fleet-wide campaign

258. Implementation Phases

Phase 1 — Dependency Inventory & Discovery

Outdated/security candidates.

Phase 2 — Rust Adapter

Dogfood Forgeyard’s own workspace.

Phase 3 — Resolver/Lockfile Reproduction

Exact update plans.

Phase 4 — Automated Change Proposal

Bot workflow.

Phase 5 — Security Deadlines/Exceptions

Remediation governance.

Phase 6 — Grouped Updates/Campaigns

Noise reduction.

Phase 7 — Toolchain/Runtime Upgrades

Cross-project maintenance.

Phase 8 — Multi-Repo Campaign DAG

Enterprise rollouts.

Phase 9 — Additional Ecosystem Adapters

JS/Python/JVM/Go/Dart/etc.

Phase 10 — Air-Gap/Federation

Internal snapshot workflows.

Phase 11 — UI/CLI/Doctor

Operability.

Phase 12 — Chaos/Scale/Security Hardening

Production readiness.


259. Acceptance Tests

  1. Update automation never silently modifies protected source.
  2. Every proposed update binds exact source snapshot and target dependency identities.
  3. Discovery is deterministic against exact registry/advisory snapshots.
  4. Package ecosystem version semantics are adapter-specific.
  5. Latest version is not automatically selected when policy forbids it.
  6. Prerelease updates require explicit policy.
  7. Lockfile regeneration uses exact resolver/toolchain environment.
  8. Full transitive lockfile changes are surfaced.
  9. Private namespaces never silently fall back to public registry.
  10. Yanked/revoked versions invalidate candidates.
  11. Security deadlines are explicit.
  12. Security exceptions are scoped and expiring.
  13. Critical security urgency does not create merge/policy bypass.
  14. Bot-authored proposals use normal Change Proposal semantics.
  15. Bot service principal has no special merge authority.
  16. Human changes to bot proposals are preserved.
  17. Auto-merge, if enabled, still uses normal Merge Queue/policy.
  18. Grouped updates are policy-bounded.
  19. Failed grouped updates can split deterministically.
  20. Proposal spam is rate/budget controlled.
  21. Major/toolchain campaigns use compatibility-aware ordering.
  22. Toolchain upgrades create new immutable ToolchainDescriptorIds.
  23. Base-image updates delegate to Part 58.
  24. Deployment/production rollout delegates to Parts 62/67.
  25. Rollback/revert creates new source history rather than rewriting.
  26. EOL/support state remains distinct from vulnerability state.
  27. Air-gap update discovery works from imported snapshots.
  28. Federation preserves package/source authority boundaries.
  29. Audit retains exceptions/deadline overrides/campaign decisions.
  30. Forgeyard dogfoods dependency update automation on its own Rust workspace.

260. Production Readiness Gates

Do not call dependency update automation production-ready until:

inventory/discovery is deterministic
Rust lockfile updates are reproducible
private namespace fallback protection passes
bot proposals cannot bypass merge policy
security deadline/exception flow works
candidate freshness handles yank/advisory changes
grouped update split/recovery works
toolchain campaign compatibility gates work
air-gap/federation snapshot tests pass
chaos/scale tests pass

261. Architectural Invariants

  1. updates are proposed, not silently applied;
  2. protected source changes use Change Proposal;
  3. dependency target identity is exact;
  4. version semantics are ecosystem-aware;
  5. policy controls allowed versions;
  6. prereleases are explicit;
  7. lockfile resolution is reproducible/traceable;
  8. transitive changes are visible;
  9. private registry namespaces never public-fallback;
  10. candidate freshness matters;
  11. yanked/revoked targets cannot merge normally;
  12. security urgency does not bypass trust/authz;
  13. exceptions expire;
  14. bot actor has no special merge privilege;
  15. human edits are preserved;
  16. grouped updates are bounded;
  17. campaigns are compatibility-ordered;
  18. toolchain descriptors remain immutable;
  19. base-image authority remains Part 58;
  20. release/deployment authority remains Parts 15/62/67;
  21. reverts create new history;
  22. EOL and vulnerability are separate;
  23. AI-generated fixes remain normal proposals;
  24. air-gap snapshots are supported;
  25. audit records privileged maintenance decisions;
  26. cost cannot defer mandatory security remediation indefinitely;
  27. no hidden DB/config migrations inside dependency update;
  28. resolver workers lack production mutation credentials;
  29. history/evidence is retained;
  30. Forgeyard dogfoods its own dependency updater.

262. Final Target Architecture

                  Registry / Advisory Snapshot
                            │
                            ▼
                     Dependency Discovery
                            │
                            ▼
                       UpdateCandidate
                            │
                            ▼
                        UpdatePlan
                            │
             ┌──────────────┼──────────────┐
             ▼              ▼              ▼
       Compatibility     Security        Policy
             │              │              │
             └──────────────┼──────────────┘
                            ▼
                  Generated Source Patch
                            │
                            ▼
                     Change Proposal
                            │
                            ▼
                        Normal CI
                            │
                            ▼
                      Merge Queue
                            │
                            ▼
                   Normal Release Flow

Security campaign:

critical advisory
      ↓
affected dependency graph
      ↓
fixed-version candidates
      ↓
update proposals
      ↓
CI + compatibility
      ↓
merge
      ↓
security/hotfix release train
      ↓
progressive rollout

The key guarantee is:

Forgeyard can automate the repetitive work of dependency maintenance without turning maintenance bots into privileged source or release authorities. Discovery, resolution, lockfile generation, security remediation, and upgrade campaigns are automated aggressively, while every actual source change remains an exact, reviewable, testable Change Proposal that flows through the same merge and release controls as human-written code.


263. Extended Architecture Sequence

01 Core Domain & Foundation
02 Storage & Metadata
03 CAS & Artifact Data Plane
04 Pipeline IR / Parsing / Planning
05 Run / Job State Machine
06 Scheduler
07 Runner / Agent
08 Sandbox & Executor
09 Transport / QUIC / Protocol
10 Events / Reconciliation
11 Policy / Authorization / Identity
12 Secrets / Trust
13 Supply Chain / SBOM / Provenance / Signing
14 Packaging
15 Release
16 Deployment
17 Observability / Health / Doctor
18 API / Axum
19 Dioxus UI
20 Device Lab
21 SCM Provider Integrations
22 HA / Coordination / Raft
23 RBE Interop
24 Plugin / Extension Architecture
25 Operations / Backup / Upgrade / DR
26 Self-Hosting / Bootstrap / Release Forgeyard
27 Multi-Tenancy / Quotas / Resource Governance
28 Audit / Compliance / Security Governance
29 Notifications / Alerting / Human Workflow
30 Entitlements / Licensing / Subscription
31 Search / Indexing / Operational Analytics
32 Test Results / Quality / Coverage / Flaky Intelligence
33 Benchmark / Performance / Load / Capacity
34 Monorepo / Dependency Graph / Affected Work
35 Developer Experience / Local Dev
36 Dependency / Registry / Mirror Governance
37 Static Analysis / Security Findings
38 Cache / Remote Cache / Correctness
39 Configuration / Feature Flags / Runtime
40 Security / Threat Model / Incident Response
41 Release Distribution / Update Delivery
42 Workflow Templates / Golden Paths
43 Runner Fleet Autoscaling / Provisioning
44 Pipeline Triggers / Schedules / Dispatch
45 Cost Accounting / FinOps
46 Data Lifecycle / Retention / Privacy
47 CI/CD Migration / Compatibility
48 Failure Diagnosis / Reproduction / Bisect
49 Service Catalog / Ownership / Developer Portal
50 Reliability / SLO / Error Budget / Resilience
51 Multi-Region Federation / Edge / Disconnected
52 Artifact Registry / OCI / Package Distribution
53 Infrastructure-as-Code / Preview Environments / Drift
54 Merge Queue / Speculative Integration / Batch Validation
55 AI-Assisted CI Optimization / Engineering Copilot
56 Test Data / Fixtures / Ephemeral Databases / Service Virtualization
57 API / ABI / Schema / Protocol Compatibility / Contract Evolution
58 Runner Image Factory / Golden Images / Patch Management / Baseline Attestation
59 Network Connectivity / Private Resource Access / Egress / Tunneling / Zero-Trust Connectivity
60 Workflow Concurrency / Distributed Locks / Idempotency / Reservations / Exclusive Coordination
61 Incident Management / On-Call / Escalation / Response Coordination / Postmortem
62 Environment Promotion / Progressive Delivery / Feature Rollout / Canary Analysis / Automated Rollback
63 Database Schema Migration / Online Backfill / Data Transformation / Zero-Downtime Change Orchestration
64 Remote Development Environments / Cloud Workspaces / Developer Workspace Orchestration
65 Build Graph Replay / Historical Reproducibility / Time-Travel CI / Evidence Reconstruction
66 Change Risk Assessment / Preflight Simulation / Policy Preview / What-If Analysis
67 Artifact Promotion Policy / Release Train / Environment Channel / Lifecycle Governance
68 Configuration Drift Detection / Desired-State Convergence / Runtime Reconciliation / Environment Consistency
69 Job Checkpointing / Suspend-Resume / Preemption / Graceful Cancellation / Interruptible Runner Recovery
70 Dependency Update Automation / Version Maintenance / Vulnerability Remediation / Upgrade Campaigns