Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
227 commits
Select commit Hold shift + click to select a range
3e59d91
feat(screenshot): Vercel preview-deploy screenshot pipeline (no stack…
isadeks May 20, 2026
70eadfd
feat(screenshot): GitHubScreenshotIntegration construct + stack wiring
isadeks May 20, 2026
3ca08c9
fix(screenshot): suppress AwsSolutions-S2 on the public-read screensh…
isadeks May 20, 2026
b00d07d
fix(screenshot): private S3 bucket + CloudFront distribution
isadeks May 20, 2026
8b26810
fix(waf): exempt /v1/github/webhook from CRS like /v1/linear/webhook
isadeks May 21, 2026
40120cb
fix(screenshot): read environment_url from deployment_status, not dep…
isadeks May 21, 2026
54b8932
fix(agentcore-browser): use ws package for SigV4-signed WebSocket han…
isadeks May 21, 2026
07d8bbb
fix(agentcore-browser): SigV4-presign WSS URL instead of signing headers
isadeks May 21, 2026
077f843
fix(iam): grant bedrock-agentcore:* to the screenshot processor
isadeks May 21, 2026
4127727
feat(screenshot): also post screenshot comment to linked Linear issue
isadeks May 21, 2026
fee1134
fix(cli): bgagent linear list-projects on the OAuth secret model
isadeks May 21, 2026
6660b1a
fix(screenshot): retry PR lookup to handle Vercel-before-PR race
isadeks May 21, 2026
790efbd
fix(linear): silent label gate + default to 'abca' to stop unlabeled-…
May 21, 2026
73f8ecf
docs: VERCEL_SETUP_GUIDE for the Vercel preview screenshot pipeline
isadeks May 21, 2026
06d4f8d
feat(linear): add bgagent linear add-workspace command
isadeks May 26, 2026
00d01be
docs(linear): rewrite setup guide for shipped 2.0b-O2 flow + per-work…
isadeks May 26, 2026
e00e245
fix(linear): make add-workspace fully interactive — drop --client-id/…
isadeks May 26, 2026
eb0e169
fix(linear): drop source workspace name from add-workspace prompt prose
isadeks May 27, 2026
33c9159
fix(linear): rewrite promptLine in raw stdin mode so it composes with…
isadeks May 27, 2026
fb65e5e
fix(cli): bgagent linear list-projects on the OAuth secret model
isadeks May 21, 2026
7ee9775
fix(linear): clearer empty-result message in list-projects
isadeks May 27, 2026
fde013a
Merge branch 'aws-samples:main' into feat/linear-add-workspace
isadeks May 27, 2026
ac6bb34
feat(linear): per-workspace webhook signing secret
isadeks May 27, 2026
1b31050
feat(linear): bgagent linear update-webhook-secret for rotation/recovery
isadeks May 27, 2026
ac5ce67
refactor(linear): drop --rotate-webhook-secret in favor of update-web…
isadeks May 27, 2026
cb41ff9
Merge remote-tracking branch 'origin/feat/linear-add-workspace' into …
isadeks May 27, 2026
f7e403d
docs(linear): step-by-step walkthrough for adding a second workspace
isadeks May 27, 2026
5debf60
docs(linear): step-by-step walkthrough for adding a second workspace
isadeks May 27, 2026
68e6010
feat(linear): bgagent linear webhook-info + setup-guide trim
isadeks May 27, 2026
1e259a3
docs(linear): aggressive trim of setup guide; PAK migration moved to …
isadeks May 27, 2026
d843540
fix(linear): bump webhook processor memory to 512 MB
isadeks May 27, 2026
a0f3533
fix(linear): bump webhook processor memory to 512 MB
isadeks May 27, 2026
cdd771c
feat(linear): bgagent linear link-user; drop broken actor=app auto-link
isadeks May 27, 2026
b2a19b3
feat(linear): inline self-link picker in setup/add-workspace; invite-…
isadeks May 27, 2026
4a7287b
Merge remote-tracking branch 'origin/feat/linear-add-workspace' into …
isadeks May 27, 2026
1cc9e99
Merge branch 'main' into feat/linear-add-workspace
isadeks May 27, 2026
9eba3e5
fix(linear): update linear-link tests for case-sensitive codes
isadeks May 27, 2026
1c1b618
feat(github): bgagent github webhook-info + set-webhook-secret
isadeks May 27, 2026
075453f
docs/code(screenshots): de-Vercel-ize the screenshot pipeline
isadeks May 27, 2026
32fd0b3
docs(screenshots): drop redundant Step 3 + condescending hardening pr…
isadeks May 27, 2026
6dd5aba
docs(screenshots): drop 'followup' framing — describe gaps as current…
isadeks May 27, 2026
4391a66
docs(screenshots): de-Linear-ize — Linear is opt-in, not required
isadeks May 27, 2026
672bfa6
feat(linear): teach agent to fetch attachments + docs via Linear MCP
isadeks May 27, 2026
368ea25
fix: sort imports in linear-webhook-multi-workspace test
isadeks May 27, 2026
7b88c74
Merge remote-tracking branch 'upstream/main' into linear-vercel
isadeks May 27, 2026
d66cb49
fix(linear): align linear-link test expectations with case-sensitive …
isadeks May 27, 2026
85aae22
fix(linear): wire AttachmentsBucket into LinearIntegration
isadeks May 27, 2026
13442a3
fix(cli): replace template literal with single quotes (eslint mutation)
isadeks May 27, 2026
009d817
fix(linear): skip uploads.linear.app images in description pre-fetch
isadeks May 27, 2026
af4cd37
Merge branch 'main' into feat/linear-add-workspace
krokoko May 27, 2026
c0a9d77
fix(linear): teach agent to detect save_issue silent no-ops
isadeks May 27, 2026
128d138
fix(agent): bump Claude SDK stdio buffer 1 MB → 16 MB
isadeks May 28, 2026
a4a7e7b
feat(screenshot): hide URL behind 'preview link' label in comments
isadeks May 28, 2026
d1a2f68
Merge branch 'main' into feat/linear-add-workspace
krokoko May 28, 2026
4570b9a
fix(linear): close fail-open + revoked-bypass on webhook verify path
isadeks Jun 1, 2026
4da242f
fix(linear): drop stale link-user-self refs, distinct corrupt-secret …
isadeks Jun 1, 2026
28599dd
test(linear): cover dry_run preview branch + generateInviteCode format
isadeks Jun 1, 2026
4383500
Merge remote-tracking branch 'origin/feat/linear-add-workspace' into …
isadeks Jun 1, 2026
a0ddfa0
fix(slack): bump command processor memory to 512 MB
isadeks Jun 1, 2026
750f2ae
docs(screenshots): add USER_GUIDE / COST_MODEL / ROADMAP coverage
isadeks Jun 1, 2026
f18fa40
docs(linear): clarify teammate-onboarding handshake
isadeks Jun 2, 2026
2b57211
feat(screenshot): preview-deploy screenshot pipeline (no stack wiring…
isadeks May 20, 2026
ca5ab14
feat(screenshot): GitHubScreenshotIntegration construct + stack wiring
isadeks May 20, 2026
8138e86
fix(screenshot): suppress AwsSolutions-S2 on the public-read screensh…
isadeks May 20, 2026
235710e
fix(screenshot): private S3 bucket + CloudFront distribution
isadeks May 20, 2026
36e8d14
fix(waf): exempt /v1/github/webhook from CRS like /v1/linear/webhook
isadeks May 21, 2026
bb5e5d1
fix(screenshot): read environment_url from deployment_status, not dep…
isadeks May 21, 2026
8b7adf4
fix(agentcore-browser): use ws package for SigV4-signed WebSocket han…
isadeks May 21, 2026
043cb84
fix(agentcore-browser): SigV4-presign WSS URL instead of signing headers
isadeks May 21, 2026
a2466cb
fix(iam): grant bedrock-agentcore:* to the screenshot processor
isadeks May 21, 2026
7bd6412
feat(screenshot): also post screenshot comment to linked Linear issue
isadeks May 21, 2026
e7d3a19
fix(screenshot): retry PR lookup to handle deploy-before-PR race
isadeks May 21, 2026
b81eee6
fix(linear): silent label gate + default to 'abca' to stop unlabeled-…
May 21, 2026
bce3aa6
docs(screenshots): add the screenshot pipeline guide
isadeks May 21, 2026
62829a0
feat(github): bgagent github webhook-info + set-webhook-secret
isadeks May 27, 2026
734c124
docs/code(screenshots): de-Vercel-ize the screenshot pipeline
isadeks May 27, 2026
1ce013d
docs(screenshots): drop redundant Step 3 + condescending hardening pr…
isadeks May 27, 2026
99e2b06
docs(screenshots): drop 'followup' framing — describe gaps as current…
isadeks May 27, 2026
a444266
docs(screenshots): de-Linear-ize — Linear is opt-in, not required
isadeks May 27, 2026
6e57515
feat(screenshot): hide URL behind 'preview link' label in comments
isadeks May 28, 2026
7d994b8
docs(screenshots): add USER_GUIDE / COST_MODEL / ROADMAP coverage
isadeks Jun 1, 2026
f9824f4
docs(linear): clarify teammate-onboarding handshake
isadeks Jun 2, 2026
d4c3aa0
fix(github-cli): de-Vercel-ize webhook-info / set-webhook-secret strings
isadeks Jun 2, 2026
dac4e31
fix(github-cli): replace template literal with single quotes (eslint …
isadeks Jun 2, 2026
3ba880d
feat(notifications): platform-side Linear final-status comment with c…
isadeks Jun 2, 2026
0957f0e
Merge branch 'main' into feat/239-linear-fanout-dispatcher
krokoko Jun 2, 2026
8c8b7e3
Merge branch 'main' into feat/240-agentcore-screenshots
krokoko Jun 2, 2026
3280d2c
fix(linear-dispatcher): krokoko PR-243 review nits + test coverage
isadeks Jun 4, 2026
e791e62
fix(screenshot): krokoko PR-241 review — scope IAM + cosmetic Vercel …
isadeks Jun 4, 2026
b84ce1e
fix(linear): drop redundant PR url + agent step-3 comment after first…
isadeks Jun 5, 2026
adff287
Merge branch 'main' into feat/239-linear-fanout-dispatcher
isadeks Jun 5, 2026
37a2d8a
Merge upstream/main into linear-vercel
isadeks Jun 5, 2026
4be999f
Merge branch 'main' into feat/240-agentcore-screenshots
isadeks Jun 5, 2026
059450e
feat(linear): prefix-route multi-workspace issue lookup by team key
isadeks Jun 5, 2026
5d64b0d
Merge branch 'main' into feat/96-linear-prefix-routing
isadeks Jun 5, 2026
984f4fc
Merge branch 'main' into feat/240-agentcore-screenshots
isadeks Jun 8, 2026
4480fa6
Merge branch 'main' into feat/239-linear-fanout-dispatcher
isadeks Jun 8, 2026
be7b527
fix(screenshot): krokoko PR-241 review — WS leak + commit-pulls guard
isadeks Jun 8, 2026
873ecea
docs(screenshot): krokoko PR-241 review — reconcile WAF rationale
isadeks Jun 8, 2026
8a6fc86
fix(linear): revert DEFAULT_LABEL_FILTER to 'bgagent'; scope PR-241 t…
isadeks Jun 8, 2026
d8d9479
fix(screenshot): krokoko PR-243 review — scope IAM + cosmetic Vercel …
isadeks Jun 8, 2026
98f4b51
test(linear): cover queryLinearTeamKeys to clear coverage gate
isadeks Jun 8, 2026
e092a63
chore(cli): apply eslint formatting to queryLinearTeamKeys tests
isadeks Jun 8, 2026
87c2550
feat(screenshot): skip screenshot when preview URL returns non-2xx
isadeks Jun 8, 2026
a445ba7
Merge remote-tracking branch 'upstream/main' into feat/239-linear-fan…
isadeks Jun 8, 2026
c53ac76
Merge remote-tracking branch 'upstream/main' into feat/287-screenshot…
isadeks Jun 8, 2026
9c35160
Merge remote-tracking branch 'upstream/main' into feat/240-agentcore-…
isadeks Jun 8, 2026
36fe8e5
Merge remote-tracking branch 'upstream/main' into feat/96-linear-pref…
isadeks Jun 8, 2026
242ff55
test(screenshot): cover the screenshot pipeline
isadeks Jun 5, 2026
ec332ad
ci: retrigger build after upstream rebase
isadeks Jun 8, 2026
9b4e5ac
fix(test): reorder FakeWebSocket statics before instance fields
isadeks Jun 8, 2026
08233d1
chore(test): apply eslint formatting to screenshot-pipeline tests
isadeks Jun 8, 2026
59c5898
feat(linear): add OrchestrationTable + TaskRecord DAG fields (#247)
isadeks Jun 9, 2026
6b3c85a
feat(linear): add pure DAG core for orchestration (#247)
isadeks Jun 9, 2026
6c421f3
feat(linear): add sub-issue graph discovery + persistence (#247)
isadeks Jun 9, 2026
5a28aaf
feat(linear): wire orchestration discovery into webhook processor (#247)
isadeks Jun 9, 2026
a0c79bd
feat(linear): add pure reconcile gating logic (#247)
isadeks Jun 9, 2026
6070261
feat(linear): add child-task release helper (#247)
isadeks Jun 9, 2026
313d846
feat(linear): orchestration reconciler + root release (#247)
isadeks Jun 9, 2026
02c4952
feat(linear): wire orchestration stack — deploy gate (#247)
isadeks Jun 9, 2026
3ba51f9
Merge remote-tracking branch 'origin/feat/239-linear-fanout-dispatche…
isadeks Jun 9, 2026
da422a8
Merge remote-tracking branch 'origin/feat/240-agentcore-screenshots' …
isadeks Jun 9, 2026
72fa67e
Merge remote-tracking branch 'origin/feat/287-screenshot-network-stat…
isadeks Jun 9, 2026
e18f802
Merge remote-tracking branch 'upstream/feat/97-screenshot-tests' into…
isadeks Jun 9, 2026
e4cc586
Merge branch 'feat/247-reconciler' into deploy/247-dev
isadeks Jun 9, 2026
f98f47a
fix(linear): orchestration idempotency key rejected by validator (#247)
isadeks Jun 9, 2026
7bd30b8
chore(linear): orchestration debug helper for #247
isadeks Jun 9, 2026
de69893
Merge branch 'feat/247-reconciler' into deploy/247-dev
isadeks Jun 9, 2026
f015aed
fix(linear): reconciler OOM + reads orchestration_id from nested meta…
isadeks Jun 9, 2026
41475fe
Merge branch 'feat/247-reconciler' into deploy/247-dev
isadeks Jun 9, 2026
29af1b6
test(linear): orchestration integration test vs real createTaskCore (…
isadeks Jun 10, 2026
7bf26c6
chore(cdk): cap jest workers + add focused test task (fix OOM)
isadeks Jun 10, 2026
d2d82f7
fix(linear): reconciler re-reads before release; document concurrency…
isadeks Jun 10, 2026
4600f12
feat(linear): stranded-orchestration backstop (#303)
isadeks Jun 10, 2026
8d36a29
feat(linear): base-branch selection logic for stacked children (#247 A4)
Jun 10, 2026
b1c18ca
feat(linear): stacked base-branch targeting for child PRs (#247 A4)
Jun 10, 2026
61c695b
Merge branch 'feat/247-reconciler' into deploy/247-dev
Jun 10, 2026
1cd1050
feat(linear): parent rollup comment + stable log events + docs (#247 A5)
Jun 10, 2026
0182ef9
feat(linear): parent rollup comment + stable log events + docs (#247 A5)
Jun 10, 2026
5302279
Merge branch 'feat/247-reconciler' into deploy/247-dev
Jun 10, 2026
e50afbf
chore(cdk): untrack .jest-cache (build artifact, already gitignored)
Jun 10, 2026
3a7225a
Merge branch 'feat/247-reconciler' into deploy/247-dev
Jun 10, 2026
b35fb7f
fix(linear): thread base_branch/merge_branches through server invocat…
Jun 10, 2026
b712c98
Merge branch 'feat/247-reconciler' into deploy/247-dev
Jun 10, 2026
ea409a6
fix(linear): post the parent rollup comment exactly once (#247 A5)
Jun 10, 2026
93f6f33
fix(linear): post the parent rollup comment exactly once (#247 A5)
Jun 10, 2026
46f969a
Merge branch 'feat/247-reconciler' into deploy/247-dev
Jun 10, 2026
abbaefc
fix(screenshot): route preview screenshot to the PR's own Linear issu…
Jun 10, 2026
5732845
Merge remote-tracking branch 'upstream/main' into deploy/247-dev
Jun 10, 2026
63bbe82
test(#247): fix pre-existing orchestration test debt surfaced by full…
Jun 10, 2026
f4042ce
fix(agent): repo.py used removed PR_TASK_TYPES after upstream merge
Jun 10, 2026
5fff24a
fix(agent): enforce provisioned-branch discipline in prompt
Jun 11, 2026
603a554
Revert "fix(agent): enforce provisioned-branch discipline in prompt"
Jun 11, 2026
0805674
fix(workflows): repo-bound task w/o workflow_ref → coding/new-task-v1…
Jun 11, 2026
5c5ecd4
fix(agent): use platform branch_name verbatim — fixes #247 A4 stackin…
Jun 11, 2026
ec6c189
feat(linear): transition + react on the parent epic through orchestra…
Jun 11, 2026
5ace712
feat(orchestration): make the #247 executor trigger-agnostic (#11)
Jun 11, 2026
dd320f1
feat(linear): live status block on the parent epic (#247 #3)
Jun 11, 2026
3dfb646
fix(linear): parent epic shows only ONE reaction at a time (#247 #3)
Jun 11, 2026
618b50f
fix(linear): serialize parent feedback calls to avoid self-throttling…
Jun 11, 2026
bba68bd
docs(adr-001): clarify bottom-up merge + add #247 agent-orchestrated …
Jun 11, 2026
4afbc45
docs(security): document guardrail PROMPT_ATTACK scope + MEDIUM ratio…
Jun 11, 2026
37dd861
docs(research): design for orchestration branch maintenance (#305/A6 …
Jun 11, 2026
ab26600
feat(orchestration): auto-integration node for fan-out leaves (#247 #16)
Jun 11, 2026
c47c36a
feat(orchestration): ChildBranchIndex GSI + branch lookup (A6 step 1,…
Jun 12, 2026
6bb5446
feat(orchestration): A6 re-stack action + planner (#305 steps 3-4)
Jun 12, 2026
424503a
feat(orchestration): A6 re-stack detection + processor handler (#305 …
Jun 12, 2026
7487ed2
feat(orchestration): wire A6 restack processor + arm the webhook (#30…
Jun 12, 2026
b529367
fix(orchestration): A6 resolve dependent PR# from pr_url fallback (#305)
Jun 12, 2026
cdc5387
fix(agent): accept coding/restack-v1 as a PR workflow in param valida…
Jun 12, 2026
9a9ef87
feat(orchestration): link child + integration PRs on the parent rollu…
Jun 12, 2026
0823d0a
feat(orchestration): throttle child release to the concurrency budget…
Jun 12, 2026
653de3a
chore(scripts): add linear_epic.py orchestration stress-test harness
Jun 12, 2026
0cf09ab
feat(orchestration): planDirectRestack — one-hop cascade core for A6 …
Jun 12, 2026
f439230
feat(orchestration): reconciler-driven A6 cascade on iteration/restac…
Jun 12, 2026
db6c270
feat(orchestration): Linear comment trigger for A6 re-iteration (#247)
Jun 12, 2026
9a1e0d9
refactor(orchestration): retire the GitHub pull_request restack path …
Jun 12, 2026
6cdafce
docs(linear): subscribe Comments on the webhook + trim GitHub-usernam…
Jun 12, 2026
07b9f1c
feat(blueprint+agent): configurable per-repo build/lint verification …
Jun 15, 2026
a84cdb8
feat(agent): warn on the PR when build-regression gating is inert (#1)
Jun 15, 2026
23f4dfd
docs(developer-guide): document configurable build command + build-ga…
Jun 15, 2026
3173ced
feat(orchestration): surface A6 cascade on Linear (dependent sub-issu…
Jun 15, 2026
fd46c93
feat(orchestration): extendOrchestration — add sub-issues to a runnin…
Jun 15, 2026
d5abeba
feat(orchestration): route re-trigger of an existing epic to extend +…
Jun 15, 2026
33585b1
feat(orchestration): renderEpicPanel — the single maturing panel rend…
Jun 16, 2026
e58d0bd
feat(orchestration): upsertEpicPanel + buildPanelRows — shared panel …
Jun 16, 2026
3b98f3c
feat(orchestration): wire the single maturing panel + retire standalo…
Jun 16, 2026
4595ff7
feat(orchestration): reactToComment + replyToComment helpers (#247 UX.3)
Jun 16, 2026
9e6f563
feat(orchestration): wire @bgagent comment ack — 👀 on receipt, thread…
Jun 16, 2026
b8f8412
feat(orchestration): generalize @bgagent comment trigger to standalon…
Jun 16, 2026
e95eabd
feat(orchestration): stack new sub-issues on the epic tip, not bare m…
Jun 16, 2026
7e357af
feat(orchestration): failure is a conversation — sanitized reason vs …
Jun 16, 2026
69ecefa
fix(orchestration): threaded reply needs issueId, not just parentId (…
Jun 16, 2026
75569f4
fix(orchestration): build-fail reply keyed on the real gating signal,…
Jun 16, 2026
47d1a8a
fix(orchestration): friendly node name in the cascade reason (#247 UX…
Jun 16, 2026
b8371ba
fix(orchestration): cascade of a no-dependents node must still refres…
Jun 16, 2026
d4c351d
fix(orchestration): clear rollup claim on cascade re-open so parent s…
Jun 16, 2026
2994a4b
fix(orchestration): @bgagent thread-reply ack must reply to the threa…
Jun 17, 2026
8cba65c
merge: upstream/main into deploy/247-dev (Jira #288 + LinearPostResul…
Jun 17, 2026
b48af71
feat(orchestration): embed the integration node's combined preview in…
Jun 17, 2026
f0e2070
fix(agent): pin AgentCore log-delivery resources to deployed identity…
Jun 17, 2026
060dcde
fix(agent): also pin the 2 AgentCore Delivery links (#247 #58 deploy-…
Jun 17, 2026
fd24e77
fix(orchestration): integration node no longer floods the parent epic…
Jun 17, 2026
f55bc79
feat(orchestration): route @bgagent comments left on the parent epic …
Jun 17, 2026
69a3466
fix(orchestration): thread the trigger comment's issue id so a parent…
Jun 17, 2026
f2a668b
fix(orchestration): idempotency-claim parent-epic comment handling — …
Jun 17, 2026
ea28521
fix(orchestration): bot must not trigger on its OWN comments — kill t…
Jun 17, 2026
86ccb8f
feat(orchestration): platform settles the comment + sub-issue on iter…
Jun 17, 2026
4d27abc
refactor(agent): make the #58 log-delivery pins an OPT-IN, stack-gate…
Jun 17, 2026
df3c972
Merge branch 'main' into deploy/247-dev
isadeks Jun 17, 2026
a654711
chore(security): allowlist orchestration idempotencyKey test fixtures…
Jun 17, 2026
ec6c457
style(agent): fix ruff lint + format to unblock CI build (#247 PR #373)
Jun 17, 2026
2f3abcf
fix(security): don't read the OAuth secret value in the orchestration…
Jun 17, 2026
aa7dc52
docs(security): mark the orchestration_debug CodeQL alert as a docume…
Jun 17, 2026
00ce455
style(cdk): resolve eslint debt blocking the PR #373 build (#247)
Jun 17, 2026
7341133
test(cdk): make the _KNOWN_WRITEABLE_WORKFLOW_IDS parser tolerant of …
Jun 17, 2026
2625109
docs(adr): ADR-017 — Linear agent-session as a future (flag-gated, po…
Jun 17, 2026
6c04571
docs(adr): ADR-017 — record the Agents-API Preview spike findings (UX…
Jun 17, 2026
e937856
docs(adr): ADR-017 — agent-session spike re-run resolves the 10s-vs-l…
Jun 17, 2026
9a15cba
docs(adr): ADR-017 — record that the agent-session toggle is not a no-op
Jun 17, 2026
609a8b8
feat(linear): teach agent to fetch attachments + docs via Linear MCP
isadeks May 27, 2026
dfc2183
fix(linear): wire AttachmentsBucket into LinearIntegration
isadeks May 27, 2026
854ac25
fix(linear): skip uploads.linear.app images in description pre-fetch
isadeks May 27, 2026
8001d87
fix(linear): teach agent to detect save_issue silent no-ops
isadeks May 27, 2026
66a348c
style(cdk): extract MAX_HINTED_ATTACHMENT_TITLES const in linear-issu…
Jun 18, 2026
300e5e4
merge: bring #247 orchestration + Linear-MCP attachments onto linear-…
Jun 18, 2026
952d865
merge: bring linear-vercel current with aws-samples/main (66f78bc)
Jun 18, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
11 changes: 11 additions & 0 deletions .gitleaks.toml
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,17 @@ stopwords = ["wat-opaque-123"]
description = "Test fixture signing secret in Slack verification unit test (not a real credential)."
stopwords = ["test-signing-secret-abc123"]

[[allowlists]]
# #247: the orchestration idempotencyKey fixtures (`orch_<id>_<subissue>`) are
# made-up test values, but generic-api-key flags the key-ish assignment. Scope
# the exemption to the orchestration test files (no real credentials there).
description = "Orchestration idempotencyKey test fixtures (not real credentials)."
targetRules = ["generic-api-key"]
paths = [
"^cdk/test/handlers/shared/orchestration-release\\.test\\.ts$",
"^cdk/test/handlers/orchestration-reconciler\\.test\\.ts$",
]

# Catch bare 12-digit AWS account IDs. The default ruleset does not flag these,
# which is how a real account ID reached a committed comment in the #236 integ
# work. RE2 (Go) has no lookarounds, so the non-digit neighbours are captured in
Expand Down
22 changes: 19 additions & 3 deletions agent/src/config.py
Original file line number Diff line number Diff line change
Expand Up @@ -17,14 +17,22 @@
# id whose ``requires_repo`` is false. Used by the load-failure fallback to
# decide repo-optionality without loading the file.
REPO_LESS_DEFAULT_WORKFLOW_ID = "default/agent-v1"
# First-party workflow ids that operate on an existing pull request.
PR_WORKFLOW_IDS = frozenset(("coding/pr-iteration-v1", "coding/pr-review-v1"))
# First-party workflow ids that operate on an existing pull request — they
# check out the existing PR branch instead of creating a fresh one. restack-v1
# (#305 A6) re-merges a changed predecessor into an existing stacked-child PR.
PR_WORKFLOW_IDS = frozenset(("coding/pr-iteration-v1", "coding/pr-review-v1", "coding/restack-v1"))
# First-party workflow ids that are writeable (NOT read-only). Used only by the
# load-failure fallback to bias an unrecognised id toward read-only (fail closed
# on the write-deny invariant). pr-review-v1 is intentionally excluded (it is
# read-only); default/agent-v1 is excluded because its conservative posture
# should fail closed too.
_KNOWN_WRITEABLE_WORKFLOW_IDS = frozenset(("coding/new-task-v1", "coding/pr-iteration-v1"))
_KNOWN_WRITEABLE_WORKFLOW_IDS = frozenset(
(
"coding/new-task-v1",
"coding/pr-iteration-v1",
"coding/restack-v1",
)
)


def resolve_github_token() -> str:
Expand Down Expand Up @@ -459,9 +467,13 @@ def build_config(
dry_run: bool = False,
task_id: str = "",
system_prompt_overrides: str = "",
build_command: str = "",
lint_command: str = "",
resolved_workflow: dict | None = None,
branch_name: str = "",
pr_number: str = "",
base_branch: str | None = None,
merge_branches: list[str] | None = None,
channel_source: str = "",
channel_metadata: dict[str, str] | None = None,
trace: bool = False,
Expand Down Expand Up @@ -565,6 +577,8 @@ def build_config(
max_turns=max_turns,
max_budget_usd=max_budget_usd,
system_prompt_overrides=system_prompt_overrides,
build_command=build_command,
lint_command=lint_command,
resolved_workflow=workflow,
policy_principal=policy_principal,
read_only=workflow_read_only,
Expand All @@ -573,6 +587,8 @@ def build_config(
is_pr_workflow=is_pr_workflow,
branch_name=branch_name,
pr_number=pr_number,
base_branch=base_branch,
merge_branches=merge_branches or [],
task_id=task_id or uuid.uuid4().hex[:12],
channel_source=channel_source,
channel_metadata=channel_metadata or {},
Expand Down
19 changes: 19 additions & 0 deletions agent/src/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -158,6 +158,13 @@ class TaskConfig(BaseModel):
max_turns: int = 10
max_budget_usd: float | None = None
system_prompt_overrides: str = ""
# Per-repo build/lint verification commands (#1 build-gate fix). When set
# (from the blueprint, via the payload), the agent runs these instead of
# the hardcoded ``mise run build`` / ``mise run lint`` to gate build/lint
# regressions. Empty → default to mise. Set for non-mise repos (e.g.
# ``npm run build``) so gating actually runs the repo's real command.
build_command: str = ""
lint_command: str = ""
# The pinned workflow this task runs ({"id", "version"}), resolved at the
# create-task boundary and threaded through the payload (#248). None on
# local/batch runs, where the pipeline defaults to coding/new-task-v1.
Expand Down Expand Up @@ -237,6 +244,11 @@ class TaskConfig(BaseModel):
approval_gate_cap: int | None = None
issue: GitHubIssue | None = None
base_branch: str | None = None
# #247 A4: predecessor branches to merge into this child's branch
# before work, for a diamond child (2+ predecessors) that branches off
# main but must see all predecessors' code. Empty for root + linear
# children (linear children stack via ``base_branch`` instead).
merge_branches: list[str] = Field(default_factory=list)
# Attachments from the orchestrator payload (Phase 3). Validated as
# AttachmentConfig models. Empty list for tasks without attachments.
attachments: list[AttachmentConfig] = Field(default_factory=list)
Expand Down Expand Up @@ -294,6 +306,13 @@ class RepoSetup(BaseModel):
build_before: bool = True
lint_before: bool = True
default_branch: str = "main"
# #1: True when the build verification command is INERT — it could not run
# at all (no build task / command not found) AND no explicit build_command
# was configured. In that state build-regression gating is effectively OFF
# (a change that breaks the build still reports success), so the agent
# surfaces a one-time warning on the PR. Distinct from a genuinely red build
# (command ran, exited non-zero), which IS meaningful gating signal.
build_gate_inert: bool = False


class TokenUsage(BaseModel):
Expand Down
12 changes: 10 additions & 2 deletions agent/src/pipeline.py
Original file line number Diff line number Diff line change
Expand Up @@ -574,11 +574,15 @@ def run_task(
task_id: str = "",
hydrated_context: dict | None = None,
system_prompt_overrides: str = "",
build_command: str = "",
lint_command: str = "",
prompt_version: str = "",
memory_id: str = "",
resolved_workflow: dict | None = None,
branch_name: str = "",
pr_number: str = "",
base_branch: str | None = None,
merge_branches: list[str] | None = None,
cedar_policies: list[str] | None = None,
approval_timeout_s: int | None = None,
initial_approvals: list[str] | None = None,
Expand Down Expand Up @@ -616,9 +620,13 @@ def run_task(
aws_region=aws_region,
task_id=task_id,
system_prompt_overrides=system_prompt_overrides,
build_command=build_command,
lint_command=lint_command,
resolved_workflow=resolved_workflow,
branch_name=branch_name,
pr_number=pr_number,
base_branch=base_branch,
merge_branches=merge_branches,
channel_source=channel_source,
channel_metadata=channel_metadata,
trace=trace,
Expand Down Expand Up @@ -1012,8 +1020,8 @@ def _on_trace_truncated(max_bytes: int, first_dropped: int) -> None:
safety_committed = False if workflow_read_only else ensure_committed(setup.repo_dir)
post_span.set_attribute("safety_net.committed", safety_committed)

build_passed = verify_build(setup.repo_dir)
lint_passed = verify_lint(setup.repo_dir)
build_passed = verify_build(setup.repo_dir, config.build_command)
lint_passed = verify_lint(setup.repo_dir, config.lint_command)
pr_url = ensure_pr(
config,
setup,
Expand Down
92 changes: 80 additions & 12 deletions agent/src/post_hooks.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
from __future__ import annotations

import re
import shlex
import subprocess
from typing import TYPE_CHECKING

Expand All @@ -11,14 +12,64 @@
if TYPE_CHECKING:
from models import AgentResult, RepoSetup, TaskConfig

# Default verification commands (#1 build-gate fix). A repo that uses mise gets
# these for free; a non-mise repo sets ``pipeline.buildCommand`` /
# ``lintCommand`` in its blueprint (threaded to the agent as build_command /
# lint_command) so gating runs the repo's real command.
DEFAULT_BUILD_COMMAND = "mise run build"
DEFAULT_LINT_COMMAND = "mise run lint"

def verify_build(repo_dir: str) -> bool:
"""Run mise run build after agent completion to verify the build."""
log("POST", "Running post-agent build verification (mise run build)...")
# POSIX shell exit code for "command not found" — an inert build signal (the
# configured verify command isn't installed), not a genuine build failure.
SHELL_COMMAND_NOT_FOUND = 127


def is_verify_command_inert(returncode: int, stderr: str) -> bool:
"""True when a verify command did not actually RUN (vs ran-and-failed).

Distinguishes the #1 inert-gate state — the build/lint command isn't
runnable in this repo, so gating is effectively OFF — from a genuine red
build (command executed, exited non-zero), which IS meaningful signal.

Heuristics (conservative — only the unambiguous "couldn't run" signals):
- exit 127: shell "command not found" (e.g. ``gradle`` not installed).
- mise "no tasks defined" / "no task named" / "not found": the configured
(or default ``mise run build``) task does not exist in the repo.
A repo that genuinely fails its build returns some other non-zero code with
real compiler/test output, which this does NOT flag.
"""
if returncode == SHELL_COMMAND_NOT_FOUND:
return True
s = (stderr or "").lower()
return (
"no tasks defined" in s
or "no task named" in s
or ("mise" in s and "not found" in s)
or "command not found" in s
)


def resolve_verify_argv(command: str | None, default: str) -> list[str]:
"""Split a configured verify command into argv, falling back to the default.

Empty/whitespace/None ``command`` → the default (mise). Parsed with ``shlex`` so
a configured ``'npm run build && npm test'`` would need a shell — we keep it
simple argv here; chained shell commands should be wrapped in a mise/npm
task by the repo. A single command with args (``npm run build``) splits
cleanly.
"""
cmd = (command or "").strip() or default
return shlex.split(cmd)


def verify_build(repo_dir: str, command: str = "") -> bool:
"""Run the configured build command (default ``mise run build``) to verify the build."""
argv = resolve_verify_argv(command, DEFAULT_BUILD_COMMAND)
log("POST", f"Running post-agent build verification ({' '.join(argv)})...")
try:
result = run_cmd(
["mise", "run", "build"],
label="mise-run-build-post",
argv,
label="verify-build-post",
cwd=repo_dir,
check=False,
)
Expand All @@ -32,13 +83,14 @@ def verify_build(repo_dir: str) -> bool:
return True


def verify_lint(repo_dir: str) -> bool:
"""Run mise run lint after agent completion to verify lint passes."""
log("POST", "Running post-agent lint verification (mise run lint)...")
def verify_lint(repo_dir: str, command: str = "") -> bool:
"""Run the configured lint command (default ``mise run lint``) to verify lint passes."""
argv = resolve_verify_argv(command, DEFAULT_LINT_COMMAND)
log("POST", f"Running post-agent lint verification ({' '.join(argv)})...")
try:
result = run_cmd(
["mise", "run", "lint"],
label="mise-run-lint-post",
argv,
label="verify-lint-post",
cwd=repo_dir,
check=False,
)
Expand Down Expand Up @@ -343,19 +395,35 @@ def ensure_pr(

build_status = "PASS" if build_passed else "FAIL"
lint_status = "PASS" if lint_passed else "FAIL"
# #1: show the actual commands run (default mise), not a hardcoded label.
build_label = (config.build_command or DEFAULT_BUILD_COMMAND).strip()
lint_label = (config.lint_command or DEFAULT_LINT_COMMAND).strip()

cost_line = ""
if agent_result and agent_result.cost_usd is not None:
cost_line = f"- Agent cost: **${agent_result.cost_usd:.4f}**\n"

# #1: when build-regression gating is inert (no runnable build command, none
# configured), say so plainly — otherwise a green "build: PASS" misleads:
# nothing was actually verified.
gate_warning = ""
if getattr(setup, "build_gate_inert", False):
gate_warning = (
"> ⚠️ **Build-regression gating is OFF for this repo.** No runnable "
f"`{DEFAULT_BUILD_COMMAND}` task was found and no build command is configured, "
"so a change that breaks the build still reports success. To enable gating, set "
"`pipeline.buildCommand` in this repo's ABCA blueprint (e.g. `npm run build`).\n\n"
)

pr_body = (
f"## Summary\n\n"
f"{task_source}"
f"### Commits\n\n"
f"```\n{commits}\n```\n\n"
f"## Verification\n\n"
f"- `mise run build` (post-agent): **{build_status}**\n"
f"- `mise run lint` (post-agent): **{lint_status}**\n"
f"{gate_warning}"
f"- `{build_label}` (post-agent): **{build_status}**\n"
f"- `{lint_label}` (post-agent): **{lint_status}**\n"
f"{cost_line}\n"
f"---\n\n"
f"By submitting this pull request, I confirm that you can use, modify, copy, "
Expand Down
Loading
Loading