Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
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
54 changes: 54 additions & 0 deletions .github/workflows/atlas-assembly.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,54 @@
name: Integrate and validate Graph Atlas
on:
push:
branches: [design/graph-atlas-v0.6]
paths: ['.atlas/**', '.github/workflows/atlas-assembly.yml']
permissions:
contents: write
jobs:
integrate:
if: contains(github.event.head_commit.message, '[atlas assemble]')
runs-on: ubuntu-latest
timeout-minutes: 20
steps:
- uses: actions/checkout@v4
- uses: actions/setup-python@v5
with:
python-version: '3.12'
cache: pip
- run: python -m pip install -q -r requirements-dev.txt pillow
- name: Integrate reviewed source and the licensed paper scan
run: |
python .atlas/apply.py
rm -rf .atlas
node --check ui/graph-atlas.js
node scripts/test_graph_scene.cjs
python -m pytest -q --junitxml=test-results/atlas-unit.xml
python scripts/docs_tool.py check
- run: python -m playwright install chromium
- name: Test existing writing and the new graph editor
run: |
python scripts/ui_smoke.py
python scripts/ui_studio_smoke.py
python scripts/ui_science_smoke.py
python scripts/ui_graphify_smoke.py
python scripts/ui_polemic_smoke.py
python scripts/ui_voices_smoke.py
python scripts/ui_atlas_smoke.py
- name: Commit only ordinary verified source and assets
run: |
git add -A -- .atlas graphpaper ui scripts tests docs README.md CHANGELOG.md pyproject.toml
python scripts/prepare_assets.py --manifest
git add publish-manifest.json
git diff --cached --check
git config user.name 'github-actions[bot]'
git config user.email '41898282+github-actions[bot]@users.noreply.github.com'
git commit -m 'Integrate Graph Atlas and verified squared-paper asset'
git push origin HEAD:design/graph-atlas-v0.6
- uses: actions/upload-artifact@v4
if: always()
with:
name: atlas-integration-validation
path: |
test-results/
ui/graph-paper.jpg
107 changes: 107 additions & 0 deletions .github/workflows/atlas-release.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,107 @@
name: Graph Atlas hosted Windows release
on:
push:
branches: [main]
paths: ['graphpaper/__init__.py', '.github/workflows/atlas-release.yml']
workflow_dispatch:
permissions:
contents: read
concurrency:
group: graphpaper-atlas-release
cancel-in-progress: false
jobs:
validate:
runs-on: ubuntu-latest
timeout-minutes: 20
steps:
- uses: actions/checkout@v4
- uses: actions/setup-python@v5
with:
python-version: '3.12'
cache: pip
- run: test "$(python -c 'from graphpaper import __version__; print(__version__)')" = '0.6.0'
- run: python -m pip install -q -r requirements-dev.txt
- run: python -m pytest -q --junitxml=test-results/linux.xml
- run: node scripts/test_graph_scene.cjs
- run: python scripts/docs_tool.py check
- run: python -m playwright install chromium
- name: Seven browser suites against the real local server
run: |
python scripts/ui_smoke.py
python scripts/ui_studio_smoke.py
python scripts/ui_science_smoke.py
python scripts/ui_graphify_smoke.py
python scripts/ui_polemic_smoke.py
python scripts/ui_voices_smoke.py
python scripts/ui_atlas_smoke.py
- uses: actions/upload-artifact@v4
if: always()
with:
name: atlas-linux-validation
path: test-results/
windows:
needs: validate
runs-on: windows-latest
timeout-minutes: 30
permissions:
contents: write
steps:
- uses: actions/checkout@v4
- uses: actions/setup-python@v5
with:
python-version: '3.12'
cache: pip
- run: python -m pip install -q -r requirements-dev.txt -r requirements-desktop.txt
- run: python -m pytest -q --junitxml=test-results/windows.xml
- run: node scripts/test_graph_scene.cjs
- name: Verify the hosted WebView2 prerequisite
shell: pwsh
run: ./scripts/prepare_ci_webview.ps1
- name: Build with public Graphify and official Codex
shell: pwsh
env:
GITHUB_TOKEN: ${{ github.token }}
run: ./scripts/build_release.ps1
- name: Exercise the compiled native window and graph editing
run: python scripts/native_smoke.py --science --graphify --polemic --voices --atlas --executable dist/GraphPaper/GraphPaper.exe --out test-results/native-package
- uses: actions/upload-artifact@v4
with:
name: GraphPaper-v0.6.0-Windows-x64
path: |
dist/GraphPaper-v0.6.0-Windows-x64.zip
dist/SHA256SUMS.txt
- name: Publish only the tested archive
shell: pwsh
env:
GH_TOKEN: ${{ github.token }}
run: |
$ErrorActionPreference = 'Stop'
$tag = 'v0.6.0'
$package = 'GraphPaper-v0.6.0-Windows-x64.zip'
$revision = (git rev-parse HEAD).Trim()
$expected = ((Get-Content dist/SHA256SUMS.txt).Split(' ')[0]).Trim().ToLower()
$actual = (Get-FileHash "dist/$package" -Algorithm SHA256).Hash.ToLower()
if ($actual -ne $expected) { throw 'Archive checksum mismatch.' }
gh release view $tag *> $null
if ($LASTEXITCODE -eq 0) { throw 'Release already exists; refusing to overwrite it.' }
$notes = Get-Content docs/RELEASE-0.6.0.md -Raw
$notes += "`n`nValidation: https://github.com/$env:GITHUB_REPOSITORY/actions/runs/$env:GITHUB_RUN_ID . Source: $revision . Archive SHA-256: $actual .`n"
$notes | Set-Content test-results/published-release-notes.md -Encoding utf8
gh release create $tag "dist/$package" dist/SHA256SUMS.txt --target $revision --title 'GraphPaper 0.6.0 - Graph Atlas' --notes-file test-results/published-release-notes.md --draft
if ($LASTEXITCODE -ne 0) { throw 'Release upload failed.' }
$releases = gh api "repos/$env:GITHUB_REPOSITORY/releases?per_page=100" | ConvertFrom-Json
$release = $releases | Where-Object { $_.tag_name -eq $tag }
$asset = $release.assets | Where-Object { $_.name -eq $package }
if ($asset.digest -ne "sha256:$actual") { throw 'Uploaded archive differs from the tested package.' }
gh release edit $tag --draft=false --latest
if ($LASTEXITCODE -ne 0) { throw 'Release publication failed.' }
- name: Print native report
if: always()
shell: pwsh
run: |
if (Test-Path test-results/native-package/report.json) { Get-Content test-results/native-package/report.json }
- uses: actions/upload-artifact@v4
if: always()
with:
name: atlas-windows-validation
path: test-results/
141 changes: 0 additions & 141 deletions .github/workflows/voices-release.yml

