neuron-explorer
Qwen3.5‑4B 전용 조향형 뉴런 탐색기, 모든 MLP 뉴런을 밀어 결과를 보관·탐색
개인 계정의 공개 저장소 소유자는 GitHub로 로그인해 운영자를 확인하고 소개를 직접 관리할 수 있습니다. 관리자 승인은 필요하지 않습니다.
로그인한 뒤 확인 파일을 만들어 이 저장소의 기본 브랜치에 30분 안에 커밋해 주세요. 다른 브랜치나 포크의 파일은 인정하지 않습니다. 파일을 올린 뒤 아래에서 확인하면 관리자 승인 없이 관리할 수 있습니다. 자격을 유지하려면 파일을 남겨 두세요.
로그인이 필요하면 로그인 화면으로 이동합니다. 로그인 후 이곳으로 돌아와 원하는 확인 버튼을 다시 눌러 주세요.
프로젝트 폴더에서 /nomorevibe verify를 실행하면 소유권을 확인하고 소개를 직접 관리할 수 있습니다.
1분 만에 확인하기README 전체를 불러오는 중입니다. 아래는 저장된 발췌입니다.
A physically-based simulator of a projected spherical display, and an alignment
solver that calibrates one from camera images.
The two are deliberately independent. They share no geometry code, no
projection math, and no distortion model — only a JSON document and the prose
describing what its numbers mean. If they shared implementation, the solver
would be inverting the simulator's own arithmetic, every recovery score would be
circular, and the project would be worthless. tools/boundary-lint.ts fails the
build on any import across that line.README 전문 보기 ↗A physically-based simulator of a projected spherical display, and an alignment solver that calibrates one from camera images.
The two are deliberately independent. They share no geometry code, no
projection math, and no distortion model — only a JSON document and the prose
describing what its numbers mean. If they shared implementation, the solver
would be inverting the simulator's own arithmetic, every recovery score would be
circular, and the project would be worthless. tools/boundary-lint.ts fails the
build on any import across that line.
Open the simulator — it runs in your browser, installs nothing, and uploads nothing. Every file you give it is read in the page.
Four projectors ring a 68-inch ball and paint one image between them. Press Bump all 4: the worst grid-line error jumps from hundredths of a millimetre to over a hundred, the badge turns red, and the seam inspector shows two projectors drawing the same coastline in different places. Press Recalibrate and the solver photographs the sphere with structured light and works out where the lenses actually are — about ten seconds, and the error comes back under a millimetre. It does not undo the bump. The sliders still read what you moved; the picture is correct again because the software now knows where the light comes from.
Drop a .glb and the same machinery runs on your own geometry: the model is
traced, lit, blended, segmented by ray cast, and calibrated. Accuracy on an
arbitrary mesh is not yet the sphere's — see docs/ARBITRARY-SHAPES.md for what
is measured and what is still open.
The developer harness is the same engine with its cover off: one WebGL2 context, five viewports, and every slider labelled with the provenance class of the constant it moves.
The projector emitter is the
one page meant for a real sphere rather than a simulated one. Opened full-screen
on the framebuffer a Science On a Sphere installation drives, it plays the same
structured-light sequence into one projector's raster at a time, with nothing
installed on the display machine. It is Phase 1 of docs/OPERATOR-PATH.md:
docs/CALIBRATE.md is the field card that goes with it. The same page reads a
camera position's photographs back and says what they were worth, and both
documents are candid that it has read only rendered and synthesised
photographs, never a real one, and stops short of a pose.
These pages are published from main by
.github/workflows/pages.yml, and
.github/workflows/solve-smoke.yml drives
both calibration paths through a real browser nightly.
| Document | What it is |
|---|---|
docs/PARAMETERS.md | The spec. Authoritative for every physical constant, its provenance class, and its uncertainty |
docs/ARCHITECTURE.md | Package layout, the phase gate, the Phase 1 loop decomposition |
docs/AMENDMENTS.md | Ambiguities found while implementing the spec. Proposed, never silently applied |
packages/calibration/README.md | The boundary object, and why it contains no code |
packages/bench/README.md | The scorer: how a solve is graded, how the gauge is removed, and how to read bench-results.json |
packages/experiments/README.md | The measurements. Each runs once and is not iterated |
packages/meshio/README.md | The model-file reader, and why a loader cannot live where either model can reach it |
packages/web/README.md | The interactive simulator. Walk around a projected sphere; press one button to run a real calibration in the browser |
PARAMETERS.md classifies every constant by where it came from. That classification drives how the work is sequenced:
DOC, CFG, or SOLVE. Ground truth is
free — the simulator knows the true poses — so geometry gets optimized in a
loop against injected misalignment with fresh seeds every round.ASSUME or MEAS. Nobody has measured
them. So photometry gets built and tested but not optimized, and every
photometric metric is marked PROVISIONAL in the report. Optimizing against
unmeasured constants produces confident nonsense.The same rule is applied to the project's own resource accounting, which is why
npm run usage reports two halves with different standing rather than one
number: the cost is measured token counts at published rates, the
environmental impact is those counts through a chain of non-public constants,
and only the first can be quoted. See
docs/USAGE-ACCOUNTING.md.
npm install # one dev dependency: typescript. zero runtime deps
npm run ci # boundary lint, typecheck, tests
npm run bench # headless deterministic bench -> bench-results.json + PNGs
npm run gate # judge bench-results.json against §7; exits non-zero on an
# unwaived gate failure. See gate-waivers.json.
npm run experiments # experiments 2 and 3, each run once
npm run experiment1 # experiment 1: camera count, resolution, floor reference,
# and each degradation on its own. ~2 h; --list prints the budget
npm run experiment4 # experiment 4: what the room behind the sphere costs the
# solve, and whether a decoder threshold can reject it. ~9 min
npm run build:web # compile sim + calibration + harness to browser ESM
npm run harness # developer harness on http://localhost:8173/
npm run build:app # compile sim + solver + bench + the app to browser ESM
npm run app # interactive simulator on http://localhost:8174/
npm run smoke:app # load the app in a real browser: does the shader compile?
npm run build:site # assemble site/ — the app, the harness and the progress page
npm run usage # what this project cost, in dollars and (PROVISIONALLY) in kWh,
# litres and kgCO2e. --html <path> writes the shareable page
npm run pack:skill # build dist/usage-report.skill — the portable form of the
# above, installable in any Claude Code project
npm run check:citation # CITATION.cff and package.json must name the same version;
# the release workflow tags whatever package.json says
npm run check:license # every source file carries an SPDX header
node tools/license-header.ts --fix # add the header to files that lack one
node packages/bench/src/validation.ts # regenerate validation/index.html (reads local files only;
# images are never fetched — the owner supplies them)
Node 22.18+ runs the TypeScript directly; there is no build step for anything but the browser bundle.
Both servers bind loopback only. They read repository files under /repo/, so
the default is deliberate; HOST=0.0.0.0 npm run app opens them to the network
when that is what you want — a tablet beside the sphere, say — and the terminal
then prints the address it actually bound rather than localhost.
A release is cut from main whenever package.json names a version that has no
tag yet, so cutting one is a deliberate one-line commit rather than a side effect
of merging. CITATION.cff has to move in the same commit — check:citation
fails CI otherwise, which catches a mismatched release before a DOI is minted
rather than after.
Archived on Zenodo. Cite the concept DOI — 10.5281/zenodo.22101428
— which always resolves to the newest version; a version DOI pins a reader to
whatever release was current when they wrote.
Licensed under Apache 2.0 — see LICENSE, with the copyright
holder and the NOAA trademark disclaimer in NOTICE. Every source file
carries a two-line SPDX header, enforced by check:license; the short form
rather than the full sixteen-line boilerplate, because 186 of 191 files open with
a doc comment explaining what they are for and burying those was the wrong trade. check:citation
keeps the licence named consistently in package.json and CITATION.cff, so a
release cannot be cut claiming terms the repository does not carry.
v0.1.0 was tagged before the licence landed, so it is archived under GitHub's default of all-rights-reserved. v0.1.1 is the first release anyone can actually use — cite that one.
From PARAMETERS.md §4.2 and §4.3. They are counterintuitive, so they are asserted in tests and rendered as a static reference on the progress page:
If the code contradicts any of these, the code has a bug.
Phase 1 (geometry) is the active loop. Phase 2 (photometry) is build-only by design. See the progress page for live metrics against gates, solver residual scatter, and the three experiment results.
Science On a Sphere® is a registered trademark of NOAA. This is an independent simulator and is not a NOAA product.
packages/harness/README.md| The developer harness, and exactly which links of the GPU↔CPU parity chain are verified by execution |
validation/README.md | Photographs of real installations beside our render. Plausibility only — no metric, no gate, no score |
docs/EXPERIMENT-1.md | How many photographs a calibration needs, and whether a phone suffices. Measured |
docs/VISIT.md | The ground-truth visit field card. What to measure, in cut order, with framing diagrams |
docs/OPERATOR-PATH.md | How a real sphere would actually get calibrated, and why none of it is built yet. The plan, ordered by what stops an operator rather than by what is interesting |
docs/CALIBRATE.md | The calibration field card. What an operator does at the sphere, and the three steps of it that are not built yet |
docs/EXPERIMENT-8.md | What a dropped photograph costs, and whether anything notices. The measurement that picks between Phase 2's candidate mechanisms for working out which frame a photograph shows — and the one that says the bookends are worth having and not sufficient, then closes their blind spot with a fourth mechanism that is just as cheap |
docs/ARBITRARY-SHAPES.md | Feasibility study, and the running record of building it. What it takes to render an uploaded GLB with projectors anywhere, and where the sphere is load-bearing. Phases 0-4 are implemented: a .glb dropped on the page is traced, lit, blended, and lit by any number of projectors placed anywhere — and Phase 2 put the mesh on the GPU, so the live view traces the dropped model rather than a sphere. A Bourke warp-and-blend file is written by packages/sim/src/warp.ts, and the projector card's warp-mesh tab now saves one per lit projector beside the drawing of the correction it carries. Phase 5's calibrated solve has landed and the page runs it: drop a .glb, press Solve, and the capture photographs the model while the bundle fits it — four tri-axial bodies at the rig's radius recover to 8-14 mm across three noise seeds on the page's own configuration, where the analytic sphere gets 8-17 — with the sphere path byte-identical across the twelve-scenario baseline. The bench corpus now carries a thirteenth scenario whose body is a tri-axial ellipsoid, judged in CI on the recovery gates and paired with nominal so the difference is the body alone: the sphere's position error across three seeds, better camera rotation on every seed, and two to four times the projector rotation on two of them, recorded there as the one measured cost. Measured there too: a NEARLY spherical mesh is less accurate than the sphere it approximates, and with the curve's normal in the Jacobian (BundleOptions.meshNormal: 'smooth', off by default) every near-spherical row that converged improved, all but one into the sphere's own range, while two rows of twelve stopped with the damping at its cap. Four attempts to close that gap from the optimiser's side all failed: a hybrid finishing with the facet derivative (built twice), the estimating-equation merit that reading proposed, and a curved-interpolant residual — the last refuted without building it, because on a tessellated sphere the curved patch IS the analytic sphere to three orders under the noise floor, and the codebase already had the seam to fit one. Then the reason the whole line failed turned out to be the fixture: every measurement above photographs the tessellation AND fits it, which is the one configuration a real capture never has, since a visitor's .glb approximates a body rather than defining it. Photograph the body the mesh approximates and the damping stalls that motivated all four remedies mostly go away — 2 rows in 12 becomes 16 in 360 — so they are largely an artifact of the test rig rather than a property of meshes. Two registered seed sweeps, 540 solves over sixty seeds, then priced a vertex budget and overturned the reading built on three seeds: against an analytic floor of 33.4 mm a tessellation costs 51.3 mm at 32x64, 22.7 at 64x128 and 0.3 at 192x384, so at fine tessellation it is nearly free. They also found that the whole line of work had been reading one of the two recovery quantities PARAMETERS.md gates. On position the smooth Jacobian buys nothing a permutation test can separate from seed variance; on ROTATION it lowers the worst projector's error at every tessellation, winning 152 paired rows of 180 — while stalling 13 times where the facet mode stalls none. It also now carries the crease guard its own docblock had described and never built: across a fold the interpolated normal is the bisector of two facet normals, and a ray reaches that singular set at ordinary incidence, which no fixture in the repository could show because every one of them gives each face its own vertices. The guard is not a crease detector — no threshold on the quantity it can see separates creased bodies from coarse smooth ones — but a floor at the measured point where the interpolated normal stops being the better approximation, and it cost a fifth of the rotation effect and ten of the thirty-three gate rows to install, on bodies that are all crease-free. So the mode stays, still off by default, as a mode with a measured regime rather than an unselected option; the mesh path's accuracy is still open |
docs/USAGE-ACCOUNTING.md | What building this cost, in dollars and in kilowatt-hours. The bill is measured; the environmental figure is PROVISIONAL |
skills/usage-report/SKILL.md | The same accounting as an installable, project-agnostic Claude Code skill |