[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill-nvidia-jetson-promote-image":3,"mdc--u8aiv7-key":31,"related-repo-nvidia-jetson-promote-image":2981,"related-org-nvidia-jetson-promote-image":3085},{"slug":4,"name":4,"fn":5,"description":6,"org":7,"tags":11,"stars":20,"repoUrl":21,"updatedAt":22,"license":23,"forks":24,"topics":25,"repo":26,"sourceUrl":29,"mdContent":30},"jetson-promote-image","promote Jetson BSP image artifacts","Use to promote overlay files and built artifacts into the staged BSP image. Do NOT use to flash or build. Triggers: promote bsp image.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":9},"nvidia","NVIDIA","https:\u002F\u002Fpexgzepcugksgbtrxkhf.supabase.co\u002Fstorage\u002Fv1\u002Fobject\u002Fpublic\u002Forg-logos\u002Fnvidia.png",[12,16,19],{"name":13,"slug":14,"type":15},"Hardware","hardware","tag",{"name":17,"slug":18,"type":15},"Deployment","deployment",{"name":9,"slug":8,"type":15},2473,"https:\u002F\u002Fgithub.com\u002FNVIDIA\u002Fskills","2026-07-14T05:28:22.14664","Apache-2.0",281,[],{"repoUrl":21,"stars":20,"forks":24,"topics":27,"description":28},[],"AI agent skills published by NVIDIA","https:\u002F\u002Fgithub.com\u002FNVIDIA\u002Fskills\u002Ftree\u002FHEAD\u002Fskills\u002Fjetson-promote-image","---\nname: jetson-promote-image\ndescription: >-\n  Use to promote overlay files and built artifacts into the staged\n  BSP image. Do NOT use to flash or build. Triggers: promote bsp\n  image.\nversion: 0.0.1\nlicense: \"Apache-2.0\"\nmetadata:\n  data-classification: public\n  author: \"Jetson Team\"\n  team: pts\n  tags:\n    - bsp\n    - promote\n    - deploy\n  domain: meta\n---\n\n# Promote BSP Image\n\n## Purpose\n\nStage every Customize-* and Build output into `bsp_image` so it is\nready for `\u002Fjetson-flash-image`. This is the **promote leg of\nDeploy** — it copies files, never flashes and never builds.\n\n## Prerequisites\n\n- Active target-platform profile with both `source:` and `bsp_image:`\n  resolved (run `\u002Fjetson-init-source` and `\u002Fjetson-init-image` first).\n- `\u003Csource.root_path>\u002FLinux_for_Tegra\u002F` initialized as a git repo\n  (overlay tracker) with a clean working tree.\n- `\u003Cbsp_image.root_path>\u002FLinux_for_Tegra\u002F` extracted from a BSP\n  tarball + `apply_binaries.sh` already run.\n- `git`, `yq`, `cmp`, and `sudo` (for `rootfs\u002F*` destinations) on\n  the host.\n- `\u003Csource.root_path>\u002F.build-manifest.yaml` + `.build-state.yaml`\n  from `\u002Fjetson-build-source` (required when kernel-side repos\n  have customize-* commits).\n\n## Overview\n\nThis is the **promote leg of Deploy** — see\n[`..\u002F..\u002Fcontext\u002Fbsp-customization-workflow.md`](..\u002F..\u002Fcontext\u002Fbsp-customization-workflow.md)\nfor the pipeline view. The two channels this skill walks are:\n\n| Channel | Source | Carrier | Owner |\n|---|---|---|---|\n| **Overlay tracker** | `\u003Csource.root_path>\u002FLinux_for_Tegra\u002F` (git repo at HEAD) | Customize-* outputs that don't require a build (e.g. `nvfancontrol.conf`, `nvpmodel.conf`, BPMP DTB hand-edits) | Customize `customize-*` skills commit here |\n| **Build manifest** | `\u003Csource.root_path>\u002F.build-manifest.yaml` | Rebuilt kernel `Image`, in-tree `.ko`, OOT `.ko`, NVIDIA DTBs | Build [`jetson-build-source`](..\u002Fjetson-build-source\u002FSKILL.md) writes here |\n\nThe skill computes the union of files to copy and writes each into\n`\u003Cbsp_image.root_path>\u002FLinux_for_Tegra\u002F` with diff-aware\nskip-if-identical logic. When the copy pass touches the kernel\n`Image` or anything under `rootfs\u002Flib\u002Fmodules\u002F`, it also rebuilds\nthe initramfs via NVIDIA's `tools\u002Fl4t_update_initrd.sh` so the\nfreshly promoted kernel + modules ship in the initrd the\nbootloader actually loads. After it returns, `bsp_image` carries\nevery Customize and Build output. The skill does **not** flash and\ndoes **not** modify the workspace.\n\n## When to invoke\n\n- First leg of the typical Deploy chain\n  `jetson-promote-image → jetson-flash-image → jetson-validate-image`.\n- Standalone, when the user wants `bsp_image` updated but isn't\n  ready to flash yet (e.g. to inspect resolved files, run an\n  out-of-band build that reads bsp_image, or hand bsp_image to a\n  separate flashing host).\n\n## Procedure\n\n### Resolve active target + paths\n\nResolve the active profile per the contract in\n[`..\u002F..\u002Fcontext\u002Ftarget-platform-contract.md`](..\u002F..\u002Fcontext\u002Ftarget-platform-contract.md).\n\nRefuse and route in these cases:\n\n| Condition | Refuse with |\n|---|---|\n| No active profile, or `active: NA` | Route to `\u002Fjetson-set-target` or `\u002Fjetson-init-target`. |\n| Profile lacks `bsp_image:` | Route to `\u002Fjetson-init-image`. |\n| `\u003Cbsp_image.root_path>\u002FLinux_for_Tegra\u002F` missing | Route to `\u002Fjetson-init-image`. |\n| `\u003Csource.root_path>\u002FLinux_for_Tegra\u002F` missing or not a git repo | Route to `\u002Fjetson-init-source`. |\n\nResolve paths:\n\n- `\u003Cworkspace>` = parent of the active profile's `target-platform\u002F`\n  directory (discovered at load time).\n- `\u003Cbsp_image.root_path>` from `bsp_image.root_path:` if present,\n  else `\u003Cworkspace>\u002FImage`.\n- `\u003Csource.root_path>` from `source.root_path:` if present, else\n  `\u003Cworkspace>\u002FSource`.\n\nBind shell variables for the rest of the procedure:\n\n```bash\nLFT_SRC=\"\u003Csource.root_path>\u002FLinux_for_Tegra\"   # overlay tracker\nLFT_DST=\"\u003Cbsp_image.root_path>\u002FLinux_for_Tegra\"\nMANIFEST=\"\u003Csource.root_path>\u002F.build-manifest.yaml\"   # build outputs\n```\n\n### Validate the two channels\n\nThe skill needs at least one channel populated. Refuse if the\noverlay tracker has uncommitted changes (`status --porcelain`\nnon-empty), if `$MANIFEST` exists but doesn't parse as YAML, or\nif both channels are empty. Records `OVERLAY_HAS_COMMITS` \u002F\n`OVERLAY_HEAD` and `MANIFEST_PRESENT` for downstream steps.\n\nSee [`references\u002Fcopy-pass-snippets.md`](references\u002Fcopy-pass-snippets.md#validate-the-two-channels)\nfor the shell snippet and refuse messages.\n\n### Verify build-source freshness\n\nRefuse if `.build-state.yaml` shows any kernel-side repo in\n`Source\u002Fbsp_sources\u002F` dirty since the last `\u002Fjetson-build-source`\n— otherwise the copy pass would silently ship stale artifacts.\nDetection rules + shell snippet in\n[`references\u002Fbuild-source-freshness-gate.md`](references\u002Fbuild-source-freshness-gate.md).\nRecords `BUILD_FRESH=1`.\n\n### Pre-promote collision check (overlay only)\n\nWhen the overlay tracks a remote, refuse if upstream has commits\nnot yet pulled. Skip gracefully when no remote is configured\n(the default `git init` empty tracker from `jetson-init-source`).\nManifest channel has no git remote concept — this check is\noverlay-only. Records `COLLISION_CHECK` for the Summary.\n\nSee [`references\u002Fcopy-pass-snippets.md`](references\u002Fcopy-pass-snippets.md#pre-promote-collision-check-overlay-only)\nfor the shell snippet.\n\n### Enumerate sources (both channels)\n\n**Channel A — overlay**: `git ls-files` against `$LFT_SRC` is\nthe source of truth (transparent to symlink mounts when\n`source.repos.Linux_for_Tegra` was overridden, excludes\nuntracked \u002F `.gitignore`d files). Each entry maps\n`src = $LFT_SRC\u002F\u003Crel>` → `dst = $LFT_DST\u002F\u003Crel>`.\n\n**Channel B — manifest**: parse `artifacts[].{src,dst}` from\n`$MANIFEST`. Refuse if any `src` is missing on disk (build was\ninterrupted, or manifest stale — re-run `\u002Fjetson-build-source`).\nThe manifest schema is written by\n[`jetson-build-source` v0.2.0](..\u002Fjetson-build-source\u002Freferences\u002Fmanifest-schema.md).\n\nSee [`references\u002Fcopy-pass-snippets.md`](references\u002Fcopy-pass-snippets.md#enumerate-sources)\nfor both shell snippets and the manifest YAML schema.\n\n### Diff-aware copy into bsp_image\n\nIterate the union of overlay files and manifest entries. For\neach `dst`: if byte-identical, skip; otherwise `cp -p` (with\n`sudo` for `rootfs\u002F*` destinations, where the sample rootfs\nwas extracted as root). Tag `INITRD_DIRTY=1` on any\n`rootfs\u002Flib\u002Fmodules\u002F*` or `kernel\u002FImage` write — the\n\"Refresh initramfs\" step gates on this flag. Counts \u002F\n`FIRST` \u002F `LAST` are recorded for the Summary.\n\nFail-fast: if any `cp` fails, surface the failed path and stop.\n`bsp_image` may be left partially updated — re-running after\nfixing the cause resumes via the diff-aware skip. **Channel\norder** is overlay first, then manifest: on a `dst` collision\nthe manifest wins (freshly built artifact beats the older\noverlay copy).\n\nSee [`references\u002Fcopy-pass-snippets.md`](references\u002Fcopy-pass-snippets.md#diff-aware-copy-into-bsp_image)\nfor the `copy_one()` function and the two driving loops.\n\n### Mirror kernel Image into rootfs (when kernel changed)\n\nThe kernel `Image` lives in two paths inside `bsp_image`:\n`\u003CLFT_DST>\u002Fkernel\u002FImage` (read by the flash tool) and\n`\u003CLFT_DST>\u002Frootfs\u002Fboot\u002FImage` (the rootfs-side copy, visible as\n`\u002Fboot\u002FImage` from inside the rootfs chroot the refresh tool\nwill run in). The build manifest only carries the `kernel\u002FImage`\ndst, so this step mirrors `kernel\u002FImage` → `rootfs\u002Fboot\u002FImage`\n(diff-aware, no-op when already in sync) so the chrooted refresh\ntool resolves the kernel against the freshly promoted binary,\nnot the stale rootfs copy. The mirror also sets `INITRD_DIRTY=1`\nso a kernel-only promote (no `rootfs\u002Flib\u002Fmodules\u002F*` writes) still\ntriggers the refresh.\n\nSee [`references\u002Fkernel-image-and-initramfs.md`](references\u002Fkernel-image-and-initramfs.md#mirror-semantics--kernel-image-lands-in-two-places)\nfor the shell snippet, the failure mode this prevents, and the\n`INITRD_DIRTY` corner case.\n\n### Refresh initramfs (when kernel or modules changed)\n\nRun `tools\u002Fl4t_update_initrd.sh` from `\u003CLFT_DST>\u002F` whenever\n`INITRD_DIRTY=1` (set by the diff-aware copy or the mirror step\nabove). The tool chroots into `rootfs\u002F`, runs NVIDIA's\n`nv-update-initrd`, and writes both\n`\u003CLFT_DST>\u002Fbootloader\u002Fl4t_initrd.img` (used by the flash tool)\nand `\u003CLFT_DST>\u002Frootfs\u002Fboot\u002Finitrd` (`\u002Fboot\u002Finitrd` on the DUT).\nIdempotent; ~30 s. Skip when `INITRD_DIRTY=0` (overlay-only\nedits). DUT-side workarounds (`update-initramfs -u` + manual\n`cp`) are out of scope — fix the gap here so flash ships a\ncoherent image.\n\nSee [`references\u002Fkernel-image-and-initramfs.md`](references\u002Fkernel-image-and-initramfs.md#refresh-tool--l4t_update_initrdsh)\nfor the shell snippet, refuse paths, the \"module shadowing\" and\n\"vermagic skew\" failure modes the rebuild closes, and why\n`bootloader\u002Finitrd` (a different file) is left alone.\n\n### Summary\n\nReport:\n\n- Overlay scope: `overlay HEAD ($OVERLAY_HEAD)` or \"(empty)\".\n- Manifest scope: `mode=\u003C...>, bsp_version=\u003C...>, rebuilt_at=\u003C...>,\n  N artifacts` or \"(absent)\".\n- Collision check: `$COLLISION_CHECK`.\n- Counts:\n  - overlay: `$COPIED_OVERLAY copied, $IDENTICAL_OVERLAY identical`\n  - manifest: `$COPIED_MANIFEST copied, $IDENTICAL_MANIFEST identical`\n- Kernel Image mirror: `$KIMG_MIRRORED` and initramfs:\n  `$INITRD_STATUS` (`copied …` \u002F `rebuilt` when triggered by\n  `kernel\u002FImage` or `rootfs\u002Flib\u002Fmodules\u002F*` writes; `skipped …`\n  otherwise).\n- First \u002F last paths copied (omit if both `COPIED` totals are 0).\n- Resolved `\u003Csource.root_path>`, `\u003Cbsp_image.root_path>`.\n- Next step: `\u002Fjetson-flash-image` (or `\u002Fjetson-validate-image` if\n  the user only wanted bsp_image refreshed for inspection \u002F static\n  validation).\n\n## Limitations\n\n- **Two channels, one destination.** `bsp_image\u002FLinux_for_Tegra\u002F`\n  is written by both passes. Overlay carries customize-* outputs\n  (overlay-only edits like nvfancontrol.conf); manifest carries\n  rebuilt binaries (kernel\u002FOOT\u002FDT). The two are intentionally\n  disjoint by construction: build outputs don't go into the\n  overlay, and customize-* edits to non-build files don't enter\n  the manifest.\n- **Build manifest is the trace-to-dirty contract.** Anything in\n  the manifest came from a dirty source repo (per\n  `jetson-build-source`'s \"Write the build manifest\" step trace policy). Promoting the\n  manifest is therefore safe: every entry is a customization-bearing\n  artifact, not toolchain-divergence noise. The skill does not\n  re-derive the trace — it trusts the manifest.\n- **Manifest entries can outlive their build outputs.** If the\n  user wipes `Source\u002F.build\u002F` or `bsp_sources\u002F`'s build artifacts\n  between `jetson-build-source` and `jetson-promote-image`, the\n  manifest will reference missing files. The \"Enumerate sources (both channels)\" step refuses in that\n  case and points the user at `\u002Fjetson-build-source` to rebuild.\n- **Manifest absence is fine when only overlay edits happened.**\n  A purely overlay-side customization (e.g. `customize-fan`)\n  produces no build outputs and writes no manifest — the \"Enumerate sources (both channels)\" step is a\n  no-op, the \"Diff-aware copy into bsp_image\" step promotes only overlay files. The skill prints\n  \"manifest: (absent)\" in the summary and continues.\n- **Diff-aware, idempotent.** Re-running with no overlay commits\n  or manifest changes since the last promote is a no-op (all\n  files identical). Use this to confirm bsp_image is in sync\n  without side effects.\n- **Symlink-mount transparency.** When\n  `source.repos.Linux_for_Tegra` was overridden in\n  `jetson-init-source`, the canonical mount is a symlink into\n  `\u003Csource.root_path>\u002F.repos\u002FLinux_for_Tegra\u002F\u003Csubdir>`. `git -C`,\n  `cp -p`, and `cmp -s` all follow it transparently — no special\n  handling needed at this layer. Manifest `src` paths are\n  absolute, so symlinks under `bsp_sources\u002F` don't matter for the\n  manifest channel.\n- **`sudo` is scoped to `rootfs\u002F` destinations.** Files under\n  `rootfs\u002F` were extracted with `sudo tar xpjf` by\n  `jetson-init-image`, so they carry root ownership and special\n  mode bits the flashing toolchain reads back. `sudo cp -p`\n  preserves them. Everything else (`bootloader\u002F`, `kernel\u002F`,\n  `kernel\u002Fdtb\u002F`, `tools\u002F`, etc.) is user-owned and does not need\n  `sudo`. This applies to both channels.\n- **Channel-overlap precedence.** If the same `dst` appears in\n  both overlay and manifest, manifest wins (later in the \"Diff-aware copy into bsp_image\" step's\n  loop). This is the desired semantic — manifest entries are\n  freshly built, overlay entries may be older state. Hand-editing\n  binary files into the overlay is discouraged (Build's job\n  is to rebuild them); the precedence rule makes such mistakes\n  recoverable.\n- **`bsp_image` is read-only outside Deploy.** This skill is the\n  only writer in the normal flow (matches the workflow invariant).\n  Hand-edits to `\u003Cbsp_image.root_path>\u002FLinux_for_Tegra\u002F` outside\n  Deploy will be silently overwritten on the next promote run if\n  the same path exists in either channel; conversely they will\n  *not* be reverted if no entry shadows them. Both behaviors are\n  wrong for the diff trail — never hand-edit upstream.\n- **Scope is overlay HEAD only (channel A).** Named tags \u002F\n  manifests \u002F commit ranges are deferred (see below). To promote\n  a historical state, `git -C $LFT_SRC checkout \u003Cref>` first,\n  then re-run. The manifest channel has no ranged scope — it\n  reflects whatever `jetson-build-source`'s last run produced.\n- **No automatic rollback on partial failure.** If `cp` fails\n  partway through, `bsp_image` is left in an intermediate state.\n  Fix the underlying cause (usually permissions \u002F disk full) and\n  re-run — the \"Diff-aware copy into bsp_image\" step will resume by skipping already-promoted files.\n- **Kernel `Image` mirror + initramfs refresh.** Gated on copy-pass\n  writes to `kernel\u002FImage` or `rootfs\u002Flib\u002Fmodules\u002F*`; the mirror\n  feeds the refresh's chroot. Both are diff-aware and skipped on\n  pure-overlay edits. `tools\u002Fl4t_update_initrd.sh` must exist in\n  `bsp_image` (ships with `apply_binaries.sh`); a missing tool\n  refuses and routes to `\u002Fjetson-init-image`. See\n  [`references\u002Fkernel-image-and-initramfs.md`](references\u002Fkernel-image-and-initramfs.md)\n  for the full contract and failure modes.\n\n## Troubleshooting\n\n| Error | Cause | Solution |\n|---|---|---|\n| `Overlay has uncommitted changes at \u003CLFT_SRC>` | Customize-* edits not committed before promote | Run `git -C $LFT_SRC commit` (or stash), then re-run. |\n| `origin has N unpulled commits on \u003Cupstream>` | Remote overlay diverged from local | `git -C $LFT_SRC pull`, resolve conflicts, then re-run. |\n| `Both overlay and manifest are empty — nothing to promote` | No Customize-* commits and no Build manifest | Run a customize-* skill or `\u002Fjetson-build-source` first. |\n| `Kernel-side source(s) changed since last \u002Fjetson-build-source` | Freshness gate detected unprocessed customize-* edits under `Source\u002Fbsp_sources\u002F` | Commit pending edits, run `\u002Fjetson-build-source`, re-run promote. |\n| `Manifest entry references missing build output: \u003Csrc>` | `bsp_sources\u002F` build outputs wiped or stale manifest | Re-run `\u002Fjetson-build-source` to regenerate. |\n| `Build manifest at \u003CMANIFEST> is not valid YAML` | Manifest hand-edited or partially written | Re-run `\u002Fjetson-build-source` to rewrite the manifest. |\n| `cp: permission denied` under `rootfs\u002F` | Missing `sudo` privilege on the host | Run on an account that can `sudo cp`; re-run resumes via diff-aware copy. |\n| Profile lacks `bsp_image:` \u002F `source:` | Workspace not bootstrapped | Run `\u002Fjetson-init-image` and\u002For `\u002Fjetson-init-source`. |\n| `tool not found at \u003CLFT_DST>\u002Ftools\u002Fl4t_update_initrd.sh` | `tools\u002F` was pruned, or bsp_image extracted from a non-NVIDIA tarball | Re-run `\u002Fjetson-init-image` to repopulate. |\n| `l4t_update_initrd.sh exited non-zero` | Insufficient sudo, broken rootfs (missing `lib\u002Fmodules\u002F\u003Cver>\u002Fmodules.dep`), or out-of-space `\u002Ftmp` | Run `depmod -a -b \u003CLFT_DST>\u002Frootfs \u003Cver>` against the rootfs first; verify `\u002Ftmp` headroom; rerun promote. |\n| DUT boots with stale kernel \u002F modules after promote, modules fail to load with `disagrees about version of symbol …`, or initramfs ships pre-customize modules even after the refresh ran | The mirror \u002F refresh gate didn't fire (manual hand-edit under `\u003CLFT_DST>` outside the skill), or `rootfs\u002Fboot\u002FImage` drifted from `kernel\u002FImage` so the chrooted refresh built against the stale kernel | Force the gate by `sudo touch \u003CLFT_DST>\u002Fkernel\u002FImage` + re-run promote, or run the two steps manually: `sudo cp -p \u003CLFT_DST>\u002Fkernel\u002FImage \u003CLFT_DST>\u002Frootfs\u002Fboot\u002FImage && cd \u003CLFT_DST> && sudo .\u002Ftools\u002Fl4t_update_initrd.sh`. Then re-flash. See [`references\u002Fkernel-image-and-initramfs.md`](references\u002Fkernel-image-and-initramfs.md). |\n\n## Spec status\n\n**Locked in for v0.2.0:**\n\n- **Two-channel scope** — overlay HEAD + build manifest, both\n  diff-aware, both copying into `\u003Cbsp_image.root_path>\u002FLinux_for_Tegra\u002F`.\n- **Channel-overlap precedence** — manifest wins on `dst` collision.\n- **Source-repo collision check** — overlay only; manifest has no\n  remote concept and source repos under `bsp_sources\u002F` are not\n  fetched (their state was sealed when `jetson-build-source`\n  wrote the manifest).\n- **Atomicity** — fail-fast, no rollback. Diff-aware copy makes\n  resume natural.\n- **Audit trail** — stdout-only at promote time. The overlay\n  tracker's git log is the canonical record for channel A; the\n  manifest itself is the canonical record for channel B.\n- **Kernel Image mirror + initramfs refresh.** Locked in as a\n  paired step. The mirror copies `kernel\u002FImage` →\n  `rootfs\u002Fboot\u002FImage` whenever the copy pass touched\n  `kernel\u002FImage`; the refresh runs\n  `tools\u002Fl4t_update_initrd.sh` whenever `kernel\u002FImage` or any\n  `rootfs\u002Flib\u002Fmodules\u002F*` was promoted, rebuilding both\n  `bootloader\u002Fl4t_initrd.img` and `rootfs\u002Fboot\u002Finitrd`.\n  Inseparable because the refresh chroots into `rootfs\u002F` and\n  resolves the kernel through `\u002Fboot\u002FImage` — the mirror has to\n  run first. Closes both module-shadowing and vermagic-skew\n  failure modes; both diff-aware, both skipped on overlay-only\n  edits. Full contract in\n  [`references\u002Fkernel-image-and-initramfs.md`](references\u002Fkernel-image-and-initramfs.md).\n\n**Still deferred:**\n\n- **Named-tag \u002F commit-range scope** for the overlay channel.\n  Revisit when a \"promote release X\" use case appears.\n- **Manifest history.** Currently only the last build's manifest\n  exists; if a user wants to roll bsp_image back to a previous\n  build state, they'd need to re-run `\u002Fjetson-build-source` at\n  the prior commit. A manifest archive (saved per-build-mode or\n  per-commit) would enable rollback without rebuild.\n- **Sidecar manifest in `bsp_image`.** Revisit when promotion\n  happens on a host that does not have access to the overlay\n  tracker repo (or the workspace's manifest file).\n\n## References\n\n- [`references\u002Fkernel-image-and-initramfs.md`](references\u002Fkernel-image-and-initramfs.md) — full contract for the kernel `Image` mirror + `l4t_update_initrd.sh` refresh: shell snippets, failure modes, tool semantics, output filenames.\n- [`..\u002F..\u002Fcontext\u002Ftarget-platform-contract.md`](..\u002F..\u002Fcontext\u002Ftarget-platform-contract.md) — target-platform contract.\n- [`..\u002F..\u002Fcontext\u002Fbsp-customization-workflow.md`](..\u002F..\u002Fcontext\u002Fbsp-customization-workflow.md#workflow-invariants) — workspace edit protocol (this skill is the promote leg of Deploy).\n- [`..\u002Fjetson-init-source\u002FSKILL.md`](..\u002Fjetson-init-source\u002FSKILL.md) — Setup; materializes the overlay tracker this skill reads (channel A) and authors `source.toolchain`.\n- [`..\u002Fjetson-build-source\u002FSKILL.md`](..\u002Fjetson-build-source\u002FSKILL.md) — Build builder; writes the `.build-manifest.yaml` this skill reads (channel B).\n- [`..\u002Fjetson-flash-image\u002FSKILL.md`](..\u002Fjetson-flash-image\u002FSKILL.md) — next leg; flashes the just-promoted bsp_image to the DUT.\n- [`..\u002Fjetson-validate-image\u002FSKILL.md`](..\u002Fjetson-validate-image\u002FSKILL.md) — final leg; static + on-target validation.\n",{"data":32,"body":43},{"name":4,"description":6,"version":33,"license":23,"metadata":34},"0.0.1",{"data-classification":35,"author":36,"team":37,"tags":38,"domain":42},"public","Jetson Team","pts",[39,40,41],"bsp","promote","deploy","meta",{"type":44,"children":45},"root",[46,55,62,93,99,239,245,269,425,480,486,514,520,527,542,547,672,677,750,755,862,868,912,929,935,980,986,1015,1030,1036,1093,1145,1160,1166,1240,1274,1297,1303,1381,1405,1411,1500,1523,1529,1534,1711,1717,2148,2154,2603,2609,2617,2787,2795,2841,2847,2975],{"type":47,"tag":48,"props":49,"children":51},"element","h1",{"id":50},"promote-bsp-image",[52],{"type":53,"value":54},"text","Promote BSP Image",{"type":47,"tag":56,"props":57,"children":59},"h2",{"id":58},"purpose",[60],{"type":53,"value":61},"Purpose",{"type":47,"tag":63,"props":64,"children":65},"p",{},[66,68,75,77,83,85,91],{"type":53,"value":67},"Stage every Customize-* and Build output into ",{"type":47,"tag":69,"props":70,"children":72},"code",{"className":71},[],[73],{"type":53,"value":74},"bsp_image",{"type":53,"value":76}," so it is\nready for ",{"type":47,"tag":69,"props":78,"children":80},{"className":79},[],[81],{"type":53,"value":82},"\u002Fjetson-flash-image",{"type":53,"value":84},". This is the ",{"type":47,"tag":86,"props":87,"children":88},"strong",{},[89],{"type":53,"value":90},"promote leg of\nDeploy",{"type":53,"value":92}," — it copies files, never flashes and never builds.",{"type":47,"tag":56,"props":94,"children":96},{"id":95},"prerequisites",[97],{"type":53,"value":98},"Prerequisites",{"type":47,"tag":100,"props":101,"children":102},"ul",{},[103,140,151,170,212],{"type":47,"tag":104,"props":105,"children":106},"li",{},[107,109,115,117,123,125,131,132,138],{"type":53,"value":108},"Active target-platform profile with both ",{"type":47,"tag":69,"props":110,"children":112},{"className":111},[],[113],{"type":53,"value":114},"source:",{"type":53,"value":116}," and ",{"type":47,"tag":69,"props":118,"children":120},{"className":119},[],[121],{"type":53,"value":122},"bsp_image:",{"type":53,"value":124},"\nresolved (run ",{"type":47,"tag":69,"props":126,"children":128},{"className":127},[],[129],{"type":53,"value":130},"\u002Fjetson-init-source",{"type":53,"value":116},{"type":47,"tag":69,"props":133,"children":135},{"className":134},[],[136],{"type":53,"value":137},"\u002Fjetson-init-image",{"type":53,"value":139}," first).",{"type":47,"tag":104,"props":141,"children":142},{},[143,149],{"type":47,"tag":69,"props":144,"children":146},{"className":145},[],[147],{"type":53,"value":148},"\u003Csource.root_path>\u002FLinux_for_Tegra\u002F",{"type":53,"value":150}," initialized as a git repo\n(overlay tracker) with a clean working tree.",{"type":47,"tag":104,"props":152,"children":153},{},[154,160,162,168],{"type":47,"tag":69,"props":155,"children":157},{"className":156},[],[158],{"type":53,"value":159},"\u003Cbsp_image.root_path>\u002FLinux_for_Tegra\u002F",{"type":53,"value":161}," extracted from a BSP\ntarball + ",{"type":47,"tag":69,"props":163,"children":165},{"className":164},[],[166],{"type":53,"value":167},"apply_binaries.sh",{"type":53,"value":169}," already run.",{"type":47,"tag":104,"props":171,"children":172},{},[173,179,181,187,188,194,196,202,204,210],{"type":47,"tag":69,"props":174,"children":176},{"className":175},[],[177],{"type":53,"value":178},"git",{"type":53,"value":180},", ",{"type":47,"tag":69,"props":182,"children":184},{"className":183},[],[185],{"type":53,"value":186},"yq",{"type":53,"value":180},{"type":47,"tag":69,"props":189,"children":191},{"className":190},[],[192],{"type":53,"value":193},"cmp",{"type":53,"value":195},", and ",{"type":47,"tag":69,"props":197,"children":199},{"className":198},[],[200],{"type":53,"value":201},"sudo",{"type":53,"value":203}," (for ",{"type":47,"tag":69,"props":205,"children":207},{"className":206},[],[208],{"type":53,"value":209},"rootfs\u002F*",{"type":53,"value":211}," destinations) on\nthe host.",{"type":47,"tag":104,"props":213,"children":214},{},[215,221,223,229,231,237],{"type":47,"tag":69,"props":216,"children":218},{"className":217},[],[219],{"type":53,"value":220},"\u003Csource.root_path>\u002F.build-manifest.yaml",{"type":53,"value":222}," + ",{"type":47,"tag":69,"props":224,"children":226},{"className":225},[],[227],{"type":53,"value":228},".build-state.yaml",{"type":53,"value":230},"\nfrom ",{"type":47,"tag":69,"props":232,"children":234},{"className":233},[],[235],{"type":53,"value":236},"\u002Fjetson-build-source",{"type":53,"value":238}," (required when kernel-side repos\nhave customize-* commits).",{"type":47,"tag":56,"props":240,"children":242},{"id":241},"overview",[243],{"type":53,"value":244},"Overview",{"type":47,"tag":63,"props":246,"children":247},{},[248,250,255,257,267],{"type":53,"value":249},"This is the ",{"type":47,"tag":86,"props":251,"children":252},{},[253],{"type":53,"value":254},"promote leg of Deploy",{"type":53,"value":256}," — see\n",{"type":47,"tag":258,"props":259,"children":261},"a",{"href":260},"..\u002F..\u002Fcontext\u002Fbsp-customization-workflow.md",[262],{"type":47,"tag":69,"props":263,"children":265},{"className":264},[],[266],{"type":53,"value":260},{"type":53,"value":268},"\nfor the pipeline view. The two channels this skill walks are:",{"type":47,"tag":270,"props":271,"children":272},"table",{},[273,302],{"type":47,"tag":274,"props":275,"children":276},"thead",{},[277],{"type":47,"tag":278,"props":279,"children":280},"tr",{},[281,287,292,297],{"type":47,"tag":282,"props":283,"children":284},"th",{},[285],{"type":53,"value":286},"Channel",{"type":47,"tag":282,"props":288,"children":289},{},[290],{"type":53,"value":291},"Source",{"type":47,"tag":282,"props":293,"children":294},{},[295],{"type":53,"value":296},"Carrier",{"type":47,"tag":282,"props":298,"children":299},{},[300],{"type":53,"value":301},"Owner",{"type":47,"tag":303,"props":304,"children":305},"tbody",{},[306,361],{"type":47,"tag":278,"props":307,"children":308},{},[309,318,328,348],{"type":47,"tag":310,"props":311,"children":312},"td",{},[313],{"type":47,"tag":86,"props":314,"children":315},{},[316],{"type":53,"value":317},"Overlay tracker",{"type":47,"tag":310,"props":319,"children":320},{},[321,326],{"type":47,"tag":69,"props":322,"children":324},{"className":323},[],[325],{"type":53,"value":148},{"type":53,"value":327}," (git repo at HEAD)",{"type":47,"tag":310,"props":329,"children":330},{},[331,333,339,340,346],{"type":53,"value":332},"Customize-* outputs that don't require a build (e.g. ",{"type":47,"tag":69,"props":334,"children":336},{"className":335},[],[337],{"type":53,"value":338},"nvfancontrol.conf",{"type":53,"value":180},{"type":47,"tag":69,"props":341,"children":343},{"className":342},[],[344],{"type":53,"value":345},"nvpmodel.conf",{"type":53,"value":347},", BPMP DTB hand-edits)",{"type":47,"tag":310,"props":349,"children":350},{},[351,353,359],{"type":53,"value":352},"Customize ",{"type":47,"tag":69,"props":354,"children":356},{"className":355},[],[357],{"type":53,"value":358},"customize-*",{"type":53,"value":360}," skills commit here",{"type":47,"tag":278,"props":362,"children":363},{},[364,372,380,408],{"type":47,"tag":310,"props":365,"children":366},{},[367],{"type":47,"tag":86,"props":368,"children":369},{},[370],{"type":53,"value":371},"Build manifest",{"type":47,"tag":310,"props":373,"children":374},{},[375],{"type":47,"tag":69,"props":376,"children":378},{"className":377},[],[379],{"type":53,"value":220},{"type":47,"tag":310,"props":381,"children":382},{},[383,385,391,393,399,401,406],{"type":53,"value":384},"Rebuilt kernel ",{"type":47,"tag":69,"props":386,"children":388},{"className":387},[],[389],{"type":53,"value":390},"Image",{"type":53,"value":392},", in-tree ",{"type":47,"tag":69,"props":394,"children":396},{"className":395},[],[397],{"type":53,"value":398},".ko",{"type":53,"value":400},", OOT ",{"type":47,"tag":69,"props":402,"children":404},{"className":403},[],[405],{"type":53,"value":398},{"type":53,"value":407},", NVIDIA DTBs",{"type":47,"tag":310,"props":409,"children":410},{},[411,413,423],{"type":53,"value":412},"Build ",{"type":47,"tag":258,"props":414,"children":416},{"href":415},"..\u002Fjetson-build-source\u002FSKILL.md",[417],{"type":47,"tag":69,"props":418,"children":420},{"className":419},[],[421],{"type":53,"value":422},"jetson-build-source",{"type":53,"value":424}," writes here",{"type":47,"tag":63,"props":426,"children":427},{},[428,430,435,437,442,444,450,452,458,460,465,467,472,474,478],{"type":53,"value":429},"The skill computes the union of files to copy and writes each into\n",{"type":47,"tag":69,"props":431,"children":433},{"className":432},[],[434],{"type":53,"value":159},{"type":53,"value":436}," with diff-aware\nskip-if-identical logic. When the copy pass touches the kernel\n",{"type":47,"tag":69,"props":438,"children":440},{"className":439},[],[441],{"type":53,"value":390},{"type":53,"value":443}," or anything under ",{"type":47,"tag":69,"props":445,"children":447},{"className":446},[],[448],{"type":53,"value":449},"rootfs\u002Flib\u002Fmodules\u002F",{"type":53,"value":451},", it also rebuilds\nthe initramfs via NVIDIA's ",{"type":47,"tag":69,"props":453,"children":455},{"className":454},[],[456],{"type":53,"value":457},"tools\u002Fl4t_update_initrd.sh",{"type":53,"value":459}," so the\nfreshly promoted kernel + modules ship in the initrd the\nbootloader actually loads. After it returns, ",{"type":47,"tag":69,"props":461,"children":463},{"className":462},[],[464],{"type":53,"value":74},{"type":53,"value":466}," carries\nevery Customize and Build output. The skill does ",{"type":47,"tag":86,"props":468,"children":469},{},[470],{"type":53,"value":471},"not",{"type":53,"value":473}," flash and\ndoes ",{"type":47,"tag":86,"props":475,"children":476},{},[477],{"type":53,"value":471},{"type":53,"value":479}," modify the workspace.",{"type":47,"tag":56,"props":481,"children":483},{"id":482},"when-to-invoke",[484],{"type":53,"value":485},"When to invoke",{"type":47,"tag":100,"props":487,"children":488},{},[489,502],{"type":47,"tag":104,"props":490,"children":491},{},[492,494,500],{"type":53,"value":493},"First leg of the typical Deploy chain\n",{"type":47,"tag":69,"props":495,"children":497},{"className":496},[],[498],{"type":53,"value":499},"jetson-promote-image → jetson-flash-image → jetson-validate-image",{"type":53,"value":501},".",{"type":47,"tag":104,"props":503,"children":504},{},[505,507,512],{"type":53,"value":506},"Standalone, when the user wants ",{"type":47,"tag":69,"props":508,"children":510},{"className":509},[],[511],{"type":53,"value":74},{"type":53,"value":513}," updated but isn't\nready to flash yet (e.g. to inspect resolved files, run an\nout-of-band build that reads bsp_image, or hand bsp_image to a\nseparate flashing host).",{"type":47,"tag":56,"props":515,"children":517},{"id":516},"procedure",[518],{"type":53,"value":519},"Procedure",{"type":47,"tag":521,"props":522,"children":524},"h3",{"id":523},"resolve-active-target-paths",[525],{"type":53,"value":526},"Resolve active target + paths",{"type":47,"tag":63,"props":528,"children":529},{},[530,532,541],{"type":53,"value":531},"Resolve the active profile per the contract in\n",{"type":47,"tag":258,"props":533,"children":535},{"href":534},"..\u002F..\u002Fcontext\u002Ftarget-platform-contract.md",[536],{"type":47,"tag":69,"props":537,"children":539},{"className":538},[],[540],{"type":53,"value":534},{"type":53,"value":501},{"type":47,"tag":63,"props":543,"children":544},{},[545],{"type":53,"value":546},"Refuse and route in these cases:",{"type":47,"tag":270,"props":548,"children":549},{},[550,566],{"type":47,"tag":274,"props":551,"children":552},{},[553],{"type":47,"tag":278,"props":554,"children":555},{},[556,561],{"type":47,"tag":282,"props":557,"children":558},{},[559],{"type":53,"value":560},"Condition",{"type":47,"tag":282,"props":562,"children":563},{},[564],{"type":53,"value":565},"Refuse with",{"type":47,"tag":303,"props":567,"children":568},{},[569,603,626,649],{"type":47,"tag":278,"props":570,"children":571},{},[572,583],{"type":47,"tag":310,"props":573,"children":574},{},[575,577],{"type":53,"value":576},"No active profile, or ",{"type":47,"tag":69,"props":578,"children":580},{"className":579},[],[581],{"type":53,"value":582},"active: NA",{"type":47,"tag":310,"props":584,"children":585},{},[586,588,594,596,602],{"type":53,"value":587},"Route to ",{"type":47,"tag":69,"props":589,"children":591},{"className":590},[],[592],{"type":53,"value":593},"\u002Fjetson-set-target",{"type":53,"value":595}," or ",{"type":47,"tag":69,"props":597,"children":599},{"className":598},[],[600],{"type":53,"value":601},"\u002Fjetson-init-target",{"type":53,"value":501},{"type":47,"tag":278,"props":604,"children":605},{},[606,616],{"type":47,"tag":310,"props":607,"children":608},{},[609,611],{"type":53,"value":610},"Profile lacks ",{"type":47,"tag":69,"props":612,"children":614},{"className":613},[],[615],{"type":53,"value":122},{"type":47,"tag":310,"props":617,"children":618},{},[619,620,625],{"type":53,"value":587},{"type":47,"tag":69,"props":621,"children":623},{"className":622},[],[624],{"type":53,"value":137},{"type":53,"value":501},{"type":47,"tag":278,"props":627,"children":628},{},[629,639],{"type":47,"tag":310,"props":630,"children":631},{},[632,637],{"type":47,"tag":69,"props":633,"children":635},{"className":634},[],[636],{"type":53,"value":159},{"type":53,"value":638}," missing",{"type":47,"tag":310,"props":640,"children":641},{},[642,643,648],{"type":53,"value":587},{"type":47,"tag":69,"props":644,"children":646},{"className":645},[],[647],{"type":53,"value":137},{"type":53,"value":501},{"type":47,"tag":278,"props":650,"children":651},{},[652,662],{"type":47,"tag":310,"props":653,"children":654},{},[655,660],{"type":47,"tag":69,"props":656,"children":658},{"className":657},[],[659],{"type":53,"value":148},{"type":53,"value":661}," missing or not a git repo",{"type":47,"tag":310,"props":663,"children":664},{},[665,666,671],{"type":53,"value":587},{"type":47,"tag":69,"props":667,"children":669},{"className":668},[],[670],{"type":53,"value":130},{"type":53,"value":501},{"type":47,"tag":63,"props":673,"children":674},{},[675],{"type":53,"value":676},"Resolve paths:",{"type":47,"tag":100,"props":678,"children":679},{},[680,699,725],{"type":47,"tag":104,"props":681,"children":682},{},[683,689,691,697],{"type":47,"tag":69,"props":684,"children":686},{"className":685},[],[687],{"type":53,"value":688},"\u003Cworkspace>",{"type":53,"value":690}," = parent of the active profile's ",{"type":47,"tag":69,"props":692,"children":694},{"className":693},[],[695],{"type":53,"value":696},"target-platform\u002F",{"type":53,"value":698},"\ndirectory (discovered at load time).",{"type":47,"tag":104,"props":700,"children":701},{},[702,708,710,716,718,724],{"type":47,"tag":69,"props":703,"children":705},{"className":704},[],[706],{"type":53,"value":707},"\u003Cbsp_image.root_path>",{"type":53,"value":709}," from ",{"type":47,"tag":69,"props":711,"children":713},{"className":712},[],[714],{"type":53,"value":715},"bsp_image.root_path:",{"type":53,"value":717}," if present,\nelse ",{"type":47,"tag":69,"props":719,"children":721},{"className":720},[],[722],{"type":53,"value":723},"\u003Cworkspace>\u002FImage",{"type":53,"value":501},{"type":47,"tag":104,"props":726,"children":727},{},[728,734,735,741,743,749],{"type":47,"tag":69,"props":729,"children":731},{"className":730},[],[732],{"type":53,"value":733},"\u003Csource.root_path>",{"type":53,"value":709},{"type":47,"tag":69,"props":736,"children":738},{"className":737},[],[739],{"type":53,"value":740},"source.root_path:",{"type":53,"value":742}," if present, else\n",{"type":47,"tag":69,"props":744,"children":746},{"className":745},[],[747],{"type":53,"value":748},"\u003Cworkspace>\u002FSource",{"type":53,"value":501},{"type":47,"tag":63,"props":751,"children":752},{},[753],{"type":53,"value":754},"Bind shell variables for the rest of the procedure:",{"type":47,"tag":756,"props":757,"children":762},"pre",{"className":758,"code":759,"language":760,"meta":761,"style":761},"language-bash shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","LFT_SRC=\"\u003Csource.root_path>\u002FLinux_for_Tegra\"   # overlay tracker\nLFT_DST=\"\u003Cbsp_image.root_path>\u002FLinux_for_Tegra\"\nMANIFEST=\"\u003Csource.root_path>\u002F.build-manifest.yaml\"   # build outputs\n","bash","",[763],{"type":47,"tag":69,"props":764,"children":765},{"__ignoreMap":761},[766,805,832],{"type":47,"tag":767,"props":768,"children":771},"span",{"class":769,"line":770},"line",1,[772,778,784,789,795,799],{"type":47,"tag":767,"props":773,"children":775},{"style":774},"--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8",[776],{"type":53,"value":777},"LFT_SRC",{"type":47,"tag":767,"props":779,"children":781},{"style":780},"--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF",[782],{"type":53,"value":783},"=",{"type":47,"tag":767,"props":785,"children":786},{"style":780},[787],{"type":53,"value":788},"\"",{"type":47,"tag":767,"props":790,"children":792},{"style":791},"--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D",[793],{"type":53,"value":794},"\u003Csource.root_path>\u002FLinux_for_Tegra",{"type":47,"tag":767,"props":796,"children":797},{"style":780},[798],{"type":53,"value":788},{"type":47,"tag":767,"props":800,"children":802},{"style":801},"--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#546E7A;--shiki-default-font-style:italic;--shiki-dark:#676E95;--shiki-dark-font-style:italic",[803],{"type":53,"value":804},"   # overlay tracker\n",{"type":47,"tag":767,"props":806,"children":808},{"class":769,"line":807},2,[809,814,818,822,827],{"type":47,"tag":767,"props":810,"children":811},{"style":774},[812],{"type":53,"value":813},"LFT_DST",{"type":47,"tag":767,"props":815,"children":816},{"style":780},[817],{"type":53,"value":783},{"type":47,"tag":767,"props":819,"children":820},{"style":780},[821],{"type":53,"value":788},{"type":47,"tag":767,"props":823,"children":824},{"style":791},[825],{"type":53,"value":826},"\u003Cbsp_image.root_path>\u002FLinux_for_Tegra",{"type":47,"tag":767,"props":828,"children":829},{"style":780},[830],{"type":53,"value":831},"\"\n",{"type":47,"tag":767,"props":833,"children":835},{"class":769,"line":834},3,[836,841,845,849,853,857],{"type":47,"tag":767,"props":837,"children":838},{"style":774},[839],{"type":53,"value":840},"MANIFEST",{"type":47,"tag":767,"props":842,"children":843},{"style":780},[844],{"type":53,"value":783},{"type":47,"tag":767,"props":846,"children":847},{"style":780},[848],{"type":53,"value":788},{"type":47,"tag":767,"props":850,"children":851},{"style":791},[852],{"type":53,"value":220},{"type":47,"tag":767,"props":854,"children":855},{"style":780},[856],{"type":53,"value":788},{"type":47,"tag":767,"props":858,"children":859},{"style":801},[860],{"type":53,"value":861},"   # build outputs\n",{"type":47,"tag":521,"props":863,"children":865},{"id":864},"validate-the-two-channels",[866],{"type":53,"value":867},"Validate the two channels",{"type":47,"tag":63,"props":869,"children":870},{},[871,873,879,881,887,889,895,897,903,904,910],{"type":53,"value":872},"The skill needs at least one channel populated. Refuse if the\noverlay tracker has uncommitted changes (",{"type":47,"tag":69,"props":874,"children":876},{"className":875},[],[877],{"type":53,"value":878},"status --porcelain",{"type":53,"value":880},"\nnon-empty), if ",{"type":47,"tag":69,"props":882,"children":884},{"className":883},[],[885],{"type":53,"value":886},"$MANIFEST",{"type":53,"value":888}," exists but doesn't parse as YAML, or\nif both channels are empty. Records ",{"type":47,"tag":69,"props":890,"children":892},{"className":891},[],[893],{"type":53,"value":894},"OVERLAY_HAS_COMMITS",{"type":53,"value":896}," \u002F\n",{"type":47,"tag":69,"props":898,"children":900},{"className":899},[],[901],{"type":53,"value":902},"OVERLAY_HEAD",{"type":53,"value":116},{"type":47,"tag":69,"props":905,"children":907},{"className":906},[],[908],{"type":53,"value":909},"MANIFEST_PRESENT",{"type":53,"value":911}," for downstream steps.",{"type":47,"tag":63,"props":913,"children":914},{},[915,917,927],{"type":53,"value":916},"See ",{"type":47,"tag":258,"props":918,"children":920},{"href":919},"references\u002Fcopy-pass-snippets.md#validate-the-two-channels",[921],{"type":47,"tag":69,"props":922,"children":924},{"className":923},[],[925],{"type":53,"value":926},"references\u002Fcopy-pass-snippets.md",{"type":53,"value":928},"\nfor the shell snippet and refuse messages.",{"type":47,"tag":521,"props":930,"children":932},{"id":931},"verify-build-source-freshness",[933],{"type":53,"value":934},"Verify build-source freshness",{"type":47,"tag":63,"props":936,"children":937},{},[938,940,945,947,953,955,960,962,971,973,979],{"type":53,"value":939},"Refuse if ",{"type":47,"tag":69,"props":941,"children":943},{"className":942},[],[944],{"type":53,"value":228},{"type":53,"value":946}," shows any kernel-side repo in\n",{"type":47,"tag":69,"props":948,"children":950},{"className":949},[],[951],{"type":53,"value":952},"Source\u002Fbsp_sources\u002F",{"type":53,"value":954}," dirty since the last ",{"type":47,"tag":69,"props":956,"children":958},{"className":957},[],[959],{"type":53,"value":236},{"type":53,"value":961},"\n— otherwise the copy pass would silently ship stale artifacts.\nDetection rules + shell snippet in\n",{"type":47,"tag":258,"props":963,"children":965},{"href":964},"references\u002Fbuild-source-freshness-gate.md",[966],{"type":47,"tag":69,"props":967,"children":969},{"className":968},[],[970],{"type":53,"value":964},{"type":53,"value":972},".\nRecords ",{"type":47,"tag":69,"props":974,"children":976},{"className":975},[],[977],{"type":53,"value":978},"BUILD_FRESH=1",{"type":53,"value":501},{"type":47,"tag":521,"props":981,"children":983},{"id":982},"pre-promote-collision-check-overlay-only",[984],{"type":53,"value":985},"Pre-promote collision check (overlay only)",{"type":47,"tag":63,"props":987,"children":988},{},[989,991,997,999,1005,1007,1013],{"type":53,"value":990},"When the overlay tracks a remote, refuse if upstream has commits\nnot yet pulled. Skip gracefully when no remote is configured\n(the default ",{"type":47,"tag":69,"props":992,"children":994},{"className":993},[],[995],{"type":53,"value":996},"git init",{"type":53,"value":998}," empty tracker from ",{"type":47,"tag":69,"props":1000,"children":1002},{"className":1001},[],[1003],{"type":53,"value":1004},"jetson-init-source",{"type":53,"value":1006},").\nManifest channel has no git remote concept — this check is\noverlay-only. Records ",{"type":47,"tag":69,"props":1008,"children":1010},{"className":1009},[],[1011],{"type":53,"value":1012},"COLLISION_CHECK",{"type":53,"value":1014}," for the Summary.",{"type":47,"tag":63,"props":1016,"children":1017},{},[1018,1019,1028],{"type":53,"value":916},{"type":47,"tag":258,"props":1020,"children":1022},{"href":1021},"references\u002Fcopy-pass-snippets.md#pre-promote-collision-check-overlay-only",[1023],{"type":47,"tag":69,"props":1024,"children":1026},{"className":1025},[],[1027],{"type":53,"value":926},{"type":53,"value":1029},"\nfor the shell snippet.",{"type":47,"tag":521,"props":1031,"children":1033},{"id":1032},"enumerate-sources-both-channels",[1034],{"type":53,"value":1035},"Enumerate sources (both channels)",{"type":47,"tag":63,"props":1037,"children":1038},{},[1039,1044,1046,1052,1054,1060,1062,1068,1070,1076,1078,1084,1086,1092],{"type":47,"tag":86,"props":1040,"children":1041},{},[1042],{"type":53,"value":1043},"Channel A — overlay",{"type":53,"value":1045},": ",{"type":47,"tag":69,"props":1047,"children":1049},{"className":1048},[],[1050],{"type":53,"value":1051},"git ls-files",{"type":53,"value":1053}," against ",{"type":47,"tag":69,"props":1055,"children":1057},{"className":1056},[],[1058],{"type":53,"value":1059},"$LFT_SRC",{"type":53,"value":1061}," is\nthe source of truth (transparent to symlink mounts when\n",{"type":47,"tag":69,"props":1063,"children":1065},{"className":1064},[],[1066],{"type":53,"value":1067},"source.repos.Linux_for_Tegra",{"type":53,"value":1069}," was overridden, excludes\nuntracked \u002F ",{"type":47,"tag":69,"props":1071,"children":1073},{"className":1072},[],[1074],{"type":53,"value":1075},".gitignore",{"type":53,"value":1077},"d files). Each entry maps\n",{"type":47,"tag":69,"props":1079,"children":1081},{"className":1080},[],[1082],{"type":53,"value":1083},"src = $LFT_SRC\u002F\u003Crel>",{"type":53,"value":1085}," → ",{"type":47,"tag":69,"props":1087,"children":1089},{"className":1088},[],[1090],{"type":53,"value":1091},"dst = $LFT_DST\u002F\u003Crel>",{"type":53,"value":501},{"type":47,"tag":63,"props":1094,"children":1095},{},[1096,1101,1103,1109,1111,1116,1118,1124,1126,1131,1133,1144],{"type":47,"tag":86,"props":1097,"children":1098},{},[1099],{"type":53,"value":1100},"Channel B — manifest",{"type":53,"value":1102},": parse ",{"type":47,"tag":69,"props":1104,"children":1106},{"className":1105},[],[1107],{"type":53,"value":1108},"artifacts[].{src,dst}",{"type":53,"value":1110}," from\n",{"type":47,"tag":69,"props":1112,"children":1114},{"className":1113},[],[1115],{"type":53,"value":886},{"type":53,"value":1117},". Refuse if any ",{"type":47,"tag":69,"props":1119,"children":1121},{"className":1120},[],[1122],{"type":53,"value":1123},"src",{"type":53,"value":1125}," is missing on disk (build was\ninterrupted, or manifest stale — re-run ",{"type":47,"tag":69,"props":1127,"children":1129},{"className":1128},[],[1130],{"type":53,"value":236},{"type":53,"value":1132},").\nThe manifest schema is written by\n",{"type":47,"tag":258,"props":1134,"children":1136},{"href":1135},"..\u002Fjetson-build-source\u002Freferences\u002Fmanifest-schema.md",[1137,1142],{"type":47,"tag":69,"props":1138,"children":1140},{"className":1139},[],[1141],{"type":53,"value":422},{"type":53,"value":1143}," v0.2.0",{"type":53,"value":501},{"type":47,"tag":63,"props":1146,"children":1147},{},[1148,1149,1158],{"type":53,"value":916},{"type":47,"tag":258,"props":1150,"children":1152},{"href":1151},"references\u002Fcopy-pass-snippets.md#enumerate-sources",[1153],{"type":47,"tag":69,"props":1154,"children":1156},{"className":1155},[],[1157],{"type":53,"value":926},{"type":53,"value":1159},"\nfor both shell snippets and the manifest YAML schema.",{"type":47,"tag":521,"props":1161,"children":1163},{"id":1162},"diff-aware-copy-into-bsp_image",[1164],{"type":53,"value":1165},"Diff-aware copy into bsp_image",{"type":47,"tag":63,"props":1167,"children":1168},{},[1169,1171,1177,1179,1185,1187,1192,1194,1199,1201,1207,1209,1215,1216,1222,1224,1230,1232,1238],{"type":53,"value":1170},"Iterate the union of overlay files and manifest entries. For\neach ",{"type":47,"tag":69,"props":1172,"children":1174},{"className":1173},[],[1175],{"type":53,"value":1176},"dst",{"type":53,"value":1178},": if byte-identical, skip; otherwise ",{"type":47,"tag":69,"props":1180,"children":1182},{"className":1181},[],[1183],{"type":53,"value":1184},"cp -p",{"type":53,"value":1186}," (with\n",{"type":47,"tag":69,"props":1188,"children":1190},{"className":1189},[],[1191],{"type":53,"value":201},{"type":53,"value":1193}," for ",{"type":47,"tag":69,"props":1195,"children":1197},{"className":1196},[],[1198],{"type":53,"value":209},{"type":53,"value":1200}," destinations, where the sample rootfs\nwas extracted as root). Tag ",{"type":47,"tag":69,"props":1202,"children":1204},{"className":1203},[],[1205],{"type":53,"value":1206},"INITRD_DIRTY=1",{"type":53,"value":1208}," on any\n",{"type":47,"tag":69,"props":1210,"children":1212},{"className":1211},[],[1213],{"type":53,"value":1214},"rootfs\u002Flib\u002Fmodules\u002F*",{"type":53,"value":595},{"type":47,"tag":69,"props":1217,"children":1219},{"className":1218},[],[1220],{"type":53,"value":1221},"kernel\u002FImage",{"type":53,"value":1223}," write — the\n\"Refresh initramfs\" step gates on this flag. Counts \u002F\n",{"type":47,"tag":69,"props":1225,"children":1227},{"className":1226},[],[1228],{"type":53,"value":1229},"FIRST",{"type":53,"value":1231}," \u002F ",{"type":47,"tag":69,"props":1233,"children":1235},{"className":1234},[],[1236],{"type":53,"value":1237},"LAST",{"type":53,"value":1239}," are recorded for the Summary.",{"type":47,"tag":63,"props":1241,"children":1242},{},[1243,1245,1251,1253,1258,1260,1265,1267,1272],{"type":53,"value":1244},"Fail-fast: if any ",{"type":47,"tag":69,"props":1246,"children":1248},{"className":1247},[],[1249],{"type":53,"value":1250},"cp",{"type":53,"value":1252}," fails, surface the failed path and stop.\n",{"type":47,"tag":69,"props":1254,"children":1256},{"className":1255},[],[1257],{"type":53,"value":74},{"type":53,"value":1259}," may be left partially updated — re-running after\nfixing the cause resumes via the diff-aware skip. ",{"type":47,"tag":86,"props":1261,"children":1262},{},[1263],{"type":53,"value":1264},"Channel\norder",{"type":53,"value":1266}," is overlay first, then manifest: on a ",{"type":47,"tag":69,"props":1268,"children":1270},{"className":1269},[],[1271],{"type":53,"value":1176},{"type":53,"value":1273}," collision\nthe manifest wins (freshly built artifact beats the older\noverlay copy).",{"type":47,"tag":63,"props":1275,"children":1276},{},[1277,1278,1287,1289,1295],{"type":53,"value":916},{"type":47,"tag":258,"props":1279,"children":1281},{"href":1280},"references\u002Fcopy-pass-snippets.md#diff-aware-copy-into-bsp_image",[1282],{"type":47,"tag":69,"props":1283,"children":1285},{"className":1284},[],[1286],{"type":53,"value":926},{"type":53,"value":1288},"\nfor the ",{"type":47,"tag":69,"props":1290,"children":1292},{"className":1291},[],[1293],{"type":53,"value":1294},"copy_one()",{"type":53,"value":1296}," function and the two driving loops.",{"type":47,"tag":521,"props":1298,"children":1300},{"id":1299},"mirror-kernel-image-into-rootfs-when-kernel-changed",[1301],{"type":53,"value":1302},"Mirror kernel Image into rootfs (when kernel changed)",{"type":47,"tag":63,"props":1304,"children":1305},{},[1306,1308,1313,1315,1320,1322,1328,1330,1336,1338,1344,1346,1351,1353,1358,1359,1365,1367,1372,1374,1379],{"type":53,"value":1307},"The kernel ",{"type":47,"tag":69,"props":1309,"children":1311},{"className":1310},[],[1312],{"type":53,"value":390},{"type":53,"value":1314}," lives in two paths inside ",{"type":47,"tag":69,"props":1316,"children":1318},{"className":1317},[],[1319],{"type":53,"value":74},{"type":53,"value":1321},":\n",{"type":47,"tag":69,"props":1323,"children":1325},{"className":1324},[],[1326],{"type":53,"value":1327},"\u003CLFT_DST>\u002Fkernel\u002FImage",{"type":53,"value":1329}," (read by the flash tool) and\n",{"type":47,"tag":69,"props":1331,"children":1333},{"className":1332},[],[1334],{"type":53,"value":1335},"\u003CLFT_DST>\u002Frootfs\u002Fboot\u002FImage",{"type":53,"value":1337}," (the rootfs-side copy, visible as\n",{"type":47,"tag":69,"props":1339,"children":1341},{"className":1340},[],[1342],{"type":53,"value":1343},"\u002Fboot\u002FImage",{"type":53,"value":1345}," from inside the rootfs chroot the refresh tool\nwill run in). The build manifest only carries the ",{"type":47,"tag":69,"props":1347,"children":1349},{"className":1348},[],[1350],{"type":53,"value":1221},{"type":53,"value":1352},"\ndst, so this step mirrors ",{"type":47,"tag":69,"props":1354,"children":1356},{"className":1355},[],[1357],{"type":53,"value":1221},{"type":53,"value":1085},{"type":47,"tag":69,"props":1360,"children":1362},{"className":1361},[],[1363],{"type":53,"value":1364},"rootfs\u002Fboot\u002FImage",{"type":53,"value":1366},"\n(diff-aware, no-op when already in sync) so the chrooted refresh\ntool resolves the kernel against the freshly promoted binary,\nnot the stale rootfs copy. The mirror also sets ",{"type":47,"tag":69,"props":1368,"children":1370},{"className":1369},[],[1371],{"type":53,"value":1206},{"type":53,"value":1373},"\nso a kernel-only promote (no ",{"type":47,"tag":69,"props":1375,"children":1377},{"className":1376},[],[1378],{"type":53,"value":1214},{"type":53,"value":1380}," writes) still\ntriggers the refresh.",{"type":47,"tag":63,"props":1382,"children":1383},{},[1384,1385,1395,1397,1403],{"type":53,"value":916},{"type":47,"tag":258,"props":1386,"children":1388},{"href":1387},"references\u002Fkernel-image-and-initramfs.md#mirror-semantics--kernel-image-lands-in-two-places",[1389],{"type":47,"tag":69,"props":1390,"children":1392},{"className":1391},[],[1393],{"type":53,"value":1394},"references\u002Fkernel-image-and-initramfs.md",{"type":53,"value":1396},"\nfor the shell snippet, the failure mode this prevents, and the\n",{"type":47,"tag":69,"props":1398,"children":1400},{"className":1399},[],[1401],{"type":53,"value":1402},"INITRD_DIRTY",{"type":53,"value":1404}," corner case.",{"type":47,"tag":521,"props":1406,"children":1408},{"id":1407},"refresh-initramfs-when-kernel-or-modules-changed",[1409],{"type":53,"value":1410},"Refresh initramfs (when kernel or modules changed)",{"type":47,"tag":63,"props":1412,"children":1413},{},[1414,1416,1421,1422,1428,1430,1435,1437,1443,1445,1451,1453,1459,1461,1467,1469,1475,1477,1483,1485,1491,1493,1498],{"type":53,"value":1415},"Run ",{"type":47,"tag":69,"props":1417,"children":1419},{"className":1418},[],[1420],{"type":53,"value":457},{"type":53,"value":709},{"type":47,"tag":69,"props":1423,"children":1425},{"className":1424},[],[1426],{"type":53,"value":1427},"\u003CLFT_DST>\u002F",{"type":53,"value":1429}," whenever\n",{"type":47,"tag":69,"props":1431,"children":1433},{"className":1432},[],[1434],{"type":53,"value":1206},{"type":53,"value":1436}," (set by the diff-aware copy or the mirror step\nabove). The tool chroots into ",{"type":47,"tag":69,"props":1438,"children":1440},{"className":1439},[],[1441],{"type":53,"value":1442},"rootfs\u002F",{"type":53,"value":1444},", runs NVIDIA's\n",{"type":47,"tag":69,"props":1446,"children":1448},{"className":1447},[],[1449],{"type":53,"value":1450},"nv-update-initrd",{"type":53,"value":1452},", and writes both\n",{"type":47,"tag":69,"props":1454,"children":1456},{"className":1455},[],[1457],{"type":53,"value":1458},"\u003CLFT_DST>\u002Fbootloader\u002Fl4t_initrd.img",{"type":53,"value":1460}," (used by the flash tool)\nand ",{"type":47,"tag":69,"props":1462,"children":1464},{"className":1463},[],[1465],{"type":53,"value":1466},"\u003CLFT_DST>\u002Frootfs\u002Fboot\u002Finitrd",{"type":53,"value":1468}," (",{"type":47,"tag":69,"props":1470,"children":1472},{"className":1471},[],[1473],{"type":53,"value":1474},"\u002Fboot\u002Finitrd",{"type":53,"value":1476}," on the DUT).\nIdempotent; ~30 s. Skip when ",{"type":47,"tag":69,"props":1478,"children":1480},{"className":1479},[],[1481],{"type":53,"value":1482},"INITRD_DIRTY=0",{"type":53,"value":1484}," (overlay-only\nedits). DUT-side workarounds (",{"type":47,"tag":69,"props":1486,"children":1488},{"className":1487},[],[1489],{"type":53,"value":1490},"update-initramfs -u",{"type":53,"value":1492}," + manual\n",{"type":47,"tag":69,"props":1494,"children":1496},{"className":1495},[],[1497],{"type":53,"value":1250},{"type":53,"value":1499},") are out of scope — fix the gap here so flash ships a\ncoherent image.",{"type":47,"tag":63,"props":1501,"children":1502},{},[1503,1504,1513,1515,1521],{"type":53,"value":916},{"type":47,"tag":258,"props":1505,"children":1507},{"href":1506},"references\u002Fkernel-image-and-initramfs.md#refresh-tool--l4t_update_initrdsh",[1508],{"type":47,"tag":69,"props":1509,"children":1511},{"className":1510},[],[1512],{"type":53,"value":1394},{"type":53,"value":1514},"\nfor the shell snippet, refuse paths, the \"module shadowing\" and\n\"vermagic skew\" failure modes the rebuild closes, and why\n",{"type":47,"tag":69,"props":1516,"children":1518},{"className":1517},[],[1519],{"type":53,"value":1520},"bootloader\u002Finitrd",{"type":53,"value":1522}," (a different file) is left alone.",{"type":47,"tag":521,"props":1524,"children":1526},{"id":1525},"summary",[1527],{"type":53,"value":1528},"Summary",{"type":47,"tag":63,"props":1530,"children":1531},{},[1532],{"type":53,"value":1533},"Report:",{"type":47,"tag":100,"props":1535,"children":1536},{},[1537,1550,1563,1575,1605,1661,1674,1691],{"type":47,"tag":104,"props":1538,"children":1539},{},[1540,1542,1548],{"type":53,"value":1541},"Overlay scope: ",{"type":47,"tag":69,"props":1543,"children":1545},{"className":1544},[],[1546],{"type":53,"value":1547},"overlay HEAD ($OVERLAY_HEAD)",{"type":53,"value":1549}," or \"(empty)\".",{"type":47,"tag":104,"props":1551,"children":1552},{},[1553,1555,1561],{"type":53,"value":1554},"Manifest scope: ",{"type":47,"tag":69,"props":1556,"children":1558},{"className":1557},[],[1559],{"type":53,"value":1560},"mode=\u003C...>, bsp_version=\u003C...>, rebuilt_at=\u003C...>, N artifacts",{"type":53,"value":1562}," or \"(absent)\".",{"type":47,"tag":104,"props":1564,"children":1565},{},[1566,1568,1574],{"type":53,"value":1567},"Collision check: ",{"type":47,"tag":69,"props":1569,"children":1571},{"className":1570},[],[1572],{"type":53,"value":1573},"$COLLISION_CHECK",{"type":53,"value":501},{"type":47,"tag":104,"props":1576,"children":1577},{},[1578,1580],{"type":53,"value":1579},"Counts:\n",{"type":47,"tag":100,"props":1581,"children":1582},{},[1583,1594],{"type":47,"tag":104,"props":1584,"children":1585},{},[1586,1588],{"type":53,"value":1587},"overlay: ",{"type":47,"tag":69,"props":1589,"children":1591},{"className":1590},[],[1592],{"type":53,"value":1593},"$COPIED_OVERLAY copied, $IDENTICAL_OVERLAY identical",{"type":47,"tag":104,"props":1595,"children":1596},{},[1597,1599],{"type":53,"value":1598},"manifest: ",{"type":47,"tag":69,"props":1600,"children":1602},{"className":1601},[],[1603],{"type":53,"value":1604},"$COPIED_MANIFEST copied, $IDENTICAL_MANIFEST identical",{"type":47,"tag":104,"props":1606,"children":1607},{},[1608,1610,1616,1618,1624,1625,1631,1632,1638,1640,1645,1646,1651,1653,1659],{"type":53,"value":1609},"Kernel Image mirror: ",{"type":47,"tag":69,"props":1611,"children":1613},{"className":1612},[],[1614],{"type":53,"value":1615},"$KIMG_MIRRORED",{"type":53,"value":1617}," and initramfs:\n",{"type":47,"tag":69,"props":1619,"children":1621},{"className":1620},[],[1622],{"type":53,"value":1623},"$INITRD_STATUS",{"type":53,"value":1468},{"type":47,"tag":69,"props":1626,"children":1628},{"className":1627},[],[1629],{"type":53,"value":1630},"copied …",{"type":53,"value":1231},{"type":47,"tag":69,"props":1633,"children":1635},{"className":1634},[],[1636],{"type":53,"value":1637},"rebuilt",{"type":53,"value":1639}," when triggered by\n",{"type":47,"tag":69,"props":1641,"children":1643},{"className":1642},[],[1644],{"type":53,"value":1221},{"type":53,"value":595},{"type":47,"tag":69,"props":1647,"children":1649},{"className":1648},[],[1650],{"type":53,"value":1214},{"type":53,"value":1652}," writes; ",{"type":47,"tag":69,"props":1654,"children":1656},{"className":1655},[],[1657],{"type":53,"value":1658},"skipped …",{"type":53,"value":1660},"\notherwise).",{"type":47,"tag":104,"props":1662,"children":1663},{},[1664,1666,1672],{"type":53,"value":1665},"First \u002F last paths copied (omit if both ",{"type":47,"tag":69,"props":1667,"children":1669},{"className":1668},[],[1670],{"type":53,"value":1671},"COPIED",{"type":53,"value":1673}," totals are 0).",{"type":47,"tag":104,"props":1675,"children":1676},{},[1677,1679,1684,1685,1690],{"type":53,"value":1678},"Resolved ",{"type":47,"tag":69,"props":1680,"children":1682},{"className":1681},[],[1683],{"type":53,"value":733},{"type":53,"value":180},{"type":47,"tag":69,"props":1686,"children":1688},{"className":1687},[],[1689],{"type":53,"value":707},{"type":53,"value":501},{"type":47,"tag":104,"props":1692,"children":1693},{},[1694,1696,1701,1703,1709],{"type":53,"value":1695},"Next step: ",{"type":47,"tag":69,"props":1697,"children":1699},{"className":1698},[],[1700],{"type":53,"value":82},{"type":53,"value":1702}," (or ",{"type":47,"tag":69,"props":1704,"children":1706},{"className":1705},[],[1707],{"type":53,"value":1708},"\u002Fjetson-validate-image",{"type":53,"value":1710}," if\nthe user only wanted bsp_image refreshed for inspection \u002F static\nvalidation).",{"type":47,"tag":56,"props":1712,"children":1714},{"id":1713},"limitations",[1715],{"type":53,"value":1716},"Limitations",{"type":47,"tag":100,"props":1718,"children":1719},{},[1720,1738,1755,1800,1818,1828,1896,1985,2002,2031,2056,2080],{"type":47,"tag":104,"props":1721,"children":1722},{},[1723,1728,1730,1736],{"type":47,"tag":86,"props":1724,"children":1725},{},[1726],{"type":53,"value":1727},"Two channels, one destination.",{"type":53,"value":1729}," ",{"type":47,"tag":69,"props":1731,"children":1733},{"className":1732},[],[1734],{"type":53,"value":1735},"bsp_image\u002FLinux_for_Tegra\u002F",{"type":53,"value":1737},"\nis written by both passes. Overlay carries customize-* outputs\n(overlay-only edits like nvfancontrol.conf); manifest carries\nrebuilt binaries (kernel\u002FOOT\u002FDT). The two are intentionally\ndisjoint by construction: build outputs don't go into the\noverlay, and customize-* edits to non-build files don't enter\nthe manifest.",{"type":47,"tag":104,"props":1739,"children":1740},{},[1741,1746,1748,1753],{"type":47,"tag":86,"props":1742,"children":1743},{},[1744],{"type":53,"value":1745},"Build manifest is the trace-to-dirty contract.",{"type":53,"value":1747}," Anything in\nthe manifest came from a dirty source repo (per\n",{"type":47,"tag":69,"props":1749,"children":1751},{"className":1750},[],[1752],{"type":53,"value":422},{"type":53,"value":1754},"'s \"Write the build manifest\" step trace policy). Promoting the\nmanifest is therefore safe: every entry is a customization-bearing\nartifact, not toolchain-divergence noise. The skill does not\nre-derive the trace — it trusts the manifest.",{"type":47,"tag":104,"props":1756,"children":1757},{},[1758,1763,1765,1771,1772,1778,1780,1785,1786,1791,1793,1798],{"type":47,"tag":86,"props":1759,"children":1760},{},[1761],{"type":53,"value":1762},"Manifest entries can outlive their build outputs.",{"type":53,"value":1764}," If the\nuser wipes ",{"type":47,"tag":69,"props":1766,"children":1768},{"className":1767},[],[1769],{"type":53,"value":1770},"Source\u002F.build\u002F",{"type":53,"value":595},{"type":47,"tag":69,"props":1773,"children":1775},{"className":1774},[],[1776],{"type":53,"value":1777},"bsp_sources\u002F",{"type":53,"value":1779},"'s build artifacts\nbetween ",{"type":47,"tag":69,"props":1781,"children":1783},{"className":1782},[],[1784],{"type":53,"value":422},{"type":53,"value":116},{"type":47,"tag":69,"props":1787,"children":1789},{"className":1788},[],[1790],{"type":53,"value":4},{"type":53,"value":1792},", the\nmanifest will reference missing files. The \"Enumerate sources (both channels)\" step refuses in that\ncase and points the user at ",{"type":47,"tag":69,"props":1794,"children":1796},{"className":1795},[],[1797],{"type":53,"value":236},{"type":53,"value":1799}," to rebuild.",{"type":47,"tag":104,"props":1801,"children":1802},{},[1803,1808,1810,1816],{"type":47,"tag":86,"props":1804,"children":1805},{},[1806],{"type":53,"value":1807},"Manifest absence is fine when only overlay edits happened.",{"type":53,"value":1809},"\nA purely overlay-side customization (e.g. ",{"type":47,"tag":69,"props":1811,"children":1813},{"className":1812},[],[1814],{"type":53,"value":1815},"customize-fan",{"type":53,"value":1817},")\nproduces no build outputs and writes no manifest — the \"Enumerate sources (both channels)\" step is a\nno-op, the \"Diff-aware copy into bsp_image\" step promotes only overlay files. The skill prints\n\"manifest: (absent)\" in the summary and continues.",{"type":47,"tag":104,"props":1819,"children":1820},{},[1821,1826],{"type":47,"tag":86,"props":1822,"children":1823},{},[1824],{"type":53,"value":1825},"Diff-aware, idempotent.",{"type":53,"value":1827}," Re-running with no overlay commits\nor manifest changes since the last promote is a no-op (all\nfiles identical). Use this to confirm bsp_image is in sync\nwithout side effects.",{"type":47,"tag":104,"props":1829,"children":1830},{},[1831,1836,1838,1843,1845,1850,1852,1858,1860,1866,1868,1873,1874,1880,1882,1887,1889,1894],{"type":47,"tag":86,"props":1832,"children":1833},{},[1834],{"type":53,"value":1835},"Symlink-mount transparency.",{"type":53,"value":1837}," When\n",{"type":47,"tag":69,"props":1839,"children":1841},{"className":1840},[],[1842],{"type":53,"value":1067},{"type":53,"value":1844}," was overridden in\n",{"type":47,"tag":69,"props":1846,"children":1848},{"className":1847},[],[1849],{"type":53,"value":1004},{"type":53,"value":1851},", the canonical mount is a symlink into\n",{"type":47,"tag":69,"props":1853,"children":1855},{"className":1854},[],[1856],{"type":53,"value":1857},"\u003Csource.root_path>\u002F.repos\u002FLinux_for_Tegra\u002F\u003Csubdir>",{"type":53,"value":1859},". ",{"type":47,"tag":69,"props":1861,"children":1863},{"className":1862},[],[1864],{"type":53,"value":1865},"git -C",{"type":53,"value":1867},",\n",{"type":47,"tag":69,"props":1869,"children":1871},{"className":1870},[],[1872],{"type":53,"value":1184},{"type":53,"value":195},{"type":47,"tag":69,"props":1875,"children":1877},{"className":1876},[],[1878],{"type":53,"value":1879},"cmp -s",{"type":53,"value":1881}," all follow it transparently — no special\nhandling needed at this layer. Manifest ",{"type":47,"tag":69,"props":1883,"children":1885},{"className":1884},[],[1886],{"type":53,"value":1123},{"type":53,"value":1888}," paths are\nabsolute, so symlinks under ",{"type":47,"tag":69,"props":1890,"children":1892},{"className":1891},[],[1893],{"type":53,"value":1777},{"type":53,"value":1895}," don't matter for the\nmanifest channel.",{"type":47,"tag":104,"props":1897,"children":1898},{},[1899,1916,1918,1923,1925,1931,1933,1939,1941,1947,1949,1955,1956,1962,1963,1969,1970,1976,1978,1983],{"type":47,"tag":86,"props":1900,"children":1901},{},[1902,1907,1909,1914],{"type":47,"tag":69,"props":1903,"children":1905},{"className":1904},[],[1906],{"type":53,"value":201},{"type":53,"value":1908}," is scoped to ",{"type":47,"tag":69,"props":1910,"children":1912},{"className":1911},[],[1913],{"type":53,"value":1442},{"type":53,"value":1915}," destinations.",{"type":53,"value":1917}," Files under\n",{"type":47,"tag":69,"props":1919,"children":1921},{"className":1920},[],[1922],{"type":53,"value":1442},{"type":53,"value":1924}," were extracted with ",{"type":47,"tag":69,"props":1926,"children":1928},{"className":1927},[],[1929],{"type":53,"value":1930},"sudo tar xpjf",{"type":53,"value":1932}," by\n",{"type":47,"tag":69,"props":1934,"children":1936},{"className":1935},[],[1937],{"type":53,"value":1938},"jetson-init-image",{"type":53,"value":1940},", so they carry root ownership and special\nmode bits the flashing toolchain reads back. ",{"type":47,"tag":69,"props":1942,"children":1944},{"className":1943},[],[1945],{"type":53,"value":1946},"sudo cp -p",{"type":53,"value":1948},"\npreserves them. Everything else (",{"type":47,"tag":69,"props":1950,"children":1952},{"className":1951},[],[1953],{"type":53,"value":1954},"bootloader\u002F",{"type":53,"value":180},{"type":47,"tag":69,"props":1957,"children":1959},{"className":1958},[],[1960],{"type":53,"value":1961},"kernel\u002F",{"type":53,"value":1867},{"type":47,"tag":69,"props":1964,"children":1966},{"className":1965},[],[1967],{"type":53,"value":1968},"kernel\u002Fdtb\u002F",{"type":53,"value":180},{"type":47,"tag":69,"props":1971,"children":1973},{"className":1972},[],[1974],{"type":53,"value":1975},"tools\u002F",{"type":53,"value":1977},", etc.) is user-owned and does not need\n",{"type":47,"tag":69,"props":1979,"children":1981},{"className":1980},[],[1982],{"type":53,"value":201},{"type":53,"value":1984},". This applies to both channels.",{"type":47,"tag":104,"props":1986,"children":1987},{},[1988,1993,1995,2000],{"type":47,"tag":86,"props":1989,"children":1990},{},[1991],{"type":53,"value":1992},"Channel-overlap precedence.",{"type":53,"value":1994}," If the same ",{"type":47,"tag":69,"props":1996,"children":1998},{"className":1997},[],[1999],{"type":53,"value":1176},{"type":53,"value":2001}," appears in\nboth overlay and manifest, manifest wins (later in the \"Diff-aware copy into bsp_image\" step's\nloop). This is the desired semantic — manifest entries are\nfreshly built, overlay entries may be older state. Hand-editing\nbinary files into the overlay is discouraged (Build's job\nis to rebuild them); the precedence rule makes such mistakes\nrecoverable.",{"type":47,"tag":104,"props":2003,"children":2004},{},[2005,2015,2017,2022,2024,2029],{"type":47,"tag":86,"props":2006,"children":2007},{},[2008,2013],{"type":47,"tag":69,"props":2009,"children":2011},{"className":2010},[],[2012],{"type":53,"value":74},{"type":53,"value":2014}," is read-only outside Deploy.",{"type":53,"value":2016}," This skill is the\nonly writer in the normal flow (matches the workflow invariant).\nHand-edits to ",{"type":47,"tag":69,"props":2018,"children":2020},{"className":2019},[],[2021],{"type":53,"value":159},{"type":53,"value":2023}," outside\nDeploy will be silently overwritten on the next promote run if\nthe same path exists in either channel; conversely they will\n",{"type":47,"tag":2025,"props":2026,"children":2027},"em",{},[2028],{"type":53,"value":471},{"type":53,"value":2030}," be reverted if no entry shadows them. Both behaviors are\nwrong for the diff trail — never hand-edit upstream.",{"type":47,"tag":104,"props":2032,"children":2033},{},[2034,2039,2041,2047,2049,2054],{"type":47,"tag":86,"props":2035,"children":2036},{},[2037],{"type":53,"value":2038},"Scope is overlay HEAD only (channel A).",{"type":53,"value":2040}," Named tags \u002F\nmanifests \u002F commit ranges are deferred (see below). To promote\na historical state, ",{"type":47,"tag":69,"props":2042,"children":2044},{"className":2043},[],[2045],{"type":53,"value":2046},"git -C $LFT_SRC checkout \u003Cref>",{"type":53,"value":2048}," first,\nthen re-run. The manifest channel has no ranged scope — it\nreflects whatever ",{"type":47,"tag":69,"props":2050,"children":2052},{"className":2051},[],[2053],{"type":53,"value":422},{"type":53,"value":2055},"'s last run produced.",{"type":47,"tag":104,"props":2057,"children":2058},{},[2059,2064,2066,2071,2073,2078],{"type":47,"tag":86,"props":2060,"children":2061},{},[2062],{"type":53,"value":2063},"No automatic rollback on partial failure.",{"type":53,"value":2065}," If ",{"type":47,"tag":69,"props":2067,"children":2069},{"className":2068},[],[2070],{"type":53,"value":1250},{"type":53,"value":2072}," fails\npartway through, ",{"type":47,"tag":69,"props":2074,"children":2076},{"className":2075},[],[2077],{"type":53,"value":74},{"type":53,"value":2079}," is left in an intermediate state.\nFix the underlying cause (usually permissions \u002F disk full) and\nre-run — the \"Diff-aware copy into bsp_image\" step will resume by skipping already-promoted files.",{"type":47,"tag":104,"props":2081,"children":2082},{},[2083,2095,2097,2102,2103,2108,2110,2115,2117,2122,2124,2129,2131,2136,2138,2146],{"type":47,"tag":86,"props":2084,"children":2085},{},[2086,2088,2093],{"type":53,"value":2087},"Kernel ",{"type":47,"tag":69,"props":2089,"children":2091},{"className":2090},[],[2092],{"type":53,"value":390},{"type":53,"value":2094}," mirror + initramfs refresh.",{"type":53,"value":2096}," Gated on copy-pass\nwrites to ",{"type":47,"tag":69,"props":2098,"children":2100},{"className":2099},[],[2101],{"type":53,"value":1221},{"type":53,"value":595},{"type":47,"tag":69,"props":2104,"children":2106},{"className":2105},[],[2107],{"type":53,"value":1214},{"type":53,"value":2109},"; the mirror\nfeeds the refresh's chroot. Both are diff-aware and skipped on\npure-overlay edits. ",{"type":47,"tag":69,"props":2111,"children":2113},{"className":2112},[],[2114],{"type":53,"value":457},{"type":53,"value":2116}," must exist in\n",{"type":47,"tag":69,"props":2118,"children":2120},{"className":2119},[],[2121],{"type":53,"value":74},{"type":53,"value":2123}," (ships with ",{"type":47,"tag":69,"props":2125,"children":2127},{"className":2126},[],[2128],{"type":53,"value":167},{"type":53,"value":2130},"); a missing tool\nrefuses and routes to ",{"type":47,"tag":69,"props":2132,"children":2134},{"className":2133},[],[2135],{"type":53,"value":137},{"type":53,"value":2137},". See\n",{"type":47,"tag":258,"props":2139,"children":2140},{"href":1394},[2141],{"type":47,"tag":69,"props":2142,"children":2144},{"className":2143},[],[2145],{"type":53,"value":1394},{"type":53,"value":2147},"\nfor the full contract and failure modes.",{"type":47,"tag":56,"props":2149,"children":2151},{"id":2150},"troubleshooting",[2152],{"type":53,"value":2153},"Troubleshooting",{"type":47,"tag":270,"props":2155,"children":2156},{},[2157,2178],{"type":47,"tag":274,"props":2158,"children":2159},{},[2160],{"type":47,"tag":278,"props":2161,"children":2162},{},[2163,2168,2173],{"type":47,"tag":282,"props":2164,"children":2165},{},[2166],{"type":53,"value":2167},"Error",{"type":47,"tag":282,"props":2169,"children":2170},{},[2171],{"type":53,"value":2172},"Cause",{"type":47,"tag":282,"props":2174,"children":2175},{},[2176],{"type":53,"value":2177},"Solution",{"type":47,"tag":303,"props":2179,"children":2180},{},[2181,2210,2238,2267,2301,2335,2363,2407,2447,2480,2530],{"type":47,"tag":278,"props":2182,"children":2183},{},[2184,2193,2198],{"type":47,"tag":310,"props":2185,"children":2186},{},[2187],{"type":47,"tag":69,"props":2188,"children":2190},{"className":2189},[],[2191],{"type":53,"value":2192},"Overlay has uncommitted changes at \u003CLFT_SRC>",{"type":47,"tag":310,"props":2194,"children":2195},{},[2196],{"type":53,"value":2197},"Customize-* edits not committed before promote",{"type":47,"tag":310,"props":2199,"children":2200},{},[2201,2202,2208],{"type":53,"value":1415},{"type":47,"tag":69,"props":2203,"children":2205},{"className":2204},[],[2206],{"type":53,"value":2207},"git -C $LFT_SRC commit",{"type":53,"value":2209}," (or stash), then re-run.",{"type":47,"tag":278,"props":2211,"children":2212},{},[2213,2222,2227],{"type":47,"tag":310,"props":2214,"children":2215},{},[2216],{"type":47,"tag":69,"props":2217,"children":2219},{"className":2218},[],[2220],{"type":53,"value":2221},"origin has N unpulled commits on \u003Cupstream>",{"type":47,"tag":310,"props":2223,"children":2224},{},[2225],{"type":53,"value":2226},"Remote overlay diverged from local",{"type":47,"tag":310,"props":2228,"children":2229},{},[2230,2236],{"type":47,"tag":69,"props":2231,"children":2233},{"className":2232},[],[2234],{"type":53,"value":2235},"git -C $LFT_SRC pull",{"type":53,"value":2237},", resolve conflicts, then re-run.",{"type":47,"tag":278,"props":2239,"children":2240},{},[2241,2250,2255],{"type":47,"tag":310,"props":2242,"children":2243},{},[2244],{"type":47,"tag":69,"props":2245,"children":2247},{"className":2246},[],[2248],{"type":53,"value":2249},"Both overlay and manifest are empty — nothing to promote",{"type":47,"tag":310,"props":2251,"children":2252},{},[2253],{"type":53,"value":2254},"No Customize-* commits and no Build manifest",{"type":47,"tag":310,"props":2256,"children":2257},{},[2258,2260,2265],{"type":53,"value":2259},"Run a customize-* skill or ",{"type":47,"tag":69,"props":2261,"children":2263},{"className":2262},[],[2264],{"type":53,"value":236},{"type":53,"value":2266}," first.",{"type":47,"tag":278,"props":2268,"children":2269},{},[2270,2279,2289],{"type":47,"tag":310,"props":2271,"children":2272},{},[2273],{"type":47,"tag":69,"props":2274,"children":2276},{"className":2275},[],[2277],{"type":53,"value":2278},"Kernel-side source(s) changed since last \u002Fjetson-build-source",{"type":47,"tag":310,"props":2280,"children":2281},{},[2282,2284],{"type":53,"value":2283},"Freshness gate detected unprocessed customize-* edits under ",{"type":47,"tag":69,"props":2285,"children":2287},{"className":2286},[],[2288],{"type":53,"value":952},{"type":47,"tag":310,"props":2290,"children":2291},{},[2292,2294,2299],{"type":53,"value":2293},"Commit pending edits, run ",{"type":47,"tag":69,"props":2295,"children":2297},{"className":2296},[],[2298],{"type":53,"value":236},{"type":53,"value":2300},", re-run promote.",{"type":47,"tag":278,"props":2302,"children":2303},{},[2304,2313,2323],{"type":47,"tag":310,"props":2305,"children":2306},{},[2307],{"type":47,"tag":69,"props":2308,"children":2310},{"className":2309},[],[2311],{"type":53,"value":2312},"Manifest entry references missing build output: \u003Csrc>",{"type":47,"tag":310,"props":2314,"children":2315},{},[2316,2321],{"type":47,"tag":69,"props":2317,"children":2319},{"className":2318},[],[2320],{"type":53,"value":1777},{"type":53,"value":2322}," build outputs wiped or stale manifest",{"type":47,"tag":310,"props":2324,"children":2325},{},[2326,2328,2333],{"type":53,"value":2327},"Re-run ",{"type":47,"tag":69,"props":2329,"children":2331},{"className":2330},[],[2332],{"type":53,"value":236},{"type":53,"value":2334}," to regenerate.",{"type":47,"tag":278,"props":2336,"children":2337},{},[2338,2347,2352],{"type":47,"tag":310,"props":2339,"children":2340},{},[2341],{"type":47,"tag":69,"props":2342,"children":2344},{"className":2343},[],[2345],{"type":53,"value":2346},"Build manifest at \u003CMANIFEST> is not valid YAML",{"type":47,"tag":310,"props":2348,"children":2349},{},[2350],{"type":53,"value":2351},"Manifest hand-edited or partially written",{"type":47,"tag":310,"props":2353,"children":2354},{},[2355,2356,2361],{"type":53,"value":2327},{"type":47,"tag":69,"props":2357,"children":2359},{"className":2358},[],[2360],{"type":53,"value":236},{"type":53,"value":2362}," to rewrite the manifest.",{"type":47,"tag":278,"props":2364,"children":2365},{},[2366,2382,2394],{"type":47,"tag":310,"props":2367,"children":2368},{},[2369,2375,2377],{"type":47,"tag":69,"props":2370,"children":2372},{"className":2371},[],[2373],{"type":53,"value":2374},"cp: permission denied",{"type":53,"value":2376}," under ",{"type":47,"tag":69,"props":2378,"children":2380},{"className":2379},[],[2381],{"type":53,"value":1442},{"type":47,"tag":310,"props":2383,"children":2384},{},[2385,2387,2392],{"type":53,"value":2386},"Missing ",{"type":47,"tag":69,"props":2388,"children":2390},{"className":2389},[],[2391],{"type":53,"value":201},{"type":53,"value":2393}," privilege on the host",{"type":47,"tag":310,"props":2395,"children":2396},{},[2397,2399,2405],{"type":53,"value":2398},"Run on an account that can ",{"type":47,"tag":69,"props":2400,"children":2402},{"className":2401},[],[2403],{"type":53,"value":2404},"sudo cp",{"type":53,"value":2406},"; re-run resumes via diff-aware copy.",{"type":47,"tag":278,"props":2408,"children":2409},{},[2410,2425,2430],{"type":47,"tag":310,"props":2411,"children":2412},{},[2413,2414,2419,2420],{"type":53,"value":610},{"type":47,"tag":69,"props":2415,"children":2417},{"className":2416},[],[2418],{"type":53,"value":122},{"type":53,"value":1231},{"type":47,"tag":69,"props":2421,"children":2423},{"className":2422},[],[2424],{"type":53,"value":114},{"type":47,"tag":310,"props":2426,"children":2427},{},[2428],{"type":53,"value":2429},"Workspace not bootstrapped",{"type":47,"tag":310,"props":2431,"children":2432},{},[2433,2434,2439,2441,2446],{"type":53,"value":1415},{"type":47,"tag":69,"props":2435,"children":2437},{"className":2436},[],[2438],{"type":53,"value":137},{"type":53,"value":2440}," and\u002For ",{"type":47,"tag":69,"props":2442,"children":2444},{"className":2443},[],[2445],{"type":53,"value":130},{"type":53,"value":501},{"type":47,"tag":278,"props":2448,"children":2449},{},[2450,2459,2469],{"type":47,"tag":310,"props":2451,"children":2452},{},[2453],{"type":47,"tag":69,"props":2454,"children":2456},{"className":2455},[],[2457],{"type":53,"value":2458},"tool not found at \u003CLFT_DST>\u002Ftools\u002Fl4t_update_initrd.sh",{"type":47,"tag":310,"props":2460,"children":2461},{},[2462,2467],{"type":47,"tag":69,"props":2463,"children":2465},{"className":2464},[],[2466],{"type":53,"value":1975},{"type":53,"value":2468}," was pruned, or bsp_image extracted from a non-NVIDIA tarball",{"type":47,"tag":310,"props":2470,"children":2471},{},[2472,2473,2478],{"type":53,"value":2327},{"type":47,"tag":69,"props":2474,"children":2476},{"className":2475},[],[2477],{"type":53,"value":137},{"type":53,"value":2479}," to repopulate.",{"type":47,"tag":278,"props":2481,"children":2482},{},[2483,2492,2511],{"type":47,"tag":310,"props":2484,"children":2485},{},[2486],{"type":47,"tag":69,"props":2487,"children":2489},{"className":2488},[],[2490],{"type":53,"value":2491},"l4t_update_initrd.sh exited non-zero",{"type":47,"tag":310,"props":2493,"children":2494},{},[2495,2497,2503,2505],{"type":53,"value":2496},"Insufficient sudo, broken rootfs (missing ",{"type":47,"tag":69,"props":2498,"children":2500},{"className":2499},[],[2501],{"type":53,"value":2502},"lib\u002Fmodules\u002F\u003Cver>\u002Fmodules.dep",{"type":53,"value":2504},"), or out-of-space ",{"type":47,"tag":69,"props":2506,"children":2508},{"className":2507},[],[2509],{"type":53,"value":2510},"\u002Ftmp",{"type":47,"tag":310,"props":2512,"children":2513},{},[2514,2515,2521,2523,2528],{"type":53,"value":1415},{"type":47,"tag":69,"props":2516,"children":2518},{"className":2517},[],[2519],{"type":53,"value":2520},"depmod -a -b \u003CLFT_DST>\u002Frootfs \u003Cver>",{"type":53,"value":2522}," against the rootfs first; verify ",{"type":47,"tag":69,"props":2524,"children":2526},{"className":2525},[],[2527],{"type":53,"value":2510},{"type":53,"value":2529}," headroom; rerun promote.",{"type":47,"tag":278,"props":2531,"children":2532},{},[2533,2546,2573],{"type":47,"tag":310,"props":2534,"children":2535},{},[2536,2538,2544],{"type":53,"value":2537},"DUT boots with stale kernel \u002F modules after promote, modules fail to load with ",{"type":47,"tag":69,"props":2539,"children":2541},{"className":2540},[],[2542],{"type":53,"value":2543},"disagrees about version of symbol …",{"type":53,"value":2545},", or initramfs ships pre-customize modules even after the refresh ran",{"type":47,"tag":310,"props":2547,"children":2548},{},[2549,2551,2557,2559,2564,2566,2571],{"type":53,"value":2550},"The mirror \u002F refresh gate didn't fire (manual hand-edit under ",{"type":47,"tag":69,"props":2552,"children":2554},{"className":2553},[],[2555],{"type":53,"value":2556},"\u003CLFT_DST>",{"type":53,"value":2558}," outside the skill), or ",{"type":47,"tag":69,"props":2560,"children":2562},{"className":2561},[],[2563],{"type":53,"value":1364},{"type":53,"value":2565}," drifted from ",{"type":47,"tag":69,"props":2567,"children":2569},{"className":2568},[],[2570],{"type":53,"value":1221},{"type":53,"value":2572}," so the chrooted refresh built against the stale kernel",{"type":47,"tag":310,"props":2574,"children":2575},{},[2576,2578,2584,2586,2592,2594,2602],{"type":53,"value":2577},"Force the gate by ",{"type":47,"tag":69,"props":2579,"children":2581},{"className":2580},[],[2582],{"type":53,"value":2583},"sudo touch \u003CLFT_DST>\u002Fkernel\u002FImage",{"type":53,"value":2585}," + re-run promote, or run the two steps manually: ",{"type":47,"tag":69,"props":2587,"children":2589},{"className":2588},[],[2590],{"type":53,"value":2591},"sudo cp -p \u003CLFT_DST>\u002Fkernel\u002FImage \u003CLFT_DST>\u002Frootfs\u002Fboot\u002FImage && cd \u003CLFT_DST> && sudo .\u002Ftools\u002Fl4t_update_initrd.sh",{"type":53,"value":2593},". Then re-flash. See ",{"type":47,"tag":258,"props":2595,"children":2596},{"href":1394},[2597],{"type":47,"tag":69,"props":2598,"children":2600},{"className":2599},[],[2601],{"type":53,"value":1394},{"type":53,"value":501},{"type":47,"tag":56,"props":2604,"children":2606},{"id":2605},"spec-status",[2607],{"type":53,"value":2608},"Spec status",{"type":47,"tag":63,"props":2610,"children":2611},{},[2612],{"type":47,"tag":86,"props":2613,"children":2614},{},[2615],{"type":53,"value":2616},"Locked in for v0.2.0:",{"type":47,"tag":100,"props":2618,"children":2619},{},[2620,2636,2653,2677,2687,2697],{"type":47,"tag":104,"props":2621,"children":2622},{},[2623,2628,2630,2635],{"type":47,"tag":86,"props":2624,"children":2625},{},[2626],{"type":53,"value":2627},"Two-channel scope",{"type":53,"value":2629}," — overlay HEAD + build manifest, both\ndiff-aware, both copying into ",{"type":47,"tag":69,"props":2631,"children":2633},{"className":2632},[],[2634],{"type":53,"value":159},{"type":53,"value":501},{"type":47,"tag":104,"props":2637,"children":2638},{},[2639,2644,2646,2651],{"type":47,"tag":86,"props":2640,"children":2641},{},[2642],{"type":53,"value":2643},"Channel-overlap precedence",{"type":53,"value":2645}," — manifest wins on ",{"type":47,"tag":69,"props":2647,"children":2649},{"className":2648},[],[2650],{"type":53,"value":1176},{"type":53,"value":2652}," collision.",{"type":47,"tag":104,"props":2654,"children":2655},{},[2656,2661,2663,2668,2670,2675],{"type":47,"tag":86,"props":2657,"children":2658},{},[2659],{"type":53,"value":2660},"Source-repo collision check",{"type":53,"value":2662}," — overlay only; manifest has no\nremote concept and source repos under ",{"type":47,"tag":69,"props":2664,"children":2666},{"className":2665},[],[2667],{"type":53,"value":1777},{"type":53,"value":2669}," are not\nfetched (their state was sealed when ",{"type":47,"tag":69,"props":2671,"children":2673},{"className":2672},[],[2674],{"type":53,"value":422},{"type":53,"value":2676},"\nwrote the manifest).",{"type":47,"tag":104,"props":2678,"children":2679},{},[2680,2685],{"type":47,"tag":86,"props":2681,"children":2682},{},[2683],{"type":53,"value":2684},"Atomicity",{"type":53,"value":2686}," — fail-fast, no rollback. Diff-aware copy makes\nresume natural.",{"type":47,"tag":104,"props":2688,"children":2689},{},[2690,2695],{"type":47,"tag":86,"props":2691,"children":2692},{},[2693],{"type":53,"value":2694},"Audit trail",{"type":53,"value":2696}," — stdout-only at promote time. The overlay\ntracker's git log is the canonical record for channel A; the\nmanifest itself is the canonical record for channel B.",{"type":47,"tag":104,"props":2698,"children":2699},{},[2700,2705,2707,2712,2714,2719,2721,2726,2728,2733,2735,2740,2742,2747,2749,2755,2756,2762,2764,2769,2771,2776,2778,2786],{"type":47,"tag":86,"props":2701,"children":2702},{},[2703],{"type":53,"value":2704},"Kernel Image mirror + initramfs refresh.",{"type":53,"value":2706}," Locked in as a\npaired step. The mirror copies ",{"type":47,"tag":69,"props":2708,"children":2710},{"className":2709},[],[2711],{"type":53,"value":1221},{"type":53,"value":2713}," →\n",{"type":47,"tag":69,"props":2715,"children":2717},{"className":2716},[],[2718],{"type":53,"value":1364},{"type":53,"value":2720}," whenever the copy pass touched\n",{"type":47,"tag":69,"props":2722,"children":2724},{"className":2723},[],[2725],{"type":53,"value":1221},{"type":53,"value":2727},"; the refresh runs\n",{"type":47,"tag":69,"props":2729,"children":2731},{"className":2730},[],[2732],{"type":53,"value":457},{"type":53,"value":2734}," whenever ",{"type":47,"tag":69,"props":2736,"children":2738},{"className":2737},[],[2739],{"type":53,"value":1221},{"type":53,"value":2741}," or any\n",{"type":47,"tag":69,"props":2743,"children":2745},{"className":2744},[],[2746],{"type":53,"value":1214},{"type":53,"value":2748}," was promoted, rebuilding both\n",{"type":47,"tag":69,"props":2750,"children":2752},{"className":2751},[],[2753],{"type":53,"value":2754},"bootloader\u002Fl4t_initrd.img",{"type":53,"value":116},{"type":47,"tag":69,"props":2757,"children":2759},{"className":2758},[],[2760],{"type":53,"value":2761},"rootfs\u002Fboot\u002Finitrd",{"type":53,"value":2763},".\nInseparable because the refresh chroots into ",{"type":47,"tag":69,"props":2765,"children":2767},{"className":2766},[],[2768],{"type":53,"value":1442},{"type":53,"value":2770}," and\nresolves the kernel through ",{"type":47,"tag":69,"props":2772,"children":2774},{"className":2773},[],[2775],{"type":53,"value":1343},{"type":53,"value":2777}," — the mirror has to\nrun first. Closes both module-shadowing and vermagic-skew\nfailure modes; both diff-aware, both skipped on overlay-only\nedits. Full contract in\n",{"type":47,"tag":258,"props":2779,"children":2780},{"href":1394},[2781],{"type":47,"tag":69,"props":2782,"children":2784},{"className":2783},[],[2785],{"type":53,"value":1394},{"type":53,"value":501},{"type":47,"tag":63,"props":2788,"children":2789},{},[2790],{"type":47,"tag":86,"props":2791,"children":2792},{},[2793],{"type":53,"value":2794},"Still deferred:",{"type":47,"tag":100,"props":2796,"children":2797},{},[2798,2808,2825],{"type":47,"tag":104,"props":2799,"children":2800},{},[2801,2806],{"type":47,"tag":86,"props":2802,"children":2803},{},[2804],{"type":53,"value":2805},"Named-tag \u002F commit-range scope",{"type":53,"value":2807}," for the overlay channel.\nRevisit when a \"promote release X\" use case appears.",{"type":47,"tag":104,"props":2809,"children":2810},{},[2811,2816,2818,2823],{"type":47,"tag":86,"props":2812,"children":2813},{},[2814],{"type":53,"value":2815},"Manifest history.",{"type":53,"value":2817}," Currently only the last build's manifest\nexists; if a user wants to roll bsp_image back to a previous\nbuild state, they'd need to re-run ",{"type":47,"tag":69,"props":2819,"children":2821},{"className":2820},[],[2822],{"type":53,"value":236},{"type":53,"value":2824}," at\nthe prior commit. A manifest archive (saved per-build-mode or\nper-commit) would enable rollback without rebuild.",{"type":47,"tag":104,"props":2826,"children":2827},{},[2828,2839],{"type":47,"tag":86,"props":2829,"children":2830},{},[2831,2833,2838],{"type":53,"value":2832},"Sidecar manifest in ",{"type":47,"tag":69,"props":2834,"children":2836},{"className":2835},[],[2837],{"type":53,"value":74},{"type":53,"value":501},{"type":53,"value":2840}," Revisit when promotion\nhappens on a host that does not have access to the overlay\ntracker repo (or the workspace's manifest file).",{"type":47,"tag":56,"props":2842,"children":2844},{"id":2843},"references",[2845],{"type":53,"value":2846},"References",{"type":47,"tag":100,"props":2848,"children":2849},{},[2850,2878,2891,2905,2926,2947,2961],{"type":47,"tag":104,"props":2851,"children":2852},{},[2853,2861,2863,2868,2870,2876],{"type":47,"tag":258,"props":2854,"children":2855},{"href":1394},[2856],{"type":47,"tag":69,"props":2857,"children":2859},{"className":2858},[],[2860],{"type":53,"value":1394},{"type":53,"value":2862}," — full contract for the kernel ",{"type":47,"tag":69,"props":2864,"children":2866},{"className":2865},[],[2867],{"type":53,"value":390},{"type":53,"value":2869}," mirror + ",{"type":47,"tag":69,"props":2871,"children":2873},{"className":2872},[],[2874],{"type":53,"value":2875},"l4t_update_initrd.sh",{"type":53,"value":2877}," refresh: shell snippets, failure modes, tool semantics, output filenames.",{"type":47,"tag":104,"props":2879,"children":2880},{},[2881,2889],{"type":47,"tag":258,"props":2882,"children":2883},{"href":534},[2884],{"type":47,"tag":69,"props":2885,"children":2887},{"className":2886},[],[2888],{"type":53,"value":534},{"type":53,"value":2890}," — target-platform contract.",{"type":47,"tag":104,"props":2892,"children":2893},{},[2894,2903],{"type":47,"tag":258,"props":2895,"children":2897},{"href":2896},"..\u002F..\u002Fcontext\u002Fbsp-customization-workflow.md#workflow-invariants",[2898],{"type":47,"tag":69,"props":2899,"children":2901},{"className":2900},[],[2902],{"type":53,"value":260},{"type":53,"value":2904}," — workspace edit protocol (this skill is the promote leg of Deploy).",{"type":47,"tag":104,"props":2906,"children":2907},{},[2908,2917,2919,2925],{"type":47,"tag":258,"props":2909,"children":2911},{"href":2910},"..\u002Fjetson-init-source\u002FSKILL.md",[2912],{"type":47,"tag":69,"props":2913,"children":2915},{"className":2914},[],[2916],{"type":53,"value":2910},{"type":53,"value":2918}," — Setup; materializes the overlay tracker this skill reads (channel A) and authors ",{"type":47,"tag":69,"props":2920,"children":2922},{"className":2921},[],[2923],{"type":53,"value":2924},"source.toolchain",{"type":53,"value":501},{"type":47,"tag":104,"props":2927,"children":2928},{},[2929,2937,2939,2945],{"type":47,"tag":258,"props":2930,"children":2931},{"href":415},[2932],{"type":47,"tag":69,"props":2933,"children":2935},{"className":2934},[],[2936],{"type":53,"value":415},{"type":53,"value":2938}," — Build builder; writes the ",{"type":47,"tag":69,"props":2940,"children":2942},{"className":2941},[],[2943],{"type":53,"value":2944},".build-manifest.yaml",{"type":53,"value":2946}," this skill reads (channel B).",{"type":47,"tag":104,"props":2948,"children":2949},{},[2950,2959],{"type":47,"tag":258,"props":2951,"children":2953},{"href":2952},"..\u002Fjetson-flash-image\u002FSKILL.md",[2954],{"type":47,"tag":69,"props":2955,"children":2957},{"className":2956},[],[2958],{"type":53,"value":2952},{"type":53,"value":2960}," — next leg; flashes the just-promoted bsp_image to the DUT.",{"type":47,"tag":104,"props":2962,"children":2963},{},[2964,2973],{"type":47,"tag":258,"props":2965,"children":2967},{"href":2966},"..\u002Fjetson-validate-image\u002FSKILL.md",[2968],{"type":47,"tag":69,"props":2969,"children":2971},{"className":2970},[],[2972],{"type":53,"value":2966},{"type":53,"value":2974}," — final leg; static + on-target validation.",{"type":47,"tag":2976,"props":2977,"children":2978},"style",{},[2979],{"type":53,"value":2980},"html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"items":2982,"total":3084},[2983,3000,3012,3026,3038,3055,3070],{"slug":2984,"name":2984,"fn":2985,"description":2986,"org":2987,"tags":2988,"stars":20,"repoUrl":21,"updatedAt":2999},"accelerated-computing-cudf","accelerate data processing with cuDF","Official NVIDIA-authored guidance for NVIDIA cuDF GPU DataFrames, pandas acceleration, dask-cuDF, ETL, joins, groupby, CSV\u002FParquet I\u002FO, nullable semantics, and multi-GPU DataFrame workloads.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":9},[2989,2992,2995,2996],{"name":2990,"slug":2991,"type":15},"Data Analysis","data-analysis",{"name":2993,"slug":2994,"type":15},"Data Engineering","data-engineering",{"name":9,"slug":8,"type":15},{"name":2997,"slug":2998,"type":15},"Performance","performance","2026-07-14T05:28:43.176466",{"slug":3001,"name":3001,"fn":3002,"description":3003,"org":3004,"tags":3005,"stars":20,"repoUrl":21,"updatedAt":3011},"aiq-deploy","deploy and manage NVIDIA AI-Q infrastructure","Use when asked to install, deploy, run, validate, troubleshoot, or stop NVIDIA AI-Q Blueprint infrastructure.\n",{"slug":8,"name":9,"logoUrl":10,"githubOrg":9},[3006,3007,3010],{"name":17,"slug":18,"type":15},{"name":3008,"slug":3009,"type":15},"Infrastructure","infrastructure",{"name":9,"slug":8,"type":15},"2026-07-14T05:29:06.667109",{"slug":3013,"name":3013,"fn":3014,"description":3015,"org":3016,"tags":3017,"stars":20,"repoUrl":21,"updatedAt":3025},"aiq-research","conduct deep research with AI-Q","Use when asked to run deep research or AI-Q research through a reachable NVIDIA AI-Q Blueprint backend.\n",{"slug":8,"name":9,"logoUrl":10,"githubOrg":9},[3018,3021,3022],{"name":3019,"slug":3020,"type":15},"Agents","agents",{"name":9,"slug":8,"type":15},{"name":3023,"slug":3024,"type":15},"Research","research","2026-07-14T05:28:06.816956",{"slug":3027,"name":3027,"fn":3028,"description":3029,"org":3030,"tags":3031,"stars":20,"repoUrl":21,"updatedAt":3037},"amc-run-sample-calibration","run AMC sample dataset calibration","Run end-to-end calibration on the shipped sample dataset (sdg_08_2_sample_data_010926.zip) against a running AMC microservice. Use when user says 'test sample dataset', 'run sample calibration', 'verify AMC install', or 'launch and test'.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":9},[3032,3033,3034],{"name":2990,"slug":2991,"type":15},{"name":9,"slug":8,"type":15},{"name":3035,"slug":3036,"type":15},"Testing","testing","2026-07-17T05:29:03.913266",{"slug":3039,"name":3039,"fn":3040,"description":3041,"org":3042,"tags":3043,"stars":20,"repoUrl":21,"updatedAt":3054},"amc-run-video-calibration","calibrate video datasets with AutoMagicCalib","Calibrate a new dataset from pre-recorded video files via the AutoMagicCalib REST API. Use when user has local MP4s and says 'calibrate my videos', 'run AMC on these videos', or similar. For RTSP\u002Flive streams, use amc-run-rtsp-calibration instead.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":9},[3044,3047,3050,3051],{"name":3045,"slug":3046,"type":15},"Automation","automation",{"name":3048,"slug":3049,"type":15},"Imaging","imaging",{"name":9,"slug":8,"type":15},{"name":3052,"slug":3053,"type":15},"Video","video","2026-07-17T05:28:53.905004",{"slug":3056,"name":3056,"fn":3057,"description":3058,"org":3059,"tags":3060,"stars":20,"repoUrl":21,"updatedAt":3069},"amc-setup-calibration-stack","deploy AutoMagicCalib microservice with Docker","Launch AutoMagicCalib microservice and web UI from NGC release images via Docker Compose. Use when user says 'deploy auto calibration', 'launch auto calibration', 'launch AMC', 'start MS+UI', or 'set up auto-magic-calib'. Requires NGC API key.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":9},[3061,3062,3065,3066],{"name":17,"slug":18,"type":15},{"name":3063,"slug":3064,"type":15},"Docker","docker",{"name":9,"slug":8,"type":15},{"name":3067,"slug":3068,"type":15},"Operations","operations","2026-07-17T05:28:56.913999",{"slug":3071,"name":3071,"fn":3072,"description":3073,"org":3074,"tags":3075,"stars":20,"repoUrl":21,"updatedAt":3083},"cudaq-guide","develop quantum applications with CUDA-Q","CUDA-Q onboarding guide for installation, test programs, GPU simulation, QPU hardware, and quantum applications.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":9},[3076,3077,3080],{"name":9,"slug":8,"type":15},{"name":3078,"slug":3079,"type":15},"Quantum Computing","quantum-computing",{"name":3081,"slug":3082,"type":15},"Simulation","simulation","2026-07-14T05:26:58.898253",305,{"items":3086,"total":3237},[3087,3105,3121,3132,3144,3158,3171,3185,3196,3205,3219,3228],{"slug":3088,"name":3088,"fn":3089,"description":3090,"org":3091,"tags":3092,"stars":3102,"repoUrl":3103,"updatedAt":3104},"nemoclaw-user-guide","retrieve NemoClaw documentation and configuration","Guides human users' AI agents to the NemoClaw docs MCP server and canonical Fern documentation in Markdown form. Use when users ask how to install, configure, operate, troubleshoot, secure, or learn NemoClaw with an AI coding assistant. Trigger keywords - nemoclaw docs, use nemoclaw with ai agent, nemoclaw mcp docs, nemoclaw install help, nemoclaw quickstart, nemoclaw markdown docs, llms.txt, agent skills.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":9},[3093,3096,3099],{"name":3094,"slug":3095,"type":15},"Documentation","documentation",{"name":3097,"slug":3098,"type":15},"MCP","mcp",{"name":3100,"slug":3101,"type":15},"Search","search",21777,"https:\u002F\u002Fgithub.com\u002FNVIDIA\u002FNemoClaw","2026-07-20T06:00:01.461044",{"slug":3106,"name":3106,"fn":3107,"description":3108,"org":3109,"tags":3110,"stars":3118,"repoUrl":3119,"updatedAt":3120},"mcore-build-and-dependency","manage Megatron-LM development environments","Container-based dev environment setup and dependency management for Megatron-LM. Covers acquiring and launching the CI container, uv package management, and updating uv.lock.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":9},[3111,3114,3115],{"name":3112,"slug":3113,"type":15},"Containers","containers",{"name":17,"slug":18,"type":15},{"name":3116,"slug":3117,"type":15},"Python","python",17049,"https:\u002F\u002Fgithub.com\u002FNVIDIA\u002FMegatron-LM","2026-07-27T06:06:11.249662",{"slug":3122,"name":3122,"fn":3123,"description":3124,"org":3125,"tags":3126,"stars":3118,"repoUrl":3119,"updatedAt":3131},"mcore-bump-base-image","update NVIDIA PyTorch base images","Bump the NVIDIA PyTorch base image (`nvcr.io\u002Fnvidia\u002Fpytorch:YY.MM-py3`) used by Megatron-LM CI. Covers the two pin sites (GitHub CI in `docker\u002F.ngc_version.dev` and GitLab CI in `.gitlab\u002Fstages\u002F01.build.yml`), the post-bump CI loop (re-run functional tests, refresh golden values, mark broken tests), and the gotchas that bit PRs",{"slug":8,"name":9,"logoUrl":10,"githubOrg":9},[3127,3130],{"name":3128,"slug":3129,"type":15},"CI\u002FCD","ci-cd",{"name":17,"slug":18,"type":15},"2026-07-14T05:25:59.97109",{"slug":3133,"name":3133,"fn":3134,"description":3135,"org":3136,"tags":3137,"stars":3118,"repoUrl":3119,"updatedAt":3143},"mcore-cicd","manage CI\u002FCD pipelines for Megatron-LM","CI\u002FCD reference for Megatron-LM. Covers CI pipeline structure, PR scope labels, triggering internal GitLab CI (which force-pushes the current branch to a pull-request\u002FBRANCH ref — always dry-run and verify the destination first; never run against shared or protected branches), and CI failure investigation.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":9},[3138,3139,3140],{"name":3128,"slug":3129,"type":15},{"name":17,"slug":18,"type":15},{"name":3141,"slug":3142,"type":15},"GitHub","github","2026-07-27T06:06:12.278222",{"slug":3145,"name":3145,"fn":3146,"description":3147,"org":3148,"tags":3149,"stars":3118,"repoUrl":3119,"updatedAt":3157},"mcore-create-issue","investigate CI failures and create issues","Investigate a failing GitHub Actions run or job and create a GitHub issue for the failure.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":9},[3150,3153,3154],{"name":3151,"slug":3152,"type":15},"Debugging","debugging",{"name":3141,"slug":3142,"type":15},{"name":3155,"slug":3156,"type":15},"Triage","triage","2026-07-14T05:25:57.442089",{"slug":3159,"name":3159,"fn":3160,"description":3161,"org":3162,"tags":3163,"stars":3118,"repoUrl":3119,"updatedAt":3170},"mcore-linting-and-formatting","lint and format Megatron-LM code","Linting and formatting for Megatron-LM. Covers running autoformat.sh, tools (ruff, black, isort, pylint, mypy), and code style rules.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":9},[3164,3167],{"name":3165,"slug":3166,"type":15},"Best Practices","best-practices",{"name":3168,"slug":3169,"type":15},"Code Analysis","code-analysis","2026-07-14T05:25:56.18433",{"slug":3172,"name":3172,"fn":3173,"description":3174,"org":3175,"tags":3176,"stars":3118,"repoUrl":3119,"updatedAt":3184},"mcore-migrate-gpt-to-hybrid","migrate Megatron-LM models to HybridModel","Migration guide for moving Megatron Core GPTModel checkpoints, model providers, training commands, and layer mappings to HybridModel.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":9},[3177,3180,3183],{"name":3178,"slug":3179,"type":15},"Machine Learning","machine-learning",{"name":3181,"slug":3182,"type":15},"Migration","migration",{"name":9,"slug":8,"type":15},"2026-07-17T06:07:11.777011",{"slug":3186,"name":3186,"fn":3187,"description":3188,"org":3189,"tags":3190,"stars":3118,"repoUrl":3119,"updatedAt":3195},"mcore-onboard-gb200-1node-tests","onboard functional tests for GB200","Onboard 1-node GitHub MR functional tests for GB200 from existing mr-scoped 2-node tests.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":9},[3191,3194],{"name":3192,"slug":3193,"type":15},"QA","qa",{"name":3035,"slug":3036,"type":15},"2026-07-14T05:25:53.673039",{"slug":3197,"name":3197,"fn":3198,"description":3199,"org":3200,"tags":3201,"stars":3118,"repoUrl":3119,"updatedAt":3204},"mcore-run-on-slurm","launch distributed training jobs on SLURM","How to launch distributed Megatron-LM training jobs on a SLURM cluster. Covers a minimal sbatch skeleton, environment-variable setup for torch.distributed.run, CUDA_DEVICE_MAX_CONNECTIONS rules across hardware and parallelism modes, container conventions, monitoring, and per-rank failure diagnosis.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":9},[3202,3203],{"name":17,"slug":18,"type":15},{"name":3008,"slug":3009,"type":15},"2026-07-14T05:25:49.362534",{"slug":3206,"name":3206,"fn":3207,"description":3208,"org":3209,"tags":3210,"stars":3118,"repoUrl":3119,"updatedAt":3218},"mcore-split-pr","split pull requests to reduce review load","Split a PR into multiple PRs to reduce the number of required CODEOWNERS reviewer groups.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":9},[3211,3214,3215],{"name":3212,"slug":3213,"type":15},"Code Review","code-review",{"name":3141,"slug":3142,"type":15},{"name":3216,"slug":3217,"type":15},"Pull Requests","pull-requests","2026-07-14T05:26:01.226578",{"slug":3220,"name":3220,"fn":3221,"description":3222,"org":3223,"tags":3224,"stars":3118,"repoUrl":3119,"updatedAt":3227},"mcore-testing","run and manage Megatron-LM tests","Test system for Megatron-LM. Covers test layout, recipe YAML structure, adding and running unit and functional tests, golden values, marker filters, and CI parity.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":9},[3225,3226],{"name":3192,"slug":3193,"type":15},{"name":3035,"slug":3036,"type":15},"2026-07-14T05:25:54.928983",{"slug":3229,"name":3229,"fn":3230,"description":3231,"org":3232,"tags":3233,"stars":3118,"repoUrl":3119,"updatedAt":3236},"nightly-sync","manage nightly main-to-dev sync workflows","Domain knowledge for the nightly main-to-dev sync workflow. Covers merge strategy, CI architecture, failure investigation, and known issues.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":9},[3234,3235],{"name":3045,"slug":3046,"type":15},{"name":3128,"slug":3129,"type":15},"2026-07-30T05:29:03.275638",496]