LIVING IS LEARNING / ENGINE
SCROLL TO INGEST

PROJECT H.

A longitudinal behavioural inference engine with cryptographic audit properties.

Not “who should this child become?” but “what is this child already remembering?”

01 / INGESTION
content_hash = sha256(transcript)
dedupe_key = sha256(raw payload)

One boundary. Everything hashes at the door.

Every producer writes to POST /api/reflections: a human in a text box, an AI tutor after a chat, a voice note. The engine never branches on source. Two hashes are stamped at write time, never retrofitted. The content hash lands before any non-deterministic processing, the dedupe key before the LLM vision read. A partial unique index makes double-taps race-safe, so a duplicate can never mint a second moment.

02 / CANDIDATE DETECT

Forty small evidenced decisions. Not one giant guess.

No mega-prompt scores forty metrics, because that hallucinates and drifts. A cheap, recall-biased candidate detector narrows each reflection to the three-to-eight dimensions actually present. Each candidate tenet then gets its own narrow judge answering one question, and it fires only on a direct quote of the child's own words. No quote, no signal. Below the confidence floor a signal is dropped, never recorded weakly.

candidate-detect → per-tenet judges
direct quotes only
03 / SKILLS CLUSTERING

An open vocabulary, canonicalised by meaning.

Skills and values are living dimensions, not a fixed list. The engine names what it observes in the learner's own language, then collapses synonyms into canonical concepts, so persistence and perseverance become one node. A new concept mints as provisional and promotes to stable at three distinct observations. Embeddings run locally, in-process, 384 dimensions: nothing leaves the box.

canonicalise: d(u,v) < θ → merge

Design-spec canonicalisation: attach when cos(e_new, e_existing) ≥ 0.86, else mint provisional. As-built, an LLM matcher performs the collapse by meaning.

04 / TENET MEASUREMENT

25 tenets. Zero scores.

The deepest layer is a curated set of exactly 25 tenets, flat, none inferring another. Growth is pure closed-form math over an immutable log: replay every reflection in order and reproduce live state exactly. Outward, only qualitative bands and a direction word ever surface. A projector wall strips every internal number from every response, and a leaked weight fails the build.

narrative + evidence, never scores, never ranking
01 Curiosity
02 Transfer
03 Self-Direction
04 Critical Thinking
05 Problem Solving
06 Agency
07 Resilience
08 Exploration
09 Discussion
10 Articulation
11 Connections
12 Expression
13 Creativity
14 Collaboration
15 Reflection
16 Integration
17 Capacity
18 Regulation
19 Embodiment
20 Relational Intelligence
21 Health
22 Media Literacy
23 Perceptual Intelligence
24 Accountability
25 Participation
decay.modelLIVE

growth.ts: 30-day half-life decay toward floor 0.1, never zero. Decay begins only after 7 days of silence, and a node quiet for a full half-life that returns reads as reawakened.

05 / AUDIT

One root. Change a byte, break the proof.

transparency.logRFC 6962
leaf[00..15] = H(0x00 ∥ content_hash)
node = H(0x01 ∥ L ∥ R)
level 2 → 4 nodes
level 3 → 2 nodes
sth.root = a96ccc3e8c3e… · VERIFIED
RFC 6962 CT construction
leaf = H(0x00 ∥ h) · node = H(0x01 ∥ L ∥ R)
GET /api/anchor · signed 32-byte root
inclusion proofs verify offline
06 / SELF-SOVEREIGN

Hers for life. Verifiable offline, forever.

Learner-owned. Private. Exportable.

The issuer identity is a did:key, where the Ed25519 public key IS the identifier, so a signed export verifies forever with no DNS and no certificate authority. Credentials mint deterministically as OpenBadges 3.0 and CLR 2.0, only from mastery confirmed across two or more distinct content hashes. Signature-ready by design, signed when an issuer key is configured. Export, wipe, import: the record and its Merkle root reproduce byte-identically. Family-held in stewardship, with custody transferring to her at majority in a key ceremony.

07 / ENGINE · PACK

The engine knows no tenet names.

A build constraint from day one, not a future refactor: the engine is domain-agnostic inference machinery. It does not know it is measuring children, or that Curiosity exists. The entire methodology lives in a versioned, forkable YAML pack. Change the pack, change the philosophy, no code change. What a pack can never do is break integrity: a conformant engine must reject any pack attempting a numeric or ranking surface.

packs/harper-home.yamlCONFIG-DRIVEN
# packs/harper-home.yaml, the live pack
# namespace publisher/pack@semver, forkOf mandatory
pack: harper-home
version: 1.0.0
forkOf: livinglearning/base-pack
seams: # all data, loaded at startup
extractor.template: judge prompt + indicators
extractor.instructions: per-tenet rules
tutor.persona: tone, banned moves
states.mapping: weight -> qualitative band
ethics.thresholds: stricter-only vs spec floor
integrity:
numeric_surfaces: rejected # engine-enforced
ZERO TENET NAMES IN THE ENGINE
08 / INFINITE FORK

One engine. Any philosophy.

Today one pack runs live: harper-home, authored by two parents for one learner. The rest is the point of the architecture. A forest school, an adult relearning to paint, a civic project: illustrative forks, until someone writes the YAML. The spec's adoption metric is a stranger with the repo and the demo pack rendering a valid conformant record in under an hour. That hour is the pitch.

PACK REGISTRY · 1 LIVE · 7 ILLUSTRATIVE
harper-home
forest-school
adult-lifelong
civic-action
unschooling-core
montessori-adapt
team-onboarding
recovery-journal
09 / DISTRIBUTION

Bring your own pack.

sh · project-hSTANDBY

booting…