Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
78 commits
Select commit Hold shift + click to select a range
afefc1e
docs: design security operations and R2 hardening
hmmhmmhm Jul 13, 2026
437fa5b
docs: plan security operations and R2 delivery
hmmhmmhm Jul 13, 2026
7174f88
test(security): enforce production audit severity
hmmhmmhm Jul 13, 2026
4eea800
fix(security): harden production audit runner
hmmhmmhm Jul 13, 2026
c9b3037
fix(security): reject incomplete audit processes
hmmhmmhm Jul 13, 2026
82e30e9
chore(api): upgrade and pin elysia runtime
hmmhmmhm Jul 13, 2026
7b1a171
chore(web): remediate production dependency advisories
hmmhmmhm Jul 13, 2026
c3f266d
fix(web): align swc helper peer
hmmhmmhm Jul 13, 2026
8269d87
chore(actions): pin automation and add dependabot
hmmhmmhm Jul 13, 2026
9c28a4d
fix(actions): cover all workflow pins
hmmhmmhm Jul 13, 2026
63243a2
fix(actions): scope dependabot groups
hmmhmmhm Jul 13, 2026
7a8e691
feat(security): codify repository governance
hmmhmmhm Jul 13, 2026
9b81e61
ci: enforce production security policy
hmmhmmhm Jul 13, 2026
5b94cad
fix(security): align governance with GitHub API
hmmhmmhm Jul 13, 2026
5d8b62c
docs(security): record repository controls
hmmhmmhm Jul 13, 2026
a6d98cc
chore(tooling): pin Bun and TypeScript
hmmhmmhm Jul 13, 2026
9a0f4cc
docs: complete security governance plan
hmmhmmhm Jul 13, 2026
55aa474
fix(api): initialize metrics clock on first request
hmmhmmhm Jul 13, 2026
d0f8ddf
feat(api): emit structured completion logs
hmmhmmhm Jul 13, 2026
da7cb3b
test(smoke): validate metrics clock and runtime metadata
hmmhmmhm Jul 13, 2026
7ecce48
feat(smoke): add quick and full profiles
hmmhmmhm Jul 14, 2026
0b7eb30
fix(smoke): preserve failures across notification attempts
hmmhmmhm Jul 14, 2026
6ff509b
docs(operations): define service objectives and runbook
hmmhmmhm Jul 14, 2026
9796817
ci(smoke): use profiles and sparse checkout
hmmhmmhm Jul 14, 2026
6d70638
chore(ci): pin bun and wrangler toolchain
hmmhmmhm Jul 14, 2026
56e8e6b
fix(operations): make objectives and rollback verifiable
hmmhmmhm Jul 14, 2026
4395a16
fix(operations): make status filters executable
hmmhmmhm Jul 14, 2026
9c5ee2a
fix(api): defer worker app initialization
hmmhmmhm Jul 14, 2026
6ae1378
test(ci): bind workflow toolchain contracts
hmmhmmhm Jul 14, 2026
3b361c1
test(ci): enforce direct bun action inputs
hmmhmmhm Jul 14, 2026
f001e51
ci(deploy): enforce production concurrency
hmmhmmhm Jul 14, 2026
9a5070a
fix(deploy): wait for active worker commit
hmmhmmhm Jul 14, 2026
a1fdebb
test(coverage): define lcov policy enforcement
hmmhmmhm Jul 14, 2026
d886c70
fix(smoke): retry transient deployment responses
hmmhmmhm Jul 14, 2026
79d773f
fix(coverage): validate policy targets and paths
hmmhmmhm Jul 14, 2026
1918543
fix(coverage): reject malformed and unsafe reports
hmmhmmhm Jul 14, 2026
9591fe4
test(ground-codes): add maintained-source coverage
hmmhmmhm Jul 14, 2026
f92ad2f
fix(coverage): validate lcov summary records
hmmhmmhm Jul 14, 2026
3b12357
fix(coverage): accept summary-only lcov metrics
hmmhmmhm Jul 14, 2026
444a7c8
test(apps): add api and web coverage
hmmhmmhm Jul 14, 2026
6df1c59
test(web): isolate coverage mocks
hmmhmmhm Jul 14, 2026
43e7f91
test(operations): cover automation policy modules
hmmhmmhm Jul 14, 2026
28ead3c
test(coverage): lock measured branch baselines
hmmhmmhm Jul 14, 2026
11145ba
fix(coverage): harden branch probe portability
hmmhmmhm Jul 14, 2026
78eb060
fix(coverage): reject malformed branch reports
hmmhmmhm Jul 14, 2026
4593d66
fix(api): flush completion logs before response
hmmhmmhm Jul 14, 2026
b6a8fa5
fix(api): preserve metrics wrapper on compile
hmmhmmhm Jul 14, 2026
dcfae00
fix(api): retain completion logs after compile
hmmhmmhm Jul 14, 2026
97cb57a
ci: enforce coverage policy
hmmhmmhm Jul 14, 2026
4fc2121
fix(coverage): secure and serialize report generation
hmmhmmhm Jul 14, 2026
9bb0f38
fix(build): pin pages release toolchain
hmmhmmhm Jul 14, 2026
4749a90
test(build): lock pages toolchain graph
hmmhmmhm Jul 14, 2026
2b40929
fix(coverage): calibrate api baseline to ci
hmmhmmhm Jul 14, 2026
0d8ff9c
docs(deploy): record reproducible release commands
hmmhmmhm Jul 14, 2026
90a4711
fix(docs): make rollback commands fail closed
hmmhmmhm Jul 14, 2026
a56dcfd
fix(docs): clarify dry-run auth boundary
hmmhmmhm Jul 14, 2026
92deacb
fix(docs): preserve incident objective contract
hmmhmmhm Jul 14, 2026
7446b95
docs: complete metrics and smoke plan
hmmhmmhm Jul 14, 2026
aa8bcf9
docs: complete ci deployment coverage plan
hmmhmmhm Jul 14, 2026
79c5670
test(region-data): define immutable manifest contract
hmmhmmhm Jul 14, 2026
1c246a8
fix(region-data): reject linked manifest roots
hmmhmmhm Jul 14, 2026
20b8a44
fix(region-data): harden immutable manifest contract
hmmhmmhm Jul 14, 2026
be2681e
fix(region-data): stabilize manifest guard failures
hmmhmmhm Jul 14, 2026
8d72f83
fix(region-data): secure directory enumeration
hmmhmmhm Jul 14, 2026
fb054a6
fix(region-data): restore manifest public API
hmmhmmhm Jul 14, 2026
b90cc9b
feat(region-data): generate content-addressed releases
hmmhmmhm Jul 14, 2026
ce105f3
test(region-data): enforce single-byte release mutation
hmmhmmhm Jul 14, 2026
a5514b8
fix(region-data): seal release generation against races
hmmhmmhm Jul 14, 2026
cd2c422
fix(region-data): make release activation durable
hmmhmmhm Jul 14, 2026
66f3098
fix(region-data): seal pointer activation transaction
hmmhmmhm Jul 14, 2026
62391ab
feat(region-data): add verified r2 synchronizer
hmmhmmhm Jul 14, 2026
f2dd779
feat(region-data): publish immutable r2 releases
hmmhmmhm Jul 14, 2026
1856c85
test(region-data): verify complete release materialization
hmmhmmhm Jul 15, 2026
8547f41
docs(region-data): document r2 delivery operations
hmmhmmhm Jul 15, 2026
731385b
feat(region-data): publish initial r2 release
hmmhmmhm Jul 15, 2026
83deb24
ci(region-data): shadow materialize from r2
hmmhmmhm Jul 15, 2026
4497a41
fix(ci): restore production audit endpoint
hmmhmmhm Jul 15, 2026
b9f5c8f
fix(ci): approve standalone native build
hmmhmmhm Jul 15, 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
36 changes: 36 additions & 0 deletions .github/dependabot.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
version: 2
updates:
- package-ecosystem: "npm"
directory: "/"
schedule:
interval: "weekly"
day: "monday"
timezone: "Asia/Seoul"
open-pull-requests-limit: 10
groups:
runtime-security:
patterns:
- "*"
dependency-type: "production"
update-types:
- "minor"
- "patch"
development-tooling:
patterns:
- "*"
dependency-type: "development"
update-types:
- "minor"
- "patch"

