Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
25 commits
Select commit Hold shift + click to select a range
b254d70
add plan-fixes skill for processing user bug reports into work plans
I194 Mar 28, 2026
6252858
add .claude/issues/ to gitignore — private user reports
I194 Mar 28, 2026
06a6583
fix: read demagType from first non-NRM step instead of steps[0]
I194 Mar 28, 2026
a11fc37
fix: use string state in metadata editor to prevent float artifacts a…
I194 Mar 28, 2026
6d7d07d
fix: strip file extension from interpretation labels
I194 Mar 28, 2026
8fbdf2b
fix: include error reason in skipped file alert message
I194 Mar 28, 2026
62df3fe
fix: replace || 0 MAD fallback with explicit isFinite guard in PCA
I194 Mar 28, 2026
adce541
fix: reject SQUID files with header but no measurement data
I194 Mar 28, 2026
d8c87b2
fix: guard against -Infinity in magnetization graph for empty data
I194 Mar 28, 2026
69810e1
chore: bump version to 2.6.2 and add changelog entry
I194 Mar 28, 2026
502b647
chore: add v2.6.3 feature requests, evaluation reports and workplan
I194 Mar 28, 2026
8b8147e
fix: remove premature MAD=0 fix from changelog — issue still under in…
I194 Mar 28, 2026
779aca0
chore: add MAD=0 investigation issue to feature-requests-v2.6.3
I194 Mar 28, 2026
131cd8b
fix: resolve MAD=0 bug in PCA eigenvalue sorting
I194 Apr 2, 2026
5ef6167
feat: add merge-on-upload option for DIR page files
I194 Apr 4, 2026
d164e52
fix: disable DataGrid virtualization for small DIR datasets
I194 Apr 4, 2026
4fadfc1
fix: reset merge state when upload modal reopens
I194 Apr 4, 2026
d880eb9
chore: add verify-fixes-report-1.md for evaluation-report-1 fix checks
I194 Apr 4, 2026
71b82a9
fix: improve dark theme contrast in upload modal and fix dropdown ove…
I194 Apr 5, 2026
329b9e8
chore: bump version to 2.6.3 and update changelog
I194 Apr 5, 2026
dd9d11e
feat: add merge prompt modal when importing 2+ files on DIR page
I194 Apr 5, 2026
7291729
fix: add merge prompt translations to src/locales
I194 Apr 5, 2026
ca3219a
Add verify-fixes-3
I194 Apr 5, 2026
3905c74
Add evaluation report for v2.6.3 merge prompt feature
I194 Apr 5, 2026
c79fa71
chore: add gstack skills and AI-assisted development guide
I194 Apr 5, 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
  •  
  •  
  •  
22 changes: 22 additions & 0 deletions .claude/feature-requests-v2.6.3/mad-zero-investigation.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
# MAD=0 investigation — awaiting data from scientists

**Reported by**: scientists (EK-march-2026)
**Priority**: bug (unresolved)
**Complexity**: unknown — need more information

## Problem

PCA MAD calculation returns 0.0 for some data. Root cause is unclear — the initial `|| 0` → `isFinite` guard did not address the real issue.

## Status

Request sent to scientists (2026-03-29) asking for:
1. Direct comparisons between PMTools and software where MAD is calculated correctly
2. The formula they expect for PCA and PCA0 MAD calculation
3. More data files and step ranges showing discrepancies

## Technical notes

- The `|| 0` fallback in PCA was replaced with an `isFinite` guard, but this is a defensive fix, not a root-cause fix.
- Relevant code: `src/utils/statistics/calculation/calculatePCA_pmd.ts`
- Cannot proceed without reference data or expected formulas from scientists.
22 changes: 22 additions & 0 deletions .claude/feature-requests-v2.6.3/merge-pmm-files.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
# Merge multiple PMM files (append collections)

