Skip to content
Merged
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
2 changes: 1 addition & 1 deletion .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -38,7 +38,7 @@ jobs:
- name: Set up Node
uses: actions/setup-node@820762786026740c76f36085b0efc47a31fe5020
with:
node-version: "22"
node-version: "24"
cache: npm
cache-dependency-path: synaplex/site/package-lock.json
- name: Install Python gates
Expand Down
1 change: 1 addition & 0 deletions .nvmrc
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
24
70 changes: 70 additions & 0 deletions docs/dependency-migration-2026-07.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,70 @@
# July 2026 dependency migration

This receipt records the deliberate consolidated upgrade of the public site and
Python repository gates. It is a maintenance result, not scientific Evidence.

## Adopted runtime and packages

- Node 24 LTS locally and in GitHub CI; `site/package.json` constrains the site
build to Node 24.
- Astro 7.1.3, `@astrojs/mdx` 7.0.3, and `@astrojs/sitemap` 3.7.3.
- Tailwind CSS 4.3.3 and `@tailwindcss/vite` 4.3.3. The deprecated
`@astrojs/tailwind` integration was removed.
- Ruff 0.16.0 and mypy 2.3.0.
- Range-compatible transitive security updates to sharp 0.35.3 and svgo 4.0.2.
The consolidated lock also contains devalue 5.8.2 and postcss 8.5.23.

## Breaking-change assessment

Astro 7 moves the site to Vite 8 and removes or changes deprecated interfaces.
This static site does not use the removed database, transition-internals,
container-renderer, or reserved `src/fetch.ts` paths. Its production build is
therefore covered by the normal static-output route inventory.

Astro documents the Tailwind Vite plugin as the preferred Tailwind 4 path and
the old Astro integration as deprecated. Tailwind 4 replaces the `@tailwind`
directives with a CSS import and raises its browser floor to Safari 16.4,
Chrome 111, and Firefox 128. The site uses no Tailwind utility classes whose
names or semantics changed. Retaining Tailwind Preflight was necessary to
preserve the existing reset and presentation.

Ruff 0.16 expands its default rules substantially and changes Markdown
formatting behavior. Synaplex selects only `E9`, `F63`, `F7`, and `F82`, excludes
the governed eval corpus, and does not invoke `ruff format`; the expanded
defaults and Markdown formatter therefore do not silently broaden the gate.
The upgraded binary passed the complete repository lint target.

Mypy 2.x drops Python 3.9 as a host runtime and changes several defaults,
including local partial types and strict bytes. Synaplex already requires and
checks Python 3.12, and mypy 2.3.0 passed the maintained publication and
configuration boundary without suppressions or compatibility edits. The
upcoming native-parser default remains outside this migration.

Primary upgrade references:

- <https://docs.astro.build/en/guides/upgrade-to/v7/>
- <https://docs.astro.build/en/guides/styling/#tailwind>
- <https://tailwindcss.com/docs/upgrade-guide>
- <https://github.com/astral-sh/ruff/releases/tag/0.16.0>
- <https://mypy.readthedocs.io/en/stable/changelog.html#mypy-2-3>

## Deterministic and visual verification

`make check` passed under Node 24.18.0, including Ruff, mypy, 54 unittests,
strict JSON Schema validation, the mechanically blocked experiment check,
19/19 external canon conformance fixtures, two accepted prompt baseline
contracts, projection generation, deploy-contract validation, and a 24-page
Astro build. `npm audit --audit-level=high` reported zero vulnerabilities.

Chromium 1440x1000 full-page comparisons used the same browser executable and
viewport before and after the migration:

| Route | Pre/post dimensions | Mean absolute RGB delta | Changed-channel ratio |
| --- | --- | ---: | ---: |
| `/` | 1440x2950 / 1440x2950 | 0.0220 | 0.000245 |
| `/lineage/ai-native/` | 1440x2032 / 1440x2032 | 0.0113 | 0.000198 |

Both retained `rgb(242, 240, 233)` as the root background and the same body font
stack; the lineage headline remained 100.8px. The new
`/lineage/cadence/` route was separately rendered and inspected, including its
“Not a Claim. Not Evidence. Not a finding. Not a current study.” boundary.
2 changes: 1 addition & 1 deletion knowledge/generate.py
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@
CONJECTURES_SCHEMA = ROOT / "reasoning" / "conjectures" / "conjectures.schema.json"
LIFECYCLE_SCHEMA = ROOT / "lab" / "evals" / "experiment-lifecycle.schema.json"
OUTPUT = ROOT / "knowledge" / "public-projection.json"
VERSION = "1.2.0"
VERSION = "1.3.0"
DECISION_KINDS = {"promote", "kill", "continue", "pivot", "amend_policy", "rollback_policy"}
ACCEPTING_DECISION_KINDS = {"promote"}

