typescript 7.0.2 is the native compiler and exports no JavaScript API, so
typescript-eslint cannot read it — it refuses TS 7 outright. It comes in
aliased as tsgo and does the typechecking through a new typecheck script;
typescript stays on the 6 line for the tools.
7 diagnostics before and after.
Co-authored-by: Hanzo Dev <[email protected]>
The purpose-prefixed labels (hanzo-build-*, hanzo-deploy-*, hanzo-docs-build-*)
are retired in favour of the bare <os>-<arch> every runner already advertises.
They were not a capability, only a habit, and the habit cost builds: papers asked
for hanzo-build-linux-amd64, no online runner offered it, and two idle
linux-amd64 runners sat beside the queue while the build simply never ran. The
lux tree lost three days to lux-linux-amd64 the same way.
What a job is FOR is the workflow's name. runs-on is the machine it needs.
Co-authored-by: Hanzo Dev <[email protected]>
Public sites carried leadership pages, team pages, advisor and executive
rosters, and an executive-bios block on the press page. They are gone, along
with the routes and navigation entries that led to them, so nothing links to a
page that is no longer there.
What the organisation does stands on its own. A visitor evaluating the work does
not need a wall of headshots to do it, and a roster is a maintenance burden that
goes stale the moment anyone moves.
Contact points are addressed by function rather than by person, so a message
reaches whoever holds that responsibility today.
The Hanzo Team product pages and the AI agent galleries are untouched: they
describe a product, not a staff list.
Co-authored-by: Hanzo Dev <[email protected]>
One family. Font stacks name Zen and fall back to the native faces, tokens
name the role rather than a face, and the packages that used to supply a
face now point at @hanzo/font.
Self-hosted @font-face blocks are removed rather than renamed: rewriting the
family in one would leave a src pointing at a file this repo no longer ships.
@hanzo/font carries the binaries and declares the faces, so the local copies
go with the declaration that used them.
Comments naming a face we no longer use are deleted, not reworded.
Leadership and team cards, board and founding prose, an AI persona modelled on a
named individual, contributor and partner entries, and personal correspondence
addresses all named one person. The organisation carries them now.
Other people keep their names. Where a card, a board list or a founding line
named someone else alongside, they stay exactly as they were; only the one entry
was removed, and prose that listed two names now reads with one.
Sample and fixture data uses the placeholder name these tests already use
elsewhere, so the IAM username defect the notes describe still reads as written.
The zoo/yapp MIT notice names the foundation that publishes it.
Co-authored-by: Hanzo Dev <[email protected]>
Bylines, paper authorship, correspondence addresses and the founder blurb under
each post named an individual. They name the organisation that published the
work instead: the brand on posts and pages, the research byline on papers, and
research@ in place of a personal address. Both are what these repositories
already used elsewhere — nothing new was coined.
Co-authors are untouched. Where a paper named someone else alongside, they stay
named; only the one byline changed. Bibliography entries, running heads,
PDF metadata and affiliations move with it, so a citation still resolves to
whoever the cited paper names.
Sample and fixture data uses the placeholder name these tests already use
elsewhere, so no assertion changed meaning.
Co-authored-by: Hanzo Dev <[email protected]>
runs-on was a bare scalar. Jobs written that way queue and are never
picked up — link and quest have waited since 10 August, painter since the
5th, none of them with a single success — while repos writing the same
label as a sequence drain within seconds of a push on the same fleet.
Same label, same runners, different shape. It fails silently: nothing errors,
the job simply never starts, so the lane looks configured and does nothing.
Five Hanzo properties were showing four different favicons — this one pointed at
a UUID-named png left behind by the scaffolding it was generated from, so a
reader with tabs open across the estate could not tell which was ours.
Both files now come byte-for-byte from @hanzo/logo, which is where the mark
lives, and the declaration is hanzo.ai's: the .ico for browsers that want one
and the .svg for those that would rather scale it.
The sentence said formal certification is scoped per enterprise engagement and
named SOC 2, ISO 27001 and HIPAA while denying none of them. A reader who scans
sees three framework names next to the word certification, which is the
impression the whole sweep was meant to remove.
hanzo.ai's own copy gate states the rule: a framework may be named only where
the same sentence denies holding it, and it cannot be satisfied by implying.
So it says outright that we hold none of them today, and then makes the offer.
The offer is the stronger half anyway.
Co-authored-by: Hanzo Dev <[email protected]>
there is no soc 2 report, no iso 27001 certificate, no auditor and no trust
center behind the words this site was using. "soc 2 type ii certified",
"soc2 type 2 attested", "annual audit completed" and "hipaa compliant" each
tell a buyer a document exists that they can ask for, and procurement will
ask. a claim we cannot produce evidence for is worse than no claim: it turns
a security review into a credibility problem, and it is the kind of statement
a regulator and a plaintiff both read literally.
what is true is the control set. encryption in transit and at rest,
role-based access control and audit logging are real and running, so the copy
now says controls aligned to the soc 2 type ii control set and stops there.
gdpr and ccpa are laws rather than certificates and those claims stand
untouched.
the compliance work is still on offer, so nothing is left as a hole or an
apology. formal certification -- soc 2 type ii, iso 27001, hipaa with a baa --
is scoped per enterprise engagement, which is the honest version of the sale
and also the true one. no timeline is promised anywhere, because we do not
control an auditor's calendar.
uptime figures go with them. 99.9/99.99 presented as an sla is a contractual
number, and we publish no availability agreement, so the promise is replaced
by the architecture that actually delivers it: multi-region redundancy with
automated failover. measured records on the status page are left alone, as
are illustrative numbers inside product mockups.
Co-authored-by: Hanzo Dev <[email protected]>
The dependency was an unrelated package that happens to share a plausible name,
pinned to a version that was never published, so --frozen-lockfile 404'd and
neither install nor build ran at all. Importing it at the top of vite.config.ts
meant the config itself could not load.
Nothing is lost by deleting rather than replacing it. The gui compiler emits the
same annotation from the AST pass that already walks every component, gated on
NODE_ENV=development: data-is (which component), data-in (the component it is
used inside) and data-at (file:line). It runs AFTER flattening, so the tag names
the component that actually rendered rather than one the optimizer removed.
Co-authored-by: Hanzo Dev <[email protected]>
Nothing imports src/components/hanzodev/Testimonials.tsx, so it reached no
bundle, but it attributed fabricated product quotes to real, named people at
Ramp, Intercom and Notion. Remove the file rather than leave those
attributions sitting in the tree.
Co-authored-by: Hanzo Dev <[email protected]>
The deploy job asked for `ubuntu-latest`. This file lives in .hanzo/workflows,
which GitHub never reads -- git.hanzo.ai is the only thing that can run it, and
the fleet advertises no generic ubuntu-* label. That is deliberate and recorded
in the runner ConfigMap: ~1400 mirrored upstream forks all ask for ubuntu-latest,
and the forge errors rather than skipping a job it cannot place, so one bad job
was retried ~520 times across 10 runners.
An unmatched label is not a failure here, it is silence -- the job queues until
the 24h timeout. So this deploy has never produced an image, and nothing ever
said so. Same class as the playground regression, found by checking every
.hanzo/workflows file against the labels the runner ConfigMap actually declares
rather than against the ones I assumed.
hanzo-build-linux-amd64 is registered (verified against cm/git-runner-config).
Co-authored-by: Hanzo Dev <[email protected]>
TypeScript 7 is the native Go compiler and removes `baseUrl` and
`moduleResolution: node|node10`. Both appear here, so `tsc` from TS7
refuses the config outright (TS5102 / TS5108) and cannot typecheck.
`paths` targets resolve relative to `baseUrl` when it is set and relative
to the tsconfig file otherwise. Every `baseUrl` folded here already
pointed at the config's own directory, so dropping it moves nothing and
the targets are left byte-identical. Where a baseUrl pointed elsewhere,
each affected target was rewritten as join(baseUrl, target).
`moduleResolution` was chosen from the declared `module`: commonjs ->
node16, esnext/preserve -> bundler. Configs whose `module` is unset or
exotic were left alone rather than guessed at.
The result is accepted by BOTH toolchains, so nothing has to upgrade
TypeScript in lockstep. Verified on hanzo/chat packages/api: tsc 5.9
779 -> 778 errors (no regression), and tsc 7.0.2 now runs the project
in 2s where it previously refused the config.
Co-authored-by: Hanzo Dev <[email protected]>
Superseded: the Hanzo GitHub App pushes a webhook, so the forge tracks GitHub
without a per-repo workflow. This file called git.hanzo.ai/api/v1/.../mirror-sync
— a Gitea API for a system we no longer drive — and would sit inert in every repo.
One mechanism, in one place, instead of ~350 copies of a cron.
.github/workflows now holds sync.yml alone, carrying refs to git.hanzo.ai; every
build runs natively there from .hanzo/workflows.
.hanzo/workflows/deploy.yml publishes ghcr.io/hanzoai/hanzo-network:<sha> and does
not deploy — the operator CR in hanzoai/universe names which tag is live.
The GitHub Pages workflow it replaces is dead, not moved: Pages did not survive
the hanzoai -> hanzo-apps transfer, so the repo's pages API is 404 and every run
since 2026-03-04 ends "Failed to create deployment (status: 404) … Ensure GitHub
Pages has been enabled". Relocating a guaranteed 404 to the forge buys nothing.
public/CNAME goes with it: that file is a Pages control file, and neither
hanzoai/static nor Cloudflare reads it.
The live host is a Cloudflare Pages project built through CF's Git integration,
outside every workflow file here — nothing in this commit changes what serves
today.
The Dockerfile ends FROM ghcr.io/hanzoai/static:v0.5.1 with dist at /public and
runs it with -spa: 98 BrowserRouter routes plus the app's own path="*" NotFound
need the fallback, or every deep link 404s. Measured against the image: -spa
returns 200 for /account/billing, and without it a missing path 404s.
Co-authored-by: Hanzo Dev <[email protected]>
git.hanzo.ai mirrors this repo by PULL on a ~10-minute interval, and arcd runs
CI/CD there — so every push waited out that interval before anything built.
This asks Gitea to pull HEAD immediately.
Latency only: the repo already mirrors via the App webhook, so a missing
HANZO_GIT_TOKEN or a failed curl is non-fatal and never fails the push.
Idempotent (mirror-sync just pulls HEAD) and concurrency-coalesced.
- LLM.md is the canonical AI context file (tracked in git)
- CLAUDE.md is a local symlink to LLM.md (gitignored)
- Updated LLM.md content for accuracy and conciseness
Decentralized AI compute marketplace based on hanzo.ai
- New NetworkLanding page with compute-focused design
- Cyan/blue color scheme for network branding
- Features: distributed GPU, secure verification, global edge