near-architecture Releases (10): 0.9.1.0 0x7bd24d368ebfcad9cc9e619cb6e740cd indexed https://jend.leeeet.dev/files.txt?path=near-architecture@0.9.1.0 0.9.0.0 0x9a0c458f159a102b8f9b9e65b34d7d79 unindexed https://jend.leeeet.dev/files.txt?path=near-architecture@0.9.0.0 0.8.0.0 0xf4c0a1d92d32842c5840d5abd117da67 unindexed https://jend.leeeet.dev/files.txt?path=near-architecture@0.8.0.0 0.7.0.0 0xee299771e6b629e9f3af7cdac8af223a unindexed https://jend.leeeet.dev/files.txt?path=near-architecture@0.7.0.0 0.6.0.0 0x058cb36f12f8bf8302ca243efd6d78dc unindexed https://jend.leeeet.dev/files.txt?path=near-architecture@0.6.0.0 0.5.0.0 0x9f92cb8772365b4bb8ff68d6c9c517e9 unindexed https://jend.leeeet.dev/files.txt?path=near-architecture@0.5.0.0 0.4.0.0 0xc527051ad6e6ef2b10e17a5f65544d78 unindexed https://jend.leeeet.dev/files.txt?path=near-architecture@0.4.0.0 0.3.0.0 0x32ddc3ea4f65841cc2859fb2a86ea04a unindexed https://jend.leeeet.dev/files.txt?path=near-architecture@0.3.0.0 0.2.0.0 0x378a3d21ce17e1246925132d663f59ec unindexed https://jend.leeeet.dev/files.txt?path=near-architecture@0.2.0.0 0.1.0.0 0x87f59fd07e5027177b8036b68fe915f8 unindexed https://jend.leeeet.dev/files.txt?path=near-architecture@0.1.0.0 Definitions (130, 1 to 100 shown): Arc.NodeRole (https://jend.leeeet.dev/definition.txt?path=near-architecture@0.9.1.0/arc.bend&name=NodeRole) # ---- vocabulary ---- # UserDevice: a user's own device. Server: a machine the project runs. Overlay: the private # (overlay) network between them. Outside: someone else's servers. type NodeRole is Data: UserDevice{} Server{} Overlay{} Outside{} Arc.PhysicalDevice (https://jend.leeeet.dev/definition.txt?path=near-architecture@0.9.1.0/arc.bend&name=PhysicalDevice) type PhysicalDevice is Data: PhysicalDevice{key: String, name: String, platform: String} Arc.Vendor (https://jend.leeeet.dev/definition.txt?path=near-architecture@0.9.1.0/arc.bend&name=Vendor) type Vendor is Data: Vendor{name: String, cloud: String} Arc.Org (https://jend.leeeet.dev/definition.txt?path=near-architecture@0.9.1.0/arc.bend&name=Org) type Org is Data: Org{name: String, vendor: Vendor, devices: List<&2, PhysicalDevice>} Arc.Person (https://jend.leeeet.dev/definition.txt?path=near-architecture@0.9.1.0/arc.bend&name=Person) # The agreement between the organization and its people: who they are (identities in the org's # directory domain), what each is granted per scope (actions; none means no access), and budgets. # It describes the people who work on the system, not the system; the diagram may omit it. type Person is Data: Person{key: String, identity: String} Arc.Grant (https://jend.leeeet.dev/definition.txt?path=near-architecture@0.9.1.0/arc.bend&name=Grant) type Grant is Data: Grant{person: String, scope: String, actions: List<&2, String>} Arc.Budget (https://jend.leeeet.dev/definition.txt?path=near-architecture@0.9.1.0/arc.bend&name=Budget) type Budget is Data: Budget{person: String, what: String, amount: Nat, unit: String} Arc.Agreement (https://jend.leeeet.dev/definition.txt?path=near-architecture@0.9.1.0/arc.bend&name=Agreement) type Agreement is Data: Agreement{domain: String, people: List<&2, Person>, grants: List<&2, Grant>, budgets: List<&2, Budget>} Arc.Host (https://jend.leeeet.dev/definition.txt?path=near-architecture@0.9.1.0/arc.bend&name=Host) type Host is Data: Owned{device: String} Cloud{provider: String} Other{} Arc.Node (https://jend.leeeet.dev/definition.txt?path=near-architecture@0.9.1.0/arc.bend&name=Node) type Node is Data: Node{key: String, name: String, role: NodeRole, host: Host} Arc.ContainerKind (https://jend.leeeet.dev/definition.txt?path=near-architecture@0.9.1.0/arc.bend&name=ContainerKind) # What a container is. The list is closed: something that is none of these is not a container. # Client: the app, on the user's device. The private overlay is a node, not a container. # DataApi: answers queries on records and changes them. # Harness: an agent harness, the loop around a model (tools, context, threads), driven over its remote-control API. # Proxy: forwards connections to another container, adding what it lacks, such as TLS or authentication. # ModelApi: answers model calls. Cli: a command a person runs. Worker: has no API of its own; it # only moves data between data APIs, so it is the first thing to fold into a data API's own actions. type ContainerKind is Data: Client{} DataApi{} Harness{} … Arc.Owner (https://jend.leeeet.dev/definition.txt?path=near-architecture@0.9.1.0/arc.bend&name=Owner) # Whether the project builds and runs it, or uses it as it is. type Owner is Data: Ours{} Theirs{} Arc.Exposure (https://jend.leeeet.dev/definition.txt?path=near-architecture@0.9.1.0/arc.bend&name=Exposure) # Who can reach it: its own machine (127.0.0.1), the local network, the overlay, the device it is on, anyone. type Exposure is Data: Local{} Lan{} Tailnet{} Device{} Public{} Arc.Cap (https://jend.leeeet.dev/definition.txt?path=near-architecture@0.9.1.0/arc.bend&name=Cap) # What a container provides. Hosting is serving the app itself (its HTML and scripts); a data API # may also host the app only while it is private (shared_hosting_ok). Observability is receiving # a running container's errors, traces and structured logs. type Cap is Data: Hosting{} PrivateHosting{} Realtime{} BlobStore{} Observability{} Arc.Lang (https://jend.leeeet.dev/definition.txt?path=near-architecture@0.9.1.0/arc.bend&name=Lang) type Lang is Data: Bend{} C{} Rust{} TypeScript{} JavaScript{} Python{} Opaque{} Arc.Container (https://jend.leeeet.dev/definition.txt?path=near-architecture@0.9.1.0/arc.bend&name=Container) type Container is Data: Container{key: String, name: String, kind: ContainerKind, owner: Owner, on: String, exposure: Exposure, caps: List<&2, Cap>, source: String, vendors: List<&2, String>, frameworks: List<&2, String>, libraries: List<&2, String>, languages: List<&2, String>} Arc.Part (https://jend.leeeet.dev/definition.txt?path=near-architecture@0.9.1.0/arc.bend&name=Part) type Part is Data: Part{key: String, name: String, lang: Lang, in: String, on: String} Arc.Link (https://jend.leeeet.dev/definition.txt?path=near-architecture@0.9.1.0/arc.bend&name=Link) # A talks-to edge between two containers or parts, by key. type Link is Data: Link{src: String, dst: String, label: String, live: Bool} Arc.System (https://jend.leeeet.dev/definition.txt?path=near-architecture@0.9.1.0/arc.bend&name=System) type System is Data: System{org: Org, nodes: List<&2, Node>, containers: List<&2, Container>, parts: List<&2, Part>, links: List<&2, Link>} Arc.org (https://jend.leeeet.dev/definition.txt?path=near-architecture@0.9.1.0/arc.bend&name=org) # ---- access ---- def org(s: System) -> Org: Arc.nodes (https://jend.leeeet.dev/definition.txt?path=near-architecture@0.9.1.0/arc.bend&name=nodes) def nodes(s: System) -> List<&2, Node>: Arc.containers (https://jend.leeeet.dev/definition.txt?path=near-architecture@0.9.1.0/arc.bend&name=containers) def containers(s: System) -> List<&2, Container>: Arc.parts (https://jend.leeeet.dev/definition.txt?path=near-architecture@0.9.1.0/arc.bend&name=parts) def parts(s: System) -> List<&2, Part>: Arc.links (https://jend.leeeet.dev/definition.txt?path=near-architecture@0.9.1.0/arc.bend&name=links) def links(s: System) -> List<&2, Link>: Arc.nkey (https://jend.leeeet.dev/definition.txt?path=near-architecture@0.9.1.0/arc.bend&name=nkey) def nkey(n: Node) -> String: Arc.ckey (https://jend.leeeet.dev/definition.txt?path=near-architecture@0.9.1.0/arc.bend&name=ckey) def ckey(c: Container) -> String: Arc.con (https://jend.leeeet.dev/definition.txt?path=near-architecture@0.9.1.0/arc.bend&name=con) def con(c: Container) -> String: Arc.caps (https://jend.leeeet.dev/definition.txt?path=near-architecture@0.9.1.0/arc.bend&name=caps) def caps(c: Container) -> List<&2, Cap>: Arc.pkey (https://jend.leeeet.dev/definition.txt?path=near-architecture@0.9.1.0/arc.bend&name=pkey) def pkey(p: Part) -> String: Arc.pin (https://jend.leeeet.dev/definition.txt?path=near-architecture@0.9.1.0/arc.bend&name=pin) def pin(p: Part) -> String: Arc.pon (https://jend.leeeet.dev/definition.txt?path=near-architecture@0.9.1.0/arc.bend&name=pon) def pon(p: Part) -> String: Arc.nkeys (https://jend.leeeet.dev/definition.txt?path=near-architecture@0.9.1.0/arc.bend&name=nkeys) def nkeys(xs: List<&2, Node>) -> List<&2, String>: Arc.ckeys (https://jend.leeeet.dev/definition.txt?path=near-architecture@0.9.1.0/arc.bend&name=ckeys) def ckeys(xs: List<&2, Container>) -> List<&2, String>: Arc.pkeys (https://jend.leeeet.dev/definition.txt?path=near-architecture@0.9.1.0/arc.bend&name=pkeys) def pkeys(xs: List<&2, Part>) -> List<&2, String>: Arc.keys (https://jend.leeeet.dev/definition.txt?path=near-architecture@0.9.1.0/arc.bend&name=keys) # Keys links may name: containers and parts. def keys(+s: System) -> List<&2, String>: Arc.is_server (https://jend.leeeet.dev/definition.txt?path=near-architecture@0.9.1.0/arc.bend&name=is_server) # ---- predicates on the vocabulary ---- def is_server(r: NodeRole) -> Bool: Arc.is_outside (https://jend.leeeet.dev/definition.txt?path=near-architecture@0.9.1.0/arc.bend&name=is_outside) def is_outside(r: NodeRole) -> Bool: Arc.is_device (https://jend.leeeet.dev/definition.txt?path=near-architecture@0.9.1.0/arc.bend&name=is_device) def is_device(r: NodeRole) -> Bool: Arc.is_overlay (https://jend.leeeet.dev/definition.txt?path=near-architecture@0.9.1.0/arc.bend&name=is_overlay) def is_overlay(r: NodeRole) -> Bool: Arc.one_if (https://jend.leeeet.dev/definition.txt?path=near-architecture@0.9.1.0/arc.bend&name=one_if) def one_if(b: Bool) -> Nat: Arc.overlay_nodes.go (https://jend.leeeet.dev/definition.txt?path=near-architecture@0.9.1.0/arc.bend&name=overlay_nodes.go) def overlay_nodes.go(xs: List<&2, Node>) -> Nat: Arc.overlay_nodes (https://jend.leeeet.dev/definition.txt?path=near-architecture@0.9.1.0/arc.bend&name=overlay_nodes) # Private access is represented by exactly one Overlay node. def overlay_nodes(+s: System) -> Nat: Arc.is_client (https://jend.leeeet.dev/definition.txt?path=near-architecture@0.9.1.0/arc.bend&name=is_client) def is_client(k: ContainerKind) -> Bool: Arc.is_data_api (https://jend.leeeet.dev/definition.txt?path=near-architecture@0.9.1.0/arc.bend&name=is_data_api) def is_data_api(k: ContainerKind) -> Bool: Arc.is_ours (https://jend.leeeet.dev/definition.txt?path=near-architecture@0.9.1.0/arc.bend&name=is_ours) def is_ours(o: Owner) -> Bool: Arc.is_local (https://jend.leeeet.dev/definition.txt?path=near-architecture@0.9.1.0/arc.bend&name=is_local) def is_local(e: Exposure) -> Bool: Arc.is_tailnet (https://jend.leeeet.dev/definition.txt?path=near-architecture@0.9.1.0/arc.bend&name=is_tailnet) def is_tailnet(e: Exposure) -> Bool: Arc.is_rust (https://jend.leeeet.dev/definition.txt?path=near-architecture@0.9.1.0/arc.bend&name=is_rust) def is_rust(l: Lang) -> Bool: Arc.str_eq (https://jend.leeeet.dev/definition.txt?path=near-architecture@0.9.1.0/arc.bend&name=str_eq) # ---- keys, like foreign keys ---- def str_eq(a: String, b: String) -> Bool: Arc.has (https://jend.leeeet.dev/definition.txt?path=near-architecture@0.9.1.0/arc.bend&name=has) def has(+s: String, xs: List<&2, String>) -> Bool: Arc.owned_device (https://jend.leeeet.dev/definition.txt?path=near-architecture@0.9.1.0/arc.bend&name=owned_device) def owned_device(+key: String, +name: String, xs: List<&2, PhysicalDevice>) -> Bool: Arc.host_in_inventory (https://jend.leeeet.dev/definition.txt?path=near-architecture@0.9.1.0/arc.bend&name=host_in_inventory) def host_in_inventory(h: Host, name: String, o: Org) -> Bool: Arc.node_owned (https://jend.leeeet.dev/definition.txt?path=near-architecture@0.9.1.0/arc.bend&name=node_owned) def node_owned(n: Node, +o: Org) -> Bool: Arc.owned_nodes.go (https://jend.leeeet.dev/definition.txt?path=near-architecture@0.9.1.0/arc.bend&name=owned_nodes.go) def owned_nodes.go(xs: List<&2, Node>, +o: Org) -> Bool: Arc.owned_nodes (https://jend.leeeet.dev/definition.txt?path=near-architecture@0.9.1.0/arc.bend&name=owned_nodes) # Every server and user device is in the owner's inventory or on its vendor's cloud. def owned_nodes(+s: System) -> Bool: Arc.pick_str (https://jend.leeeet.dev/definition.txt?path=near-architecture@0.9.1.0/arc.bend&name=pick_str) def pick_str(c: Bool, a: String, b: String) -> String: Arc.distinct_keys (https://jend.leeeet.dev/definition.txt?path=near-architecture@0.9.1.0/arc.bend&name=distinct_keys) # No key names two things. def distinct_keys(xs: List<&2, String>) -> Bool: Arc.all_in (https://jend.leeeet.dev/definition.txt?path=near-architecture@0.9.1.0/arc.bend&name=all_in) # Every key in `xs` names something in `ks`. def all_in(xs: List<&2, String>, +ks: List<&2, String>) -> Bool: Arc.part_ins (https://jend.leeeet.dev/definition.txt?path=near-architecture@0.9.1.0/arc.bend&name=part_ins) def part_ins(xs: List<&2, Part>) -> List<&2, String>: Arc.part_ons (https://jend.leeeet.dev/definition.txt?path=near-architecture@0.9.1.0/arc.bend&name=part_ons) def part_ons(xs: List<&2, Part>) -> List<&2, String>: Arc.container_ons (https://jend.leeeet.dev/definition.txt?path=near-architecture@0.9.1.0/arc.bend&name=container_ons) def container_ons(xs: List<&2, Container>) -> List<&2, String>: Arc.link_ends (https://jend.leeeet.dev/definition.txt?path=near-architecture@0.9.1.0/arc.bend&name=link_ends) def link_ends(xs: List<&2, Link>) -> List<&2, String>: Arc.well_formed (https://jend.leeeet.dev/definition.txt?path=near-architecture@0.9.1.0/arc.bend&name=well_formed) # The system is well formed: node keys and container/part keys are unique, every container is on # a node, every part in a container, and every link joins two things that exist. def well_formed(+s: System) -> Bool: Arc.part_home (https://jend.leeeet.dev/definition.txt?path=near-architecture@0.9.1.0/arc.bend&name=part_home) # ---- looking things up ---- def part_home(+k: String, xs: List<&2, Part>) -> String: Arc.home (https://jend.leeeet.dev/definition.txt?path=near-architecture@0.9.1.0/arc.bend&name=home) # The container a key belongs to: itself, or the one its part sits in. def home(+k: String, +s: System) -> String: Arc.none (https://jend.leeeet.dev/definition.txt?path=near-architecture@0.9.1.0/arc.bend&name=none) def none() -> Container: Arc.pick_c (https://jend.leeeet.dev/definition.txt?path=near-architecture@0.9.1.0/arc.bend&name=pick_c) def pick_c(hit: Bool, c: Container, other: Container) -> Container: Arc.container (https://jend.leeeet.dev/definition.txt?path=near-architecture@0.9.1.0/arc.bend&name=container) # The container with key `k` (an empty one when `k` is unknown; well_formed rules that out). def container(+k: String, xs: List<&2, Container>) -> Container: Arc.pick_r (https://jend.leeeet.dev/definition.txt?path=near-architecture@0.9.1.0/arc.bend&name=pick_r) def pick_r(hit: Bool, r: NodeRole, other: NodeRole) -> NodeRole: Arc.node_role (https://jend.leeeet.dev/definition.txt?path=near-architecture@0.9.1.0/arc.bend&name=node_role) def node_role(+k: String, xs: List<&2, Node>) -> NodeRole: Arc.part_node (https://jend.leeeet.dev/definition.txt?path=near-architecture@0.9.1.0/arc.bend&name=part_node) def part_node(+k: String, xs: List<&2, Part>) -> String: Arc.node_of (https://jend.leeeet.dev/definition.txt?path=near-architecture@0.9.1.0/arc.bend&name=node_of) # The node a container or part runs on, and its role. def node_of(+k: String, +s: System) -> String: Arc.role_of (https://jend.leeeet.dev/definition.txt?path=near-architecture@0.9.1.0/arc.bend&name=role_of) def role_of(+k: String, +s: System) -> NodeRole: Arc.container_exposure (https://jend.leeeet.dev/definition.txt?path=near-architecture@0.9.1.0/arc.bend&name=container_exposure) def container_exposure(c: Container) -> Exposure: Arc.exposure_of (https://jend.leeeet.dev/definition.txt?path=near-architecture@0.9.1.0/arc.bend&name=exposure_of) def exposure_of(+k: String, +s: System) -> Exposure: Arc.private_ok (https://jend.leeeet.dev/definition.txt?path=near-architecture@0.9.1.0/arc.bend&name=private_ok) # ---- where it runs ---- # On a server, everything is reachable only from the server itself or over the overlay. def private_ok(c: Container, +ns: List<&2, Node>) -> Bool: Arc.all_private (https://jend.leeeet.dev/definition.txt?path=near-architecture@0.9.1.0/arc.bend&name=all_private) def all_private(xs: List<&2, Container>, +ns: List<&2, Node>) -> Bool: Arc.servers_private (https://jend.leeeet.dev/definition.txt?path=near-architecture@0.9.1.0/arc.bend&name=servers_private) def servers_private(+s: System) -> Bool: Arc.devices_via_network.go (https://jend.leeeet.dev/definition.txt?path=near-architecture@0.9.1.0/arc.bend&name=devices_via_network.go) # A device reaches a server over the overlay only when the destination is exposed to the tailnet. def devices_via_network.go(xs: List<&2, Link>, +s: System) -> Bool: Arc.devices_via_network (https://jend.leeeet.dev/definition.txt?path=near-architecture@0.9.1.0/arc.bend&name=devices_via_network) def devices_via_network(+s: System) -> Bool: Arc.device_reaches (https://jend.leeeet.dev/definition.txt?path=near-architecture@0.9.1.0/arc.bend&name=device_reaches) # A server container needs overlay exposure exactly when a device-origin link reaches it. def device_reaches(+key: String, xs: List<&2, Link>, +s: System) -> Bool: Arc.exposure_for_reach (https://jend.leeeet.dev/definition.txt?path=near-architecture@0.9.1.0/arc.bend&name=exposure_for_reach) def exposure_for_reach(c: Container, reached: Bool) -> Bool: Arc.exposure_follows_reach.go (https://jend.leeeet.dev/definition.txt?path=near-architecture@0.9.1.0/arc.bend&name=exposure_follows_reach.go) def exposure_follows_reach.go(xs: List<&2, Container>, +s: System) -> Bool: Arc.exposure_follows_reach (https://jend.leeeet.dev/definition.txt?path=near-architecture@0.9.1.0/arc.bend&name=exposure_follows_reach) def exposure_follows_reach(+s: System) -> Bool: Arc.is_cap (https://jend.leeeet.dev/definition.txt?path=near-architecture@0.9.1.0/arc.bend&name=is_cap) # ---- what it is: minimality, every capability provided exactly once ---- def is_cap(want: Cap, c: Cap) -> Bool: Arc.count_in (https://jend.leeeet.dev/definition.txt?path=near-architecture@0.9.1.0/arc.bend&name=count_in) def count_in(+want: Cap, cs: List<&2, Cap>) -> Nat: Arc.direct (https://jend.leeeet.dev/definition.txt?path=near-architecture@0.9.1.0/arc.bend&name=direct) def direct(+want: Cap, xs: List<&2, Container>) -> Nat: Arc.tailnet_hosting.go (https://jend.leeeet.dev/definition.txt?path=near-architecture@0.9.1.0/arc.bend&name=tailnet_hosting.go) def tailnet_hosting.go(xs: List<&2, Container>) -> Nat: Arc.tailnet_hosting (https://jend.leeeet.dev/definition.txt?path=near-architecture@0.9.1.0/arc.bend&name=tailnet_hosting) # How many containers host the app at Tailnet exposure. def tailnet_hosting(+s: System) -> Nat: Arc.provided (https://jend.leeeet.dev/definition.txt?path=near-architecture@0.9.1.0/arc.bend&name=provided) # How many containers provide `want`. One tailnet host plus one overlay composes private hosting. def provided(want: Cap, +s: System) -> Nat: Arc.cons_if (https://jend.leeeet.dev/definition.txt?path=near-architecture@0.9.1.0/arc.bend&name=cons_if) # ---- observability: everything we run reports to the observability provider ---- def cons_if(b: Bool, k: String, xs: List<&2, String>) -> List<&2, String>: Arc.providers (https://jend.leeeet.dev/definition.txt?path=near-architecture@0.9.1.0/arc.bend&name=providers) # Keys of the containers that provide `want`. def providers(+want: Cap, xs: List<&2, Container>) -> List<&2, String>: Arc.part_container (https://jend.leeeet.dev/definition.txt?path=near-architecture@0.9.1.0/arc.bend&name=part_container) # The container a link end belongs to: a part's container, else the key itself. def part_container(ps: List<&2, Part>, +k: String) -> String: Arc.reports_to (https://jend.leeeet.dev/definition.txt?path=near-architecture@0.9.1.0/arc.bend&name=reports_to) # Some link from container `k` (or one of its parts) reaches one of `obs`. def reports_to(ls: List<&2, Link>, +k: String, +ps: List<&2, Part>, +obs: List<&2, String>) -> Bool: Arc.observed.go (https://jend.leeeet.dev/definition.txt?path=near-architecture@0.9.1.0/arc.bend&name=observed.go) def observed.go(xs: List<&2, Container>, +s: System, +obs: List<&2, String>) -> Bool: Arc.observed (https://jend.leeeet.dev/definition.txt?path=near-architecture@0.9.1.0/arc.bend&name=observed) # Every container we build (ours, with source) links to a container providing Observability. def observed(+s: System) -> Bool: Arc.tailnet_data_apis.go (https://jend.leeeet.dev/definition.txt?path=near-architecture@0.9.1.0/arc.bend&name=tailnet_data_apis.go) def tailnet_data_apis.go(xs: List<&2, Container>) -> Nat: Arc.tailnet_data_apis (https://jend.leeeet.dev/definition.txt?path=near-architecture@0.9.1.0/arc.bend&name=tailnet_data_apis) # The data APIs the overlay reaches: the client's data API. Local and outside ones are its sources. def tailnet_data_apis(+s: System) -> Nat: Arc.own_data_apis.go (https://jend.leeeet.dev/definition.txt?path=near-architecture@0.9.1.0/arc.bend&name=own_data_apis.go) def own_data_apis.go(xs: List<&2, Container>, +ns: List<&2, Node>) -> Nat: Arc.own_data_apis (https://jend.leeeet.dev/definition.txt?path=near-architecture@0.9.1.0/arc.bend&name=own_data_apis) # The system's own data APIs: those not on someone else's servers. "Exactly one" means one store. def own_data_apis(+s: System) -> Nat: More: https://jend.leeeet.dev/packages/near-architecture.txt?definitions_offset=100