Repository: Azure/AgentBaker
Pull request #6327: feat: add Copilot settings for commit message and code generation ins…
Author: login: bravebeaver
Created: 2025-05-01T03:54:26Z | Merged: 2025-05-01T22:30:59Z

**What type of PR is this?**
/kind feature

**What this PR does / why we need it**:
adding copilot instruction for better dev experience


**Requirements**:

- [x] uses [conventional commit messages](https://www.conventionalcommits.org/)
  <!-- Common commit types:
        build: Build 🏭
        chore: Maintenance 🔧
        ci: Continuous Integration 💜
        docs: Documentation 📘
        feat: Features 🌈
        fix: Bug Fixes 🐞
        perf: Performance Improvements 🚀
        refactor: Code Refactoring 💎
        revert: Revert Change ◀️
        style: Code Style 🎶
        security: Security Fix 🛡️
        test: Testing 💚 -->
- [ ] includes documentation
- [ ] adds unit tests
- [ ] tested upgrade from previous version

**Special notes for your reviewer**:

**Release note**:

```
none
```



Diff:
diff --git a/.github/copilot-instructions.md b/.github/copilot-instructions.md
new file mode 100644
index 00000000000..e78c02a38f6
--- /dev/null
+++ b/.github/copilot-instructions.md
@@ -0,0 +1,61 @@
+# Overview
+
+AgentBaker repo has 2 main services discussed below:
+
+- VHD Builder
+- AgentBaker Service
+
+## VHD Builder
+
+It builds VHDs using Packer for base OS: Windows, Azure Linux/Mariner and Ubuntu. For each OS there are multiple supported versions (windows 2019, 2022, ubuntu 2004, 2204 etc). THe VHDs are base images for a node in an aks cluster.
+
+VHDs are built using [Packer](https://developer.hashicorp.com/packer/docs) in [vhdbuilder](../vhdbuilder/).
+
+## AgentBaker Service
+
+[apiserver](../apiserver/) is `go` based webserver. It receives request from external client and generates CSE and CustomData to be used on the VHD when a new node is created / provisioned.
+
+The webserver is also used to determine the latest version of Linux VHDs available for provisioning within AKS clusters.
+
+## Code Structure
+
+[parts](../parts/) serves both AgentBaker Service and VHD build. AgentBaker service and VHDs are coupled because of this shared component. When building VHD, packer maps and renames scripts from [parts](../parts/)  depending on the OS / versions. The mappings can be found at [packer](../vhdbuilder/packer/).
+
+Windows uses a different folder [cse](../staging/cse/windows/) for almost the same purpose. There are subtle differences as windows CSEs can be downloaded as a zip file during provisioning time due to restrictions on the file size on Windows system, while for linux based systems the cse/custom data are dropped in during provisioning time.
+
+## Deployment and Release
+
+Tags of AgentBaker and corresponding Linux VHDs are released every week. Linux VHDs are built with a particular image version in the YYYYMM.DD.PATCH format. All Linux VHD versions correspond to a particular tag of the AgentBaker go module. AgentBaker go module tags follow the format v0.YYYYMMDD.PATCH. The mapping between AgentBaker tag and Linux VHD version is defined within [linux_sig_version.json](../pkg/agent/datamodel/linux_sig_version.json).
+
+Windows VHD are released separately, following windows patch tuesday schedule.
+
+## Guidelines
+
+### SRE Guidelines
+
+The operational goals of this project are:
+
+- achieve consistency across different OS as much as possible
+- avoid functional regression when introducing new features (component updates, new drivers, new binaries), ensure that all supported OS / versions are tested
+- avoid VHD build performance regressions when making any changes
+- avoid node provisioning performance regression when making any changes
+
+The SRE guidelines ground other coding guidelines and practices.
+
+### Golang Guidelines
+
+- Follow golang best practice
+- Use vanilla go test framework
+
+### PowerShell Guidelines
+
+- follow powershell best practices
+
+### ShellScripts Guidelines
+
+- use shellcheck for sanity checking
+- use ShellSpec for testing
+- the shell scripts are used on both azure linux/mariner and ubuntu and cross platform portability is critical.
+- when using functions defined in other files, ensure it is sourced properly.
+- use local variables rather than constants when their scoping allows for it.
+- avoid using variables declared inside another function, even they are visible. It is hard to reason and might introduce subtle bugs.
diff --git a/.golangci.bck.yaml b/.golangci.bck.yaml
deleted file mode 100644
index d4218c5f8da..00000000000
--- a/.golangci.bck.yaml
+++ /dev/null
@@ -1,313 +0,0 @@
-# Borrowed from https://gist.github.com/maratori/47a4d00457a92aa426dbd48a18776322
-# At time of writing, gist is licensed under the terms of the MIT license.
-
-## Golden config for golangci-lint v1.51.2
-# It is very strict, but not extremely strict.
-#
-
-run:
-  # Timeout for analysis, e.g. 30s, 5m.
-  # Default: 1m
-  timeout: 3m
-
-
-# This file contains only configs which differ from defaults.
-# All possible options can be found here https://github.com/golangci/golangci-lint/blob/master/.golangci.reference.yml
-linters-settings:
-  revive:
-    rules:
-      - name: dot-imports
-        disabled: true
-
-  cyclop:
-    # The maximal code complexity to report.
-    # Default: 10
-    max-complexity: 30
-    # The maximal average package complexity.
-    # If it's higher than 0.0 (float) the check is enabled
-    # Default: 0.0
-    package-average: 10.0
-
-  errcheck:
-    # Report about not checking of errors in type assertions: `a := b.(MyStruct)`.
-    # Such cases aren't reported by default.
-    # Default: false
-    check-type-assertions: true
-
-  exhaustive:
-    # Program elements to check for exhaustiveness.
-    # Default: [ switch ]
-    check:
-      - switch
-
-  exhaustruct:
-    # List of regular expressions to exclude struct packages and names from check.
-    # Default: []
-    exclude:
-      # std libs
-      - "^net/http.Client$"
-      - "^net/http.Cookie$"
-      - "^net/http.Request$"
-      - "^net/http.Response$"
-      - "^net/http.Server$"
-      - "^net/http.Transport$"
-      - "^net/url.URL$"
-      - "^os/exec.Cmd$"
-      - "^reflect.StructField$"
-      # public libs
-      - "^github.com/Shopify/sarama.Config$"
-      - "^github.com/Shopify/sarama.ProducerMessage$"
-      - "^github.com/mitchellh/mapstructure.DecoderConfig$"
-      - "^github.com/prometheus/client_golang/.+Opts$"
-      - "^github.com/spf13/cobra.Command$"
-      - "^github.com/spf13/cobra.CompletionOptions$"
-      - "^github.com/stretchr/testify/mock.Mock$"
-      - "^github.com/testcontainers/testcontainers-go.+Request$"
-      - "^github.com/testcontainers/testcontainers-go.FromDockerfile$"
-      - "^golang.org/x/tools/go/analysis.Analyzer$"
-      - "^google.golang.org/protobuf/.+Options$"
-      - "^gopkg.in/yaml.v3.Node$"
-
-  goconst:
-    ignore-strings: "(true|false)"
-
-  funlen:
-    # Checks the number of lines in a function.
-    # If lower than 0, disable the check.
-    # Default: 60
-    lines: 100
-    # Checks the number of statements in a function.
-    # If lower than 0, disable the check.
-    # Default: 40
-    statements: 50
-
-  gocognit:
-    # Minimal code complexity to report.
-    # Default: 30 (but we recommend 10-20)
-    min-complexity: 20
-
-  gocritic:
-    # Settings passed to gocritic.
-    # The settings key is the name of a supported gocritic checker.
-    # The list of supported checkers can be find in https://go-critic.github.io/overview.
-    settings:
-      captLocal:
-        # Whether to restrict checker to params only.
-        # Default: true
-        paramsOnly: false
-      underef:
-        # Whether to skip (*x).method() calls where x is a pointer receiver.
-        # Default: true
-        skipRecvDeref: false
-
-  gomodguard:
-    blocked:
-      # List of blocked modules.
-      # Default: []
-      modules:
-        - github.com/golang/protobuf:
-            recommendations:
-              - google.golang.org/protobuf
-            reason: "see https://developers.google.com/protocol-buffers/docs/reference/go/faq#modules"
-        - github.com/satori/go.uuid:
-            recommendations:
-              - github.com/google/uuid
-            reason: "satori's package is not maintained"
-        - github.com/gofrs/uuid:
-            recommendations:
-              - github.com/google/uuid
-            reason: "gofrs' package is not go module"
-
-  govet:
-    # Enable all analyzers.
-    # Default: false
-    enable-all: true
-    # Disable analyzers by name.
-    # Run `go tool vet help` to see all analyzers.
-    # Default: []
-    disable:
-      - fieldalignment # too strict
-    # Settings per analyzer.
-    settings:
-      shadow:
-        # Whether to be strict about shadowing; can be noisy.
-        # Default: false
-        strict: false
-
-  nakedret:
-    # Make an issue if func has more lines of code than this setting, and it has naked returns.
-    # Default: 30
-    max-func-lines: 0
-
-  nolintlint:
-    # Exclude following linters from requiring an explanation.
-    # Default: []
-    allow-no-explanation: [ funlen, gocognit, lll, gochecknoinits, gochecknoglobals, nestif, cyclop, gocyclo ]
-    # Enable to require an explanation of nonzero length after each nolint directive.
-    # Default: false
-    require-explanation: true
-    # Enable to require nolint directives to mention the specific linter being suppressed.
-    # Default: false
-    require-specific: true
-
-  rowserrcheck:
-    # database/sql is always checked
-    # Default: []
-    packages:
-      - github.com/jmoiron/sqlx
-
-  tenv:
-    # The option `all` will run against whole test files (`_test.go`) regardless of method/function signatures.
-    # Otherwise, only methods that take `*testing.T`, `*testing.B`, and `testing.TB` as arguments are checked.
-    # Default: false
-    all: true
-  
-  lll:
-    # Max line length, lines longer will be reported.
-    # '\t' is counted as 1 character by default, and can be changed with the tab-width option.
-    # Default: 120.
-    line-length: 180
-    # Tab width in spaces.
-    # Default: 1
-    tab-width: 1
-
-
-
-linters:
-  disable-all: true
-  enable:
-    ## enabled by default
-    - errcheck # checking for unchecked errors, these unchecked errors can be critical bugs in some cases
-    - gosimple # specializes in simplifying a code
-    - govet # reports suspicious constructs, such as Printf calls whose arguments do not align with the format string
-    - ineffassign # detects when assignments to existing variables are not used
-    - staticcheck # is a go vet on steroids, applying a ton of static analysis checks
-    - typecheck # like the front-end of a Go compiler, parses and type-checks Go code
-    - unused # checks for unused constants, variables, functions and types
-    ## disabled by default
-    - asasalint # checks for pass []any as any in variadic func(...any)
-    - asciicheck # checks that your code does not contain non-ASCII identifiers
-    - bidichk # checks for dangerous unicode character sequences
-    - bodyclose # checks whether HTTP response body is closed successfully
-    - cyclop # checks function and package cyclomatic complexity
-    - dupl # tool for code clone detection
-    - durationcheck # checks for two durations multiplied together
-    - errname # checks that sentinel errors are prefixed with the Err and error types are suffixed with the Error
-    - errorlint # finds code that will cause problems with the error wrapping scheme introduced in Go 1.13
-    - exhaustive # checks exhaustiveness of enum switch statements
-    - forbidigo # forbids identifiers
-    - funlen # tool for detection of long functions
-    - gocheckcompilerdirectives # validates go compiler directive comments (//go:)
-    - gochecknoglobals # checks that no global variables exist
-    - gochecknoinits # checks that no init functions are present in Go code
-    - gocognit # computes and checks the cognitive complexity of functions
-    - goconst # finds repeated strings that could be replaced by a constant
-    - gocritic # provides diagnostics that check for bugs, performance and style issues
-    - gocyclo # computes and checks the cyclomatic complexity of functions
-    - godot # checks if comments end in a period
-    - goimports # in addition to fixing imports, goimports also formats your code in the same style as gofmt
-    - gomodguard # allow and block lists linter for direct Go module dependencies. This is different from depguard where there are different block types for example version constraints and module recommendations
-    - goprintffuncname # checks that printf-like functions are named with f at the end
-    - gosec # inspects source code for security problems
-    - lll # reports long lines
-    - loggercheck # checks key value pairs for common logger libraries (kitlog,klog,logr,zap)
-    - makezero # finds slice declarations with non-zero initial length
-    - nakedret # finds naked returns in functions greater than a specified function length
-    - nestif # reports deeply nested if statements
-    - nilerr # finds the code that returns nil even if it checks that the error is not nil
-    - nilnil # checks that there is no simultaneous return of nil error and an invalid value
-    - noctx # finds sending http request without context.Context
-    - nolintlint # reports ill-formed or insufficient nolint directives
-    - nonamedreturns # reports all named returns
-    - nosprintfhostport # checks for misuse of Sprintf to construct a host with port in a URL
-    - predeclared # finds code that shadows one of Go's predeclared identifiers
-    - promlinter # checks Prometheus metrics naming via promlint
-    - reassign # checks that package variables are not reassigned
-    - revive # fast, configurable, extensible, flexible, and beautiful linter for Go, drop-in replacement of golint
-    - rowserrcheck # checks whether Err of rows is checked successfully
-    - sqlclosecheck # checks that sql.Rows and sql.Stmt are closed
-    - stylecheck # is a replacement for golint
-    - tenv # detects using os.Setenv instead of t.Setenv since Go1.17
-    - testableexamples # checks if examples are testable (have an expected output)
-    - testpackage # makes you use a separate _test package
-    - tparallel # detects inappropriate usage of t.Parallel() method in your Go test codes
-    - unconvert # removes unnecessary type conversions
-    - unparam # reports unused function parameters
-    - usestdlibvars # detects the possibility to use variables/constants from the Go standard library
-    - wastedassign # finds wasted assignment statements
-    - whitespace # detects leading and trailing whitespace
-
-    ## you may want to enable
-    #- decorder # checks declaration order and count of types, constants, variables and functions
-    #- exhaustruct # [highly recommend to enable] checks if all structure fields are initialized
-    #- gci # controls golang package import order and makes it always deterministic
-    #- ginkgolinter # [if you use ginkgo/gomega] enforces standards of using ginkgo and gomega
-    #- godox # detects FIXME, TODO and other comment keywords
-    #- goheader # checks is file header matches to pattern
-    #- interfacebloat # checks the number of methods inside an interface
-    #- ireturn # accept interfaces, return concrete types
-    #- prealloc # [premature optimization, but can be used in some cases] finds slice declarations that could potentially be preallocated
-    #- varnamelen # [great idea, but too many false positives] checks that the length of a variable's name matches its scope
-    #- wrapcheck # checks that errors returned from external packages are wrapped
-
-    ## disabled
-    #- containedctx # detects struct contained context.Context field
-    #- contextcheck # [too many false positives] checks the function whether use a non-inherited context
-    #- depguard # [replaced by gomodguard] checks if package imports are in a list of acceptable packages
-    #- dogsled # checks assignments with too many blank identifiers (e.g. x, _, _, _, := f())
-    #- dupword # [useless without config] checks for duplicate words in the source code
-    #- errchkjson # [don't see profit + I'm against of omitting errors like in the first example https://github.com/breml/errchkjson] checks types passed to the json encoding functions. Reports unsupported types and optionally reports occasions, where the check for the returned error can be omitted
-    #- forcetypeassert # [replaced by errcheck] finds forced type assertions
-    #- goerr113 # [too strict] checks the errors handling expressions
-    #- gofmt # [replaced by goimports] checks whether code was gofmt-ed
-    #- gofumpt # [replaced by goimports, gofumports is not available yet] checks whether code was gofumpt-ed
-    #- grouper # analyzes expression groups
-    #- importas # enforces consistent import aliases
-    #- maintidx # measures the maintainability index of each function
-    #- misspell # [useless] finds commonly misspelled English words in comments
-    #- nlreturn # [too strict and mostly code is not more readable] checks for a new line before return and branch statements to increase code clarity
-    #- paralleltest # [too many false positives] detects missing usage of t.Parallel() method in your Go test
-    #- tagliatelle # checks the struct tags
-    #- thelper # detects golang test helpers without t.Helper() call and checks the consistency of test helpers
-    #- wsl # [too strict and mostly code is not more readable] whitespace linter forces you to use empty lines
-
-    ## deprecated
-    #- deadcode # [deprecated, replaced by unused] finds unused code
-    #- exhaustivestruct # [deprecated, replaced by exhaustruct] checks if all struct's fields are initialized
-    #- golint # [deprecated, replaced by revive] golint differs from gofmt. Gofmt reformats Go source code, whereas golint prints out style mistakes
-    #- ifshort # [deprecated] checks that your code uses short syntax for if-statements whenever possible
-    #- interfacer # [deprecated] suggests narrower interface types
-    #- maligned # [deprecated, replaced by govet fieldalignment] detects Go structs that would take less memory if their fields were sorted
-    #- nosnakecase # [deprecated, replaced by revive var-naming] detects snake case of variable naming and function name
-    #- scopelint # [deprecated, replaced by exportloopref] checks for unpinned variables in go programs
-    #- structcheck # [deprecated, replaced by unused] finds unused struct fields
-    #- varcheck # [deprecated, replaced by unused] finds unused global variables and constants
-
-
-issues:
-  # Maximum count of issues with the same text.
-  # Set to 0 to disable.
-  # Default: 3
-  max-same-issues: 50
-
-  exclude-rules:
-    - source: "^//\\s*go:generate\\s"
-      linters: [ lll ]
-    - source: "(noinspection|TODO)"
-      linters: [ godot ]
-    - source: "//noinspection"
-      linters: [ gocritic ]
-    - source: "^\\s+if _, ok := err\\.\\([^.]+\\.InternalError\\); ok {"
-      linters: [ errorlint ]
-    - path: "_test\\.go"
-      linters:
-        - bodyclose
-        - dupl
-        - funlen
-        - goconst
-        - gosec
-        - noctx
-        - wrapcheck
-        - gochecknoglobals
-        - testpackage
-        - tparallel
diff --git a/.vscode/settings.json b/.vscode/settings.json
new file mode 100644
index 00000000000..a9982254f11
--- /dev/null
+++ b/.vscode/settings.json
@@ -0,0 +1,42 @@
+{
+  "github.copilot.chat.commitMessageGeneration.instructions": [
+    {
+      "text": "Follow the commit message conventions of the project, fetch from https://www.conventionalcommits.org/",
+    }
+  ],
+
+  "github.copilot.chat.codeGeneration.instructions": [
+    {
+      "text": "Generate code that is efficient and follows best practices.",
+    },
+    {
+      "text": "Use the same programming language and framework as the existing code.",
+    },
+    {
+      "text": "Follow the coding style and conventions of the project.",
+    },
+    {
+      "text": "Include comments and documentation for the generated code.",
+    },
+    {
+      "text": "Ensure all new code is covered by tests.",
+    },
+    {
+      "text": "If changes are in folder 'parts', 'pkg', run 'make generate' to regenerate the snapshot test data.",
+    }
+  ],
+  "github.copilot.chat.testGeneration.instructions": [
+    {
+      "text": "Generate unit tests for the function, including edge cases and error handling.",
+    },
+    {
+      "text": "Use the same programming language and framework as the function.",
+    },
+    {
+      "text": "Follow best practices for writing unit tests.",
+    },
+    {
+      "text": "Generete e2e tests when applicable, following the same pattern as the existing tests.",
+    },
+  ],
+}
\ No newline at end of file


Reviews:
user: login: timmy-wright
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-05-01T03:58:49Z
user: login: timmy-wright
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-05-01T03:59:23Z
user: login: timmy-wright
body: As per comments.
state: CHANGES_REQUESTED
author_association: CONTRIBUTOR
submitted_at: 2025-05-01T04:00:37Z
user: login: davefellows
state: COMMENTED
author_association: NONE
submitted_at: 2025-05-01T04:18:21Z
user: login: bravebeaver
state: COMMENTED
author_association: MEMBER
submitted_at: 2025-05-01T04:54:00Z
user: login: bravebeaver
state: COMMENTED
author_association: MEMBER
submitted_at: 2025-05-01T04:57:14Z
user: login: bravebeaver
state: COMMENTED
author_association: MEMBER
submitted_at: 2025-05-01T05:01:10Z
user: login: cameronmeissner
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-05-01T16:52:19Z
user: login: cameronmeissner
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-05-01T16:53:20Z
user: login: cameronmeissner
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-05-01T16:53:47Z
user: login: cameronmeissner
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-05-01T16:54:29Z
user: login: cameronmeissner
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-05-01T16:55:40Z
user: login: bravebeaver
state: COMMENTED
author_association: MEMBER
submitted_at: 2025-05-01T21:49:09Z
user: login: timmy-wright
state: APPROVED
author_association: CONTRIBUTOR
submitted_at: 2025-05-01T22:29:14Z

Review comments:
diff_hunk: @@ -0,0 +1,44 @@
+# Overview
+
+AgentBaker builds VHDs using Packer for various base OS: Windows, Azure Linux and Ubuntu. For each OS there are various versions (windows 2019, 2022, ubuntu 2004, 2204 etc). The goal is to
+
+- achieve consistency among all builds as much as possible
+- avoid function regression when introducing new features (component updates, new drivers, new binaries), ensure that all supported OS / versions are tested
+- avoid performance regression when making changes
+
+## AgentBaker Service 
+
+[apiserver](../apiserver/) is go based webserver. It receives request from RP and generates CSE and CustomData to be used on the VHD when a new node is created / provisioned.
path: .github/copilot-instructions.md
user: login: timmy-wright
body: should we say aks-rp or just rp? Maybe we need a hint to copilot that aks-rp and rp usually mean the same thing.
created_at: 2025-05-01T03:58:49Z
author_association: CONTRIBUTOR
diff_hunk: @@ -0,0 +1,44 @@
+# Overview
+
+AgentBaker builds VHDs using Packer for various base OS: Windows, Azure Linux and Ubuntu. For each OS there are various versions (windows 2019, 2022, ubuntu 2004, 2204 etc). The goal is to
+
+- achieve consistency among all builds as much as possible
+- avoid function regression when introducing new features (component updates, new drivers, new binaries), ensure that all supported OS / versions are tested
+- avoid performance regression when making changes
+
+## AgentBaker Service 
+
+[apiserver](../apiserver/) is go based webserver. It receives request from RP and generates CSE and CustomData to be used on the VHD when a new node is created / provisioned.
+
+## VHD Builder
+
+VHDs are built using [Packer](https://developer.hashicorp.com/packer/docs) in [vhdbuilder](../vhdbuilder/).
+
+## Parts
+
+[parts](../parts/) serves both AgentBaker Service and VHD build. AgentBaker service and VHDs are coupled because of this shared component.
+
+Windows uses a different folder [cse](../staging/cse/windows/) for almost the same purpose. There are subtle differences as windows CSEs can be downloaded as a zip file during provisioning time due to restrictions on the file size on Windows system, while for linux based systems the cse/custom data are dropped in during provisioning time.
+
+## Release
+
+AgentBaker follows a weekky release. All VHDs are built and tagged. New versions of AgentBaker service is deployed. Older versions (up to 6 months) of AgentBaker service are kept for the coupling reason above.
path: .github/copilot-instructions.md
user: login: timmy-wright
body: Might be worth saying that Linux VHDs are released with the AgentBaker release and Windows VHDs have a different timeline.
created_at: 2025-05-01T03:59:22Z
author_association: CONTRIBUTOR
diff_hunk: @@ -0,0 +1,44 @@
+# Overview
+
+AgentBaker builds VHDs using Packer for various base OS: Windows, Azure Linux and Ubuntu. For each OS there are various versions (windows 2019, 2022, ubuntu 2004, 2204 etc). The goal is to
+
+- achieve consistency among all builds as much as possible
+- avoid function regression when introducing new features (component updates, new drivers, new binaries), ensure that all supported OS / versions are tested
path: .github/copilot-instructions.md
user: login: davefellows
body: ```suggestion
- avoid functional regression when introducing new features (component updates, new drivers, new binaries), ensure that all supported OS / versions are tested
```
created_at: 2025-05-01T04:08:51Z
author_association: NONE
diff_hunk: @@ -0,0 +1,44 @@
+# Overview
+
+AgentBaker builds VHDs using Packer for various base OS: Windows, Azure Linux and Ubuntu. For each OS there are various versions (windows 2019, 2022, ubuntu 2004, 2204 etc). The goal is to
+
+- achieve consistency among all builds as much as possible
+- avoid function regression when introducing new features (component updates, new drivers, new binaries), ensure that all supported OS / versions are tested
+- avoid performance regression when making changes
+
+## AgentBaker Service 
+
+[apiserver](../apiserver/) is go based webserver. It receives request from RP and generates CSE and CustomData to be used on the VHD when a new node is created / provisioned.
path: .github/copilot-instructions.md
user: login: davefellows
body: The request is from runtime RP so RP is correct (vs the repo).
created_at: 2025-05-01T04:11:51Z
author_association: NONE
diff_hunk: @@ -0,0 +1,44 @@
+# Overview
+
+AgentBaker builds VHDs using Packer for various base OS: Windows, Azure Linux and Ubuntu. For each OS there are various versions (windows 2019, 2022, ubuntu 2004, 2204 etc). The goal is to
+
+- achieve consistency among all builds as much as possible
+- avoid function regression when introducing new features (component updates, new drivers, new binaries), ensure that all supported OS / versions are tested
+- avoid performance regression when making changes
+
+## AgentBaker Service 
+
+[apiserver](../apiserver/) is go based webserver. It receives request from RP and generates CSE and CustomData to be used on the VHD when a new node is created / provisioned.
+
+## VHD Builder
+
+VHDs are built using [Packer](https://developer.hashicorp.com/packer/docs) in [vhdbuilder](../vhdbuilder/).
+
+## Parts
path: .github/copilot-instructions.md
user: login: davefellows
body: Is it worth saying what "Parts" are? I have no idea :) 
created_at: 2025-05-01T04:12:37Z
author_association: NONE
diff_hunk: @@ -0,0 +1,44 @@
+# Overview
+
+AgentBaker builds VHDs using Packer for various base OS: Windows, Azure Linux and Ubuntu. For each OS there are various versions (windows 2019, 2022, ubuntu 2004, 2204 etc). The goal is to
+
+- achieve consistency among all builds as much as possible
+- avoid function regression when introducing new features (component updates, new drivers, new binaries), ensure that all supported OS / versions are tested
+- avoid performance regression when making changes
+
+## AgentBaker Service 
+
+[apiserver](../apiserver/) is go based webserver. It receives request from RP and generates CSE and CustomData to be used on the VHD when a new node is created / provisioned.
+
+## VHD Builder
+
+VHDs are built using [Packer](https://developer.hashicorp.com/packer/docs) in [vhdbuilder](../vhdbuilder/).
+
+## Parts
+
+[parts](../parts/) serves both AgentBaker Service and VHD build. AgentBaker service and VHDs are coupled because of this shared component.
+
+Windows uses a different folder [cse](../staging/cse/windows/) for almost the same purpose. There are subtle differences as windows CSEs can be downloaded as a zip file during provisioning time due to restrictions on the file size on Windows system, while for linux based systems the cse/custom data are dropped in during provisioning time.
+
+## Release
+
+AgentBaker follows a weekky release. All VHDs are built and tagged. New versions of AgentBaker service is deployed. Older versions (up to 6 months) of AgentBaker service are kept for the coupling reason above.
+
+## Coding standing
+
+### Golang Guidelines
+
+- Follow golang best practice
+- Use vanilla go test framework
+
+### PowerShell Guidelines
+
+- follow powershell best practices
+
+### ShellScripts Guidelines
+
+- use shellcheck for sanity checking
+- use ShellSpec for testing
+- the shell scripts are used on both azure linux and ubuntu and cross platform portability is critical.
path: .github/copilot-instructions.md
user: login: davefellows
body: ```suggestion
- the shell scripts are used on both azure linux/mariner and ubuntu and cross platform portability is critical.
```
(I notice the LLMs I've used so far mostly know of Azure Linux as Mariner :) )
created_at: 2025-05-01T04:14:55Z
author_association: NONE
diff_hunk: @@ -0,0 +1,44 @@
+# Overview
+
+AgentBaker builds VHDs using Packer for various base OS: Windows, Azure Linux and Ubuntu. For each OS there are various versions (windows 2019, 2022, ubuntu 2004, 2204 etc). The goal is to
+
+- achieve consistency among all builds as much as possible
+- avoid function regression when introducing new features (component updates, new drivers, new binaries), ensure that all supported OS / versions are tested
+- avoid performance regression when making changes
+
+## AgentBaker Service 
+
+[apiserver](../apiserver/) is go based webserver. It receives request from RP and generates CSE and CustomData to be used on the VHD when a new node is created / provisioned.
+
+## VHD Builder
+
+VHDs are built using [Packer](https://developer.hashicorp.com/packer/docs) in [vhdbuilder](../vhdbuilder/).
+
+## Parts
+
+[parts](../parts/) serves both AgentBaker Service and VHD build. AgentBaker service and VHDs are coupled because of this shared component.
+
+Windows uses a different folder [cse](../staging/cse/windows/) for almost the same purpose. There are subtle differences as windows CSEs can be downloaded as a zip file during provisioning time due to restrictions on the file size on Windows system, while for linux based systems the cse/custom data are dropped in during provisioning time.
+
+## Release
+
+AgentBaker follows a weekky release. All VHDs are built and tagged. New versions of AgentBaker service is deployed. Older versions (up to 6 months) of AgentBaker service are kept for the coupling reason above.
+
+## Coding standing
+
+### Golang Guidelines
+
+- Follow golang best practice
+- Use vanilla go test framework
+
+### PowerShell Guidelines
+
+- follow powershell best practices
+
+### ShellScripts Guidelines
+
+- use shellcheck for sanity checking
+- use ShellSpec for testing
+- the shell scripts are used on both azure linux and ubuntu and cross platform portability is critical.
+- when using functions defined in other files, ensure it is sourced properly.
+- prefer to avoid sharing variables between functions unless they are environment variables.
path: .github/copilot-instructions.md
user: login: davefellows
body: "use local variables rather than constants when their scoping allows for it"?
I've noticed LLMs will flip-flop between the two which can create a bit of a mess of inconsistency.
created_at: 2025-05-01T04:16:40Z
author_association: NONE
diff_hunk: @@ -0,0 +1,44 @@
+# Overview
+
+AgentBaker builds VHDs using Packer for various base OS: Windows, Azure Linux and Ubuntu. For each OS there are various versions (windows 2019, 2022, ubuntu 2004, 2204 etc). The goal is to
+
+- achieve consistency among all builds as much as possible
+- avoid function regression when introducing new features (component updates, new drivers, new binaries), ensure that all supported OS / versions are tested
+- avoid performance regression when making changes
+
+## AgentBaker Service 
+
+[apiserver](../apiserver/) is go based webserver. It receives request from RP and generates CSE and CustomData to be used on the VHD when a new node is created / provisioned.
path: .github/copilot-instructions.md
user: login: bravebeaver
body: i probably should remove the mention of RP? not sure whether copilot can reach out to RP code anyway and probably should just refer to it as an external client?
created_at: 2025-05-01T04:54:00Z
author_association: MEMBER
diff_hunk: @@ -0,0 +1,44 @@
+# Overview
+
+AgentBaker builds VHDs using Packer for various base OS: Windows, Azure Linux and Ubuntu. For each OS there are various versions (windows 2019, 2022, ubuntu 2004, 2204 etc). The goal is to
+
+- achieve consistency among all builds as much as possible
+- avoid function regression when introducing new features (component updates, new drivers, new binaries), ensure that all supported OS / versions are tested
+- avoid performance regression when making changes
+
+## AgentBaker Service 
+
+[apiserver](../apiserver/) is go based webserver. It receives request from RP and generates CSE and CustomData to be used on the VHD when a new node is created / provisioned.
+
+## VHD Builder
+
+VHDs are built using [Packer](https://developer.hashicorp.com/packer/docs) in [vhdbuilder](../vhdbuilder/).
+
+## Parts
+
+[parts](../parts/) serves both AgentBaker Service and VHD build. AgentBaker service and VHDs are coupled because of this shared component.
+
+Windows uses a different folder [cse](../staging/cse/windows/) for almost the same purpose. There are subtle differences as windows CSEs can be downloaded as a zip file during provisioning time due to restrictions on the file size on Windows system, while for linux based systems the cse/custom data are dropped in during provisioning time.
+
+## Release
+
+AgentBaker follows a weekky release. All VHDs are built and tagged. New versions of AgentBaker service is deployed. Older versions (up to 6 months) of AgentBaker service are kept for the coupling reason above.
path: .github/copilot-instructions.md
user: login: bravebeaver
body: totally.. could that also be a reason that windows CSE are stored differently?
created_at: 2025-05-01T04:57:13Z
author_association: MEMBER
diff_hunk: @@ -0,0 +1,44 @@
+# Overview
+
+AgentBaker builds VHDs using Packer for various base OS: Windows, Azure Linux and Ubuntu. For each OS there are various versions (windows 2019, 2022, ubuntu 2004, 2204 etc). The goal is to
+
+- achieve consistency among all builds as much as possible
+- avoid function regression when introducing new features (component updates, new drivers, new binaries), ensure that all supported OS / versions are tested
+- avoid performance regression when making changes
+
+## AgentBaker Service 
+
+[apiserver](../apiserver/) is go based webserver. It receives request from RP and generates CSE and CustomData to be used on the VHD when a new node is created / provisioned.
+
+## VHD Builder
+
+VHDs are built using [Packer](https://developer.hashicorp.com/packer/docs) in [vhdbuilder](../vhdbuilder/).
+
+## Parts
path: .github/copilot-instructions.md
user: login: bravebeaver
body: i think you are right.. it is a shared components and probably not on the same level as the other 2 "services".

my thinking is to guide copilot on the structure of the repo
created_at: 2025-05-01T05:01:10Z
author_association: MEMBER
diff_hunk: @@ -0,0 +1,46 @@
+# Overview
+
+AgentBaker builds VHDs using Packer for various base OS: Windows, Azure Linux and Ubuntu. For each OS there are various versions (windows 2019, 2022, ubuntu 2004, 2204 etc). The goal is to
+
+- achieve consistency among all builds as much as possible
+- avoid functional regression when introducing new features (component updates, new drivers, new binaries), ensure that all supported OS / versions are tested
+- avoid performance regression when making changes
+
+## AgentBaker Service
+
+[apiserver](../apiserver/) is `go` based webserver. It receives request from external client and generates CSE and CustomData to be used on the VHD when a new node is created / provisioned.
+
+## VHD Builder
+
+VHDs are built using [Packer](https://developer.hashicorp.com/packer/docs) in [vhdbuilder](../vhdbuilder/).
+
+
+[parts](../parts/) serves both AgentBaker Service and VHD build. AgentBaker service and VHDs are coupled because of this shared component.
+
+Windows uses a different folder [cse](../staging/cse/windows/) for almost the same purpose. There are subtle differences as windows CSEs can be downloaded as a zip file during provisioning time due to restrictions on the file size on Windows system, while for linux based systems the cse/custom data are dropped in during provisioning time.
+
+## Release
+
+AgentBaker follows a weekky release. All VHDs are built and tagged. New versions of AgentBaker service is deployed. Older versions (up to 6 months) of AgentBaker service are kept for the coupling reason discussed above.
path: .github/copilot-instructions.md
user: login: cameronmeissner
body: ```suggestion
Tags of AgentBaker and corresponding Linux VHDs are released every week. Linux VHDs are built with a particular image version in the YYYYMM.DD.PATCH format. All Linux VHD versions correspond to a particular tag of the AgentBaker go module. AgentBaker go module tags follow the format v0.YYYYMMDD.PATCH. The mapping between AgentBaker tag and Linux VHD version is defined within [linux_sig_version.json](../pkg/agent/datamodel/linux_sig_version.json).
```
created_at: 2025-05-01T16:52:18Z
author_association: CONTRIBUTOR
diff_hunk: @@ -0,0 +1,46 @@
+# Overview
+
+AgentBaker builds VHDs using Packer for various base OS: Windows, Azure Linux and Ubuntu. For each OS there are various versions (windows 2019, 2022, ubuntu 2004, 2204 etc). The goal is to
+
+- achieve consistency among all builds as much as possible
+- avoid functional regression when introducing new features (component updates, new drivers, new binaries), ensure that all supported OS / versions are tested
+- avoid performance regression when making changes
+
+## AgentBaker Service
+
+[apiserver](../apiserver/) is `go` based webserver. It receives request from external client and generates CSE and CustomData to be used on the VHD when a new node is created / provisioned.
path: .github/copilot-instructions.md
user: login: cameronmeissner
body: ```suggestion
[apiserver](../apiserver/) is `go` based webserver. It receives request from external client and generates CSE and CustomData to be used on the VHD when a new node is created / provisioned. The webserver is also used to determine the latest version of Linux VHDs available for provisioning within AKS clusters.
```
created_at: 2025-05-01T16:53:20Z
author_association: CONTRIBUTOR
diff_hunk: @@ -0,0 +1,46 @@
+# Overview
+
+AgentBaker builds VHDs using Packer for various base OS: Windows, Azure Linux and Ubuntu. For each OS there are various versions (windows 2019, 2022, ubuntu 2004, 2204 etc). The goal is to
+
+- achieve consistency among all builds as much as possible
+- avoid functional regression when introducing new features (component updates, new drivers, new binaries), ensure that all supported OS / versions are tested
+- avoid performance regression when making changes
path: .github/copilot-instructions.md
user: login: cameronmeissner
body: ```suggestion
- avoid VHD build and node provisioning performance regressions when making any changes
```
created_at: 2025-05-01T16:53:46Z
author_association: CONTRIBUTOR
diff_hunk: @@ -0,0 +1,46 @@
+# Overview
+
+AgentBaker builds VHDs using Packer for various base OS: Windows, Azure Linux and Ubuntu. For each OS there are various versions (windows 2019, 2022, ubuntu 2004, 2204 etc). The goal is to
+
+- achieve consistency among all builds as much as possible
+- avoid functional regression when introducing new features (component updates, new drivers, new binaries), ensure that all supported OS / versions are tested
+- avoid performance regression when making changes
+
+## AgentBaker Service
+
+[apiserver](../apiserver/) is `go` based webserver. It receives request from external client and generates CSE and CustomData to be used on the VHD when a new node is created / provisioned.
+
+## VHD Builder
+
+VHDs are built using [Packer](https://developer.hashicorp.com/packer/docs) in [vhdbuilder](../vhdbuilder/).
+
+
+[parts](../parts/) serves both AgentBaker Service and VHD build. AgentBaker service and VHDs are coupled because of this shared component.
+
+Windows uses a different folder [cse](../staging/cse/windows/) for almost the same purpose. There are subtle differences as windows CSEs can be downloaded as a zip file during provisioning time due to restrictions on the file size on Windows system, while for linux based systems the cse/custom data are dropped in during provisioning time.
+
+## Release
+
+AgentBaker follows a weekky release. All VHDs are built and tagged. New versions of AgentBaker service is deployed. Older versions (up to 6 months) of AgentBaker service are kept for the coupling reason discussed above.
+
+Windows VHD are released separately, following windows patch tuesday schedule.
+
+## Coding standing
path: .github/copilot-instructions.md
user: login: cameronmeissner
body: ```suggestion
## Coding standards
```
created_at: 2025-05-01T16:54:29Z
author_association: CONTRIBUTOR
path: .golangci.bck.yaml
user: login: cameronmeissner
body: was this an old golangci-lint config file? not sure where it came from...
created_at: 2025-05-01T16:55:40Z
author_association: CONTRIBUTOR
path: .golangci.bck.yaml
user: login: bravebeaver
body: this is the old file generated when we update golang ci linter plugin.. and was left over from the other [PR](https://github.com/Azure/AgentBaker/pull/6109)
created_at: 2025-05-01T21:49:09Z
author_association: MEMBER

PR comments:
user: login: github-actions[bot]
created_at: 2025-05-01T22:25:50Z
body: No changes to cached containers or packages on Windows VHDs

<!-- thollander/actions-comment-pull-request "WINDOWS_VHD_CONTENT_DIFF" -->
author_association: CONTRIBUTOR