diff --git a/.github/workflow-templates/julia-ci.properties.json b/.github/workflow-templates/julia-ci.properties.json
new file mode 100644
index 0000000..c786fb6
--- /dev/null
+++ b/.github/workflow-templates/julia-ci.properties.json
@@ -0,0 +1,6 @@
+{
+ "name": "QAtlasHub Julia CI",
+ "description": "Format + version + test (reusable), optional sharding.",
+ "iconName": "octicon-checklist",
+ "categories": ["Julia"]
+}
diff --git a/.github/workflow-templates/julia-ci.yml b/.github/workflow-templates/julia-ci.yml
new file mode 100644
index 0000000..407ad26
--- /dev/null
+++ b/.github/workflow-templates/julia-ci.yml
@@ -0,0 +1,13 @@
+name: CI
+on:
+ push: { branches: [main] }
+ pull_request: {}
+jobs:
+ format:
+ uses: QAtlasHub/.github/.github/workflows/format-check.yml@v1
+ version:
+ uses: QAtlasHub/.github/.github/workflows/version-check.yml@v1
+ ci:
+ uses: QAtlasHub/.github/.github/workflows/julia-ci.yml@v1
+ with: { shards: 1 } # set 16 for sharded CI
+ secrets: inherit
diff --git a/.github/workflows/lint.yml b/.github/workflows/lint.yml
new file mode 100644
index 0000000..92c5dab
--- /dev/null
+++ b/.github/workflows/lint.yml
@@ -0,0 +1,18 @@
+name: Lint workflows
+on:
+ push:
+ branches: [main]
+ paths: ['.github/workflows/**', 'actions/**']
+ pull_request:
+ paths: ['.github/workflows/**', 'actions/**']
+permissions:
+ contents: read
+jobs:
+ actionlint:
+ runs-on: ubuntu-latest
+ steps:
+ - uses: actions/checkout@v4
+ - uses: reviewdog/action-actionlint@v1
+ with:
+ reporter: github-check
+ fail_level: error
diff --git a/CODE_OF_CONDUCT.md b/CODE_OF_CONDUCT.md
new file mode 100644
index 0000000..b565821
--- /dev/null
+++ b/CODE_OF_CONDUCT.md
@@ -0,0 +1,5 @@
+# Code of Conduct
+
+This project follows the [Contributor Covenant](https://www.contributor-covenant.org/version/2/1/code_of_conduct/)
+v2.1. Be respectful and constructive. Report unacceptable behaviour to the
+organization owner via a private channel or a security advisory.
diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md
new file mode 100644
index 0000000..db514b2
--- /dev/null
+++ b/CONTRIBUTING.md
@@ -0,0 +1,10 @@
+# Contributing
+
+1. Open an issue (bug / wish) before large changes.
+2. One focused change per PR. Fill in the PR template — the **Proposed Changes**
+ and **Usage or Results** sections become the release notes.
+3. Write tests that check an *independent* expectation (closed form,
+ cross-method, structural law), not tautological self-consistency.
+4. Bump `Project.toml` version by exactly one semver step (patch / minor / major).
+5. Format with JuliaFormatter v2 (`julia -e 'using JuliaFormatter; format(".")'`).
+CI runs format + version + tests; bot PRs (CompatHelper/dependabot) auto-merge on green.
diff --git a/README.md b/README.md
index ab8a8d0..fe82687 100644
--- a/README.md
+++ b/README.md
@@ -14,7 +14,7 @@ Reference with the (intentional) double `.github` path, pinned to `@main`:
name: Format Check
on: { pull_request: { paths: ['**/*.jl'] } }
jobs:
- format: { uses: QAtlasHub/.github/.github/workflows/format-check.yml@main }
+ format: { uses: QAtlasHub/.github/.github/workflows/format-check.yml@v1 }
```
**Version check** — `.github/workflows/VersionCheck.yml`:
@@ -22,7 +22,7 @@ jobs:
name: VersionCheck
on: { pull_request: { branches: [main] } }
jobs:
- version: { uses: QAtlasHub/.github/.github/workflows/version-check.yml@main }
+ version: { uses: QAtlasHub/.github/.github/workflows/version-check.yml@v1 }
```
**CompatHelper** — `.github/workflows/CompatHelper.yml`:
@@ -31,7 +31,7 @@ name: CompatHelper
on: { schedule: [{ cron: '0 */4 * * *' }], workflow_dispatch: {} }
jobs:
compathelper:
- uses: QAtlasHub/.github/.github/workflows/compathelper.yml@main
+ uses: QAtlasHub/.github/.github/workflows/compathelper.yml@v1
secrets: inherit
```
@@ -41,7 +41,7 @@ name: AutoMerge
on: { pull_request: { types: [opened, synchronize, reopened, labeled] } }
jobs:
automerge:
- uses: QAtlasHub/.github/.github/workflows/automerge.yml@main
+ uses: QAtlasHub/.github/.github/workflows/automerge.yml@v1
secrets: inherit
```
@@ -54,7 +54,7 @@ name: Documentation
on: { push: { branches: [main], tags: ['*'] }, workflow_dispatch: {} }
jobs:
docs:
- uses: QAtlasHub/.github/.github/workflows/docs-deploy.yml@main
+ uses: QAtlasHub/.github/.github/workflows/docs-deploy.yml@v1
secrets: inherit
# with: { pre-build: docs/atlas/generate.jl } # optional pre-make hook
```
@@ -65,7 +65,7 @@ name: Docs Preview
on: { pull_request: {} }
jobs:
preview:
- uses: QAtlasHub/.github/.github/workflows/docs-preview.yml@main
+ uses: QAtlasHub/.github/.github/workflows/docs-preview.yml@v1
secrets: inherit
# with: { preview-base: https://codes.sota-shimozono.com }
```
@@ -76,7 +76,7 @@ name: Cleanup Preview
on: { pull_request: { types: [closed] } }
jobs:
cleanup:
- uses: QAtlasHub/.github/.github/workflows/docs-cleanup-preview.yml@main
+ uses: QAtlasHub/.github/.github/workflows/docs-cleanup-preview.yml@v1
```
Inputs: `julia-version` (default `1`), `pre-build` (optional Julia script before `make.jl` — e.g. an atlas generator), `preview-base` (docs host; preview link is `//previews/PR/`).
@@ -92,7 +92,7 @@ name: CI
on: { push: { branches: [main] }, pull_request: {} }
jobs:
ci:
- uses: QAtlasHub/.github/.github/workflows/julia-ci.yml@main
+ uses: QAtlasHub/.github/.github/workflows/julia-ci.yml@v1
with:
shards: 16 # omit or set 1 for a plain single-job Pkg.test
```
@@ -110,22 +110,22 @@ The label→version→register→tag→notes chain, all reusable:
```yaml
# PRLabeler.yml
on: { pull_request: { types: [opened, edited, synchronize, reopened] } }
-jobs: { label: { uses: QAtlasHub/.github/.github/workflows/labeler.yml@main } }
+jobs: { label: { uses: QAtlasHub/.github/.github/workflows/labeler.yml@v1 } }
```
```yaml
# ReleaseDrafter.yml (repo also ships .github/release-drafter.yml config)
on: { push: { branches: [main] }, pull_request: { types: [opened, reopened, synchronize, edited] } }
-jobs: { draft: { uses: QAtlasHub/.github/.github/workflows/release-drafter.yml@main } }
+jobs: { draft: { uses: QAtlasHub/.github/.github/workflows/release-drafter.yml@v1 } }
```
```yaml
# AutoRegister.yml
on: { workflow_run: { workflows: ["Release Drafter"], types: [completed], branches: [main] } }
-jobs: { register: { uses: QAtlasHub/.github/.github/workflows/autoregister.yml@main } }
+jobs: { register: { uses: QAtlasHub/.github/.github/workflows/autoregister.yml@v1 } }
```
```yaml
# TagBot.yml
on: { issue_comment: { types: [created] }, workflow_dispatch: { inputs: { lookback: { default: "3" } } } }
-jobs: { tagbot: { uses: QAtlasHub/.github/.github/workflows/tagbot.yml@main, secrets: inherit } }
+jobs: { tagbot: { uses: QAtlasHub/.github/.github/workflows/tagbot.yml@v1, secrets: inherit } }
```
- **labeler** feeds `enhancement`/`bug`/… labels from the PR title + Type-of-Change checkboxes → drives the version-resolver and release-notes categories.
diff --git a/SECURITY.md b/SECURITY.md
new file mode 100644
index 0000000..d877a39
--- /dev/null
+++ b/SECURITY.md
@@ -0,0 +1,5 @@
+# Security Policy
+
+Report vulnerabilities **privately** via GitHub Security Advisories
+("Report a vulnerability" on the affected repo), not a public issue. We aim to
+acknowledge within a few days. Do not include exploit details in public channels.
diff --git a/SUPPORT.md b/SUPPORT.md
new file mode 100644
index 0000000..1817595
--- /dev/null
+++ b/SUPPORT.md
@@ -0,0 +1,5 @@
+# Support
+
+- **Questions / ideas** → the repo's Discussions or a `wishlist` issue.
+- **Bugs** → a `bug` issue with a minimal reproducer.
+- **Docs errors** → open an issue labelled `documentation`.
diff --git a/profile/README.md b/profile/README.md
new file mode 100644
index 0000000..ced9cf7
--- /dev/null
+++ b/profile/README.md
@@ -0,0 +1,23 @@
+# QAtlasHub
+
+A self-hosted home for the **QAtlas** atlas family and its supporting
+infrastructure — declarative physics knowledge, its independent numerical
+oracles, and the reproducible-research tooling around them.
+
+## Packages
+
+- **AbstractQAtlas.jl** — model-independent physics vocabulary + relations (the verify-engine base)
+- **QAtlas.jl** — the model atlas: declared values, closed forms, constraint kernel
+- **QAtlasRegistry** — cross-validated evidence registry (oracles report here)
+- **ClassicalMonteCarlo.jl** — independent classical numerical oracle
+- **LatticeCore / Lattice2D / QuasiCrystal** — lattice geometry
+- **ParamIO.jl / DataVault.jl** — parameter & data management for compute campaigns
+- **Pinax.jl** — figure galleries → self-contained annotated HTML
+- **doiget** — OA-first DOI/arXiv fetcher + citation-check action
+
+## Shared CI
+
+This org's [`.github`](https://github.com/QAtlasHub/.github) repo hosts the
+reusable workflows and actions every package uses via thin `uses:` callers —
+CI (optional sharding), formatting, versioning, CompatHelper/AutoMerge, docs
+deploy/preview, rich release notes, and citation checking.