Skip to content

Commit e897cbf

Browse files
committed
docs(contrib): open Issues and PRs; ask for divergences by template
Smell-audited: depth 1: pausing Issues was a deliberate, documented choice ("small, resource-limited project"), not an oversight — so this reverses a real decision rather than fixing a slip. The reversal is grounded in a measurement, not a preference: at ★176 with Issues closed cljw has 0 external contributors, while the sibling zwasm at ★156 with Issues open has 5 — and one of them found a documentation claim that was false in two places at once. The constraint that motivated the pause (small team, slow replies) is still true and is now stated up front instead of used as a reason to close the door. - `.github/ISSUE_TEMPLATE/divergence.yml` — the highest-value report for this project: an expression, what cljw prints, what a JVM REPL prints. Points at docs/clojure_vs_clojurewasm.md first so deliberate differences self-filter. - `.github/ISSUE_TEMPLATE/bug.yml` — crash/hang/wrong-output, and routes a suspected sandbox or FFI memory-safety fault to private reporting instead. - `.github/ISSUE_TEMPLATE/missing.yml` — asks what the reporter was trying to do, not just the missing var name; the use case is what sets priority, and the permanently-out-of-scope set is linked rather than argued per issue. - CONTRIBUTING states explicitly that the loop's own conventions (`Smell-audited:`, debt rows, ADRs, per-task notes) are NOT required of an outside contributor. Internal discipline should not become an entry toll. - SECURITY's supported-version table said `1.0.0-rc.*` / `1.0.0-alpha.*` while releases had reached v1.5.1; it now names the newest 1.x line and main. - README's note said "first stable release (1.0.0)" and "Issues and Pull Requests are not being accepted"; both were stale as of this commit.
1 parent 77f690a commit e897cbf

7 files changed

Lines changed: 283 additions & 44 deletions

File tree

‎.github/CONTRIBUTING.md‎

Lines changed: 65 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -1,48 +1,87 @@
11
# Contributing to ClojureWasm
22