- package-ecosystem: "github-actions"
directory: "/"
schedule:
interval: "weekly"
day: "monday"
timezone: "Asia/Seoul"
open-pull-requests-limit: 10
groups:
github-actions:
patterns:
- "*"
23 changes: 17 additions & 6 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -12,27 +12,35 @@ jobs:

steps:
- name: Checkout repository
uses: actions/checkout@v6
uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6

- name: Setup Node.js
uses: actions/setup-node@v6
uses: actions/setup-node@48b55a011bda9f5d6aeb4c2d9c7362e8dae4041e # v6
with:
node-version: "22"
package-manager-cache: false

- name: Setup pnpm
uses: pnpm/action-setup@v6
uses: pnpm/action-setup@0ebf47130e4866e96fce0953f49152a61190b271 # v6
with:
version: 9.0.0
version: 11.4.0

- name: Setup Bun
uses: oven-sh/setup-bun@v2
uses: oven-sh/setup-bun@0c5077e51419868618aeaa5fe8019c62421857d6 # v2
with:
bun-version: latest
bun-version: "1.3.1"

- name: Install dependencies
run: pnpm install --frozen-lockfile

- name: Audit production dependencies
run: pnpm security:audit

- name: Materialize verified region data
env:
REGION_DATA_BASE_URL: ${{ vars.REGION_DATA_BASE_URL }}
run: node scripts/sync-region-data.mjs --groups region-dist,region-db --prune