Expand Down
37 changes: 36 additions & 1 deletion knowledge/lineage-artifacts.json
Original file line number Diff line number Diff line change
@@ -1,8 +1,43 @@
{
"schema_version": "1.0.0",
"generated_at": "2026-07-26T20:15:00Z",
"generated_at": "2026-07-26T23:58:00Z",
"digest_method": "sha256 of `git archive --format=tar <source_commit>` bytes",
"artifacts": [
{
"id": "lineage:cadence",
"slug": "cadence",
"title": "Cadence",
"repository_url": "https://github.com/evanfollis/cadence",
"source_commit": "dd58ce4e1a6cc0baa777d4096c0d0a1710654c8a",
"snapshot_digest": "sha256:c5cfd850f7021c9e9760ad5f2c7f0e1899ad03249fd50852f493ecf3645666f3",
"license_status": "missing",
"lifecycle": "archived",
"summary": "An early AI-native orchestration prototype with agent roles, an orchestrator, audit trails, and rollback machinery; retained as superseded implementation lineage.",
"verification": {
"status": "partial",
"observed": "A clean, pinned source snapshot contains the canonical NORTH_STAR, agent-role and orchestration code, audit/event-log machinery, rollback paths, notebooks, and 12 tracked test files.",
"limits": "This migration performed a source inventory, not a validation run. The snapshot tracks roughly 3.1 MB of event and LLM logs plus roughly 3.1 MB of generated root state and notebooks, includes generated cache and package metadata, and has no LICENSE."
},
"retained_assets": [
{"label": "Canonical NORTH_STAR", "url": "https://github.com/evanfollis/cadence/blob/dd58ce4e1a6cc0baa777d4096c0d0a1710654c8a/docs/NORTH_STAR.md"},
{"label": "Development orchestrator", "url": "https://github.com/evanfollis/cadence/blob/dd58ce4e1a6cc0baa777d4096c0d0a1710654c8a/src/cadence/dev/orchestrator.py"},
{"label": "Agent event log", "url": "https://github.com/evanfollis/cadence/blob/dd58ce4e1a6cc0baa777d4096c0d0a1710654c8a/src/cadence/audit/agent_event_log.py"},
{"label": "Failed rollback test", "url": "https://github.com/evanfollis/cadence/blob/dd58ce4e1a6cc0baa777d4096c0d0a1710654c8a/tests/test_failed_rollback.py"}
],
"excluded_claims": [
"Cadence is a current Synaplex subsystem.",
"Tracked logs, notebooks, or generated state are scientific Evidence.",
"The presence of tests establishes a validated delivery result.",
"The archived implementation is production-ready or maintained."
],
"boundary": {
"is_claim": false,
"is_evidence": false,
"is_finding": false,
"is_current_study": false,
"statement": "Historical archived lineage only; the source inventory does not enter canon, a study denominator, or the public findings lane."
}
},
{
"id": "lineage:geometric-agent-primitives",
"slug": "geometric-agent-primitives",
Expand Down
4 changes: 2 additions & 2 deletions knowledge/lineage-artifacts.schema.json
Original file line number Diff line number Diff line change
Expand Up @@ -11,8 +11,8 @@
"digest_method": {"const": "sha256 of `git archive --format=tar <source_commit>` bytes"},
"artifacts": {
"type": "array",
"minItems": 4,
"maxItems": 4,
"minItems": 5,
"maxItems": 5,
"items": {"$ref": "#/$defs/artifact"}
}
},
Expand Down
55 changes: 51 additions & 4 deletions knowledge/public-projection.json
Original file line number Diff line number Diff line change
@@ -1,14 +1,14 @@
{
"projection_version": "1.2.0",
"generated_at": "2026-07-26T20:15:00Z",
"projection_version": "1.3.0",
"generated_at": "2026-07-26T23:58:00Z",
"counts": {
"research": 3,
"findings": 0,
"mechanisms": 3,
"engineering_cases": 3,
"sources": 18,
"conjectures": 4,
"lineage": 4
"lineage": 5
Comment on lines +2 to +11
},
"research": [
{
Expand Down Expand Up @@ -539,6 +539,53 @@
"statement": "Historical conceptual lineage only; no content is promoted into canon or a current study."
}
},
{
"id": "lineage:cadence",
"slug": "cadence",
"title": "Cadence",
"repository_url": "https://github.com/evanfollis/cadence",
"source_commit": "dd58ce4e1a6cc0baa777d4096c0d0a1710654c8a",
"snapshot_digest": "sha256:c5cfd850f7021c9e9760ad5f2c7f0e1899ad03249fd50852f493ecf3645666f3",
"license_status": "missing",
"lifecycle": "archived",
"summary": "An early AI-native orchestration prototype with agent roles, an orchestrator, audit trails, and rollback machinery; retained as superseded implementation lineage.",
"verification": {
"status": "partial",
"observed": "A clean, pinned source snapshot contains the canonical NORTH_STAR, agent-role and orchestration code, audit/event-log machinery, rollback paths, notebooks, and 12 tracked test files.",
"limits": "This migration performed a source inventory, not a validation run. The snapshot tracks roughly 3.1 MB of event and LLM logs plus roughly 3.1 MB of generated root state and notebooks, includes generated cache and package metadata, and has no LICENSE."
},
"retained_assets": [
{
"label": "Canonical NORTH_STAR",
"url": "https://github.com/evanfollis/cadence/blob/dd58ce4e1a6cc0baa777d4096c0d0a1710654c8a/docs/NORTH_STAR.md"
},
{
"label": "Development orchestrator",
"url": "https://github.com/evanfollis/cadence/blob/dd58ce4e1a6cc0baa777d4096c0d0a1710654c8a/src/cadence/dev/orchestrator.py"
},
{
"label": "Agent event log",
"url": "https://github.com/evanfollis/cadence/blob/dd58ce4e1a6cc0baa777d4096c0d0a1710654c8a/src/cadence/audit/agent_event_log.py"
},
{
"label": "Failed rollback test",
"url": "https://github.com/evanfollis/cadence/blob/dd58ce4e1a6cc0baa777d4096c0d0a1710654c8a/tests/test_failed_rollback.py"
}
],
"excluded_claims": [
"Cadence is a current Synaplex subsystem.",
"Tracked logs, notebooks, or generated state are scientific Evidence.",
"The presence of tests establishes a validated delivery result.",
"The archived implementation is production-ready or maintained."
],
"boundary": {
"is_claim": false,
"is_evidence": false,
"is_finding": false,
"is_current_study": false,
"statement": "Historical archived lineage only; the source inventory does not enter canon, a study denominator, or the public findings lane."
}
},
{
"id": "lineage:edg",
"slug": "edg",
Expand Down Expand Up @@ -654,5 +701,5 @@
}
}
],
"digest": "sha256:e551c363d097ddf4b8477ecc7a6157e2c5512fe775cd132daf3adb871424f773"
"digest": "sha256:4ae99babff63e92c607978f80e18a89c235868fd91b2bbf1a21c104945585e98"
}
2 changes: 1 addition & 1 deletion knowledge/public-projection.schema.json
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@
"additionalProperties": false,
"required": ["projection_version", "generated_at", "digest", "counts", "research", "findings", "mechanisms", "engineering_cases", "sources", "conjectures", "lineage"],
"properties": {
"projection_version": {"const": "1.2.0"},
"projection_version": {"const": "1.3.0"},
"generated_at": {"type": "string", "format": "date-time"},
"digest": {"type": "string", "pattern": "^sha256:[a-f0-9]{64}$"},
"counts": {
Expand Down
11 changes: 10 additions & 1 deletion knowledge/test_projection.py
Original file line number Diff line number Diff line change
Expand Up @@ -73,7 +73,16 @@ def test_lineage_is_typed_and_outside_epistemic_lanes(self):
schema, format_checker=Draft202012Validator.FORMAT_CHECKER
).validate(source)
projection = build_projection()
self.assertEqual(projection["counts"]["lineage"], 4)
self.assertEqual(projection["counts"]["lineage"], 5)
cadence = next(
artifact
for artifact in projection["lineage"]
if artifact["id"] == "lineage:cadence"
)
self.assertEqual(cadence["lifecycle"], "archived")
self.assertEqual(cadence["license_status"], "missing")
self.assertEqual(cadence["verification"]["status"], "partial")
self.assertIn("not a validation run", cadence["verification"]["limits"])
for artifact in projection["lineage"]:
self.assertEqual(
artifact["boundary"],
Expand Down
4 changes: 2 additions & 2 deletions pyproject.toml
Original file line number Diff line number Diff line change
Expand Up @@ -29,8 +29,8 @@ lab = [
"playwright==1.61.0",
]
dev = [
"mypy==1.17.1",
"ruff==0.12.7",
"mypy==2.3.0",
"ruff==0.16.0",
]

[project.scripts]
Expand Down
6 changes: 4 additions & 2 deletions site/astro.config.mjs
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
import { defineConfig } from 'astro/config';
import mdx from '@astrojs/mdx';
import sitemap from '@astrojs/sitemap';
import tailwind from '@astrojs/tailwind';
import tailwindcss from '@tailwindcss/vite';

// Canonical site URL. Production deploy target is synaplex.ai (apex).
// Override at build time with ASTRO_SITE env var for staging previews.
Expand All @@ -14,8 +14,10 @@ export default defineConfig({
integrations: [
mdx(),
sitemap(),
tailwind({ applyBaseStyles: false }),
],
vite: {
plugins: [tailwindcss()],
},
build: {
format: 'directory',
},
Expand Down
Loading