Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
352 commits
Select commit Hold shift + click to select a range
8e9838c
fix(cognitoidp): give terms the wire model AWS actually defines
Aug 8, 2026
7e96564
feat(cli): wire eight more services into cross-service tag queries
Aug 8, 2026
f010f33
chore(beads): sync issue state
Aug 8, 2026
6885988
feat(medialive): model the caption destination settings union
Aug 8, 2026
b5ae04e
fix(cli): register opsworks, which has been unreachable since June
Aug 8, 2026
16830ad
chore(beads): sync issue state
Aug 8, 2026
7bfc648
fix(opsworks): correct two shapes found by auditing it as a live service
Aug 8, 2026
0e046d3
feat(cli): wire twenty-one more services into cross-service tag queries
Aug 8, 2026
a5e0b6e
chore(beads): sync issue state
Aug 8, 2026
aec9446
feat(medialive): model the video codec settings union
Aug 8, 2026
5b11aee
fix(sesv2): route creation-time tags into the store that serves tag r…
Aug 8, 2026
8af81be
chore(beads): sync issue state
Aug 8, 2026
5067ad0
fix(elasticache): decode Tags on the six creates that were dropping them
Aug 8, 2026
9a0df68
fix(redshift): make the serverless surface reachable by real clients
Aug 8, 2026
d8b791b
chore(beads): sync issue state
Aug 8, 2026
e82e50c
chore(beads): sync issue state
Aug 8, 2026
d84e332
fix(sesv2): decode creation-time tags on four more creates
Aug 8, 2026
3ea649b
fix(tagging): decode creation-time tags in docdb, neptune, forecast a…
Aug 8, 2026
0893425
chore(beads): sync issue state
Aug 8, 2026
4c1e0c9
chore(beads): sync issue state
Aug 8, 2026
422e5be
fix(tagging): apply creation-time tags across six more services
Aug 9, 2026
f18dc29
fix(xml): correct twelve list wrappers no real client could parse
Aug 9, 2026
f797542
chore(beads): sync issue state
Aug 9, 2026
1aae104
docs: regenerate from the PARITY.md changes made today
Aug 9, 2026
41177fa
feat(ui): expose detective and accessanalyzer ops beyond the CRUD floor
Aug 9, 2026
7368add
feat(ui): give appconfigdata an SDK client and quicksight its remaini…
Aug 9, 2026
8b87170
chore(beads): sync issue state
Aug 9, 2026
217c651
feat(dlm): accept the default-policy fields and edit PolicyDetails pr…
Aug 9, 2026
246a4fb
chore(beads): sync issue state
Aug 9, 2026
05aa39f
chore(beads): sync issue state
Aug 9, 2026
3cf30cd
fix(xml): correct six wire shapes that silently dropped or hid client…
Aug 9, 2026
55d77d5
fix(tagging): make iot's tag endpoints reachable, and fix four more s…
Aug 9, 2026
5d65985
chore(beads): sync issue state
Aug 9, 2026
3b96e45
chore(beads): sync issue state
Aug 9, 2026
6cec4c7
docs: regenerate dlm README after the default-policy fields landed
Aug 9, 2026
837a583
fix(rds): correct six list wrappers and two request-side parameter names
Aug 9, 2026
6c4a1d3
chore(beads): sync issue state
Aug 9, 2026
9ff853f
fix(tagging): reach the tag path in five more services, and fix acm's…
Aug 9, 2026
3231a21
fix(tagging): decode and expose creation-time tags in four more services
Aug 9, 2026
2b4f6c4
chore(beads): sync issue state
Aug 9, 2026
2676578
fix(routing): stop appsync claiming every service's tag path
Aug 9, 2026
5f4af24
chore(beads): sync issue state
Aug 9, 2026
d1b3dda
fix(ec2,lambda): render tags on describe, and mirror lambda's into th…
Aug 9, 2026
c5907df
fix(routing): stop three services claiming paths that belong to others
Aug 9, 2026
55da508
chore(beads): sync issue state
Aug 9, 2026
26cfbad
fix(routing): scope appconfig and securityhub's path claims
Aug 9, 2026
7c6a4f2
fix(tagging): correct codebuild's tag wire type and three cloudfront …
Aug 9, 2026
691df5b
chore(beads): sync issue state
Aug 9, 2026
0c08745
fix(sagemaker): make the tag registry a table, and register five more…
Aug 9, 2026
044172d
chore(beads): sync issue state
Aug 9, 2026
3d0aa4b
fix(tagging): route mediatailor and resiliencehub tags to the read path
Aug 9, 2026
145eac7
chore(beads): sync issue state
Aug 9, 2026
acd4ac4
fix(sagemaker): register the remaining tag kinds, and fix thirty deco…
Aug 9, 2026
f2d178c
chore(beads): sync issue state
Aug 9, 2026
a14d399
fix(cloudformation,cloudwatch,workspaces,timestreamquery): store crea…
Aug 9, 2026
8e9a7de
chore(beads): sync issue state
Aug 9, 2026
287148a
test(grafana,lightsail,directoryservice,emrserverless,resourcegroups,…
Aug 9, 2026
198b28e
chore(beads): sync issue state
Aug 9, 2026
cca6db6
fix(cloudwatch): remodel the alarm mute rule family to its real wire …
Aug 9, 2026
f4f0d6d
chore(beads): sync issue state
Aug 9, 2026
fb81fc0
fix(resourcegroupstaggingapi): wire the tag policy provider, and matc…
Aug 9, 2026
34344ba
chore(beads): sync issue state
Aug 9, 2026
f12e24d
fix(lambda,eks,awsconfig,accessanalyzer): store and return creation tags
Aug 9, 2026
3c2298b
chore(beads): sync issue state
Aug 9, 2026
f6d83f1
fix(iot,omics): stop decode helpers reporting success after writing a…
Aug 9, 2026
c77829e
chore(beads): sync issue state
Aug 9, 2026
6e446a9
fix(s3,securityhub,sesv2,managedblockchain): close the creation-tag s…
Aug 9, 2026
181bb1e
fix(sagemaker): key the hyperpod scheduling resources by id, not name
Aug 9, 2026
7df628a
chore(beads): sync issue state
Aug 9, 2026
7f1350a
feat(s3,s3control): surface tags through cross-service resource disco…
Aug 9, 2026
5e5316a
chore(beads): sync issue state
Aug 9, 2026
9f452c0
fix(sagemaker): store the hyperpod scheduling bodies, and report real…
Aug 9, 2026
5fbc0b7
feat(appsync,emrserverless): surface tags through cross-service disco…
Aug 9, 2026
e006804
chore(beads): sync issue state
Aug 9, 2026
d5661b6
fix(cloudfront): update anycast lists by address type, and name the i…
Aug 9, 2026
38a94b2
chore(beads): sync issue state
Aug 9, 2026
3f870a2
feat(ssoadmin,acm): surface tags through cross-service discovery
Aug 9, 2026
3d84262
chore(beads): sync issue state
Aug 9, 2026
712942d
fix(cloudfront): complete the anycast IP list shape
Aug 9, 2026
0659d0c
chore(beads): sync issue state
Aug 9, 2026
958d9df
feat(apigateway,organizations): finish cross-service tag discovery wi…
Aug 9, 2026
e804cac
chore(beads): sync issue state
Aug 9, 2026
5258758
chore(beads): sync issue state
Aug 9, 2026
35bbd5f
fix(apigateway): model the domain name and usage plan fields PATCH ca…
Aug 9, 2026
a690d8b
chore(beads): sync issue state
Aug 9, 2026
04ec06c
fix(bedrock): materialize customization job output, and honour the ba…
Aug 9, 2026
b547965
chore(beads): sync issue state
Aug 9, 2026
50e8c80
fix(bedrock): drop the account id from provisioned throughput's model…
Aug 9, 2026
c2bf721
chore(beads): sync issue state
Aug 9, 2026
e034ad9
feat(cloudwatch): suppress alarm actions while a mute rule is active
Aug 9, 2026
c5ee0a8
chore(beads): sync issue state
Aug 9, 2026
3a949b6
refactor(pkgs): share the AWS cron field matching across its three co…
Aug 9, 2026
b010197
chore(beads): sync issue state
Aug 9, 2026
13bc319
fix(bedrock): use the real service segment in flow and prompt ARNs
Aug 9, 2026
857ab7c
chore(beads): sync issue state
Aug 9, 2026
1728a78
feat(sagemaker): model four cluster config types, and stop discarding…
Aug 9, 2026
54afcaf
chore(beads): sync issue state
Aug 9, 2026
f16063c
fix(bedrock): return flows, aliases and prompts in the shape clients …
Aug 9, 2026
d3f1f00
chore(beads): sync issue state
Aug 9, 2026
41214d9
fix(cloudformation): reject the account filter modes stack instances …
Aug 9, 2026
1b72b3c
feat(redshift): add serverless tagging and custom domain associations
Aug 9, 2026
c531f86
chore(beads): sync issue state
Aug 9, 2026
8e295c7
chore(beads): sync issue state
Aug 9, 2026
c534666
feat(iotwireless): give the remaining LoRaWAN and Sidewalk configs re…
Aug 9, 2026
f23bfab
chore(beads): sync issue state
Aug 9, 2026
ddaffc9
feat(autoscaling): model customized metric specifications and baselin…
Aug 9, 2026
69979a1
chore(beads): sync issue state
Aug 9, 2026
8de1e47
fix(stepfunctions): warn when a distributed map's result export is un…
Aug 10, 2026
611a6cd
chore(beads): sync issue state
Aug 10, 2026
dfc3811
fix(iotwireless): apply the FUOTA task fields update and start actual…
Aug 10, 2026
0967a4b
chore(beads): sync issue state
Aug 10, 2026
3d4e083
chore(beads): sync issue state
Aug 10, 2026
374c2e5
fix(iotwireless): route the three associate operations clients actual…
Aug 10, 2026
6b23dff
chore(beads): sync issue state
Aug 10, 2026
971eacf
fix(elasticbeanstalk): give environment resource lists a real member …
Aug 10, 2026
bf9f08b
chore(beads): sync issue state
Aug 10, 2026
2a9768f
chore(beads): sync issue state
Aug 10, 2026
94b4f51
fix(iotwireless): match the verb clients send on three update operations
Aug 10, 2026
e1f4321
chore(beads): sync issue state
Aug 10, 2026
583cb45
feat(glue): make workflow runs actually run, and report real statistics
Aug 10, 2026
3d56ce5
chore(beads): sync issue state
Aug 10, 2026
561f320
fix(test): stop the shared container being removed twice at teardown
Aug 10, 2026
b7afcbd
feat(stepfunctions): model the path-valued distributed map settings
Aug 10, 2026
fea5195
chore(beads): sync issue state
Aug 10, 2026
004f4f7
fix(build): stop the two build targets clobbering each other, and sta…
Aug 10, 2026
8e074f1
chore(beads): sync issue state
Aug 10, 2026
14228e9
fix(test): point the terraform suite at the renamed static binary
Aug 10, 2026
5e1de35
feat(stepfunctions): resolve task timeout and heartbeat paths, per at…
Aug 10, 2026
8268079
chore(beads): sync issue state
Aug 10, 2026
707f346
fix(opsworks): convert timestamps to UTC before formatting them
Aug 10, 2026
f6756d6
fix(stepfunctions): resolve reference paths before Parameters transfo…
Aug 10, 2026
d4433f2
chore(beads): sync issue state
Aug 10, 2026
46f6f65
fix(apigatewayv2): put the account id in routing rule ARNs
Aug 10, 2026
71500fa
chore(beads): sync issue state
Aug 10, 2026
43e4445
feat(redshift): add serverless resource policies and snapshot copy co…
Aug 10, 2026
d0fac34
chore(beads): sync issue state
Aug 10, 2026
ca35c33
feat(redshift): add serverless recovery points, table restores and th…
Aug 10, 2026
f2025c1
chore(beads): sync issue state
Aug 10, 2026
7c2db66
feat(swf): time out executions that exceed their start-to-close limit
Aug 10, 2026
5d16264
chore(beads): sync issue state
Aug 10, 2026
19a5214
fix(dms): reject engine settings rather than silently discarding them
Aug 10, 2026
196d506
chore(beads): sync issue state
Aug 10, 2026
16814c0
feat(redshift): add the last serverless families
Aug 10, 2026
8ca9da0
chore(beads): sync issue state
Aug 10, 2026
7d42489
feat(sagemaker): read pipeline definitions from S3
Aug 10, 2026
67d3bfb
chore(beads): sync issue state
Aug 10, 2026
2169a84
feat(cloudformation): provision Resilience Hub apps and policies from…
Aug 10, 2026
bc79427
chore(beads): sync issue state
Aug 10, 2026
cfae950
feat(ui): edit a resilience hub app's draft additional info
Aug 10, 2026
a31f2a9
feat(glue): validate schema compatibility modes and enforce the disab…
Aug 10, 2026
9b57a61
chore(beads): sync issue state
Aug 10, 2026
5aafed5
feat(glue): let CreateSchema carry its first definition
Aug 10, 2026
8a50fc5
chore(beads): sync issue state
Aug 10, 2026
84ff330
feat(dlm): echo the default-policy flag and enforce the region policy…
Aug 10, 2026
1155d64
chore(beads): sync issue state
Aug 10, 2026
42326ad
feat(elb): check security groups, subnets and certificates against th…
Aug 10, 2026
5d5e12d
chore(beads): sync issue state
Aug 10, 2026
939f3dd
feat(elasticsearch): model the security, tuning and deployment option…
Aug 10, 2026
95db4e4
chore(beads): sync issue state
Aug 10, 2026
add4e71
chore(beads): sync issue state
Aug 10, 2026
f35e204
feat(elasticache): link user groups to serverless caches, and enforce…
Aug 10, 2026
9571507
chore(beads): sync issue state
Aug 10, 2026
df38294
feat(glacier): write select results to the requested S3 location, and…
Aug 10, 2026
4486033
chore(beads): sync issue state
Aug 10, 2026
a6ba836
fix(emrserverless): add the missing job run state, and describe the r…
Aug 10, 2026
52e35a4
chore(beads): sync issue state
Aug 10, 2026
2842ea0
feat(iotanalytics): run the pipeline activities that were passing mes…
Aug 10, 2026
dcd641e
chore(beads): sync issue state
Aug 10, 2026
792ab19
fix(iotdataplane): carry the MQTT5 properties through to subscribers
Aug 10, 2026
e5d6506
chore(beads): sync issue state
Aug 10, 2026
1291636
feat(kinesisanalytics): infer input schemas from real records
Aug 10, 2026
71e527b
chore(beads): sync issue state
Aug 10, 2026
d86ebef
fix(lakeformation): expand tag grants, record who granted, and refuse…
Aug 10, 2026
d08692e
chore(beads): sync issue state
Aug 10, 2026
9080e8e
fix(managedblockchain): require and consume the invitation a member i…
Aug 10, 2026
ef550f4
chore(beads): sync issue state
Aug 10, 2026
909aa8e
fix(mediapackage): stop harvest jobs claiming success, and type two p…
Aug 10, 2026
54d89aa
chore(beads): sync issue state
Aug 10, 2026
dd19503
fix(mediastoredata): validate upload availability instead of storing …
Aug 10, 2026
2eb5bdb
fix(resourcegroups): refuse to hand-edit membership of a query-based …
Aug 10, 2026
6a50e40
fix(timestreamquery): keep the scheduled query's key id, and stop cla…
Aug 10, 2026
e218320
fix(test): update the timestream wiring test for the key id parameter
Aug 10, 2026
dd95e14
fix(verifiedpermissions): reject tokens minted for another client
Aug 10, 2026
9ae3319
fix(wafv2): enforce the required fields on the managed rule set opera…
Aug 10, 2026
4db8b21
fix(xray): point service graph edges at the callee, and give them sta…
Aug 10, 2026
1360dfb
fix(accessanalyzer): correct the recommendation type and keep the tra…
Aug 10, 2026
6e25408
fix(account): refuse a primary email update to the address already in…
Aug 10, 2026
6fa4c99
fix(acm): issue HTTP-validated certificates pending, and reject inval…
Aug 10, 2026
ad90bf7
fix(athena,appmesh): validate what the API validates, and report dele…
Aug 10, 2026
5f0e272
fix(detective,codedeploy,codeconnections): serialise a field that exi…
Aug 10, 2026
3667179
fix(mq,mwaa): validate tag targets that exist, and stop writing rejec…
Aug 10, 2026
cf439a0
fix(opsworks): reject registrations missing required fields, and rege…
Aug 10, 2026
a4eda8d
fix(redshiftdata): honour the idempotency token, and stop requiring a…
Aug 10, 2026
903d74b
fix(rolesanywhere): require the roles a profile exists to grant, and …
Aug 10, 2026
734be2a
fix(rekognition): return the request fields the async video jobs alre…
Aug 10, 2026
2c216ec
build: check every PARITY.md sdk_module pin against go.mod
Aug 10, 2026
ec75b29
docs(parity): correct every stale sdk_module pin, and record what the…
Aug 10, 2026
1a7ddc6
build: enforce the pin check in CI, and regenerate the docs my own sw…
Aug 10, 2026
42a9321
fix(transcribe): derive accepted language codes from the SDK enum
Aug 10, 2026
0d2f490
fix(secretsmanager): require a rotation strategy, and stop matching e…
Aug 10, 2026
065322c
fix(ses): count bounces the simulator can actually produce, and apply…
Aug 11, 2026
778e7aa
fix(organizations): give service control policies their own size limi…
Aug 11, 2026
70eea52
fix(servicediscovery): enforce the attribute limits the model documen…
Aug 11, 2026
16ad8e3
fix(dax): stop returning a tag list the cluster shape does not have, …
Aug 11, 2026
85cdb77
docs: regenerate the service READMEs six commits left stale
Aug 11, 2026
7c80778
fix(sns): validate data protection policies, and stop exposing them a…
Aug 11, 2026
d0b7241
fix(workspaces): report the association field the API actually define…
Aug 11, 2026
473624c
fix(apigatewayv2): type routing rule actions and conditions, and hono…
Aug 11, 2026
5eee2c5
fix(sqs): reject unknown attribute names, and check the FIFO pairing …
Aug 11, 2026
4942505
fix(databrew): type the job shapes that are shallow, and stop accepti…
Aug 11, 2026
e15e694
fix(forecast): reject predictors and dataset groups built on referenc…
Aug 11, 2026
b626b1b
fix(datasync): store the secret and Kerberos settings that were dropp…
Aug 11, 2026
98c0006
fix(datasync): validate NFS agent references too
Aug 11, 2026
f41d5b4
fix(mediatailor): send an error type clients can read, and reconcile …
Aug 11, 2026
a36bc0a
fix(medialive,resourcegroups,vpclattice): identify errors so clients …
Aug 11, 2026
0a66d1b
fix(memorydb): apply the service update the caller named, and reject …
Aug 11, 2026
695aa1c
fix(appconfig,iotdataplane,securityhub): type the errors these three …
Aug 11, 2026
ca27323
fix(guardduty): compute free-trial days instead of asserting thirty, …
Aug 11, 2026
58567cc
fix(codebuild,route53resolver,scheduler,ce): type the error paths who…
Aug 11, 2026
2d6524f
fix(kinesisanalyticsv2): read the force flag and the schema request f…
Aug 11, 2026
4f58817
fix(scheduler): reject schedule expressions that parse structurally b…
Aug 11, 2026
43c52e2
fix(s3): restore the sdk_module pin my own verification reverted
Aug 11, 2026
0a0d120
fix(workspaces,appsync,backup,efs,quicksight,acm): derive enum valida…
Aug 11, 2026
c90bf50
fix(route53resolver): apply the list filters that were being dropped
Aug 11, 2026
1413218
fix(scheduler): validate cron field values, accepting the forms the d…
Aug 11, 2026
cdb5f44
fix(route53resolver): apply the remaining dropped filters, and valida…
Aug 11, 2026
40c2096
fix(codebuild): check report references where the API says to, and st…
Aug 11, 2026
27521e4
fix(route53resolver): sort query-log listings before paging, and read…
Aug 11, 2026
b235b95
fix(cloudwatchlogs,ssm,glue): read the request fields the API actuall…
Aug 11, 2026
922bf2d
fix(route53resolver): accept the request fields that were being disca…
Aug 11, 2026
2b3f3c8
fix(apigateway): apply the patch paths that were dropped or rejected …
Aug 11, 2026
c8e486e
fix(dms,bedrock,fsx,kms,transcribe): read the request field names the…
Aug 11, 2026
d071426
fix(apigateway): let a base path mapping actually be renamed, and app…
Aug 11, 2026
974a24b
fix(apigateway): stop handing callers the stored object five updates …
Aug 11, 2026
e12c5f4
fix(opensearch,sagemaker,iot,omics): read four request fields that we…
Aug 11, 2026
5a3d578
fix(apigateway): copy the rest of the stored objects handed out to ca…
Aug 11, 2026
42fcc30
fix(ec2,iam,sqs): read the form keys the real clients send
Aug 11, 2026
69dc2df
test(datasync): rename a shadowed error in the integration suite
Aug 11, 2026
494298f
chore(beads): record the two process gaps this session exposed
Aug 11, 2026
fc3dd01
docs: add a checkpoint for the next session
Aug 11, 2026
17b54d9
docs: remove CHECKPOINT.md from the repo
Aug 11, 2026
5e7f352
ci: raise the Node heap ceiling for the UI jobs
Aug 11, 2026
6d2c196
refactor: clear the CodeFactor findings blocking the PR
Aug 11, 2026
a2510d8
chore(pgo): refresh default.pgo
Aug 11, 2026
2a1ee1a
fix: bound RunInstances counts and clear the CodeQL alert gate
Aug 11, 2026
e525792
test(e2e): update call sites for two changed backend signatures
Aug 11, 2026
e59987d
test(persistence): record detective's added snapshot field in the golden
Aug 11, 2026
b078c86
test(ui): give the quicksight modal tests room under suite contention
Aug 11, 2026
5f7be6b
fix: satisfy CodeQL's guard recognition without fighting modernize
Aug 11, 2026
e78f3c0
fix(ec2): allocate the outpost instance-ID slice at a constant size
Aug 11, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
6 changes: 3 additions & 3 deletions .badges/operations.svg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
12 changes: 6 additions & 6 deletions .badges/parity.svg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
6 changes: 3 additions & 3 deletions .badges/services.svg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
504 changes: 313 additions & 191 deletions .beads/issues.jsonl

Large diffs are not rendered by default.

1 change: 1 addition & 0 deletions .dockerignore
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
.git
bin/
!bin/gopherstack
!bin/gopherstack-linux
test/e2e/failures/
coverage.out
coverage.html
Expand Down
41 changes: 35 additions & 6 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -49,6 +49,8 @@ jobs:

- name: Run UI type check
run: npm --prefix ui run check
env:
NODE_OPTIONS: --max-old-space-size=8192

lint:
runs-on: ubuntu-latest
Expand Down Expand Up @@ -84,6 +86,29 @@ jobs:
- name: go fix (modernize)
run: go fix -diff ./...

docs:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
with:
token: ${{ env.GH_CI_TOKEN }}

- name: Set up Go
uses: actions/setup-go@b7ad1dad31e06c5925ef5d2fc7ad053ef454303e # v7
with:
go-version-file: go.mod
check-latest: true
cache: true

- name: Check sdk_module pins
run: make check-pins

- name: Generate docs
run: make docs

- name: Fail if docs are out of date
run: git diff --exit-code

govulncheck:
runs-on: ubuntu-latest
steps:
Expand Down Expand Up @@ -233,13 +258,13 @@ jobs:
mkdir -p dashboard/static/spa
touch dashboard/static/spa/.keep
CGO_ENABLED=0 GOOS=linux go build -tags 'netgo osusergo static_build' -trimpath \
-ldflags="-w -s" -o bin/gopherstack .
-ldflags="-w -s" -o bin/gopherstack-linux .

- name: Upload binary
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7
with:
name: gopherstack-binary
path: bin/gopherstack
path: bin/gopherstack-linux
retention-days: 1

integration-tests:
Expand Down Expand Up @@ -279,7 +304,7 @@ jobs:
path: bin/

- name: Make binary executable
run: chmod +x bin/gopherstack
run: chmod +x bin/gopherstack-linux

- name: Compute test pattern for chunk
id: tests
Expand All @@ -297,7 +322,7 @@ jobs:

- name: Run Integration Tests (chunk ${{ matrix.chunk }})
run: |
echo "bin/gopherstack exists: $(test -f bin/gopherstack && echo yes || echo no)"
echo "bin/gopherstack-linux exists: $(test -f bin/gopherstack-linux && echo yes || echo no)"
go tool gotestsum --format standard-verbose -- \
-race -shuffle on -timeout 10m -v \
-run '${{ steps.tests.outputs.pattern }}' \
Expand Down Expand Up @@ -361,7 +386,7 @@ jobs:
path: bin/

- name: Make binary executable
run: chmod +x bin/gopherstack
run: chmod +x bin/gopherstack-linux

- name: Install OpenTofu
uses: opentofu/setup-opentofu@a1320f892987e89d278cc92dc5adc984fb93aca4 # v2
Expand Down Expand Up @@ -392,7 +417,7 @@ jobs:
- name: Run OpenTofu Tests (chunk ${{ matrix.chunk }})
run: |
echo "tofu version: $(tofu version)"
echo "bin/gopherstack exists: $(test -f bin/gopherstack && echo yes || echo no)"
echo "bin/gopherstack-linux exists: $(test -f bin/gopherstack-linux && echo yes || echo no)"
go tool gotestsum --format standard-verbose -- \
-race -parallel 8 -timeout 15m \
-run '${{ steps.tests.outputs.pattern }}' \
Expand Down Expand Up @@ -427,6 +452,8 @@ jobs:

- name: Build UI
working-directory: ui
env:
NODE_OPTIONS: --max-old-space-size=8192
run: |
npm ci
npm run build
Expand Down Expand Up @@ -483,6 +510,8 @@ jobs:

- name: Run UI Tests
working-directory: ui
env:
NODE_OPTIONS: --max-old-space-size=8192
run: npx vitest run

coverage:
Expand Down
35 changes: 35 additions & 0 deletions .golangci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -502,6 +502,27 @@ linters:
# injectable RNG field, so it must live in the same package.
- path: 'route53/routing_test.go'
linters: [ testpackage ]
# ordering_requirements_test.go white-box tests buildOrderingRequirements
# and its unexported per-check helpers directly with hand-built Site/
# Outpost structs -- several of the real OrderingRequirementType checks
# (SHIPPING_ADDRESS_MISSING_CONTACT_*) need a partially-populated Address
# the real SDK client's own validators.go refuses to construct (every
# Address field is client-side required once OperatingAddress/
# ShippingAddress is non-nil), so this cannot be reached through the
# real SDK client the way this package's other tests are.
- path: 'outposts/ordering_requirements_test.go'
linters: [ testpackage ]
# iotanalytics is AWS-deprecated (no longer available for use), so every
# SDK type/method/field the client touches carries an SA1019 deprecation
# notice -- gopherstack still emulates it, so the whole file is exempt
# rather than sprinkling ~15 identical inline nolints.
- path: 'iotanalytics/handler_create_tags_test.go'
linters: [ staticcheck ]
# Same reasoning as iotanalytics/handler_create_tags_test.go above -- this
# cli.go composition-root wiring test also drives the deprecated iotanalytics
# SDK client end to end.
- path: 'cli_iotanalytics_lambda_iot_wiring_test.go'
linters: [ staticcheck ]
- path: 'pkgs/service/cloudtrail_capture_test.go'
linters: [ testpackage ]
- path: 'pkgs/service/registry_test.go'
Expand All @@ -515,6 +536,20 @@ linters:
linters: [ testpackage ]
- path: 'autoscaling/scheduled_action_scheduler_test.go'
linters: [ testpackage ]
# whitebox_test.go: the export_test.go cleanup (gopherstack-f84y) moved
# tests needing unexported field/const access out of the external _test
# package into these in-package files instead of re-exporting test-only
# helpers. One shared rule covers every service's whitebox_test.go.
- path: 'whitebox_test\.go$'
linters: [ testpackage ]
- path: 'sdkcheck/check_test.go'
linters: [ testpackage ]
- path: 'pkgs/telemetry/collector_test.go'
linters: [ testpackage ]
- path: 'cognitoidentity/errors_test.go'
linters: [ testpackage ]
- path: 'glacier/select_sql_test.go'
linters: [ testpackage ]
- text: 'should have a package comment'
linters: [ revive ]
- text: 'exported \S+ \S+ should have comment( \(or a comment on this block\))? or be unexported'
Expand Down
5 changes: 5 additions & 0 deletions AGENTS.md
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,11 @@ go vet ./services/<pkg>/...
golangci-lint run ./services/<pkg>/...
```

`make lint` also runs mulint (mutex misuse detection) via `go vet -vettool`.
mulint cannot follow mutex wrappers across package boundaries, so it does
**not** see `lockmetrics.RWMutex` (used almost everywhere in this repo) — it
only guards direct `sync.Mutex`/`sync.RWMutex` use.


**Logging — context-aware only (no exceptions):**
- NEVER call `slog.Default()` or construct an ad-hoc `slog.New(...)` in service/production
Expand Down
6 changes: 4 additions & 2 deletions Dockerfile.test
Original file line number Diff line number Diff line change
@@ -1,6 +1,8 @@
# Lightweight test image — expects a pre-built static binary at bin/gopherstack.
# Lightweight test image — expects a pre-built static binary at bin/gopherstack-linux
# (from `make build-linux`; this is a separate path from `make build`'s bin/gopherstack
# so the two targets can't clobber each other — see gopherstack-gooq).
FROM scratch
COPY bin/gopherstack /root/gopherstack
COPY bin/gopherstack-linux /root/gopherstack
EXPOSE 8000
EXPOSE 1883
CMD ["/root/gopherstack"]
32 changes: 24 additions & 8 deletions Makefile
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
.PHONY: build ui-install ui-lint ui-check ui-lint-fix ui-fmt ui-fmt-fix ui-test ui-build install-deps install-tofu lint lint-fix test integration-test terraform-test e2e e2e-test total-coverage clean demo all dev-mcp-install dev-mcp-check pgo docs
.PHONY: build ui-install ui-lint ui-check ui-lint-fix ui-fmt ui-fmt-fix ui-test ui-build install-deps install-tofu lint lint-fix test integration-test terraform-test e2e e2e-test total-coverage clean demo all dev-mcp-install dev-mcp-check pgo docs check-pins

BINARY_NAME=gopherstack
VERSION_PKG=github.com/blackbirdworks/gopherstack/pkgs/version
Expand All @@ -17,7 +17,7 @@ ui-lint: ui-install
PATH="/opt/homebrew/bin:$(PATH)" npm --prefix ui run lint

ui-check: ui-install
PATH="/opt/homebrew/bin:$(PATH)" NODE_OPTIONS="--max-old-space-size=4096" npm --prefix ui run check
PATH="/opt/homebrew/bin:$(PATH)" NODE_OPTIONS="--max-old-space-size=8192" npm --prefix ui run check

ui-lint-fix: ui-install
PATH="/opt/homebrew/bin:$(PATH)" npm --prefix ui run lint:fix
Expand All @@ -29,19 +29,25 @@ ui-fmt-fix: ui-install
PATH="/opt/homebrew/bin:$(PATH)" npm --prefix ui run fmt

ui-test: ui-install
PATH="/opt/homebrew/bin:$(PATH)" NODE_OPTIONS="--max-old-space-size=4096" npm --prefix ui run test:coverage
PATH="/opt/homebrew/bin:$(PATH)" NODE_OPTIONS="--max-old-space-size=8192" npm --prefix ui run test:coverage

ui-build: ui-install
mkdir -p dashboard/static/spa
find dashboard/static/spa -mindepth 1 ! -name '.keep' -exec rm -rf {} +
PATH="/opt/homebrew/bin:$(PATH)" NODE_OPTIONS="--max-old-space-size=4096" npm --prefix ui run build
PATH="/opt/homebrew/bin:$(PATH)" NODE_OPTIONS="--max-old-space-size=8192" npm --prefix ui run build
@# Embedded so a browser repro / server log can show what SPA is actually
@# running instead of silently serving a stale go:embed artifact (gopherstack-0rkc).
echo "{\"builtAt\":\"$$(date -u +%Y-%m-%dT%H:%M:%SZ)\",\"commit\":\"$$(git rev-parse --short HEAD 2>/dev/null || echo unknown)\"}" > dashboard/static/spa/build-stamp.json
touch dashboard/static/spa/.keep

# Distinct output path from `build`: both used to write bin/gopherstack, so
# running `make build` (dynamic) while integration tests were mid-flight
# silently replaced the static binary Dockerfile.test's `FROM scratch` needs.
build-linux:
CGO_ENABLED=0 GOOS=linux go build \
-trimpath \
-ldflags "-w -s -X $(VERSION_PKG).Build=$(BUILD_VERSION)" \
-o bin/$(BINARY_NAME) .
-o bin/$(BINARY_NAME)-linux .

install-deps:
@echo "Checking for golangci-lint..."
Expand Down Expand Up @@ -123,6 +129,7 @@ install-tofu:

lint: install-deps ui-lint ui-fmt ui-check
golangci-lint run --timeout 20m ./...
go vet -vettool=$$(go tool -n mulint-vet) ./...
go tool govulncheck ./...

lint-fix: install-deps ui-lint-fix ui-fmt-fix
Expand All @@ -138,7 +145,7 @@ integration-test: build-linux
go tool gotestsum --format pkgname -- -race -shuffle on -timeout 10m ./test/integration/...

terraform-test: install-tofu
PATH="$$PWD/bin:$$PATH" go tool gotestsum --format pkgname -- -v -race -parallel 8 -timeout 10m ./test/terraform/...
PATH="$$PWD/bin:$$PATH" go tool gotestsum --format pkgname -- -v -race -parallel 8 -timeout 45m ./test/terraform/...

e2e: e2e-test

Expand All @@ -148,11 +155,14 @@ e2e-test: ui-build
total-coverage: build-linux
$(eval COVERPKGS := $(shell go list ./... | grep -v -E '(test/|/demo$$|/modules/|/teststack$$)' | tr '\n' ',' | sed 's/,$$//'))
@echo "Running unit tests with coverage..."
go tool gotestsum --format pkgname -- -race -shuffle on -short -timeout 5m -coverpkg=$(COVERPKGS) -coverprofile=unit-coverage.out -covermode=atomic ./...
@# Same -race -shuffle on -short ./... as the `test` target (go test's own
@# default timeout, 10m, applies there) plus coverage instrumentation
@# overhead, so this step needs at least as much room, not less.
go tool gotestsum --format pkgname -- -race -shuffle on -short -timeout 10m -coverpkg=$(COVERPKGS) -coverprofile=unit-coverage.out -covermode=atomic ./...
@echo "Running integration tests with coverage..."
go tool gotestsum --format pkgname -- -race -shuffle on -timeout 10m -coverpkg=$(COVERPKGS) -coverprofile=integration-coverage.out -covermode=atomic ./test/integration/...
@echo "Running terraform tests with coverage..."
go tool gotestsum --format pkgname -- -race -parallel 8 -timeout 20m -coverpkg=$(COVERPKGS) -coverprofile=terraform-coverage.out -covermode=atomic ./test/terraform/...
go tool gotestsum --format pkgname -- -race -parallel 8 -timeout 45m -coverpkg=$(COVERPKGS) -coverprofile=terraform-coverage.out -covermode=atomic ./test/terraform/...
@echo "Running E2E tests with coverage..."
go tool gotestsum --format pkgname -- -race -shuffle on -timeout 10m -tags=e2e -coverpkg=$(COVERPKGS) -coverprofile=e2e-coverage.out -covermode=atomic ./test/e2e/...
@echo "Merging coverage profiles..."
Expand Down Expand Up @@ -191,6 +201,12 @@ pgo:
docs:
go run ./cmd/gendocs

# Verify every services/<svc>/PARITY.md sdk_module pin matches the version
# go.mod actually requires -- a stale pin silently undermines every wire
# claim audited against it. See cmd/checkpins.
check-pins:
go run ./cmd/checkpins

demo: ui-build
docker compose down
docker compose build
Expand Down
Loading
Loading