Repository navigation
chore(release): promote dev to main (v1.0.0) - #2154
Merged
bradygaster merged 741 commits intoOct 3, 2026
Merged
Conversation
…cit (github#1961) (github#1964) * fix(gh-aw): prevent silent truncation of activation label operations Working as FIDO (Quality Owner). A 50-issue activation could lose `add_labels` operations while the run still reported success. Two causes: 1. `add-labels: max: 80` was below the worst case under the reading gh-aw's own injected prose invites. The compiler emits "Maximum {max} label(s) can be added", which reads as a budget of label NAMES; a full 50-issue activation applying `squad` + `squad:{agent}` needs 100. An agent taking that phrasing literally could conclude it had overrun and stop labeling early or batch issues together. 2. gh-aw v0.87.10 drops an over-limit item rather than failing. Its collector (`collect_ndjson_output.cjs`) rejects the item and `continue`s, pushing a string into `errors`; those are emitted with `core.warning`, never `core.setFailed`. The run finishes green with label operations missing and nothing announces it. Verified against the pinned runtime rather than inferred: `max` caps safe-output ITEMS (tool calls) per type, not label names inside a call. A two-label call costs one item. Capacity: largest supported activation is 50 issues (`enterprise` profile `max_issues: 50`, the highest documented profile limit, and the same threshold `squad-plan-activate` uses to force phased activation). Worst case at that size is 50 `create-issue` items, 50 `add_labels` calls, <=2 labels per call, 100 label names across the run. Changes: - `add-labels: max` 80 -> 110, sized to cover the worst case under BOTH readings (50 calls, 100 names) so no interpretation of the cap can justify dropping a label operation. `create-issue` stays at 75. - Record the derivation and the item-vs-label-name semantics in the activation skill, plus the fact that an over-limit item is dropped, not failed. - New Step 2e Label-Operation Reconciliation: track `activated` vs `labeled`, count a never-made/rejected/errored call as unlabeled, and on shortfall call `report_incomplete` naming the affected work items. gh-aw treats that as a failure signal even on successful exit, so a truncated activation can no longer be recorded as clean. Cap exhaustion becomes a nameable cause when observed; github#1683's rule against guessing at caps is preserved and narrowed. Tests: `test/gh-aw-activation-capacity.test.ts` (27) covers the derived maximum, capacity under both readings, at-maximum and one-over boundaries, and the reconciliation contract. Compiled-artifact assertions prefer runtime evidence over prose: the declared cap reaching `GH_AW_SAFE_OUTPUTS_CONFIG`, the injected constraint carrying the same number, `report_incomplete` being present (and so callable), and agent-job permissions staying `issues: read`. Fails closed if `gh aw` is absent, per github#1834. Mutation-checked: reverting the cap to 80 fails 4. No changes to temporary-ID linkage (github#1962), fast-path parity (github#1959), label result reporting (github#1963), broad contract coverage (github#1960), or E4 (github#1958). Step 2e is deliberately neutral about how `add_labels` identifies its target so it does not conflict with github#1962. Closes github#1961 Parent github#1957 Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> * fix(gh-aw): correct runtime claims in activation capacity safeguards Independent review found three factual defects in the prose and tests shipped by the first commit. All three are corrected against the pinned gh-aw v0.87.10 sources rather than gh-aw's own injected descriptions. 1. `report_incomplete` does NOT make the run conclude non-successfully. `report_incomplete_handler.cjs` emits `core.warning` only, and `handle_agent_failure.cjs` contains zero `setFailed`/`process.exit` calls in 4453 lines. What it actually does is open or update a durable `[aw] {workflow} reported incomplete result` tracking issue. Step 2e now states that, says the run still reports success, and tells the agent never to rely on a red run to carry the signal. gh-aw's own tool description ("treated as a failure signal even when the agent exits successfully") is misleading; trusting it was exactly the injected-prose mistake github#1961 exists to prevent. Limitation, stated honestly: no narrow mechanism in the pinned runtime makes an incomplete activation conclude red. Forcing one would require a custom safe-job, which is outside this issue's scope. The durable tracking record plus the "never report a clean activation you did not perform" rule are what carry the signal. 2. Cap enforcement is dual, not collection-only. Per Safe Outputs MCE4, `enforcePerTypeMax` in `safe_outputs_handlers.cjs` throws JSON-RPC `E002: {type} limit reached` at invocation time, which the agent DOES see; the collector then drops surplus items with a warning. Removed the claim that an over-limit item "never appears as an error to the agent". Reconciliation still keys on absence-of-success, not presence-of-error, because a call can also simply never be made. 3. The old `max: 80` did not cause runtime truncation — 50 calls never reached it. The real hazard is gh-aw's injected "Maximum 80 label(s) can be added" wording against a 100-label worst case, which invites agent self-truncation. 110 is justified by that hazard plus bounded margin, and the docblock now explicitly records what is NOT claimed. Also, per the PR github#1965 review: Step 2e no longer demands a real issue number for items created during the run. Issue creation is deferred to the post-agent job, so it names the stable temporary ID plus title and intended labels, and quotes a real number only for a reused issue — avoiding reintroduction of github#1962's invalid-number assumption. Tests: renamed the two overclaiming tests and gave each a negative guard that fails if the retracted wording returns; added coverage for the temporary-ID rule. Trimmed prose to stay under the existing 160 KB source-growth guard rather than raising another test's budget. Verified: 221/221 across the three gh-aw suites; mutation-checked (cap -> 80 fails 5 tests incl. the compiled-runtime one, reintroducing either retracted claim fails its guard); strict compile clean on all four workflows; npm run build passes. Closes github#1961 Parent github#1957 Working as FIDO (Quality Owner) Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> Copilot-Session: 2471face-3b27-4419-bd48-0becd2642d7f * test(gh-aw): use explicit .js extension on helper import Addresses Copilot review on PR github#1964. The reviewer is correct on both counts. `tsc --module nodenext --moduleResolution nodenext` reports exactly one error on this file, and TypeScript names the fix itself: test/gh-aw-activation-capacity.test.ts(94,46): error TS2835: Relative import paths need explicit file extensions in ECMAScript imports when '--moduleResolution' is 'node16' or 'nodenext'. Did you mean './helpers/gh-aw-lock.js'? The repo is `"type": "module"` with `module`/`moduleResolution: NodeNext` in the root tsconfig, and the four other suites importing this helper already use the `.js` specifier. This file was the lone outlier; it now matches. Verified: 293/293 across all eight suites that import the helper, all four workflows compile with `--strict` (pre-existing warnings only), `npm run build` passes, and the NodeNext type-check on this file is now clean. Refs github#1961. Parent github#1957. Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> Copilot-Session: 2471face-3b27-4419-bd48-0becd2642d7f * fix(workflows): state Step 2e counts as accepted operations, not applied labels Copilot review flagged that Step 2e's reconciliation claimed issues "received their labels". github#1963 (now merged to dev) settled the vocabulary: an accepted safe output is queued this turn and applied by the post-agent job, so the agent has evidence only that a call was accepted for a specific target -- never that a label reached GitHub. Step 2e was the remaining place still asserting application, which conflicts with the accepted-vs-applied rule the same skill now states. - `labeled` is defined as issues whose add_labels call was accepted. - The report_incomplete reason reads "had a label operation accepted". - "proof that every label landed" -> "every label operation was accepted". - Added an explicit statement that the counts track label operations, not labels present on GitHub. Tests: new assertion guards the positive and both retired over-claim phrasings; verified by reverting the prose (1 failed, 28 passed) rather than assuming. Tightened the sibling assertion to match the exact count definitions -- the previous `.*`-joined form matched a distant "was accepted" elsewhere in the flattened skill and so failed to detect a reverted definition. Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> Copilot-Session: 0515ad5d-4c5b-48bb-92a6-4e1296594cab * test(gh-aw): anchor the false-success assertion, which was vacuous Copilot review caught that the regex ended in an `|activated.*artifact` alternative. Alternation binds loosest, so the whole pattern collapsed to that branch and matched any mention of the artifact -- the test would have passed with the `labeled < activated` condition deleted from the prose, which is the entire invariant it names. Anchored to the full sentence and verified by mutation: removing the condition from Step 2e now fails (1 failed / 28 passed) where it previously passed. Second instance of this defect class in this suite; the sibling count assertions were tightened in 4ec89dd for the same reason. Audited the remaining alternations here -- `/finish green|still succeeds/` is legitimate (two accepted phrasings, both specific). Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> Copilot-Session: 0515ad5d-4c5b-48bb-92a6-4e1296594cab --------- Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> Copilot-Session: 2471face-3b27-4419-bd48-0becd2642d7f Copilot-Session: 0515ad5d-4c5b-48bb-92a6-4e1296594cab
…mplates (github#1949) * docs: add .squad/templates/README.md — runtime inputs vs bootstrap templates Add a README.md template that ships with squad init to explain which files under .squad/templates/ are runtime inputs (coordinator reads them on-demand) vs bootstrap templates (used once to seed agent files). Register it in the TEMPLATE_MANIFEST so it lands in every generated project and is kept current by squad upgrade. Also drop a copy of the README into this repo's .squad/templates/ directly. Closes github#1494 Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> * fix(templates): make templates README reach squad init output Copilot review on github#1949 found that registering `templates-readme.md` in TEMPLATE_MANIFEST does not put the README into `squad init` output. Verified: `squad init` seeds `.squad/templates/` with a verbatim recursive copy of the SDK templates directory (`copyRecursiveSync(getSDKTemplatesDir(), ...)` in packages/squad-sdk/src/config/init.ts), so a file only reaches new projects if it lives in that directory under its final name. The README existed only as `packages/squad-cli/templates/templates-readme.md`, so new projects got nothing. Promote the file to the canonical source `.squad-templates/README.md` and let scripts/sync-templates.mjs mirror it to templates/, packages/squad-cli/templates/ and packages/squad-sdk/templates/. Manifest source becomes `README.md` so the canonical name already matches the destination name. Verified `getSDKTemplatesDir()` resolves to packages/squad-sdk/templates and that README.md is now present there — the exact path init copies from. Also correct the bootstrap table: the charter template on disk is `rai-charter.md` (lowercase), not `Rai-charter.md`. Pin the routing in test/template-routing.test.ts. Mirror sync is already covered by test/template-sync.test.ts, which enumerates `.squad-templates/` dynamically. Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> Copilot-Session: 0515ad5d-4c5b-48bb-92a6-4e1296594cab * docs(templates): document all .squad/templates subtrees Copilot review flagged that the README omitted every subtree that ships under .squad/templates/, while the Invariant said anything unlisted is "a stale copy and safe to remove". Verified the risk is real: - squad init copies this directory recursively (copyRecursiveSync, init.ts:1481), so casting/, identity/, scripts/, skills/ and workflows/ all ship into every new project. - .squad/templates/casting/ is read at runtime by Init Mode to allocate custom-universe names, so deleting it breaks casting. - .squad/templates/scripts/ and workflows/ are documented copy-sources in shipped docs (state-backends, ci-cd-integration). Add a Subtrees table classifying all five, scope the Invariant to top-level files so absence from the two tables no longer implies a subtree is stale, and correct the historical note: it told users the workflows/ and skills/ subtrees were "safe to delete", which contradicts the docs that instruct copying from workflows/ and would delete the source the manifest installs skills from. Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> Copilot-Session: 0515ad5d-4c5b-48bb-92a6-4e1296594cab * docs(templates): make the Invariant fail safe for unclassified files Second round of Copilot review found my subtree fix was incomplete: the same "not in a table => stale and safe to remove" hazard still applied to top-level files. Audited every top-level file against both tables and TEMPLATE_MANIFEST. Ten are in neither table and unregistered -- including notes-protocol.md, which the state-backends doc tells users to copy into .squad/. The tables are not a complete inventory, so "safe to remove" was an unsafe default. - Absence from the tables now means unclassified, not stale; removal requires positive evidence nothing reads or copies the file. - notes-protocol.md named explicitly as the worked example. - Registration is stated as expected for new files rather than as a property all current files have, which they do not. Also corrected the casting/ row: it cited .copilot/skills/init-mode, a legacy path users do not get after squad init. No shipped template references the casting/ directory, so the row now describes the data and points at casting-reference.md instead of a path that would mislead. Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> Copilot-Session: 0515ad5d-4c5b-48bb-92a6-4e1296594cab * docs(templates): classify README.md, which broke its own Invariant Copilot review noted the README was the one top-level file its own rule left unaccounted for. Now that absence from the tables means "unclassified" and requires classification, that is a real self-contradiction rather than a cosmetic gap. It fits neither table -- it is not a runtime input and seeds nothing -- so it is classified explicitly instead of being forced into one: it ships as the directory's own documentation via the same recursive copy, and is manifest-registered so squad upgrade maintains it. Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> Copilot-Session: 0515ad5d-4c5b-48bb-92a6-4e1296594cab * fix(templates): repair merged table row and correct casting/ claim Two Copilot findings: 1. The copilot-instructions.md and fact-checker-charter.md rows were concatenated onto one line, breaking the bootstrap table. Introduced by a stray edit in the previous commit; the table now renders again. 2. The casting/ row claimed the directory is read during Init Mode casting. Nothing shipped references it, which is the whole reason github#1972 exists -- so the row asserted a consumer this PR had already established does not exist, and contradicted its own description. Reclassified as shipped data with no known consumer, still explicitly not-safe-to-delete pending github#1972. Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> Copilot-Session: 0515ad5d-4c5b-48bb-92a6-4e1296594cab --------- Co-authored-by: brady gaster <bradygaster@github.com> Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> Copilot-Session: 0515ad5d-4c5b-48bb-92a6-4e1296594cab
* feat(gh-aw): add Squad repo enlistment skill Add the gh-aw-enlistment skill that operationalizes the supported Squad GitHub Agentic Workflows bootstrap: install the four @dev workflows, strictly compile, honor an explicit safe-update allowlist (only the documented Squad secrets and squad-init action), keep the default workflow token read-only, stage only documented surfaces, and open a human-reviewed bootstrap PR that is never auto-merged. Resolves repo identity at runtime for cross-repo safety. Ships canonical (.squad/skills) plus both template mirrors, a focused safety-gate regression test, a changeset, and a discoverability pointer from the agentic-workflows router. Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> * test: anchor final strict-compile assertion to start-of-line (m flag) The previous lookahead regex matched prose/backtick mentions in the Anti-Patterns section, as flagged by the code reviewer (comment 3884574741). Replace with /^gh aw compile --strict(\s+#[^\n]*)?$/m so only real command lines (L151, L260) satisfy the test; lines with --approve or indented prose do not. Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> * fix(skills): make gh-aw preflight portable and bound the safe-update allowlist Address two suppressed concerns from Copilot's second review of the gh-aw-enlistment skill. Portability: the step-0 extension check used `gh extension list | grep -q`, which fails in default Windows PowerShell even though the skill is explicitly portable. `gh extension list` has no `--json` flag, so there is no gh-native structured check; document a verified PowerShell alternative alongside the bash form, matching the existing step-6 portability-note convention. Allowlist exclusivity: the safe-update allowlist is now delimited by `<!-- allowlist-start -->` / `<!-- allowlist-end -->` so tests can bound it. The previous tests were named as if they enforced exclusivity but only asserted whole-document string presence, which could not fail if the allowlist grew. They now extract the delimited region and deep-equal the sorted token set against exactly SQUAD_GITHUB_APP_PRIVATE_KEY, SQUAD_GITHUB_TOKEN, and bradygaster/squad/.github/actions/squad-init, assert both delimiters appear exactly once, and assert the bullet-line count so structural drift is caught. A new test guards the portability fix by requiring Select-String to be bound to the github/gh-aw pattern and to guard an install. All three skill copies (canonical, CLI template, SDK template) remain byte-identical. Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> * fix(skills): make gh-aw-enlistment triggers actually parse, strengthen guard Copilot review on github#1946 flagged that the discoverability assertions only checked that trigger phrases appeared *somewhere* in the document, so they would still pass if a phrase left the frontmatter `triggers:` list. Strengthening the assertion to check the parsed `skill.triggers` array — the same array the runtime matcher iterates in packages/squad-sdk/src/skills/index.ts — immediately failed, revealing the weak assertion had been masking a real defect. `parseFrontmatter` (packages/squad-sdk/src/skills/skill-loader.ts:48) is a naive line-based parser that only understands inline arrays. Given a YAML block sequence it stores the empty post-colon value as a string, so `Array.isArray(meta.triggers)` is false and triggers resolve to `[]`. The skill was therefore discoverable by NONE of its ten advertised phrases. Measured across the three forms: block -> "" (skill undiscoverable) inline+quoted-> ["\"a phrase\"", ...] (quotes retained, never matches) inline bare -> ["a phrase", ...] (correct) Convert this skill's triggers to the only form that parses into clean, matchable strings. All ten phrases now resolve; canonical and both mirrors stay byte-identical. Also note in the router that the enlistment skill is local to this repository, since the surrounding preamble says its listed files are fetched from `github/gh-aw` and are not available locally. The strengthened guard is verified by mutation: moving a phrase out of `triggers:` while leaving it in prose leaves 2 textual occurrences (the old assertion would have passed) and fails the new one. Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> Copilot-Session: 0515ad5d-4c5b-48bb-92a6-4e1296594cab * test(gh-aw): assert the STOP gate, not just the warning carve-out The suite asserted that the bot-trigger warning is documented as permitted, but not the halt that makes that carve-out safe. As written it would keep passing if the STOP were deleted -- turning a narrow, justified exception into a blanket "warnings are fine" without any test noticing. Asserts the full sentence (whitespace-collapsed, since it wraps). Mutation-verified: weakening the STOP to a soft note fails this assertion; the two mirror-parity guards also fire, since the mutation was applied to one copy only. Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> Copilot-Session: 0515ad5d-4c5b-48bb-92a6-4e1296594cab --------- Co-authored-by: brady gaster <bradygaster@github.com> Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> Copilot-Session: 0515ad5d-4c5b-48bb-92a6-4e1296594cab
…es (github#1973) * docs(gh-aw): correct credentials guidance and document activation fixes The bootstrap procedure listed SQUAD_GITHUB_APP_PRIVATE_KEY and SQUAD_GITHUB_TOKEN as a setup-time item with no statement that they need not exist. The clarification sat ~95 lines downstream in an "Optional:" section a reader following the numbered path never reaches before deciding whether they are blocked. Two independent agents read that passage and concluded a PAT was a prerequisite for enlisting a fresh repo. It is not. The correction now lands inline at the point of misreading, and is mirrored byte-identically into the three gh-aw-enlistment SKILL.md copies (outside the bounded allowlist block). Also documents four merged activation fixes that shipped with zero docs changes, traceable to workflows/squad.md on dev: - github#1959 label auto-provisioning (squad.md:113-115, 1307, 1931-1945, 2004) — add-labels create-if-missing auto-creates squad/squad:{agent}; auto-provisioned labels get a deterministic color and empty description, which is expected and not a failure. - github#1961 bounded caps (squad.md:111, 121, 1997, 1999) — create-issue 75, add_labels 110; the two shortfall paths are kept distinct; report_incomplete does NOT fail the run, so the durable signal is the [aw] ... reported incomplete result tracking issue, not the run conclusion. A cap is named only when observed. - github#1963 accepted-vs-applied (squad.md:1392, 2058-2081) — defines accepted, states what a summary must not claim, and explains why the distinction exists (create-issue labels: silently drops missing names). - github#1962 temporary IDs — documented only where user-observable: shortfall reports identify items by #aw_epic{K}/#aw_task{N}/#aw_wi{N}. Adds the Activation bindings: JSON block as the checkable verification surface, and updates the stale troubleshooting row that predated github#1961. Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> * chore: add changeset for gh-aw-enlistment skill template change The changelog gate's SDK_CLI_PATH_REGEX (squad-ci.yml:273) matches ^packages/squad-(sdk|cli)/templates/, not just src/ — template edits ship as scaffolding and are covered deliberately. Both packages distribute the gh-aw-enlistment skill, so both take a patch bump. Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> * docs(gh-aw): correct activation capacity and rescope label-evidence claim Addresses review findings A-D on the activation section. A. The cap table presented 75 as "issues created in one run", which would lead a reader to size for 75. squad.md:105-107 states the actual ceiling is 50 issues per activation run; 75 is 50 worst-case plus 25 bounded margin, and 110 covers both readings of the add-labels worst case (50 calls / 100 label names). Now states the 50-issue ceiling as the user-facing number and presents 75/110 as underlying headroom, preserving the workflow's statement that `max` counts safe-output items (tool calls), not label names. B. Rescoped the label-evidence claim to the workflow's own epistemic scope (squad.md:2059-2060): `create-issue`'s `labels:` field never lands a label the activation run can claim. Dropped the generalized assertion about GitHub API behavior. Note: "silently drops names the repository lacks" is verbatim shipped prose at squad.md:2060 — the scoping concern is upstream in the workflow, flagged rather than propagated here. C. Added the fast-path phase temporary ID `#aw_ph{N}` (squad.md:1289), which was missing from the documented identifier set. D. Listing labels proves a label exists, not that it landed on the right issue. Added a per-issue verification path: read the Activation bindings: block from the origin issue's comments, then compare each binding against `gh issue view {issue} --json title,labels`. Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> * docs(gh-aw): explain add-labels vs add_labels naming surfaces Review flagged the two spellings as inconsistent. Audited every occurrence: all six are already correct for their surface. The hyphenated add-labels is the safe-outputs configuration key (squad.md:113) and is what the caps apply to; the underscored add_labels is the run-time tool call (squad.md:1294) and is what appears in summaries and incomplete reports. Rather than collapse them to one spelling, which would make one of the two surfaces unsearchable, this states the distinction explicitly at first joint mention. Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> --------- Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
* feat: enable online Squad research Enable web-fetch for /squad research, prefer current authoritative documentation, and disclose when online sources are unavailable. Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> Copilot-Session: 7d6c4262-f790-49ff-88f8-8aae54b9287c * test: simplify section extraction Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --------- Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> Copilot-Session: 7d6c4262-f790-49ff-88f8-8aae54b9287c
* feat: close direct cast issues on merge Closes github#1974 Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> Copilot-Session: d20ee964-dcbd-4e17-921d-e624f8bc0eb3 * test: simplify cast pivot assertion Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> Copilot-Session: d20ee964-dcbd-4e17-921d-e624f8bc0eb3 * fix: clarify cast issue substitution Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> Copilot-Session: d20ee964-dcbd-4e17-921d-e624f8bc0eb3 --------- Copilot-Session: d20ee964-dcbd-4e17-921d-e624f8bc0eb3
* fix(gh-aw): make Cast validator delivery deterministic Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> * fix(gh-aw): anchor Cast validation failures Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> * fix(gh-aw): authenticate Cast validator bytes Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> * fix(gh-aw): accept CRLF validator markers Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> * test: avoid variable-length validator lookbehind Use capture groups when replacing the embedded validator payload so the portability regression fixture does not depend on variable-length lookbehind support.\n\nCo-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> * fix: order Cast validator find options Place the depth limit before predicates so validator discovery remains bounded and deterministic across find implementations. Add a regression assertion for the command shape.\n\nCo-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> * test: clarify Cast command budget source State explicitly that the command markers are authored inside the squad-cast inline skill, which gh-aw extracts from the ambient prompt.\n\nCo-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> * test: resolve workflow shell on Windows Use the shared POSIX-shell resolver for Git for Windows while retaining bash execution on POSIX hosts for the workflow's pipefail contract.\n\nCo-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> --------- Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Materialize and authenticate the Cast validator outside the agent prompt, preserve exact validation authorization, and emit bounded factual terminal failures without success-shaped reporting.\n\nCo-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>\nCopilot-Session: 84876c36-36ab-4d53-a689-6ab9a52fe551
) * fix(gh-aw): restore public installability after github#1977 PR github#1977 added correct safety prose telling research runs to distrust fetched web content, but it quoted a canonical adversarial phrase verbatim. `gh aw compile --strict` does not run gh-aw's markdown security scanner, so the source PR passed; `gh aw add` does run it, so every consumer bootstrapping from dev hit: workflows/squad.md:1438:1: error: [social-engineering] contains prompt injection pattern (attempts to override AI agent instructions) Rephrase the line to describe the override attempt instead of reproducing it. Online research and fetched-content distrust semantics are unchanged: fetched pages remain untrusted evidence, never instructions, and embedded directives, persona assignments, tool-use requests, and instruction-override attempts are still ignored. Add test/gh-aw-security-scan.test.ts as the regression guard. It runs the real gh-aw scanner over every distributed workflow Markdown file rather than a handwritten phrase blocklist, which would drift from gh-aw's ruleset. The gate is offline, needs no GitHub round-trip, runs in seconds, and fails closed per the github#1833/github#1834 convention. Scratch repos are created outside this checkout: gh aw add resolves .github/workflows/ by walking up from its working directory, and a nested workspace let it escape into the real tree and write stray files there. A self-check asserts the sandbox held. Verified: the guard fails on pre-fix content with the exact scanner error and passes after; all four workflows strict-compile; the public four-workflow gh aw add succeeds from the pushed branch. Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> * fix(gh-aw): address review on the security-scan gate Two findings from Copilot review on github#1979. 1. `git commit` in the scratch repo made the gate flaky on machines with `commit.gpgsign=true` set globally and no usable signing key. Rather than disabling signing, drop the commit entirely: an empty `git init` is sufficient for gh-aw once the workspace lives outside this checkout. The commit was only ever compensating for the earlier in-repo workspace, so removing it eliminates the failure class instead of suppressing it. Verified green with `commit.gpgsign=true` forced. 2. The `-n` comment claimed it avoided a batch-abort on basename collision, but each file already gets its own workspace, so no such collision exists. Corrected to state the real reason: a deterministic installed name for the sandbox-leak self-check. Guard re-verified in both directions after the refactor: fails on pre-fix content with the exact scanner error, 10 passed on this branch. Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> * test(gh-aw): prove the scan gate needs no commit, under hostile signing Independent review flagged the same portability defect Copilot did: a scratch-repo commit inherits global `commit.gpgsign=true`, so a machine without a usable signing key fails before gh-aw's scanner ever runs, turning an installability gate into an environment-dependent one. 0f26442 already removed the commit (the reviewer's preferred option: `git init` alone is sufficient once the workspace lives outside this checkout). What was missing is the reviewer's second ask -- making the property non-regressable rather than merely documented. Add a test that executes a real scan under a signing-hostile git environment: `commit.gpgsign=true`, `tag.gpgsign=true`, and `gpg.program` pointed at a path asserted not to exist. Any reintroduced commit dies there, while a path that never commits is unaffected. Verified by temporarily restoring the commit: the new test fails with "gpg failed to sign the data". It passes on this branch. Config is injected through `GIT_CONFIG_COUNT`/`GIT_CONFIG_KEY_n`, which applies to every git process in the subtree, including any git that `gh aw` shells out to, without mutating global config. Scope unchanged: two files. Guard still bidirectional (fails on pre-fix content with the exact scanner error). Targeted suites 218 passed, eslint and tsc clean. Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> --------- Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
…t A) (github#1980) * fix(gh-aw): fast-path /squad activate artifact integrity (E4 preflight A) Closes the gap where the recommended /squad activate fast path (squad-plan-accept, artifacts plan-accepted/phases-accepted) created and labeled issues identically to the granular /squad plan activate path but was not covered by the Activation bindings: contract, the deterministic checker, or the CI collector. - workflows/squad.md: fast path Step 4 now requires the same non-empty Activation bindings: JSON block (shape/quoting/omission semantics) as squad-plan-activate. Renamed both paths' label-reporting heading to the identical "Label operations accepted" text. Reworded the "label set it should have received" trap phrase to drop the forbidden certainty word "received" while preserving meaning. - workflows/shared/squad-planning-ontology.md: the bindings mapping is now documented as mandatory for phases-accepted/plan-accepted too, not just phases-activated/activated. - scripts/check-agent-binding.mjs: ACTIVATION_ARTIFACTS now includes plan-accepted/phases-accepted so missing/empty bindings fail closed for fast-path artifacts exactly like granular ones. Added assertAcceptedOnlyLabelWording(), which rejects standalone certainty claims (applied, received, landed, verified, confirmed, checked) in label-operation reporting. It is scoped to lines that actually mention label vocabulary, strips fenced/inline code and quoted strings first, skips markdown table rows, and treats explicit negations as compliant -- never a blanket whole-comment scan -- so quoted titles, unrelated sections, negations, and substrings (unverified) don't false-positive. Wired into main()'s per-comment loop. - .github/workflows/squad-agent-binding-check.yml: the collector filter matched only /activated/i, which a plan-accepted/phases-accepted comment never contains, so fast-path artifacts were silently never passed to the checker. Now matches the squad_artifact field precisely for all four activation artifact types. - test/gh-aw-activation-artifact-integrity.test.ts (new): heading parity, fast-path bindings-contract presence + mutation kills against committed source, checker/runtime parity across all four artifact types (missing and [] bindings), a full parseStructuredData+validateActivation pipeline test against realistic comment strings (including bindings-block deletion/emptying), parameterized forbidden-word rejection (6 words x case/punctuation), negative tests for quoted titles/table rows/unrelated sections/negations/substrings, and collector-regex parity/regression tests. - test/gh-aw-activation-capacity.test.ts: updated the one existing assertion pinned to the reworded trap phrase. Out of scope per the E4 preflight package A brief: workflow discriminators, docs sequencing, draft PR UX, and all other E4 findings. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * fix(gh-aw): scope negation/claim detection to clauses in label-wording check FIDO rejected the first revision of github#1980 with two reproduced defects in assertAcceptedOnlyLabelWording (scripts/check-agent-binding.mjs): 1. False negative: NEGATION_NEARBY matched a negation anywhere on the whole line, so an unrelated negation earlier in the line (e.g. "No issues were skipped") blanket-suppressed a real, separate certainty claim later in the same line ("Label squad:kint was verified for github#42"). 2. False positive: a forbidden word describing an unrelated subject sharing a line with a label token ("its verified real number" describing a reused issue number, not the label operation) was incorrectly flagged. Fix: split each line into clauses on clause/sentence-ending punctuation (., ,, ;, :), protecting squad:{agent} tokens so their embedded colon is never mistaken for a clause boundary. Label-operation context, the forbidden word, and any negation must now all be found within the *same* clause before a claim is flagged. This lets an unrelated negation in a different clause fail to suppress a real claim, and lets a forbidden word in a clause that carries no label-operation context correctly fall out of scope, without weakening the existing quoted-title/table-row/code-fence/substring/negation guards or the six forbidden standalone certainty claims (applied, received, landed, verified, confirmed, checked). Adds two permanent regression tests reproducing FIDO's exact reported strings in test/gh-aw-activation-artifact-integrity.test.ts. Testing: - npx vitest run test/gh-aw-activation-artifact-integrity.test.ts — 90/90 passed (88 previously + 2 new regression tests) - npx vitest run test/check-agent-binding.test.ts test/gh-aw-activation-summary-outcomes.test.ts test/gh-aw-activation-capacity.test.ts test/gh-aw-quality.test.ts test/gh-aw-activate-roster-binding.test.ts test/gh-aw-agent-binding-correspondence.test.ts test/gh-aw-activation-artifact-integrity.test.ts — 377/377 passed - npx vitest run (full suite) — only pre-existing, unrelated failures remain (externalized-state CLI tests), confirmed identical on the pre-revision commit - npx eslint scripts/check-agent-binding.mjs test/gh-aw-activation-artifact-integrity.test.ts test/gh-aw-activation-capacity.test.ts — clean - npm run build — succeeds; build-metadata/version-bump and skill-template CRLF sync side effects reverted before commit, not part of this diff Scope: only scripts/check-agent-binding.mjs and test/gh-aw-activation-artifact-integrity.test.ts touched, per FIDO's required narrow revision. Closes the FIDO REJECT on github#1980. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> * fix(gh-aw): resolve quoted issue references before prefetching labels main() filtered binding.issue/epic_issue with Number.isInteger, but compliant activation artifacts write these as quoted "github#42" strings per the resolveIssueReference() contract. That produced an empty issues list, skipped label fetching entirely, and made validateActivation() fail with "labels could not be resolved" for otherwise-valid bindings. Add extractIssueNumber(), a non-throwing counterpart to resolveIssueReference() that also accepts the "github#42" string form, and use it when building the label-prefetch list in main(). Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * test(gh-aw): cover quoted activation references Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> --------- Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Refs github#1958 Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
…istribution-updates feat: automate CLI release distribution
* feat(gh-aw): add resource delivery probe Closes github#1982 Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> Copilot-Session: 083906de-529b-42f9-ae2d-36b0c911eaef * chore(gh-aw): keep resource probe scope focused Closes github#1982 Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> Copilot-Session: 083906de-529b-42f9-ae2d-36b0c911eaef * test(gh-aw): exercise resource readability guard (github#1982) Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> Copilot-Session: 083906de-529b-42f9-ae2d-36b0c911eaef --------- Copilot-Session: 083906de-529b-42f9-ae2d-36b0c911eaef
…source (github#1986) * gh-aw: replace gzip+Base64 Cast validator transport with plaintext resource Replace the fake-skill gzip+Base64 transport for the Cast validator (workflows/shared/squad-cast-validator.md, materialized at runtime via SKILL.md discovery and gunzip/base64 extraction) with a canonical plaintext gh-aw resources sidecar, workflows/shared/squad-cast-validator.mjs, installed verbatim at .github/workflows/shared/ in consumer repos. - workflows/squad.md: declare the validator as a resources entry (not imports); rewrite the validator runner step to execute the installed resource directly from GITHUB_WORKSPACE (never staged to or run from RUNNER_TEMP); drop the SKILL.md search/extraction logic; restore the pwd -P physical-path normalization the old script relied on (needed so import.meta.url resolution is not defeated by symlinked temp/workspace paths); reduce the cast-failure job stage taxonomy from 6 to 4 stages (discovery/integrity/syntax/validation); update Step 7 docs and stage table to match. - workflows/shared/squad-cast-validator.mjs: new plaintext resource, byte-identical to scripts/validate-gh-aw-cast.mjs, pinned by SHA-256 in the runner script. - Remove workflows/shared/squad-cast-validator.md (fake-skill payload) and workflows/shared/squad-gh-aw-resource-probe.txt (experimental probe-only resource from github#1982/github#1983), plus their .gitattributes entry and probe-only docs. - test/gh-aw-cast-validator.test.ts, test/gh-aw-quality.test.ts: rewrite delivery-mechanism coverage for the new 4-stage model; remove probe-only tests; update SOURCE_GROWTH_BUDGET_KB. Pinned SHA-256 authentication, node --check, the exact authorization output ("Cast validation passed."), and the typed Cast failure contract (fail-closed on missing/unreadable/modified/syntactically invalid/rejecting validators) are unchanged. The direct install path in .github/AGENTS.md (gh aw add bradygaster/squad/workflows/squad.md@dev) is untouched. Validation: - npx vitest run test/gh-aw-cast-validator.test.ts test/gh-aw-quality.test.ts -> 213/213 passed (includes dynamic gh-aw strict-mode compile via lockText()). - Manual gh aw compile squad --strict against a scratch workspace (repository-pinned gh-aw v0.87.10): compiled successfully; inspected generated squad.lock.yml runner script contains no SKILL.md search, base64, or gzip logic, reads validator_script directly from GITHUB_WORKSPACE, and preserves the 4-stage fail_cast taxonomy. - npm run build (packages/squad-sdk then packages/squad-cli): passed. Closes github#1984 Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> * test(gh-aw): restore cast-failure output diagnostic tests Restore three tests deleted during the plaintext resource transport migration for unchanged cast-failure safe-output handler behavior: - fails malformed agent output with a deterministic diagnostic - fails non-object output items with a deterministic diagnostic - diagnoses conflicting failure and pull-request outputs without claiming prevention Closes github#1984 Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> --------- Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
* fix: keep Cast validator inside sandbox workspace Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> * test: remove redundant Cast fixture setup Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> --------- Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
* fix: preserve built-in agents in gh-aw casts Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> Copilot-Session: bc7757e5-628e-4f82-bb3c-7ea20b6b6056 * fix: address built-in validation feedback Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> Copilot-Session: bc7757e5-628e-4f82-bb3c-7ea20b6b6056 * test: use canonical fact-checker directory Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> Copilot-Session: bc7757e5-628e-4f82-bb3c-7ea20b6b6056 --------- Copilot-Session: bc7757e5-628e-4f82-bb3c-7ea20b6b6056
…clobbering (github#1992) * gh-aw: enforce byte-identical built-in charters in Cast validator Strengthen the GH-AW Cast validator so it fails Cast validation unless every final .squad/agents/{scribe,ralph,rai,fact-checker}/charter.md is byte-for-byte identical to its canonical resource under .github/workflows/shared/builtins/{id}-charter.md. Previously the validator only checked that the four built-in directories existed and were referenced correctly, not that their content survived intact through a squad init run or agent rewrite after the deterministic materialization step. - Add validateBuiltinCharterFidelity to workflows/shared/squad-cast-validator.mjs, mirrored verbatim to scripts/validate-gh-aw-cast.mjs. - Update the validator SHA-256 pin in workflows/squad.md for the new validator bytes. - Update test/gh-aw-cast-validator.test.ts fixtures to materialize real canonical built-in charter content (read from workflows/shared/builtins/) instead of placeholders, and add focused tests covering byte-mismatch rejection, missing canonical resource, and byte-identical acceptance. - Update the hardcoded SHA-256 expectation in test/gh-aw-quality.test.ts. Validated: targeted vitest run (226 passed), full gh-aw-*.test.ts run (699 passed, 1 pre-existing unrelated failure from an unbuilt SDK workspace package), and gh aw compile --strict for all four Squad workflows using the pinned v0.87.10 compiler via the repo's CI-mirroring recipe. Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> * gh-aw: run built-in charter materialization as a pre-agent-step Fix the residual clobbering path the byte-fidelity validator (previous commit) could only detect, not prevent: gh-aw's native "Restore agent config folders from base branch" and the (unconditional, no runtime if:-guard) repeated "Restore ambient folders from activation artifact" step run AFTER our old steps: placement, and can reintroduce a stale committed .squad/ snapshot over the freshly materialized built-in charters whenever this workflow's pull_request_comment trigger causes checkout-pr to succeed and a stale .squad/ already exists on the relevant ref (matching the octodemo/zava-social-squad-backend#13 scenario, and the residual gap identified in review of PR github#1992). Root-cause detail confirmed empirically against the compiled lock file (pkg/workflow/compiler_yaml_ai_execution.go in github/gh-aw): custom steps: are always spliced in early (right after the activation-artifact download), while base-branch restore, both ambient-folder restores, and inline sub-agent/skill restore are compiler-injected later in the same job — before pre-agent-steps, MCP setup, and Copilot CLI execution. The existing steps: mechanism was structurally unable to run after those restores; pre-agent-steps is the documented gh-aw hook designed for exactly this ordering need. - workflows/squad.md: move "Materialize canonical built-in support agents" and "Prepare deterministic Cast validator runner" from steps: to pre-agent-steps:. Verified via `gh aw compile --strict` that both now execute after every restore step and before MCP setup / "Execute GitHub Copilot CLI". - test/gh-aw-quality.test.ts: replace the now-inverted ordering assertion (validator-runner used to run before "Restore inline skills"; it now correctly runs after every restore and before agent execution) and add a new focused test asserting the full ordering invariant end-to-end: activation job (squad init) precedes the agent job; materialization runs after init and after every restore step (Squad state, base-branch, both ambient-folder occurrences, inline sub-agents, inline skills); and materialization precedes "Execute GitHub Copilot CLI". Validated with the mandatory npm proxy set before every npm/npx invocation: - `npx vitest run test/gh-aw-cast-validator.test.ts test/gh-aw-quality.test.ts` -> 227/227 passed - `npx vitest run test/gh-aw-*.test.ts` -> 700/700 passed (1 pre-existing unrelated failure from an unbuilt SDK workspace package, same as before this change and on dev) - `gh aw compile --strict` for all four Squad workflows using the pinned v0.87.10 compiler via the repo's CI-mirroring recipe — all 4 succeeded - Confirmed step order in the compiled squad.lock.yml directly: Restore agent config folders from base branch -> Restore ambient folders from activation artifact (2nd occurrence) -> Restore inline sub-agents -> Restore inline skills -> Materialize canonical built-in support agents -> Prepare deterministic Cast validator runner -> Start MCP Gateway -> Execute GitHub Copilot CLI Only the already-authorized workflow/validator/test files were touched; no changeset added (workflow/test-only scope is exempt from the changelog gate's SDK/CLI path regex). Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> --------- Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Bumps [fast-uri](https://github.com/fastify/fast-uri) from 3.1.5 to 3.1.7. - [Release notes](https://github.com/fastify/fast-uri/releases) - [Commits](fastify/fast-uri@v3.1.5...v3.1.7) --- updated-dependencies: - dependency-name: fast-uri dependency-version: 3.1.7 dependency-type: indirect ... Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Brady Gaster <41929050+bradygaster@users.noreply.github.com>
…oup (github#1952) Bumps the minor-patch group in /docs with 1 update: [sharp](https://github.com/lovell/sharp). Updates `sharp` from 0.35.3 to 0.35.4 - [Release notes](https://github.com/lovell/sharp/releases) - [Commits](lovell/sharp@v0.35.3...v0.35.4) --- updated-dependencies: - dependency-name: sharp dependency-version: 0.35.4 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: minor-patch ... Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Brady Gaster <41929050+bradygaster@users.noreply.github.com>
Bumps the astro-minor-patch group in /docs with 1 update: [astro](https://github.com/withastro/astro/tree/HEAD/packages/astro). Updates `astro` from 7.2.4 to 7.2.9 - [Release notes](https://github.com/withastro/astro/releases) - [Changelog](https://github.com/withastro/astro/blob/main/packages/astro/CHANGELOG.md) - [Commits](https://github.com/withastro/astro/commits/astro@7.2.9/packages/astro) --- updated-dependencies: - dependency-name: astro dependency-version: 7.2.9 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: astro-minor-patch ... Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Bumps [qs](https://github.com/ljharb/qs) from 6.15.2 to 6.16.0. - [Changelog](https://github.com/ljharb/qs/blob/main/CHANGELOG.md) - [Commits](ljharb/qs@v6.15.2...v6.16.0) --- updated-dependencies: - dependency-name: qs dependency-version: 6.16.0 dependency-type: indirect ... Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Brady Gaster <41929050+bradygaster@users.noreply.github.com>
Bumps [@humanfs/node](https://github.com/humanwhocodes/humanfs/tree/HEAD/packages/node) from 0.16.7 to 0.16.8. - [Release notes](https://github.com/humanwhocodes/humanfs/releases) - [Changelog](https://github.com/humanwhocodes/humanfs/blob/main/packages/node/CHANGELOG.md) - [Commits](https://github.com/humanwhocodes/humanfs/commits/node-v0.16.8/packages/node) --- updated-dependencies: - dependency-name: "@humanfs/node" dependency-version: 0.16.8 dependency-type: indirect ... Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Brady Gaster <41929050+bradygaster@users.noreply.github.com>
Bumps the github-actions group with 1 update in the / directory: [github/gh-aw-actions](https://github.com/github/gh-aw-actions). Updates `github/gh-aw-actions` from 0.87.2 to 0.87.9 - [Release notes](https://github.com/github/gh-aw-actions/releases) - [Changelog](https://github.com/github/gh-aw-actions/blob/main/CHANGELOG.md) - [Commits](github/gh-aw-actions@v0.87.2...v0.87.9) --- updated-dependencies: - dependency-name: github/gh-aw-actions dependency-version: 0.87.9 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: github-actions ... Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Brady Gaster <41929050+bradygaster@users.noreply.github.com>
* fix(gh-aw): preserve research source URLs Allow the public Microsoft Learn and Aspire documentation domains through safe-output URL sanitization while retaining credential and sensitive-query safeguards. Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> Copilot-Session: f3bb47aa-1b45-4302-8ec2-5e3dc868de42 * test(gh-aw): tighten research URL guards Assert the exact safe-output domain allowlist, tolerate prompt line wrapping, and exclude safe-output metadata from operation max validation. Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> Copilot-Session: 7abb1583-79f9-4355-882d-a9d099f6817f --------- Copilot-Session: f3bb47aa-1b45-4302-8ec2-5e3dc868de42 Copilot-Session: 7abb1583-79f9-4355-882d-a9d099f6817f
…ithub#2002) * ci: Bump the github-actions group across 1 directory with 2 updates Bumps the github-actions group with 2 updates in the / directory: [github/gh-aw-actions](https://github.com/github/gh-aw-actions) and [actions/deploy-pages](https://github.com/actions/deploy-pages). Updates `github/gh-aw-actions` from 0.87.9 to 0.88.4 - [Release notes](https://github.com/github/gh-aw-actions/releases) - [Changelog](https://github.com/github/gh-aw-actions/blob/main/CHANGELOG.md) - [Commits](github/gh-aw-actions@v0.87.9...v0.88.4) Updates `actions/deploy-pages` from 5.0.0 to 5.0.1 - [Release notes](https://github.com/actions/deploy-pages/releases) - [Commits](actions/deploy-pages@cd2ce8f...368f825) --- updated-dependencies: - dependency-name: actions/deploy-pages dependency-version: 5.0.1 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: github-actions - dependency-name: github/gh-aw-actions dependency-version: 0.88.4 dependency-type: direct:production update-type: version-update:semver-minor dependency-group: github-actions ... Signed-off-by: dependabot[bot] <support@github.com> * ci: pin gh-aw actions to v0.88.4 commit Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> --------- Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Brady Gaster <brady.gaster@gmail.com> Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
…ithub#2007) * deps: Bump the minor-patch group across 1 directory with 4 updates Bumps the minor-patch group with 4 updates in the /docs directory: [@astrojs/markdown-remark](https://github.com/withastro/astro/tree/HEAD/packages/markdown/remark), [@astrojs/sitemap](https://github.com/withastro/astro/tree/HEAD/packages/integrations/sitemap), [astro](https://github.com/withastro/astro/tree/HEAD/packages/astro) and [@playwright/test](https://github.com/microsoft/playwright). Updates `@astrojs/markdown-remark` from 7.2.4 to 7.3.0 - [Release notes](https://github.com/withastro/astro/releases) - [Changelog](https://github.com/withastro/astro/blob/main/packages/markdown/remark/CHANGELOG.md) - [Commits](https://github.com/withastro/astro/commits/@astrojs/markdown-remark@7.3.0/packages/markdown/remark) Updates `@astrojs/sitemap` from 3.7.3 to 3.7.4 - [Release notes](https://github.com/withastro/astro/releases) - [Changelog](https://github.com/withastro/astro/blob/main/packages/integrations/sitemap/CHANGELOG.md) - [Commits](https://github.com/withastro/astro/commits/@astrojs/sitemap@3.7.4/packages/integrations/sitemap) Updates `astro` from 7.2.9 to 7.2.10 - [Release notes](https://github.com/withastro/astro/releases) - [Changelog](https://github.com/withastro/astro/blob/main/packages/astro/CHANGELOG.md) - [Commits](https://github.com/withastro/astro/commits/astro@7.2.10/packages/astro) Updates `@playwright/test` from 1.62.1 to 1.63.0 - [Release notes](https://github.com/microsoft/playwright/releases) - [Commits](microsoft/playwright@v1.62.1...v1.63.0) --- updated-dependencies: - dependency-name: "@astrojs/markdown-remark" dependency-version: 7.3.0 dependency-type: direct:production update-type: version-update:semver-minor dependency-group: minor-patch - dependency-name: "@astrojs/sitemap" dependency-version: 3.7.4 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: minor-patch - dependency-name: astro dependency-version: 7.2.10 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: minor-patch - dependency-name: "@playwright/test" dependency-version: 1.63.0 dependency-type: direct:development update-type: version-update:semver-minor dependency-group: minor-patch ... Signed-off-by: dependabot[bot] <support@github.com> * fix(docs): stabilize Astro upgrade validation Update generated Astro content types, preserve sidebar scroll before transition preparation, and refresh stale feature/API assertions. Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> --------- Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Brady Gaster <brady.gaster@gmail.com> Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> Co-authored-by: Brady Gaster <41929050+bradygaster@users.noreply.github.com>
…ithub#2008) * deps: Bump the minor-patch group across 1 directory with 18 updates Bumps the minor-patch group with 15 updates in the / directory: | Package | From | To | | --- | --- | --- | | [@opentelemetry/context-async-hooks](https://github.com/open-telemetry/opentelemetry-js) | `2.10.0` | `2.11.0` | | [@opentelemetry/sdk-metrics](https://github.com/open-telemetry/opentelemetry-js) | `2.10.0` | `2.11.0` | | [@opentelemetry/sdk-trace-base](https://github.com/open-telemetry/opentelemetry-js) | `2.10.0` | `2.11.0` | | [@playwright/test](https://github.com/microsoft/playwright) | `1.62.1` | `1.63.0` | | [@typescript-eslint/eslint-plugin](https://github.com/typescript-eslint/typescript-eslint/tree/HEAD/packages/eslint-plugin) | `8.67.0` | `8.69.0` | | [cspell](https://github.com/streetsidesoftware/cspell/tree/HEAD/packages/cspell) | `10.0.1` | `10.2.2` | | [eslint](https://github.com/eslint/eslint) | `10.8.1` | `10.10.0` | | [markdown-it](https://github.com/markdown-it/markdown-it) | `15.0.0` | `15.0.1` | | [vscode-jsonrpc](https://github.com/Microsoft/vscode-languageserver-node/tree/HEAD/jsonrpc) | `9.0.1` | `9.0.2` | | [@types/node](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/node) | `26.2.0` | `26.4.1` | | [@github/copilot-sdk](https://github.com/github/copilot-sdk) | `1.0.11` | `1.0.13` | | [typedoc-plugin-markdown](https://github.com/typedoc2md/typedoc-plugin-markdown/tree/HEAD/packages/typedoc-plugin-markdown) | `4.12.0` | `4.13.0` | | [@opentelemetry/exporter-metrics-otlp-grpc](https://github.com/open-telemetry/opentelemetry-js) | `0.221.0` | `0.222.0` | | [@opentelemetry/exporter-trace-otlp-grpc](https://github.com/open-telemetry/opentelemetry-js) | `0.221.0` | `0.222.0` | | [@opentelemetry/sdk-node](https://github.com/open-telemetry/opentelemetry-js) | `0.221.0` | `0.222.0` | Updates `@opentelemetry/context-async-hooks` from 2.10.0 to 2.11.0 - [Release notes](https://github.com/open-telemetry/opentelemetry-js/releases) - [Changelog](https://github.com/open-telemetry/opentelemetry-js/blob/main/CHANGELOG.md) - [Commits](open-telemetry/opentelemetry-js@v2.10.0...v2.11.0) Updates `@opentelemetry/sdk-metrics` from 2.10.0 to 2.11.0 - [Release notes](https://github.com/open-telemetry/opentelemetry-js/releases) - [Changelog](https://github.com/open-telemetry/opentelemetry-js/blob/main/CHANGELOG.md) - [Commits](open-telemetry/opentelemetry-js@v2.10.0...v2.11.0) Updates `@opentelemetry/sdk-trace-base` from 2.10.0 to 2.11.0 - [Release notes](https://github.com/open-telemetry/opentelemetry-js/releases) - [Changelog](https://github.com/open-telemetry/opentelemetry-js/blob/main/CHANGELOG.md) - [Commits](open-telemetry/opentelemetry-js@v2.10.0...v2.11.0) Updates `@playwright/test` from 1.62.1 to 1.63.0 - [Release notes](https://github.com/microsoft/playwright/releases) - [Commits](microsoft/playwright@v1.62.1...v1.63.0) Updates `@typescript-eslint/eslint-plugin` from 8.67.0 to 8.69.0 - [Release notes](https://github.com/typescript-eslint/typescript-eslint/releases) - [Changelog](https://github.com/typescript-eslint/typescript-eslint/blob/main/packages/eslint-plugin/CHANGELOG.md) - [Commits](https://github.com/typescript-eslint/typescript-eslint/commits/v8.69.0/packages/eslint-plugin) Updates `@typescript-eslint/parser` from 8.67.0 to 8.69.0 - [Release notes](https://github.com/typescript-eslint/typescript-eslint/releases) - [Changelog](https://github.com/typescript-eslint/typescript-eslint/blob/main/packages/parser/CHANGELOG.md) - [Commits](https://github.com/typescript-eslint/typescript-eslint/commits/v8.69.0/packages/parser) Updates `cspell` from 10.0.1 to 10.2.2 - [Release notes](https://github.com/streetsidesoftware/cspell/releases) - [Changelog](https://github.com/streetsidesoftware/cspell/blob/main/packages/cspell/CHANGELOG.md) - [Commits](https://github.com/streetsidesoftware/cspell/commits/v10.2.2/packages/cspell) Updates `eslint` from 10.8.1 to 10.10.0 - [Release notes](https://github.com/eslint/eslint/releases) - [Commits](eslint/eslint@v10.8.1...v10.10.0) Updates `markdown-it` from 15.0.0 to 15.0.1 - [Changelog](https://github.com/markdown-it/markdown-it/blob/master/CHANGELOG.md) - [Commits](markdown-it/markdown-it@15.0.0...15.0.1) Updates `vscode-jsonrpc` from 9.0.1 to 9.0.2 - [Release notes](https://github.com/Microsoft/vscode-languageserver-node/releases) - [Commits](https://github.com/Microsoft/vscode-languageserver-node/commits/release/jsonrpc/9.0.2/jsonrpc) Updates `@types/node` from 26.2.0 to 26.4.1 - [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases) - [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/node) Updates `@github/copilot-sdk` from 1.0.11 to 1.0.13 - [Release notes](https://github.com/github/copilot-sdk/releases) - [Changelog](https://github.com/github/copilot-sdk/blob/main/CHANGELOG.md) - [Commits](github/copilot-sdk@v1.0.11...v1.0.13) Updates `typedoc-plugin-markdown` from 4.12.0 to 4.13.0 - [Release notes](https://github.com/typedoc2md/typedoc-plugin-markdown/releases) - [Changelog](https://github.com/typedoc2md/typedoc-plugin-markdown/blob/main/packages/typedoc-plugin-markdown/CHANGELOG.md) - [Commits](https://github.com/typedoc2md/typedoc-plugin-markdown/commits/typedoc-plugin-markdown@4.13.0/packages/typedoc-plugin-markdown) Updates `@opentelemetry/exporter-metrics-otlp-grpc` from 0.221.0 to 0.222.0 - [Release notes](https://github.com/open-telemetry/opentelemetry-js/releases) - [Changelog](https://github.com/open-telemetry/opentelemetry-js/blob/main/CHANGELOG.md) - [Commits](open-telemetry/opentelemetry-js@experimental/v0.221.0...experimental/v0.222.0) Updates `@opentelemetry/exporter-trace-otlp-grpc` from 0.221.0 to 0.222.0 - [Release notes](https://github.com/open-telemetry/opentelemetry-js/releases) - [Changelog](https://github.com/open-telemetry/opentelemetry-js/blob/main/CHANGELOG.md) - [Commits](open-telemetry/opentelemetry-js@experimental/v0.221.0...experimental/v0.222.0) Updates `@opentelemetry/resources` from 2.10.0 to 2.11.0 - [Release notes](https://github.com/open-telemetry/opentelemetry-js/releases) - [Changelog](https://github.com/open-telemetry/opentelemetry-js/blob/main/CHANGELOG.md) - [Commits](open-telemetry/opentelemetry-js@v2.10.0...v2.11.0) Updates `@opentelemetry/sdk-node` from 0.221.0 to 0.222.0 - [Release notes](https://github.com/open-telemetry/opentelemetry-js/releases) - [Changelog](https://github.com/open-telemetry/opentelemetry-js/blob/main/CHANGELOG.md) - [Commits](open-telemetry/opentelemetry-js@experimental/v0.221.0...experimental/v0.222.0) Updates `@opentelemetry/sdk-trace-node` from 2.10.0 to 2.11.0 - [Release notes](https://github.com/open-telemetry/opentelemetry-js/releases) - [Changelog](https://github.com/open-telemetry/opentelemetry-js/blob/main/CHANGELOG.md) - [Commits](open-telemetry/opentelemetry-js@v2.10.0...v2.11.0) --- updated-dependencies: - dependency-name: "@opentelemetry/context-async-hooks" dependency-version: 2.11.0 dependency-type: direct:development update-type: version-update:semver-minor dependency-group: minor-patch - dependency-name: "@opentelemetry/sdk-metrics" dependency-version: 2.11.0 dependency-type: direct:production update-type: version-update:semver-minor dependency-group: minor-patch - dependency-name: "@opentelemetry/sdk-trace-base" dependency-version: 2.11.0 dependency-type: direct:production update-type: version-update:semver-minor dependency-group: minor-patch - dependency-name: "@playwright/test" dependency-version: 1.63.0 dependency-type: direct:development update-type: version-update:semver-minor dependency-group: minor-patch - dependency-name: "@typescript-eslint/eslint-plugin" dependency-version: 8.69.0 dependency-type: direct:development update-type: version-update:semver-minor dependency-group: minor-patch - dependency-name: "@typescript-eslint/parser" dependency-version: 8.69.0 dependency-type: direct:development update-type: version-update:semver-minor dependency-group: minor-patch - dependency-name: cspell dependency-version: 10.2.2 dependency-type: direct:development update-type: version-update:semver-minor dependency-group: minor-patch - dependency-name: eslint dependency-version: 10.10.0 dependency-type: direct:development update-type: version-update:semver-minor dependency-group: minor-patch - dependency-name: markdown-it dependency-version: 15.0.1 dependency-type: direct:development update-type: version-update:semver-patch dependency-group: minor-patch - dependency-name: vscode-jsonrpc dependency-version: 9.0.2 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: minor-patch - dependency-name: "@types/node" dependency-version: 26.4.1 dependency-type: direct:development update-type: version-update:semver-minor dependency-group: minor-patch - dependency-name: "@github/copilot-sdk" dependency-version: 1.0.13 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: minor-patch - dependency-name: typedoc-plugin-markdown dependency-version: 4.13.0 dependency-type: direct:development update-type: version-update:semver-minor dependency-group: minor-patch - dependency-name: "@opentelemetry/exporter-metrics-otlp-grpc" dependency-version: 0.222.0 dependency-type: direct:production update-type: version-update:semver-minor dependency-group: minor-patch - dependency-name: "@opentelemetry/exporter-trace-otlp-grpc" dependency-version: 0.222.0 dependency-type: direct:production update-type: version-update:semver-minor dependency-group: minor-patch - dependency-name: "@opentelemetry/resources" dependency-version: 2.11.0 dependency-type: direct:production update-type: version-update:semver-minor dependency-group: minor-patch - dependency-name: "@opentelemetry/sdk-node" dependency-version: 0.222.0 dependency-type: direct:production update-type: version-update:semver-minor dependency-group: minor-patch - dependency-name: "@opentelemetry/sdk-trace-node" dependency-version: 2.11.0 dependency-type: direct:production update-type: version-update:semver-minor dependency-group: minor-patch ... Signed-off-by: dependabot[bot] <support@github.com> * fix(deps): align typescript-eslint parser Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> --------- Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Brady Gaster <brady.gaster@gmail.com> Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> Co-authored-by: Brady Gaster <41929050+bradygaster@users.noreply.github.com>
…ithub#2001) --- updated-dependencies: - dependency-name: Microsoft.Agents.AI.GitHub.Copilot dependency-version: 1.20.0 dependency-type: direct:production update-type: version-update:semver-minor dependency-group: microsoft-packages ... Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Brady Gaster <41929050+bradygaster@users.noreply.github.com>
…hub#2005) * feat: add Squad retrospective workflow Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> * fix: satisfy retrospective workflow gates Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> * feat: add retrospective remediation handoff Closes github#2005 Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> * fix: restore retrospective CI contracts Closes github#2005 Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> --------- Co-authored-by: Copilot <Copilot@users.noreply.github.com> Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> Co-authored-by: Brady Gaster <41929050+bradygaster@users.noreply.github.com>
* fix(gh-aw): harden bootstrap provenance Reject same-named tag dispatches and preserve trusted install provenance across default-branch fast-forwards.\n\nSource: octodemo/zava-social-queue-worker-20261002092250#1\n\nCo-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> * docs(gh-aw): align provenance binding comment Address Copilot review on bradygaster/squad#2145.\n\nCo-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
* fix(gh-aw): verify installed workflow source bindings Closes github#2146 Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> * fix(gh-aw): reject extra workflow newline Closes github#2146 Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> * chore(gh-aw): regenerate restacked workflow manifest Closes github#2146 Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> --------- Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
* fix(gh-aw): remove mutable generated router Reject gh-aw's unowned mutable agentic-workflows skill in final and staged installation verification while preserving the exact Squad enlistment skill. Finding: octodemo/zava-social-queue-worker-20261002092250#1 comment 4164580830 Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> * test(gh-aw): prove router removal independence Document and enforce that repository routing uses the owned agentic-workflows specialist, designer, and reliability skill without the mutable gh-aw router. Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> * fix(gh-aw): repair verifier recovery cleanup Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> --------- Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
* fix(gh-aw): prevent edited command replay Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> * fix(gh-aw): address exact-head review findings Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> * fix(gh-aw): finish command replay hardening Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> * fix(gh-aw): reject ineffective revocations Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> * fix(gh-aw): normalize durable revocations Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> * fix(gh-aw): route edited revocation rejection Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> --------- Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
…disclaimers (github#2143) * chore(squad-agents-ai): bump MAF to 1.23.0 and sample Extensions packages to 10.0.12 - Microsoft.Agents.AI.GitHub.Copilot 1.22.0 -> 1.23.0 (GitHub.Copilot.SDK stays pinned at 1.0.14 via SquadCopilotSdkVersion; 1.0.16 showed unreliable startup in validation). - Sample's Microsoft.Extensions.Hosting/DependencyInjection/Logging.Console bumped to 10.0.12. - Add a --smoke flag to the sample Program.cs: a bounded, no-auth/no-model-call check of default and keyed DI resolution and the client configuration callback, documented in the README for a fast sanity check without Copilot authentication or CLI startup. - Update the Squad.Agents.AI.csproj prerelease-version comment now that Microsoft.Agents.AI.GitHub.Copilot has shipped a stable (non "-rc") release; the package's own Version stays 0.5.6-rc1 until its stable release is scheduled. Verified: full Squad.Agents.AI.Tests suite (82 tests x net8.0/net9.0/net10.0 = 246) passes; sample builds and the new --smoke check passes. Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> * chore(squad-agents-ai): prepare stable 1.0.0 (PR github#2143) Set the package version to 1.0.0, align current documentation and sample metadata, and preserve stable dependency pins. Use the configured team root and signed-in authentication in the sample. Publication remains human-only; live validation and the root npm build remain blocked in this environment. Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> --------- Co-authored-by: Copilot <Copilot@users.noreply.github.com> Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
…ch-scope feat(gh-aw): opt-in committed research scope for bootstrap
Promote the Squad CLI/SDK npm packages (@bradygaster/squad-cli, @bradygaster/squad-sdk) to 1.0.0. - Bump root, squad-cli, and squad-sdk package.json + package-lock.json from 0.13.1 to 1.0.0. - Bump squad-cli's declared dependency floor on squad-sdk from >=0.11.0 to >=1.0.0. - Add a [1.0.0] CHANGELOG.md entry. - Remove the blanket "Experimental - Squad is alpha software" banner from 87 documentation pages under docs/src/content/docs/**. Genuine preview-channel and feature-specific warnings (SDK-first mode, GitLab Issues Mode, the plugin security MVP gate, and preview/ insider release channels) are left untouched. This does not touch src/Squad.Agents.AI (the separately-versioned .NET/NuGet package, already stable at 1.0.0 via PR github#2143) and does not consolidate the pending .changeset/*.md fragments, which track unrelated in-flight feature work. Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
…ft-laughing-barnacle chore(release): prepare v1.0.0
…es (github#2152) * fix(ci): resolve dev-to-main promotion merge conflicts and false whitespace failures squad-promote.yml's dev-to-main merge (-X theirs) was failing with ~76 unresolved conflicts, diagnosed down to concrete, mechanical causes: 1. Git's rename-detection heuristic falsely paired newly-added template/ charter files (new on dev, absent at merge-base) with unrelated files independently deleted on main, producing ~51 spurious conflicts. Fix: add -X no-renames. 2. The remaining ~25 conflicts were genuine delete(main)/modify(dev) conflicts purely on .squad/.ai-team/etc paths that the script's own next step deletes from the release tree regardless of merge outcome. Fix: run that git rm --cached cleanup before the unmerged-conflict check instead of after, so these non-decisions don't block the merge. 3. .github/workflows/squad-preview.yml was hardened independently on main while being deliberately removed on dev as part of the preview/ stable release-channel consolidation (8361274, which folded its logic into squad-release.yml). Fix: accept dev's removal explicitly. Also fixes a second, independent latent blocker that would hit the real v1.0.0 promotion even after the conflicts above are resolved: the 'git diff --cached --check' validation step flags every added line in the repo's ~95 intentionally CRLF-encoded .ts files (see .gitattributes) as 'trailing whitespace', since they're deliberately excluded from eol=lf normalization to avoid a disruptive renormalization commit. Fix: run the check with core.whitespace=cr-at-eol, which still catches real trailing spaces/tabs and blank-line-at-EOF issues. That real issue was present too: test/gh-aw-hosted-e2e.test.ts had one stray trailing blank line at EOF, now removed (141/141 tests still pass for that file via vitest). Validated end-to-end against live origin/main and origin/dev in an isolated clone: merge -X theirs -X no-renames -> git rm cleanup for .squad/.ai-team/etc -> git rm for squad-preview.yml yields 0 unresolved conflicts, 0 forbidden paths remaining, and a clean cr-at-eol whitespace check. Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> * test: update stable-promotion merge command assertion for -X no-renames The 'stable promotion' contract test hardcoded the exact pre-fix merge command string ('git merge origin/dev --no-commit --no-ff -X theirs || true'). PR github#2152's fix added '-X no-renames' to that command to eliminate spurious rename-detection-heuristic conflicts during the dev-to-main sanitized merge, so the literal substring no longer matched, failing CI run 37048896755. Updated the expected string to match the new, intentional command: 'git merge origin/dev --no-commit --no-ff -X theirs -X no-renames || true'. Verified via px vitest run test/standalone-release-workflow.test.ts (32/32 passed). Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> --------- Co-authored-by: Copilot <Copilot@users.noreply.github.com> Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Contributor
🛫 PR Readiness Check
PR Scope: 📦🔧 Mixed (product + infrastructure)
|
| Status | Check | Details |
|---|---|---|
| ❌ | Single commit | 250 commits — consider squashing before review |
| ✅ | Not in draft | Ready for review |
| ✅ | Branch up to date | Up to date with main |
| ❌ | Copilot review | No Copilot review yet — it may still be processing |
| ✅ | Changeset present | Changeset file found |
| ✅ | Scope clean | No .squad/ or docs/proposals/ files |
| ✅ | No merge conflicts | No merge conflicts |
| ✅ | Copilot threads resolved | No Copilot review threads |
| ❌ | CI passing | 1 check(s) failing: samples-build |
Files Changed (657 files, +78000 −11150)
| File | +/− |
|---|---|
.changeset/1494-templates-readme.md |
+5 −0 |
.changeset/1973-gh-aw-enlistment-credentials.md |
+6 −0 |
.changeset/2056-doctor-remote-state-dir.md |
+5 −0 |
.changeset/2106-windows-durable-casting.md |
+5 −0 |
.changeset/2107-linked-team-root-forms.md |
+10 −0 |
.changeset/2155-heartbeat-fork-pr-labels.md |
+10 −0 |
.changeset/agent-identity-provenance.md |
+25 −0 |
.changeset/automate-release-distribution.md |
+6 −0 |
.changeset/automatic-squad-bootstrap.md |
+8 −0 |
.changeset/bright-gh-aw-central-ops.md |
+6 −0 |
.changeset/calm-casts-preserve-support.md |
+6 −0 |
.changeset/casting-runtime-state.md |
+6 −0 |
.changeset/coordinator-scope-persistence.md |
+6 −0 |
.changeset/dedicated-review-app.md |
+12 −0 |
.changeset/exact-gh-aw-enlistment-version.md |
+8 −0 |
.changeset/fail-closed-gh-aw-resource-verification.md |
+8 −0 |
.changeset/fix-bootstrap-payload-transport.md |
+7 −0 |
.changeset/fix-bootstrap-triage-continuity.md |
+8 −0 |
.changeset/fix-router-author-binding.md |
+6 −0 |
.changeset/fix-squad-command-relay-defects.md |
+10 −0 |
.changeset/formalize-charter-profile.md |
+5 −0 |
.changeset/gh-aw-compiled-expression.md |
+8 −0 |
.changeset/gh-aw-enlistment-skill.md |
+6 −0 |
.changeset/gh-aw-ga-review-hardening.md |
+83 −0 |
.changeset/gh-aw-issues-prerequisite.md |
+6 −0 |
.changeset/gh-aw-native-review-warning.md |
+6 −0 |
.changeset/gh-aw-runtime-resource-closure.md |
+8 −0 |
.changeset/harden-bootstrap-provenance.md |
+8 −0 |
.changeset/identity-neutral-squad-templates.md |
+10 −0 |
.changeset/preserve-gh-aw-builtins.md |
+12 −0 |
.changeset/preserve-mcp-json-env.md |
+9 −0 |
.changeset/prevent-command-replay.md |
+6 −0 |
.changeset/recast-label-slugs.md |
+6 −0 |
.changeset/reject-legacy-revision-tokens.md |
+5 −0 |
.changeset/remove-mutable-gh-aw-router.md |
+6 −0 |
.changeset/reskill-template-skills.md |
+8 −0 |
.changeset/secure-gh-aw-canary.md |
+6 −0 |
.changeset/secure-native-gh-aw-package.md |
+8 −0 |
.changeset/squad-retro-auto-implement.md |
+20 −0 |
.changeset/squad-retrospective-workflow.md |
+7 −0 |
.changeset/strict-casting-durability.md |
+6 −0 |
.changeset/strict-casting-readers.md |
+5 −0 |
.changeset/verified-gh-aw-ownership-staging.md |
+6 −0 |
.copilot/skills/action-skill-contracts/SKILL.md |
+36 −0 |
.copilot/skills/architectural-proposals/SKILL.md |
+1 −1 |
.copilot/skills/archival-integrity/SKILL.md |
+57 −0 |
.copilot/skills/ci-validation-gates/SKILL.md |
+25 −7 |
.copilot/skills/client-compatibility/SKILL.md |
+7 −2 |
.copilot/skills/content-scope/SKILL.md |
+33 −0 |
.copilot/skills/documentation-maintenance/SKILL.md |
+38 −0 |
| ... | +607 more files |
Total: +78000 −11150
This check runs automatically on every push. Fix any ❌ items and push again.
See CONTRIBUTING.md and PR Requirements for details.
Bumps [devalue](https://github.com/sveltejs/devalue) from 5.9.2 to 5.9.4. - [Release notes](https://github.com/sveltejs/devalue/releases) - [Changelog](https://github.com/sveltejs/devalue/blob/main/CHANGELOG.md) - [Commits](sveltejs/devalue@v5.9.2...v5.9.4) --- updated-dependencies: - dependency-name: devalue dependency-version: 5.9.4 dependency-type: indirect ... Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Brady Gaster <41929050+bradygaster@users.noreply.github.com>
Bumps [@grpc/grpc-js](https://github.com/grpc/grpc-node) from 1.14.4 to 1.14.5. - [Release notes](https://github.com/grpc/grpc-node/releases) - [Commits](https://github.com/grpc/grpc-node/compare/@grpc/grpc-js@1.14.4...@grpc/grpc-js@1.14.5) --- updated-dependencies: - dependency-name: "@grpc/grpc-js" dependency-version: 1.14.5 dependency-type: indirect ... Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Brady Gaster <41929050+bradygaster@users.noreply.github.com>
…All artifact - test/e2e-runbook-hygiene.test.ts: deliberately deleted from dev in PR github#2015 (Isolate Squad product assets from team state) because it read live .squad state. It survived only on main (added at v0.13.0, no promotion since), so the dev-vs-main merge resurrected it. Removing it to match dev's documented, traceable intent — not a blanket ours/theirs choice. - test/template-sync.test.ts: the 3-way merge auto-combined non-overlapping hunks from dev (simplified describe block, no beforeAll) and main (legacy describe-scoped beforeAll retained for historical defence-in-depth) into semantically broken code referencing an unimported beforeAll. Replaced with dev's complete, authoritative file content (byte-identical to origin/dev). Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
…nce (github#2153) Resolve a set of contradictions/unreliable instructions in the public Agentic Workflows setup guide (docs/src/content/docs/guide/gh-aw.md): - Clarify the Profile A (least-privilege, recommended) Actions permission setting and what remains manual under it; add an explicit opt-in Profile B (automatic PR creation) section with its coupled security tradeoff instead of silently enabling it. - Remove unconditional safe-update approval from the executable quick start; approval now requires verifying the report contains exactly SQUAD_GITHUB_APP_PRIVATE_KEY, SQUAD_GITHUB_TOKEN, and bradygaster/squad/.github/actions/squad-init, otherwise stop. - Replace the broken `gh pr edit --add-reviewer @copilot` with a verified Copilot-as-Bot GraphQL requestReviewsByLogin/botLogins request plus a manual UI fallback (both quick-start and full-steps flows). - Make SQUAD_SHA discovery immutable: remove prose claiming quick start resolves dev automatically; require a maintainer-approved SHA. - Make quick start rerunnable/safe: validate a clean working tree and reuse an existing bootstrap branch instead of failing. - Replace the incomplete 7/8-workflow, 5/17-runtime-resource inventory loop with the manifest-backed squad-install-verifier.mjs --verify-install check (8 workflows / 17 shared runtime resources). - Correct the least-privilege fallback lifecycle: bootstrap opens/ reuses a signed fallback issue, a human opens the Cast PR, and Squad Bootstrap must be manually re-dispatched to create the linked research-proposal issue; make this explicit in the quick-start outcome narrative. - Align the /squad implement and troubleshooting prose with the Profile A/B framing so it no longer recommends disabling PR creation while also claiming automatic implementation PRs. Sync the canonical enlistment guidance (.squad-templates/skills/gh-aw-enlistment/SKILL.md) and its 4 mirrors with the same Copilot-as-Bot GraphQL reviewer-request fix (verified via scripts/sync-templates.mjs --sync), and regenerate workflows/squad-workflows.manifest.json's enlistment-skill digest via squad-install-verifier.mjs --write-source. Update the two directly-related documentation contract tests: - test/gh-aw-enlistment-skill.test.ts: match the renamed Profile A heading used as a test slice boundary. - test/standalone-release-workflow.test.ts: assert the new requestReviewsByLogin/copilot-pull-request-reviewer approach instead of the removed --add-reviewer command. Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
…#2144) Bumps [@grpc/grpc-js](https://github.com/grpc/grpc-node) from 1.14.4 to 1.14.5. - [Release notes](https://github.com/grpc/grpc-node/releases) - [Commits](https://github.com/grpc/grpc-node/compare/@grpc/grpc-js@1.14.4...@grpc/grpc-js@1.14.5) --- updated-dependencies: - dependency-name: "@grpc/grpc-js" dependency-version: 1.14.5 dependency-type: indirect ... Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Brady Gaster <41929050+bradygaster@users.noreply.github.com>
* deps: Bump vitest from 4.1.11 to 5.0.2 Bumps [vitest](https://github.com/vitest-dev/vitest/tree/HEAD/packages/vitest) from 4.1.11 to 5.0.2. - [Release notes](https://github.com/vitest-dev/vitest/releases) - [Changelog](https://github.com/vitest-dev/vitest/blob/main/docs/releases.md) - [Commits](https://github.com/vitest-dev/vitest/commits/v5.0.2/packages/vitest) --- updated-dependencies: - dependency-name: vitest dependency-version: 5.0.1 dependency-type: direct:development update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] <support@github.com> * fix: align vitest coverage peer dependency (Part of github#2090) Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> * chore: use public registry URL for yaml lock (Part of github#2090) Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> * deps: Bump vitest from 4.1.11 to 5.0.2 Bumps [vitest](https://github.com/vitest-dev/vitest/tree/HEAD/packages/vitest) from 4.1.11 to 5.0.2. - [Release notes](https://github.com/vitest-dev/vitest/releases) - [Changelog](https://github.com/vitest-dev/vitest/blob/main/docs/releases.md) - [Commits](https://github.com/vitest-dev/vitest/commits/v5.0.2/packages/vitest) --- updated-dependencies: - dependency-name: vitest dependency-version: 5.0.1 dependency-type: direct:development update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] <support@github.com> * fix(ci): use public npm registry for gh-aw verifier Fixes the dependency-install failure blocking Dependabot PR github#2151 before strict compilation. Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> --------- Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: brady gaster <bradygaster@github.com> Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> Co-authored-by: Brady Gaster <41929050+bradygaster@users.noreply.github.com>
…ithub#2069) (github#2074) * feat: formalize Squad charter profile Part of github#2069 Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> fix: complete charter profile conformance Part of github#2069 Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> docs: remove specification trailing whitespace Part of github#2069 Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> Source-Commit: d21ab99 * fix: enforce portable charter conformance Part of github#2069 Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> Source-Commit: ab80da1 * fix: complete charter conformance gate Part of github#2069 Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> Source-Commit: f7d430a * fix: enforce charter manifest schema Part of github#2069 Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> Source-Commit: 71634fd * docs: draft Squad specification suite Part of github#2069 Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> (cherry picked from commit c03ba95) * fix: revise specification suite publication claims Part of github#2069 Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> (cherry picked from commit f5ced9d) * fix: close specification suite contracts Part of github#2069 Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> (cherry picked from commit 3a7fb53) * docs: align specification claim boundaries Part of github#2069 Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> * fix: bind Charter claims to immutable revisions Part of github#2069 Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> * docs: clarify specification scope and execution boundaries Part of github#2069 Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> * fix: bind Charter digest to portable checkout bytes Part of github#2069 Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> --------- Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> Co-authored-by: brady gaster <bradygaster@github.com>
) squad init and team casting failed on Windows with "EPERM: operation not permitted, fsync" (regression from github#2066). - flushDirectory() fsynced directory handles after each rename, which Windows rejects. Skip it on win32; the file-level fsync already ran. - The lock publishes by renaming a candidate dir onto registry.lock. Windows reports a rename onto an existing directory as EPERM, not ENOTEMPTY/EEXIST, so a contended lock crashed instead of waiting. Treat win32 EPERM as contention in the sync and async acquirers, and name the last publish error in the timeout so a real permission problem isn't blamed on a phantom writer. - Lock release retries the quarantine rename on transient win32 EPERM/EACCES/EBUSY (antivirus holding a fresh owner.json) for up to 1s, since a leftover registry.lock.recovery blocks every later writer. Deleting the already-quarantined copy is best-effort on win32. - A blocked quarantine delete could leave registry.lock.released-* folders in .squad/casting/ with no later cleanup. Release now sweeps abandoned lock quarantines while holding the recovery guard; guard quarantines are swept only once older than the stale-lock age. Tests: an emulated-Windows suite runs on any host, including the ubuntu-only CI; each fix turns it red when reverted. The retry and delete tests run for EPERM, EACCES and EBUSY. Child-process tests import the module via a file:// URL so the existing durability suite also runs on Windows. Closes github#2106 Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> Co-authored-by: Tamir Dresher <tamir.dresher@gmail.com> Co-authored-by: Brady Gaster <41929050+bradygaster@users.noreply.github.com>
…ub#2119) teamRoot can name the team repo (what `squad link` writes) or the team's .squad/ dir (what the docs show), but callers assumed different forms: effectiveSquadDir and cast appended .squad, while the state MCP server did not. The docs form broke `squad loop`/`watch`/`cast`; the link form made squad_decide write decisions outside .squad/. Add ResolvedSquadPaths.teamSquadDir, which resolves either form to the team's squad dir (legacy .ai-team included), and use it in effectiveSquadDir, cast, state-mcp, and the local-backend storage root. Document on teamDir that callers must not join team-state paths onto it. `squad doctor` now warns when a linked team repo still holds state-mcp output outside .squad/. It checks every path the state tools can write (exported as MUTABLE_STATE_PATHS, with isMutableStateKey) and lists each .md/.json file to move, or to merge by hand when the same file already exists under .squad/. It reports only and does not move files. The SDK changeset is minor because teamSquadDir is a required field on the exported ResolvedSquadPaths type. Closes github#2107 Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> Co-authored-by: Brady Gaster <41929050+bradygaster@users.noreply.github.com> Co-authored-by: Tamir Dresher <tamir.dresher@gmail.com>
…emote mode (github#2057) squad doctor detected the remote teamRoot correctly but then ran the team.md/routing.md/agents/casting/decisions checks against the local .squad/ stub instead of the resolved team root's .squad/, producing false 'file not found' failures for linked projects even though squad status and squad cast resolved the team fine. runDoctor() now uses effectiveSquadDir() (the same dual-root resolver already used by build/copilot/export/loop/plugin/watch) to compute the state dir, so it follows the remote teamRoot the same way the rest of the CLI does. Fixes github#2056. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> Co-authored-by: Tamir Dresher <tamir.dresher@gmail.com> Co-authored-by: Brady Gaster <41929050+bradygaster@users.noreply.github.com> Co-authored-by: Copilot <Copilot@users.noreply.github.com>
- test/cli/export-import.test.ts, test/agent-provenance.test.ts, test/gh-aw-quality.test.ts: replace franken-merge/live-state-dependent assertions with hermetic fixtures so the hosted test job (dev/main divergence) doesn't fail on main-promotion-specific repo state. - test/acceptance/steps/cli-steps.ts: init a git repo in the scaffolded temp dir for the squadified-project step so 'squad consult' reaches its real check instead of failing at the git-repo precondition. - remove 3 files dev deliberately deleted that were still present only on main (orphaned from a prior promotion).
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
Sanitized promotion of dev (v1.0.0, commit dbfe382) into main, replicating exactly the merge/cleanup logic of .github/workflows/squad-promote.yml (as fixed in #2152) — produced manually because the automation's direct git push origin HEAD:main is rejected by this repo's branch ruleset (
equired_status_checks with current_user_can_bypass: never), which cannot be satisfied by a commit that has never run through a PR. See full root-cause writeup below.
What's in this PR
git -c core.whitespace=cr-at-eol diff --cached --checkclean (no genuine whitespace issues)Why a manual PR instead of the automation
Dispatched the real (dry_run=false) squad-promote.yml run after merging #2152 (run 37053642911). The sanitized-merge/build/test steps all succeeded, but the final git push origin HEAD:main step failed:
! [remote rejected] HEAD -> main (push declined due to repository rule violations)Root cause: ruleset 12703724 (target �ranch, covers
efs/heads/main) enforces
equired_status_checks (gh-aw strict compile, est) with strict_required_status_checks_policy: true, and this actor has current_user_can_bypass: never. A freshly-built promotion commit can never satisfy this — those checks only evaluate commits that are the head of an open PR. main was not modified by the failed push (still 5e086ce at the time).
This PR is the compliant path: the exact same sanitized candidate, submitted through a real PR so the required checks run and gate the merge normally, with no ruleset bypass.
Follow-up (separate, not in this PR)
squad-promote.yml itself should be updated to open a PR like this one instead of pushing directly to main, so future promotions don't hit this same rejection. Tracking as a follow-up; out of scope here to keep this PR's diff limited to the actual release candidate content.
Co-authored-by: Copilot App 223556219+Copilot@users.noreply.github.com
Heartbeat workflow fix (added after initial review request)
.github/workflows/squad-heartbeat.yml(and its 4 synced template copies) used apull_request: types: [closed]trigger. GitHub forcesGITHUB_TOKENto read-only forpull_requestevents from a fork, regardless of declaredpermissions:, so the "Repair orphaned squad labels" step'sissues.addLabelscall 403'd whenever a fork PR closed (runs 37045805429, 37036858649).Fixed by switching the trigger to
pull_request_target(safe here: noref:override anywhere in the file, so checkout always uses the base ref, never the fork head; no step reads/executes fork PR content). Already reviewed and merged intodevas #2155. Cherry-picked as commit d38f148 into this PR (scoped single-commit cherry-pick, not a full dev merge -- dev has since advanced further with an unrelated dependency-bump commit, #2151, intentionally NOT included here).Verification evidence (token-permission header comparison, not an inferred/empty-run claim):
Issues: read(despiteissues: writedeclared) -> 403.Issues: write-> token correctly elevated.addLabelswrite was not exercised end-to-end. The token-scope evidence above is the actual root-cause mechanism; no live-write proof is claimed.