This file was deleted.

4 changes: 4 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,3 +1,7 @@
# 0.6.0 — Graph Atlas

Real squared-paper sidebar, ink palette, orbitable graph with typed lines, dense-graph clusters, neighborhood focus, persistent node/edge editing and atomic one-step undo. Existing writing, sources and voices are preserved.

# Changelog

## 0.5.0
Expand Down
5 changes: 5 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -90,3 +90,8 @@ A graph suggests connections; it does not prove them. Science keeps capped searc
For implementation details, tests and builds, see the [developer guide](docs/DEVELOPMENT.md) and [architecture](docs/ARCHITECTURE.md). Recorded release validation is separate from the live CI badge: [test reports and scope](docs/QUALITY.md).

**[MIT licensed](LICENSE) · Created by Aron Bijl.** External runtimes and services retain their own licenses and terms.


## Graph Atlas

The new [editable spatial graph](docs/GRAPH-ATLAS.md) adds orbit, focus, clusters and colored relationships. The light sidebar uses [real scanned graph paper](docs/ASSET-CREDITS.md), not a generated mockup.
15 changes: 15 additions & 0 deletions docs/ASSET-CREDITS.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
# Interface asset credits

## Graph-paper sidebar

**Graph paper notepad (4562203394)**, a direct scan by **Calsidyrose**, 25 April 2010.

Source: https://commons.wikimedia.org/wiki/File:Graph_paper_notepad_(4562203394).jpg

Original source: https://www.flickr.com/photos/calsidyrose/4562203394/

License: **Creative Commons Attribution 2.0 Generic (CC BY 2.0)**, https://creativecommons.org/licenses/by/2.0/ .