3-
Thanks for your interest. ClojureWasm is an early-stage runtime built by a very
4-
small team, so **Issues and Pull Requests are currently paused**. The most useful
5-
things you can do right now are to **read along, try it, and report behaviour that
6-
differs from JVM Clojure** — please do that in
7-
[GitHub Discussions](https://github.com/clojurewasm/ClojureWasm/discussions) and
8-
mention `@chaploud`.
3+
Thanks for your interest. **Issues and Pull Requests are open.** This is a
4+
small project, so replies can take a while — but the queue is real and it gets
5+
read.
96

10-
## Reporting a divergence from Clojure
7+
## The most useful thing you can do
8+
9+
**Report Clojure code that behaves differently here than on the JVM.**
1110

1211
ClojureWasm targets behavioural equivalence with JVM Clojure on the
13-
user-observable surface. If you find an expression that behaves differently:
12+
user-observable surface. Every divergence you find is either a bug or a gap
13+
that has not been written down yet — and finding them from the outside is worth
14+
more than anything else, because a project cannot easily see its own blind
15+
spots.
16+
17+
There is a [Clojure divergence issue template](https://github.com/clojurewasm/ClojureWasm/issues/new?template=divergence.yml)
18+
that asks for the three things that make such a report actionable: the
19+
expression, what `cljw` prints, and what a JVM REPL prints.
1420

15-
1. Check whether it is already a known, intentional difference in
16-
[`docs/clojure_vs_clojurewasm.md`](../docs/clojure_vs_clojurewasm.md).
17-
2. If not, start a
18-
[Discussion](https://github.com/clojurewasm/ClojureWasm/discussions) with the
19-
expression, what `cljw` prints, and what a JVM Clojure REPL prints.
21+
Some differences are deliberate — check
22+
[`docs/clojure_vs_clojurewasm.md`](../docs/clojure_vs_clojurewasm.md) first. If
23+
one is listed there and you think the reasoning is wrong, that is a good
24+
Discussion.
2025

2126
## Working on the code
2227

2328
```sh
2429
direnv allow # one-time: load Zig 0.16.0 via Nix (or: nix develop)
2530
zig build -Dwasm -Doptimize=ReleaseSafe # build the Wasm-enabled `cljw` binary
26-
bash test/run_all.sh # the full test suite must be green before a change lands
31+
bash test/run_all.sh --serial-e2e # the full gate; must be green before a change lands
2732
```
2833

29-
`test/run_all.sh` runs the full gate; if a run flakes on a concurrency test, the
30-
serial mode (`bash test/run_all.sh --serial-e2e`) is authoritative.
34+
For a quick loop while iterating, `bash test/run_all.sh --smoke <e2e-step>`
35+
runs the unit tests, the dual-backend differential oracle, the linter, and the
36+
one end-to-end step you touched — tens of seconds instead of ~20 minutes. Run
37+
the full gate before you open the PR.
38+
39+
Branch from `main` as `develop/<short-slug>`, open a PR, and let CI run. CI
40+
runs the same gate on macOS and Linux; a green CI is what merges.
41+
42+
### What we do **not** ask of you
43+
44+
This repository is developed largely by an autonomous loop working under
45+
written guardrails, and that loop follows conventions that exist to keep *it*
46+
honest. **None of them apply to your contribution:**
47+
48+
- You do not need a `Smell-audited:` line in your commit message.
49+
- You do not need to add a row to `.dev/debt.yaml`.
50+
- You do not need to write an ADR, a per-task note, or a ROADMAP amendment.
51+
- You do not need to match the commit-message style of the surrounding history.
52+
53+
Write a clear commit message, keep the gate green, and that is enough. If a
54+
change turns out to need a design record, writing it is the maintainer's job,
55+
not yours.
56+
57+
### What helps a PR land
58+
59+
- **One concern per PR.** A 30-line fix with a test merges; a 600-line
60+
refactor bundled with a fix stalls.
61+
- **A test that fails before your change and passes after it.** The test
62+
taxonomy is in [`.claude/rules/test_taxonomy.md`](../.claude/rules/test_taxonomy.md);
63+
in short, unit tests live in `test "..."` blocks next to the code and CLI
64+
behaviour lives in `test/e2e/*.sh`.
65+
- For a `clojure.core` behaviour change, **a line in the relevant corpus under
66+
`test/diff/clj_corpus/`**, so the behaviour stays checked against real `clj`
67+
from then on.
68+
69+
A note on provenance: much of this codebase is machine-written under human
70+
review and direction. Contributions from people are very welcome and are
71+
reviewed the same way — on whether the code is right, not on who wrote it.
3172

32-
The project follows a TDD loop (red → green → refactor) and keeps tests green on
33-
every commit. The development workflow, design principles, and the amendment
34-
process for the roadmap are documented in [`CLAUDE.md`](../.claude/CLAUDE.md) and
35-
[`.dev/`](../.dev/) (ROADMAP, decision records, principles). Load-bearing
36-
decisions are recorded as ADRs under [`.dev/decisions/`](../.dev/decisions/).
73+
## Design context, if you want it
3774

38-
A note on provenance: much of this codebase is written by an autonomous
39-
development loop under written guardrails and ADR discipline. Human review and
40-
direction set the rails; contributions from people are very welcome and reviewed
41-
the same way.
75+
Load-bearing decisions are recorded as ADRs under
76+
[`.dev/decisions/`](../.dev/decisions/); the plan and its principles live in
77+
[`.dev/ROADMAP.md`](../.dev/ROADMAP.md); the development loop itself is
78+
described in [`.claude/CLAUDE.md`](../.claude/CLAUDE.md). None of this is
79+
required reading to send a patch — it is there if you want to know why
80+
something is the way it is.
4281

4382
## Getting in touch
4483

45-
Questions and discussion are welcome in
84+
Open-ended questions belong in
4685
[GitHub Discussions](https://github.com/clojurewasm/ClojureWasm/discussions);
4786
the wider Clojure community also gathers on the
4887
[Clojurians Slack](https://clojurians.slack.com).

‎.github/ISSUE_TEMPLATE/bug.yml‎

Lines changed: 70 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,70 @@
1+
name: "🐛 Bug"
2+
description: A crash, a hang, wrong output, or a build failure
3+
title: "[bug] "
4+
labels: ["bug"]
5+
body:
6+
- type: markdown
7+
attributes:
8+
value: |
9+
If the bug is "this Clojure code gives a different answer than the JVM",
10+
please use the **Clojure divergence** template instead — it asks for the
11+
comparison that makes such a report actionable.
12+
13+
Crashes and hangs are the highest-priority reports here. A crash in the
14+
WebAssembly FFI or the sandbox may be a security issue — in that case
15+
please use [private vulnerability reporting](https://github.com/clojurewasm/ClojureWasm/security/advisories/new)
16+
rather than a public issue.
17+
18+
- type: textarea
19+
id: repro
20+
attributes:
21+
label: How to reproduce
22+
description: The exact command or code. Smaller is better.
23+
render: shell
24+
placeholder: cljw -e '(future (throw (ex-info "x" {})))'
25+
validations:
26+
required: true
27+
28+
- type: textarea
29+
id: expected
30+
attributes:
31+
label: What you expected
32+
validations:
33+
required: true
34+
35+
- type: textarea
36+
id: actual
37+
attributes:
38+
label: What happened
39+
description: Paste the output, error, or stack trace verbatim.
40+
render: text
41+
validations:
42+
required: true
43+
44+
- type: input
45+
id: version
46+
attributes:
47+
label: cljw version
48+
description: Output of `cljw --version`.
49+
validations:
50+
required: true
51+
52+
- type: input
53+
id: platform
54+
attributes:
55+
label: Platform and install method
56+
placeholder: macOS aarch64, brew / Linux x86_64, built from source
57+
validations:
58+
required: true
59+
60+
- type: dropdown
61+
id: wasm
62+
attributes:
63+
label: Does it involve the WebAssembly FFI?
64+
options:
65+
- "No"
66+
- "Yes — wasm/load or wasm/call"
67+
- "Yes — a component required as a namespace"
68+
- "Not sure"
69+
validations:
70+
required: true

‎.github/ISSUE_TEMPLATE/config.yml‎

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,14 @@
1-
# Issues are paused for ClojureWasm (small, resource-limited project).
2-
# Route everything to Discussions; disable blank issues.
1+
# Issues are open. Blank issues stay disabled so every report starts from a
2+
# template that asks for the one or two facts that make it actionable.
33
blank_issues_enabled: false
44
contact_links:
5-
- name: 💬 Questions, bugs & Clojure divergences → Discussions
5+
- name: 💬 Questions, ideas, "is this supposed to work?"
66
url: https://github.com/clojurewasm/ClojureWasm/discussions
77
about: >-
8-
Issues and Pull Requests are currently paused. Please start a Discussion
9-
and mention @chaploud. Reports of behaviour that differs from JVM Clojure
10-
are especially welcome.
8+
Anything open-ended belongs in Discussions rather than an issue — usage
9+
questions, design conversations, showing what you built.
1110
- name: 🔒 Report a security vulnerability (private)
1211
url: https://github.com/clojurewasm/ClojureWasm/security/advisories/new
1312
about: >-
1413
Do NOT report security problems in public. Use private vulnerability
15-
reporting — see SECURITY.md.
14+
reporting — see SECURITY.md for scope and what to include.
Lines changed: 73 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,73 @@
1+
name: "🔀 Clojure divergence"
2+
description: Code that behaves differently on cljw than on JVM Clojure
3+
title: "[divergence] "
4+
labels: ["divergence"]
5+
body:
6+
- type: markdown
7+
attributes:
8+
value: |
9+
This is the most valuable report you can file. ClojureWasm targets
10+
behavioural equivalence with JVM Clojure on the user-observable
11+
surface, so a difference is either a bug or a gap we have not written
12+
down yet.
13+
14+
Before filing, it is worth a glance at
15+
[`docs/clojure_vs_clojurewasm.md`](https://github.com/clojurewasm/ClojureWasm/blob/main/docs/clojure_vs_clojurewasm.md)
16+
— some differences are deliberate and already recorded there. If yours
17+
is listed, no need to file; if you think the reasoning is wrong, a
18+
Discussion is the better place for that.
19+
20+
- type: textarea
21+
id: expr
22+
attributes:
23+
label: The expression
24+
description: The smallest form that shows the difference.
25+
render: clojure
26+
placeholder: (map inc [1 2 3])
27+
validations:
28+
required: true
29+
30+
- type: textarea
31+
id: cljw
32+
attributes:
33+
label: What cljw prints
34+
description: Paste the output verbatim, including any error.
35+
render: text
36+
validations:
37+
required: true
38+
39+
- type: textarea
40+
id: clj
41+
attributes:
42+
label: What a JVM Clojure REPL prints
43+
description: Verbatim again. If you cannot run a JVM REPL, say so and we will check.
44+
render: text
45+
validations:
46+
required: true
47+
48+
- type: input
49+
id: version
50+
attributes:
51+
label: cljw version
52+
description: Output of `cljw --version`.
53+
placeholder: ClojureWasm v1.5.1 (ReleaseSafe, wasm)
54+
validations:
55+
required: true
56+
57+
- type: input
58+
id: platform
59+
attributes:
60+
label: Platform
61+
placeholder: macOS aarch64 / Linux x86_64 / installed via brew
62+
validations:
63+
required: true
64+
65+
- type: textarea
66+
id: context
67+
attributes:
68+
label: Anything else
69+
description: >-
70+
Optional. If you hit this inside a real library, naming it helps —
71+
library compatibility is tracked in `docs/works/ladder.md`.
72+
validations:
73+
required: false

‎.github/ISSUE_TEMPLATE/missing.yml‎

Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
name: "🧩 Missing var, namespace, or library support"
2+
description: Something from Clojure or a library that cljw does not have yet
3+
title: "[missing] "
4+
labels: ["missing"]
5+
body:
6+
- type: markdown
7+
attributes:
8+
value: |
9+
cljw implements most of `clojure.core` and a growing set of standard
10+
namespaces, but not all of it, and some of it never will be — anything
11+
that requires the JVM class system (`gen-class`, `proxy` against real
12+
Java base classes, `bean`'s reflective variant) is permanently out of
13+
scope, recorded in [`data/compat_tiers.yaml`](https://github.com/clojurewasm/ClojureWasm/blob/main/data/compat_tiers.yaml).
14+
15+
Telling us *what you were trying to do* matters more than the var name
16+
— often there is a supported path, and if there is not, the use case is
17+
what decides the priority.
18+
19+
- type: input
20+
id: what
21+
attributes:
22+
label: What is missing
23+
placeholder: clojure.core/load-file, or clojure.spec.alpha, or next.jdbc
24+
validations:
25+
required: true
26+
27+
- type: textarea
28+
id: usecase
29+
attributes:
30+
label: What you were trying to do
31+
description: The actual task, not just the missing name.
32+
validations:
33+
required: true
34+
35+
- type: textarea
36+
id: error
37+
attributes:
38+
label: What cljw said
39+
description: The error output, if you got one.
40+
render: text
41+
validations:
42+
required: false
43+
44+
- type: input
45+
id: version
46+
attributes:
47+
label: cljw version
48+
validations:
49+
required: true

‎.github/SECURITY.md‎

Lines changed: 12 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -9,13 +9,18 @@ reports seriously.
99

1010
## Supported versions
1111

12-
ClojureWasm is currently **pre-1.0** (`1.0.0-rc.*` / `1.0.0-alpha.*`). Security
13-
fixes land on the `main` branch and the newest pre-release tag.
14-
15-
| Version | Supported |
16-
|-------------------------|-----------|
17-
| `1.0.0-rc.*` / `main` | ✅ |
18-
| earlier `1.0.0-alpha.*` | ❌ |
12+
Security fixes land on the `main` branch and in the next release cut from it.
13+
Only the newest release line is supported — this is a small project and there
14+
is no backport branch.
15+
16+
| Version | Supported |
17+
|--------------------------------|-----------|
18+
| `main` | ✅ |
19+
| newest `1.x` release | ✅ |
20+
| any older release | ❌ |
21+
22+
If you are on Homebrew, `brew upgrade clojurewasm/tap/cljw` puts you on the
23+
supported line.
1924

2025
## Reporting a vulnerability
2126

‎README.md‎

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -17,10 +17,14 @@
1717
</p>
1818

1919
> [!NOTE]
20-
> ClojureWasm has reached its first stable release (**1.0.0**), but it is built by
21-
> a very small team with limited resources. To keep that focus, **Issues and Pull Requests are not
22-
> being accepted** right now. You are very welcome to read along, try it, and
23-
> say hello in [GitHub Discussions](https://github.com/clojurewasm/ClojureWasm/discussions).
20+
> ClojureWasm is stable and released regularly; the current line is **1.x**
21+
> (see [Releases](https://github.com/clojurewasm/ClojureWasm/releases)). It is
22+
> built by a very small team, so replies can take a while — but
23+
> [Issues](https://github.com/clojurewasm/ClojureWasm/issues) and Pull Requests
24+
> are open. **The single most useful thing you can report is Clojure code that
25+
> behaves differently here than on the JVM**; there is an issue template for
26+
> exactly that. Questions and general discussion are welcome in
27+
> [Discussions](https://github.com/clojurewasm/ClojureWasm/discussions).
2428
2529
## What it is
2630

0 commit comments

Comments
 (0)