**Requested by**: Ekaterina Kulakova (EK-march-2026, issue #2)
**Priority**: feature request
**Complexity**: medium

## Problem

Importing a new file replaces the previously loaded data. Users who have interpretation results split across multiple PMM files (e.g., different field seasons or labs) cannot combine them without external tools.

## Desired behavior

Users should be able to either:
1. Select multiple PMM files at once (Ctrl+click / Shift+click in the file dialog), or
2. Use an "Add to results" / "Append" option that imports a file without clearing existing data.

## Technical notes

- The file upload pipeline currently replaces the Redux store with new data on each import.
- Need to modify the import flow to support an "append" mode alongside "replace" mode.
- UI options: a toggle/checkbox in the upload dialog, or a separate "Add files" button next to the existing "Open files" button.
- Must handle potential ID/label collisions when merging collections.
22 changes: 22 additions & 0 deletions .claude/feature-requests-v2.6.3/multi-window-support.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
# Multi-window / multi-collection support

**Requested by**: Roman Veselovsky (RV-march-2026, issue #1)
**Priority**: feature request
**Complexity**: large

## Problem

All browser tabs/windows share the same Redux state via localStorage. Opening PMTools in a new tab mirrors the first tab's data. Users cannot view different collections side by side.

## Desired behavior

Users should be able to open multiple PMTools instances (tabs or windows) and work with independent collections in each.

## Technical notes

- Current architecture persists Redux state to localStorage, which is shared across all tabs of the same origin.
- Possible approaches:
1. **sessionStorage** — scoped per tab, simplest migration but breaks "reopen tab" persistence.
2. **URL-based state** — encode collection ID in the URL; each tab loads its own data.
3. **Per-tab ID** — generate a unique tab ID on load, key localStorage entries by tab ID.
- This is a fundamental architecture change — needs careful design to avoid breaking existing single-tab workflows.
24 changes: 24 additions & 0 deletions .claude/feature-requests-v2.6.3/vgp-both-coordinate-systems.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
# VGP for both geographic and stratigraphic coordinate systems

**Requested by**: Alexander Pasenko (AP-march-2026, issue #2)
**Priority**: major improvement
**Complexity**: medium

## Problem

VGP calculations currently use whichever coordinate system is selected (geographic OR stratigraphic). Users need VGP computed and displayed for both systems simultaneously, similar to how PCA shows Dgeo/Igeo and Dstrat/Istrat side by side.

## Desired behavior

1. VGP table and graph should show poles for both geographic and stratigraphic coordinate systems at the same time.
2. (Stretch) Allow users to input custom directions directly in the VGP section and calculate VGP without importing a DIR file — currently requires an external tool like Excel.

## Technical notes

- Key files:
- `src/components/AppLogic/DataTablesDIR/SitesDataTable/SitesDataTable.tsx` — lines 128–130 select one coord system
- `src/utils/statistics/calculation/calculateVGP.ts` — pure VGP math
- `src/components/AppLogic/VGP/` — VGP display components
- `src/utils/GlobalTypes.ts` — VGPData type definition
- Current behavior: VGP uses either `DgeoFinal/IgeoFinal` or `DstratFinal/IstratFinal` based on the `reference` toggle. VGPData stores a single set of pole coordinates.
- Suggested approach: extend VGPData to include both `poleLatGeo/poleLonGeo` and `poleLatStrat/poleLonStrat`. Calculate VGP for both systems when site data is processed.
1 change: 1 addition & 0 deletions .claude/skills/autoplan/SKILL.md
1 change: 1 addition & 0 deletions .claude/skills/benchmark/SKILL.md
1 change: 1 addition & 0 deletions .claude/skills/browse/SKILL.md
1 change: 1 addition & 0 deletions .claude/skills/canary/SKILL.md
1 change: 1 addition & 0 deletions .claude/skills/careful/SKILL.md
1 change: 1 addition & 0 deletions .claude/skills/checkpoint/SKILL.md
1 change: 1 addition & 0 deletions .claude/skills/codex/SKILL.md
1 change: 1 addition & 0 deletions .claude/skills/connect-chrome/SKILL.md
1 change: 1 addition & 0 deletions .claude/skills/cso/SKILL.md
1 change: 1 addition & 0 deletions .claude/skills/design-consultation/SKILL.md
1 change: 1 addition & 0 deletions .claude/skills/design-html/SKILL.md
1 change: 1 addition & 0 deletions .claude/skills/design-review/SKILL.md
1 change: 1 addition & 0 deletions .claude/skills/design-shotgun/SKILL.md
1 change: 1 addition & 0 deletions .claude/skills/devex-review/SKILL.md
1 change: 1 addition & 0 deletions .claude/skills/document-release/SKILL.md
1 change: 1 addition & 0 deletions .claude/skills/freeze/SKILL.md
1 change: 1 addition & 0 deletions .claude/skills/gstack-upgrade/SKILL.md
5 changes: 5 additions & 0 deletions .claude/skills/gstack/.env.example
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
# Copy to .env and fill in values
# bun auto-loads .env — no dotenv needed

# Required for LLM-as-judge evals (bun run test:eval)
ANTHROPIC_API_KEY=sk-ant-your-key-here
4 changes: 4 additions & 0 deletions .claude/skills/gstack/.github/actionlint.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
self-hosted-runner:
labels:
- ubicloud-standard-2
- ubicloud-standard-8
63 changes: 63 additions & 0 deletions .claude/skills/gstack/.github/docker/Dockerfile.ci
Original file line number Diff line number Diff line change
@@ -0,0 +1,63 @@
# gstack CI eval runner — pre-baked toolchain + deps
# Rebuild weekly via ci-image.yml, on Dockerfile changes, or on lockfile changes
FROM ubuntu:24.04

ENV DEBIAN_FRONTEND=noninteractive

# System deps
RUN apt-get update && apt-get install -y --no-install-recommends \
git curl unzip ca-certificates jq bc gpg \
&& rm -rf /var/lib/apt/lists/*

# GitHub CLI
RUN curl -fsSL https://cli.github.com/packages/githubcli-archive-keyring.gpg \
| gpg --dearmor -o /usr/share/keyrings/githubcli-archive-keyring.gpg \
&& echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/githubcli-archive-keyring.gpg] https://cli.github.com/packages stable main" \
| tee /etc/apt/sources.list.d/github-cli.list > /dev/null \
&& apt-get update && apt-get install -y --no-install-recommends gh \
&& rm -rf /var/lib/apt/lists/*

# Node.js 22 LTS (needed for claude CLI)
RUN curl -fsSL https://deb.nodesource.com/setup_22.x | bash - \
&& apt-get install -y --no-install-recommends nodejs \
&& rm -rf /var/lib/apt/lists/*

# Bun (install to /usr/local so non-root users can access it)
ENV BUN_INSTALL="/usr/local"
RUN curl -fsSL https://bun.sh/install | BUN_VERSION=1.3.10 bash

# Claude CLI
RUN npm i -g @anthropic-ai/claude-code

# Playwright system deps (Chromium) — needed for browse E2E tests
RUN npx playwright install-deps chromium

# Pre-install dependencies (cached layer — only rebuilds when package.json changes)
COPY package.json /workspace/
WORKDIR /workspace
RUN bun install && rm -rf /tmp/*

# Install Playwright Chromium to a shared location accessible by all users
ENV PLAYWRIGHT_BROWSERS_PATH=/opt/playwright-browsers
RUN npx playwright install chromium \
&& chmod -R a+rX /opt/playwright-browsers

# Verify everything works
RUN bun --version && node --version && claude --version && jq --version && gh --version \
&& npx playwright --version

# At runtime: checkout overwrites /workspace, but node_modules persists
# if we move it out of the way and symlink back
# Save node_modules + package.json snapshot for cache validation at runtime
RUN mv /workspace/node_modules /opt/node_modules_cache \
&& cp /workspace/package.json /opt/node_modules_cache/.package.json

# Claude CLI refuses --dangerously-skip-permissions as root.
# Create a non-root user for eval runs (GH Actions overrides USER, so
# the workflow must set options.user or use gosu/su-exec at runtime).
RUN useradd -m -s /bin/bash runner \
&& chmod -R a+rX /opt/node_modules_cache \
&& mkdir -p /home/runner/.gstack && chown -R runner:runner /home/runner/.gstack \
&& chmod 1777 /tmp \
&& mkdir -p /home/runner/.bun && chown -R runner:runner /home/runner/.bun \
&& chmod -R 1777 /tmp
8 changes: 8 additions & 0 deletions .claude/skills/gstack/.github/workflows/actionlint.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
name: Workflow Lint
on: [push, pull_request]
jobs:
actionlint:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: rhysd/actionlint@v1.7.11
40 changes: 40 additions & 0 deletions .claude/skills/gstack/.github/workflows/ci-image.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
name: Build CI Image
on:
# Rebuild weekly (Monday 6am UTC) to pick up CLI updates
schedule:
- cron: '0 6 * * 1'
# Rebuild on Dockerfile or lockfile changes
push:
branches: [main]
paths:
- '.github/docker/Dockerfile.ci'
- 'package.json'
# Manual trigger
workflow_dispatch:

jobs:
build:
runs-on: ubicloud-standard-2
permissions:
contents: read
packages: write
steps:
- uses: actions/checkout@v4

# Copy lockfile + package.json into Docker build context
- run: cp package.json .github/docker/

- uses: docker/login-action@v3
with:
registry: ghcr.io
username: ${{ github.actor }}
password: ${{ secrets.GITHUB_TOKEN }}

- uses: docker/build-push-action@v6
with:
context: .github/docker
file: .github/docker/Dockerfile.ci
push: true
tags: |
ghcr.io/${{ github.repository }}/ci:latest
ghcr.io/${{ github.repository }}/ci:${{ github.sha }}
129 changes: 129 additions & 0 deletions .claude/skills/gstack/.github/workflows/evals-periodic.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,129 @@
name: Periodic Evals
on:
schedule:
- cron: '0 6 * * 1' # Monday 6 AM UTC
workflow_dispatch:

concurrency:
group: evals-periodic
cancel-in-progress: true

env:
IMAGE: ghcr.io/${{ github.repository }}/ci
EVALS_TIER: periodic
EVALS_ALL: 1 # Ignore diff — run all periodic tests

jobs:
build-image:
runs-on: ubicloud-standard-2
permissions:
contents: read
packages: write
outputs:
image-tag: ${{ steps.meta.outputs.tag }}
steps:
- uses: actions/checkout@v4

- id: meta
run: echo "tag=${{ env.IMAGE }}:${{ hashFiles('.github/docker/Dockerfile.ci', 'package.json') }}" >> "$GITHUB_OUTPUT"

- uses: docker/login-action@v3
with:
registry: ghcr.io
username: ${{ github.actor }}
password: ${{ secrets.GITHUB_TOKEN }}

- name: Check if image exists
id: check
run: |
if docker manifest inspect ${{ steps.meta.outputs.tag }} > /dev/null 2>&1; then
echo "exists=true" >> "$GITHUB_OUTPUT"
else
echo "exists=false" >> "$GITHUB_OUTPUT"
fi

- if: steps.check.outputs.exists == 'false'
run: cp package.json .github/docker/

- if: steps.check.outputs.exists == 'false'
uses: docker/build-push-action@v6
with:
context: .github/docker
file: .github/docker/Dockerfile.ci
push: true
tags: |
${{ steps.meta.outputs.tag }}
${{ env.IMAGE }}:latest

evals:
runs-on: ubicloud-standard-2
needs: build-image
container:
image: ${{ needs.build-image.outputs.image-tag }}
credentials:
username: ${{ github.actor }}
password: ${{ secrets.GITHUB_TOKEN }}
options: --user runner
timeout-minutes: 25
strategy:
fail-fast: false
matrix:
suite:
- name: e2e-plan
file: test/skill-e2e-plan.test.ts
- name: e2e-design
file: test/skill-e2e-design.test.ts
- name: e2e-qa-bugs
file: test/skill-e2e-qa-bugs.test.ts
- name: e2e-qa-workflow
file: test/skill-e2e-qa-workflow.test.ts
- name: e2e-review
file: test/skill-e2e-review.test.ts
- name: e2e-workflow
file: test/skill-e2e-workflow.test.ts
- name: e2e-routing
file: test/skill-routing-e2e.test.ts
- name: e2e-codex
file: test/codex-e2e.test.ts
- name: e2e-gemini
file: test/gemini-e2e.test.ts
steps:
- uses: actions/checkout@v4
with:
fetch-depth: 0

- name: Fix bun temp
run: |
mkdir -p /home/runner/.cache/bun
{
echo "BUN_INSTALL_CACHE_DIR=/home/runner/.cache/bun"
echo "BUN_TMPDIR=/home/runner/.cache/bun"
echo "TMPDIR=/home/runner/.cache"
} >> "$GITHUB_ENV"

- name: Restore deps
run: |
if [ -d /opt/node_modules_cache ] && diff -q /opt/node_modules_cache/.package.json package.json >/dev/null 2>&1; then
ln -s /opt/node_modules_cache node_modules
else
bun install
fi

- run: bun run build

- name: Run ${{ matrix.suite.name }}
env:
ANTHROPIC_API_KEY: ${{ secrets.ANTHROPIC_API_KEY }}
OPENAI_API_KEY: ${{ secrets.OPENAI_API_KEY }}
GEMINI_API_KEY: ${{ secrets.GEMINI_API_KEY }}
EVALS_CONCURRENCY: "40"
PLAYWRIGHT_BROWSERS_PATH: /opt/playwright-browsers
run: EVALS=1 bun test --retry 2 --concurrent --max-concurrency 40 ${{ matrix.suite.file }}

- name: Upload eval results
if: always()
uses: actions/upload-artifact@v4
with:
name: eval-periodic-${{ matrix.suite.name }}
path: ~/.gstack-dev/evals/*.json
retention-days: 90
Loading