GraphPaper bundles a resized JPEG of this scan as `ui/graph-paper.jpg`. The sidebar crops it through CSS and applies a translucent light overlay for legibility. No endorsement is implied. The image retains its own CC BY 2.0 license, separate from the MIT application code.

The graph canvas, interface icons and atlas mark are vector interface elements, not an AI-generated screenshot. No generated mockup is shipped as the interface.
29 changes: 29 additions & 0 deletions docs/GRAPH-ATLAS.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
# Graph Atlas

GraphPaper 0.6 replaces the cramped graph canvas with an editable spatial view and an ink/indigo workspace. The sidebar uses an actual scanned sheet of squared graph paper, bundled locally. It is not the earlier generated mockup.

## Explore without a wall of labels

Open an existing project and choose **Graph**. There is no extraction, model call or graph rebuild required for the new view. Drag the background to orbit; Shift-drag or middle-drag to pan; scroll to zoom. Drag individual nodes to arrange them for the current session. **2D** returns to a flat view. **Fit graph** or the overview inset recenters the scene. The expand button gives the graph most of the window.

The scene uses real x/y/z positions and perspective projection into accessible SVG, not a raster picture and not a WebGL dependency. It does not continuously simulate or rotate when idle. Camera and spacing preferences are remembered per project; manually dragged node positions are session-local.

Node colors and shapes identify ideas, claims, sources, evidence, people, events and other types. Connections have their own colors, line patterns and arrowheads. The legend distinguishes support, challenge, citation, sequence/cause, analogy/style and other relationships. These are visual groupings of existing relation labels, not newly inferred evidence. Select a line to see its exact label and direction.

Large graphs initially open as expandable **Clusters**, grouped using existing community/type information. The overview counts all represented nodes. Click a cluster to enter it. Select an idea and choose **Focus neighborhood** for its direct connections, or choose a two-hop view. Type and relationship filters narrow the scene. Search runs over the full stored graph, not only the initial visible nodes. When an individual view exceeds 500 nodes or 2,000 connections, the counts make that visible; use clustering, search or focus to inspect the rest.

**Layout & readability** contains spacing and smart/all/hidden label controls. Smart labels avoid overlapping labels while keeping the selected neighborhood readable. Keyboard users can Tab through nodes and lines, press Enter to select, use arrow keys to orbit, +/- to zoom, F to fit and 2/3 to switch views. The inspector also provides a text-based node browser.

## Click and edit

Select a node to edit its title, type and notes. Select a relationship to edit its label and notes, reverse its direction, or delete it. The toolbar adds nodes and connects existing nodes. Press **Save changes** to persist the edit. Unsaved form changes are identified; switching the selected item asks before discarding them.

Manual edits use a version-checked API. They preserve source files, exact quotation anchors, manuscripts, voices, outlines and existing angles. An edited relationship or claim is labeled **proposed**, rather than falsely retaining a sourced verification stamp. This is provenance bookkeeping, not a language filter. The graph editor does not weaken an author's wording or call a model.

**Undo last graph edit** restores the previous graph in one atomic operation, including the affected pins/exclusions. This one-step undo is stored locally and survives reopening the app. It refuses to overwrite an intervening rebuilt/imported graph. Deleting a node also deletes its incident connections; original sources and writing remain intact.

## What stays the same

Codex OAuth, model/reasoning controls, public Graphify extraction, reusable voice graphs, bounded JEV decisions, Polemic and Science remain available. This update changes the interface and adds explicit manual graph editing, not the authorial instructions or evidence pipeline. Tests use disposable projects, not a user's installed database.

[Graph and JEV](GRAPH-AND-JEV.md) · [Reusable voices](VOICE-GRAPHS.md) · [Asset credits](ASSET-CREDITS.md)
3 changes: 3 additions & 0 deletions docs/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -50,3 +50,6 @@ These Markdown files are the maintained source. [The documentation tooling](DEVE
## Reusable voices and bounded JEV decisions

[Save a voice graph once and reuse it across projects](VOICE-GRAPHS.md). Training pieces are separate from article evidence; current author instructions override saved preferences.


[Graph Atlas: spatial navigation and click-to-edit](GRAPH-ATLAS.md) · [Interface asset credits](ASSET-CREDITS.md)
Loading