- name: Check formatting
run: pnpm format:check

Expand Down Expand Up @@ -69,6 +77,9 @@ jobs:
- name: Test web client
run: pnpm --filter web test

- name: Enforce coverage policy
run: pnpm coverage

- name: Build
run: pnpm build

Expand Down
28 changes: 18 additions & 10 deletions .github/workflows/deploy-api.yml
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ on:
- "apps/api-ground-codes/**"
- "packages/ground-codes/**"
- "packages/geoint/region-dist/**"
- "packages/geoint/region-data-release.json"
- "packages/codebook/codebook-dist/**"
- ".github/workflows/deploy-api.yml"
- "package.json"
Expand All @@ -28,32 +29,38 @@ concurrency:
jobs:
deploy:
runs-on: ubuntu-latest
environment: production

steps:
- name: Checkout repository
uses: actions/checkout@v6
uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6
with:
fetch-depth: 0

- name: Setup Node.js
uses: actions/setup-node@v6
uses: actions/setup-node@48b55a011bda9f5d6aeb4c2d9c7362e8dae4041e # v6
with:
node-version: "22"
package-manager-cache: false

- name: Setup pnpm
uses: pnpm/action-setup@v6
uses: pnpm/action-setup@0ebf47130e4866e96fce0953f49152a61190b271 # v6
with:
version: 9.0.0
version: 11.4.0

- name: Setup Bun
uses: oven-sh/setup-bun@v2
uses: oven-sh/setup-bun@0c5077e51419868618aeaa5fe8019c62421857d6 # v2
with:
bun-version: latest
bun-version: "1.3.1"

- name: Install dependencies
run: pnpm install --frozen-lockfile

- name: Materialize verified region data
env:
REGION_DATA_BASE_URL: ${{ vars.REGION_DATA_BASE_URL }}
run: node scripts/sync-region-data.mjs --groups region-dist --prune

- name: Type check API
run: pnpm --filter api-ground-codes check-types

Expand All @@ -63,9 +70,6 @@ jobs:
- name: Build ground-codes package
run: pnpm --filter ground-codes build

- name: Install Wrangler
run: pnpm install -g wrangler

- name: Apply PostGIS schema
env:
SUPABASE_DB_URL: ${{ secrets.SUPABASE_DB_URL }}
Expand All @@ -75,6 +79,8 @@ jobs:

- name: Detect changed region datasets
id: regions
env:
REGION_DATA_BASE_URL: ${{ vars.REGION_DATA_BASE_URL }}
run: |
if [ "${{ github.event_name }}" = "workflow_dispatch" ] && [ "${{ inputs.import_all_regions }}" = "true" ]; then
echo "datasets=__all_missing__" >> "$GITHUB_OUTPUT"
Expand Down Expand Up @@ -104,7 +110,7 @@ jobs:
CLOUDFLARE_API_TOKEN: ${{ secrets.CLOUDFLARE_API_TOKEN }}
CLOUDFLARE_ACCOUNT_ID: ${{ secrets.CLOUDFLARE_ACCOUNT_ID }}
run: |
wrangler deploy \
pnpm exec wrangler deploy \
--config apps/api-ground-codes/wrangler.toml \
--keep-vars \
--var API_RUNTIME_TAG:workspace \
Expand All @@ -113,4 +119,6 @@ jobs:
--message "Deploy API Worker from ${GITHUB_SHA}"

- name: Run production smoke
env:
GROUND_CODES_EXPECTED_RUNTIME_COMMIT: ${{ github.sha }}
run: pnpm production:smoke
24 changes: 12 additions & 12 deletions .github/workflows/deploy-grok-spiral.yml
Original file line number Diff line number Diff line change
Expand Up @@ -13,24 +13,29 @@ on:
- "pnpm-workspace.yaml"
workflow_dispatch:

concurrency:
group: deploy-grok-spiral-production
cancel-in-progress: true

jobs:
deploy:
runs-on: ubuntu-latest
environment: production

steps:
- name: Checkout repository
uses: actions/checkout@v6
uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6

- name: Setup Node.js
uses: actions/setup-node@v6
uses: actions/setup-node@48b55a011bda9f5d6aeb4c2d9c7362e8dae4041e # v6
with:
node-version: "22"
package-manager-cache: false

- name: Setup pnpm
uses: pnpm/action-setup@v6
uses: pnpm/action-setup@0ebf47130e4866e96fce0953f49152a61190b271 # v6
with:
version: 9.0.0
version: 11.4.0

- name: Get pnpm store directory
id: pnpm-cache
Expand All @@ -39,26 +44,21 @@ jobs:
echo "STORE_PATH=$(pnpm store path)" >> $GITHUB_OUTPUT

- name: Setup pnpm cache
uses: actions/cache@v5
uses: actions/cache@caa296126883cff596d87d8935842f9db880ef25 # v5
with:
path: ${{ steps.pnpm-cache.outputs.STORE_PATH }}
key: ${{ runner.os }}-pnpm-store-${{ hashFiles('**/pnpm-lock.yaml') }}
restore-keys: |
${{ runner.os }}-pnpm-store-

- name: Install dependencies
run: pnpm install
run: pnpm install --frozen-lockfile

- name: Build Next.js app
run: pnpm --filter grok-spiral build

- name: Install Wrangler
run: pnpm install -g wrangler

- name: Deploy to Cloudflare Pages
env:
CLOUDFLARE_API_TOKEN: ${{ secrets.CLOUDFLARE_API_TOKEN }}
CLOUDFLARE_ACCOUNT_ID: ${{ secrets.CLOUDFLARE_ACCOUNT_ID }}
run: |
cd apps/grok-spiral
pnpm run pages:build && wrangler pages deploy
run: pnpm --filter grok-spiral deploy
24 changes: 12 additions & 12 deletions .github/workflows/deploy-web.yml
Original file line number Diff line number Diff line change
Expand Up @@ -13,24 +13,29 @@ on:
- "pnpm-workspace.yaml"
workflow_dispatch:

concurrency:
group: deploy-web-production
cancel-in-progress: true

jobs:
deploy:
runs-on: ubuntu-latest
environment: production

steps:
- name: Checkout repository
uses: actions/checkout@v6
uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6

- name: Setup Node.js
uses: actions/setup-node@v6
uses: actions/setup-node@48b55a011bda9f5d6aeb4c2d9c7362e8dae4041e # v6
with:
node-version: "22"
package-manager-cache: false

- name: Setup pnpm
uses: pnpm/action-setup@v6
uses: pnpm/action-setup@0ebf47130e4866e96fce0953f49152a61190b271 # v6
with:
version: 9.0.0
version: 11.4.0

- name: Get pnpm store directory
id: pnpm-cache
Expand All @@ -39,22 +44,19 @@ jobs:
echo "STORE_PATH=$(pnpm store path)" >> $GITHUB_OUTPUT

- name: Setup pnpm cache
uses: actions/cache@v5
uses: actions/cache@caa296126883cff596d87d8935842f9db880ef25 # v5
with:
path: ${{ steps.pnpm-cache.outputs.STORE_PATH }}
key: ${{ runner.os }}-pnpm-store-${{ hashFiles('**/pnpm-lock.yaml') }}
restore-keys: |
${{ runner.os }}-pnpm-store-

- name: Install dependencies
run: pnpm install
run: pnpm install --frozen-lockfile

- name: Build Next.js app
run: pnpm --filter web build

- name: Install Wrangler
run: pnpm install -g wrangler

- name: Deploy to Cloudflare Pages
env:
CLOUDFLARE_API_TOKEN: ${{ secrets.CLOUDFLARE_API_TOKEN }}
Expand All @@ -67,6 +69,4 @@ jobs:
NEXT_PUBLIC_CESIUM_MARS_ASSET_ID: ${{ secrets.NEXT_PUBLIC_CESIUM_MARS_ASSET_ID }}
GOOGLE_MAPS_NODEJS_API_KEY: ${{ secrets.GOOGLE_MAPS_NODEJS_API_KEY }}
OPENWEATHER_API_KEY: ${{ secrets.OPENWEATHER_API_KEY }}
run: |
cd apps/web
pnpm run pages:build && wrangler pages deploy
run: pnpm --filter web deploy
Loading