diff --git a/apps/01-hello-c/README.md b/apps/01-hello-c/README.md index defa661..b2a91d2 100644 --- a/apps/01-hello-c/README.md +++ b/apps/01-hello-c/README.md @@ -1,8 +1,8 @@ # 01 - hello, C -[01-hello-rust](../01-hello-rust) written in C. C apps build with a WASI clang -toolchain rather than Emscripten, because Emscripten's standalone modules can't -open the files an Ark mounts. +[01-hello-rust](../01-hello-rust/README.md) written in C. C apps build with a +WASI clang toolchain rather than Emscripten, because Emscripten's standalone +modules can't open the files an Ark mounts. The Makefile finds a wasi-sdk install at `/opt/wasi-sdk`, or falls back to Homebrew's WASI toolchain. `WASI_SDK` points it at any other clang that carries diff --git a/apps/01-hello-go/README.md b/apps/01-hello-go/README.md index 9dc0e70..1de67e9 100644 --- a/apps/01-hello-go/README.md +++ b/apps/01-hello-go/README.md @@ -1,7 +1,7 @@ # 01 - hello, Go -[01-hello-rust](../01-hello-rust) written in Go. The Makefile builds Go apps -with TinyGo, which produces a module a fraction of the size the standard +[01-hello-rust](../01-hello-rust/README.md) written in Go. The Makefile builds +Go apps with TinyGo, which produces a module a fraction of the size the standard toolchain emits. ## Build and run diff --git a/apps/01-hello-python/README.md b/apps/01-hello-python/README.md index a14e18b..77a18b8 100644 --- a/apps/01-hello-python/README.md +++ b/apps/01-hello-python/README.md @@ -1,8 +1,8 @@ # 01 - hello, Python -[01-hello-rust](../01-hello-rust) written in Python. The module carries a -trimmed CPython along with the app, so it is megabytes where the others are -kilobytes, and it takes noticeably longer to start on an Ark. +[01-hello-rust](../01-hello-rust/README.md) written in Python. The module +carries a trimmed CPython along with the app, so it is megabytes where the +others are kilobytes, and it takes noticeably longer to start on an Ark. The first Python build compiles that interpreter once and reuses it for every Python app. [05-running.md](../../docs/05-running.md) covers what it needs. diff --git a/apps/01-hello-rust/README.md b/apps/01-hello-rust/README.md index f0fc589..21f302c 100644 --- a/apps/01-hello-rust/README.md +++ b/apps/01-hello-rust/README.md @@ -2,8 +2,8 @@ The smallest Ark app. It prints its manifest when run with no arguments and a greeting when given a data directory, and it reads no data. Start here, then -compare the [Go](../01-hello-go), [C](../01-hello-c) and -[Python](../01-hello-python) versions. +compare the [Go](../01-hello-go/README.md), [C](../01-hello-c/README.md) and +[Python](../01-hello-python/README.md) versions. ## Build and run diff --git a/apps/04-cilantro-mini-c/README.md b/apps/04-cilantro-mini-c/README.md index 5c88573..6931f6f 100644 --- a/apps/04-cilantro-mini-c/README.md +++ b/apps/04-cilantro-mini-c/README.md @@ -1,9 +1,9 @@ # 04 - cilantro-mini (C) -[04-cilantro-mini-rust](../04-cilantro-mini-rust) written in C. Only +[04-cilantro-mini-rust](../04-cilantro-mini-rust/README.md) written in C. Only `errno == ENOENT` means no answer, and any other failure to open or read a file stops the app. Each file is read into a buffer that grows to fit, since a -genotype can hold long alleles. [01-hello-c](../01-hello-c) covers the +genotype can hold long alleles. [01-hello-c](../01-hello-c/README.md) covers the toolchain. ## Build and run diff --git a/apps/04-cilantro-mini-go/README.md b/apps/04-cilantro-mini-go/README.md index 20b86e5..8ac2ea9 100644 --- a/apps/04-cilantro-mini-go/README.md +++ b/apps/04-cilantro-mini-go/README.md @@ -1,7 +1,8 @@ # 04 - cilantro-mini (Go) -[04-cilantro-mini-rust](../04-cilantro-mini-rust) written in Go. It distinguishes -an absent genotype from a failed read with `errors.Is(err, fs.ErrNotExist)`. +[04-cilantro-mini-rust](../04-cilantro-mini-rust/README.md) written in Go. It +distinguishes an absent genotype from a failed read with +`errors.Is(err, fs.ErrNotExist)`. ## Build and run diff --git a/apps/04-cilantro-mini-python/README.md b/apps/04-cilantro-mini-python/README.md index 79e7c00..fa6e76b 100644 --- a/apps/04-cilantro-mini-python/README.md +++ b/apps/04-cilantro-mini-python/README.md @@ -1,9 +1,10 @@ # 04 - cilantro-mini (Python) -[04-cilantro-mini-rust](../04-cilantro-mini-rust) written in Python. An absent -genotype arrives as `FileNotFoundError` and reads as no answer, while every -other `OSError` stops the app. [01-hello-python](../01-hello-python) covers what -a Python module costs. +[04-cilantro-mini-rust](../04-cilantro-mini-rust/README.md) written in Python. +An absent genotype arrives as `FileNotFoundError` and reads as no answer, while +every other `OSError` stops the app. +[01-hello-python](../01-hello-python/README.md) covers what a Python module +costs. ## Build and run diff --git a/apps/04-cilantro-mini-rust/README.md b/apps/04-cilantro-mini-rust/README.md index 9a1d1f5..b6c78fe 100644 --- a/apps/04-cilantro-mini-rust/README.md +++ b/apps/04-cilantro-mini-rust/README.md @@ -10,9 +10,11 @@ makes the count inconclusive. An absent genotype is reported as no answer, never as two reference alleles. Any other read error stops the app. [04-reading-data.md](../../docs/04-reading-data.md) explains why. -The same mini exists in [Go](../04-cilantro-mini-go), -[C](../04-cilantro-mini-c) and [Python](../04-cilantro-mini-python), and -[04-cilantro-soapiness](../04-cilantro-soapiness) turns it into a report. +The same mini exists in [Go](../04-cilantro-mini-go/README.md), +[C](../04-cilantro-mini-c/README.md) and +[Python](../04-cilantro-mini-python/README.md), and +[04-cilantro-soapiness](../04-cilantro-soapiness/README.md) turns it into a +report. ## Build and run diff --git a/apps/04-cilantro-soapiness/README.md b/apps/04-cilantro-soapiness/README.md index a07b068..9f574a4 100644 --- a/apps/04-cilantro-soapiness/README.md +++ b/apps/04-cilantro-soapiness/README.md @@ -1,12 +1,13 @@ # 04 - cilantro-soapiness -The single variant from [04-cilantro-mini-rust](../04-cilantro-mini-rust), -turned into a full report in the shape [06-reports.md](../../docs/06-reports.md) -describes, with a finding, the evidence behind it, the method, its limitations -and sources. A no-call and an absent genotype each get their -own finding instead of a verdict, and a call without exactly two copies shows -its copies without a homozygous or heterozygous label. The `reference` grant is -read for one file, the assembly build the coordinate is reported on. +The single variant from +[04-cilantro-mini-rust](../04-cilantro-mini-rust/README.md), turned into a full +report in the shape [06-reports.md](../../docs/06-reports.md) describes, with a +finding, the evidence behind it, the method, its limitations and sources. A +no-call and an absent genotype each get their own finding instead of a verdict, +and a call without exactly two copies shows its copies without a homozygous or +heterozygous label. The `reference` grant is read for one file, the assembly +build the coordinate is reported on. ## Build and run diff --git a/apps/05-drunk-o-type/README.md b/apps/05-drunk-o-type/README.md index 02506ae..420d8c0 100644 --- a/apps/05-drunk-o-type/README.md +++ b/apps/05-drunk-o-type/README.md @@ -2,8 +2,8 @@ A panel of eleven variants, scored on three axes of how a body handles alcohol: flushing, reward and histamine. Each variant is its own `rsids/` grant, so the -access pattern is [04-cilantro-mini-rust](../04-cilantro-mini-rust) repeated, -and the owner sees every site by name before approving. +access pattern is [04-cilantro-mini-rust](../04-cilantro-mini-rust/README.md) +repeated, and the owner sees every site by name before approving. The app counts the allele each study tested, which isn't always the ALT allele. A missing allele or an absent genotype makes its axis inconclusive rather than diff --git a/apps/06-genes-mini-c/README.md b/apps/06-genes-mini-c/README.md index 8e68713..484db29 100644 --- a/apps/06-genes-mini-c/README.md +++ b/apps/06-genes-mini-c/README.md @@ -1,9 +1,9 @@ # 06 - genes-mini (C) -[06-genes-mini-rust](../06-genes-mini-rust) written in C. It takes the sequence -length from `stat`, reads each scalar into a buffer that grows to fit, and -treats only `errno == ENOENT` as no answer. [01-hello-c](../01-hello-c) covers -the toolchain. +[06-genes-mini-rust](../06-genes-mini-rust/README.md) written in C. It takes the +sequence length from `stat`, reads each scalar into a buffer that grows to fit, +and treats only `errno == ENOENT` as no answer. +[01-hello-c](../01-hello-c/README.md) covers the toolchain. ## Build and run diff --git a/apps/06-genes-mini-go/README.md b/apps/06-genes-mini-go/README.md index 0bc697b..176dbf3 100644 --- a/apps/06-genes-mini-go/README.md +++ b/apps/06-genes-mini-go/README.md @@ -1,8 +1,8 @@ # 06 - genes-mini (Go) -[06-genes-mini-rust](../06-genes-mini-rust) written in Go. It takes the sequence -length from `os.Stat` and distinguishes an absent scalar from a failed read -with `errors.Is(err, fs.ErrNotExist)`. +[06-genes-mini-rust](../06-genes-mini-rust/README.md) written in Go. It takes +the sequence length from `os.Stat` and distinguishes an absent scalar from a +failed read with `errors.Is(err, fs.ErrNotExist)`. ## Build and run diff --git a/apps/06-genes-mini-python/README.md b/apps/06-genes-mini-python/README.md index 2f45031..78aa21b 100644 --- a/apps/06-genes-mini-python/README.md +++ b/apps/06-genes-mini-python/README.md @@ -1,9 +1,10 @@ # 06 - genes-mini (Python) -[06-genes-mini-rust](../06-genes-mini-rust) written in Python. It takes the -sequence length from `os.stat` and reads an absent scalar as no answer when -`FileNotFoundError` arrives. [01-hello-python](../01-hello-python) covers what a -Python module costs. +[06-genes-mini-rust](../06-genes-mini-rust/README.md) written in Python. It +takes the sequence length from `os.stat` and reads an absent scalar as no answer +when `FileNotFoundError` arrives. +[01-hello-python](../01-hello-python/README.md) covers what a Python module +costs. ## Build and run diff --git a/apps/06-genes-mini-rust/README.md b/apps/06-genes-mini-rust/README.md index 7639091..768ab79 100644 --- a/apps/06-genes-mini-rust/README.md +++ b/apps/06-genes-mini-rust/README.md @@ -7,10 +7,11 @@ to fit in memory. An absent value prints as no answer, while a missing sequence is an error. The gene grant also covers the owner's `changes` in it, even though this mini -doesn't read them. [06-bitter-meter](../06-bitter-meter) does. +doesn't read them. [06-bitter-meter](../06-bitter-meter/README.md) does. -The same mini exists in [Go](../06-genes-mini-go), [C](../06-genes-mini-c) and -[Python](../06-genes-mini-python). +The same mini exists in [Go](../06-genes-mini-go/README.md), +[C](../06-genes-mini-c/README.md) and +[Python](../06-genes-mini-python/README.md). ## Build and run diff --git a/apps/07-powerhouse-of-the-cell/README.md b/apps/07-powerhouse-of-the-cell/README.md index 0591e72..6ae72b2 100644 --- a/apps/07-powerhouse-of-the-cell/README.md +++ b/apps/07-powerhouse-of-the-cell/README.md @@ -2,10 +2,10 @@ A full report on the mitochondrial genome, read as one interval. It streams the `sequence` for GC content and density windows, and lists the owner's `changes` -with a text map of where they fall. Like [06-bitter-meter](../06-bitter-meter), -it counts listed positions without leaves and splits genotypes around symbolic -and breakend alleles. It isn't a haplogroup caller, an ancestry test or a -medical report. +with a text map of where they fall. Like +[06-bitter-meter](../06-bitter-meter/README.md), it counts listed positions +without leaves and splits genotypes around symbolic and breakend alleles. It +isn't a haplogroup caller, an ancestry test or a medical report. ## Build and run diff --git a/apps/07-regions-mini-c/README.md b/apps/07-regions-mini-c/README.md index 0d5ea3f..82f5976 100644 --- a/apps/07-regions-mini-c/README.md +++ b/apps/07-regions-mini-c/README.md @@ -1,8 +1,8 @@ # 07 - regions-mini (C) -[07-regions-mini-rust](../07-regions-mini-rust) written in C. It reads the -sequence in 8 KiB chunks with `fread`, so the interval never has to fit in -memory. [01-hello-c](../01-hello-c) covers the toolchain. +[07-regions-mini-rust](../07-regions-mini-rust/README.md) written in C. It reads +the sequence in 8 KiB chunks with `fread`, so the interval never has to fit in +memory. [01-hello-c](../01-hello-c/README.md) covers the toolchain. ## Build and run diff --git a/apps/07-regions-mini-go/README.md b/apps/07-regions-mini-go/README.md index a6433ba..e320af3 100644 --- a/apps/07-regions-mini-go/README.md +++ b/apps/07-regions-mini-go/README.md @@ -1,8 +1,8 @@ # 07 - regions-mini (Go) -[07-regions-mini-rust](../07-regions-mini-rust) written in Go. It reads the -sequence in 8 KiB chunks with `os.File.Read`, so the interval never has to fit -in memory. +[07-regions-mini-rust](../07-regions-mini-rust/README.md) written in Go. It +reads the sequence in 8 KiB chunks with `os.File.Read`, so the interval never +has to fit in memory. ## Build and run diff --git a/apps/07-regions-mini-python/README.md b/apps/07-regions-mini-python/README.md index 9a651e9..fbcfbd5 100644 --- a/apps/07-regions-mini-python/README.md +++ b/apps/07-regions-mini-python/README.md @@ -1,8 +1,9 @@ # 07 - regions-mini (Python) -[07-regions-mini-rust](../07-regions-mini-rust) written in Python. It reads the -sequence in 8 KiB chunks of bytes, so the interval never has to fit in memory. -[01-hello-python](../01-hello-python) covers what a Python module costs. +[07-regions-mini-rust](../07-regions-mini-rust/README.md) written in Python. It +reads the sequence in 8 KiB chunks of bytes, so the interval never has to fit in +memory. [01-hello-python](../01-hello-python/README.md) covers what a Python +module costs. ## Build and run diff --git a/apps/07-regions-mini-rust/README.md b/apps/07-regions-mini-rust/README.md index a502107..c453f6e 100644 --- a/apps/07-regions-mini-rust/README.md +++ b/apps/07-regions-mini-rust/README.md @@ -6,10 +6,11 @@ its length and GC content, so memory use doesn't grow with the interval. A missing sequence or a failed read stops the app. The interval grant also covers the owner's `changes`, which -[07-powerhouse-of-the-cell](../07-powerhouse-of-the-cell) lists. +[07-powerhouse-of-the-cell](../07-powerhouse-of-the-cell/README.md) lists. -The same mini exists in [Go](../07-regions-mini-go), -[C](../07-regions-mini-c) and [Python](../07-regions-mini-python). +The same mini exists in [Go](../07-regions-mini-go/README.md), +[C](../07-regions-mini-c/README.md) and +[Python](../07-regions-mini-python/README.md). ## Build and run diff --git a/apps/08-vcf-mini-c/README.md b/apps/08-vcf-mini-c/README.md index 7d0804e..8048514 100644 --- a/apps/08-vcf-mini-c/README.md +++ b/apps/08-vcf-mini-c/README.md @@ -1,10 +1,10 @@ # 08 - vcf-mini (C) -[08-vcf-mini-rust](../08-vcf-mini-rust) written in C. It reads the call file -with `getline`, which accepts long records while keeping only one line in -memory, over a 64 KiB `setvbuf` buffer. The default buffer is small enough to +[08-vcf-mini-rust](../08-vcf-mini-rust/README.md) written in C. It reads the +call file with `getline`, which accepts long records while keeping only one line +in memory, over a 64 KiB `setvbuf` buffer. The default buffer is small enough to make a whole-genome scan an order of magnitude slower. -[01-hello-c](../01-hello-c) covers the toolchain. +[01-hello-c](../01-hello-c/README.md) covers the toolchain. ## Build and run diff --git a/apps/08-vcf-mini-go/README.md b/apps/08-vcf-mini-go/README.md index 603131c..ef72cdc 100644 --- a/apps/08-vcf-mini-go/README.md +++ b/apps/08-vcf-mini-go/README.md @@ -1,8 +1,9 @@ # 08 - vcf-mini (Go) -[08-vcf-mini-rust](../08-vcf-mini-rust) written in Go. It reads the call file -with `bufio.Reader.ReadString`, which accepts long records while keeping only -one line in memory, over a 64 KiB buffer from `bufio.NewReaderSize`. +[08-vcf-mini-rust](../08-vcf-mini-rust/README.md) written in Go. It reads the +call file with `bufio.Reader.ReadString`, which accepts long records while +keeping only one line in memory, over a 64 KiB buffer from +`bufio.NewReaderSize`. ## Build and run diff --git a/apps/08-vcf-mini-python/README.md b/apps/08-vcf-mini-python/README.md index 39b8ed8..5a4264f 100644 --- a/apps/08-vcf-mini-python/README.md +++ b/apps/08-vcf-mini-python/README.md @@ -1,8 +1,9 @@ # 08 - vcf-mini (Python) -[08-vcf-mini-rust](../08-vcf-mini-rust) written in Python. Iterating the open -file yields one line at a time, so a whole-genome call file never has to fit in -memory. [01-hello-python](../01-hello-python) covers what a Python module costs. +[08-vcf-mini-rust](../08-vcf-mini-rust/README.md) written in Python. Iterating +the open file yields one line at a time, so a whole-genome call file never has +to fit in memory. [01-hello-python](../01-hello-python/README.md) covers what a +Python module costs. ## Build and run diff --git a/apps/08-vcf-mini-rust/README.md b/apps/08-vcf-mini-rust/README.md index b4ba358..f88b63b 100644 --- a/apps/08-vcf-mini-rust/README.md +++ b/apps/08-vcf-mini-rust/README.md @@ -4,14 +4,15 @@ The app grants the whole call file, `v1/genome/snp-indel`, and streams `vcf` one line at a time to count its header lines and records. A whole-genome call file runs to gigabytes, far past an app's 128 MiB of memory, so it's never loaded whole. A failed read stops the app instead of reporting zero records. -[08-vcf-roll-call](../08-vcf-roll-call) parses the same file with a library. +[08-vcf-roll-call](../08-vcf-roll-call/README.md) parses the same file with a +library. It reads through a 64 KiB buffer into one reused line. Both matter over millions of records, since every refill leaves the sandbox and a fresh line per record would allocate for each one. -The same mini exists in [Go](../08-vcf-mini-go), [C](../08-vcf-mini-c) and -[Python](../08-vcf-mini-python). +The same mini exists in [Go](../08-vcf-mini-go/README.md), +[C](../08-vcf-mini-c/README.md) and [Python](../08-vcf-mini-python/README.md). ## Build and run diff --git a/docs/01-app-model.md b/docs/01-app-model.md index ce6b753..dfcd57a 100644 --- a/docs/01-app-model.md +++ b/docs/01-app-model.md @@ -67,7 +67,7 @@ same report every time: unrelated to real time. An app that needs a random-looking choice derives it from its input. -[10-fortune-cookie](../apps/10-fortune-cookie) does exactly that. +[10-fortune-cookie](../apps/10-fortune-cookie/README.md) does exactly that. ## Limits diff --git a/docs/02-manifest.md b/docs/02-manifest.md index 658ddfe..9c789f4 100644 --- a/docs/02-manifest.md +++ b/docs/02-manifest.md @@ -23,8 +23,8 @@ category = "traits" license = "BSD-3-Clause" ``` -[04-cilantro-soapiness](../apps/04-cilantro-soapiness) prints this manifest, -with a longer listing. +[04-cilantro-soapiness](../apps/04-cilantro-soapiness/README.md) prints this +manifest, with a longer listing. ## Format @@ -120,7 +120,8 @@ It suits data that adds to a report without being needed for its answer. absent answer, as [04-reading-data.md](04-reading-data.md#least-privilege) shows. -[02-permissions](../apps/02-permissions) asks for one optional variant. +[02-permissions](../apps/02-permissions/README.md) asks for one optional +variant. ## Choosing grants @@ -170,7 +171,7 @@ per input and named after it, in UTF-8 with no trailing newline. A choice's file holds the picked choice. A multiple choice's file holds the picks one per line, in the order of `choices`, and is empty when nothing was picked. A text's file holds the text, which is never empty. -[03-sundae-order](../apps/03-sundae-order) reads all three. +[03-sundae-order](../apps/03-sundae-order/README.md) reads all three. Inputs never change what an app reads. An app whose reads depend on an answer grants everything the answer can select. The Ark's journal records which inputs diff --git a/docs/04-reading-data.md b/docs/04-reading-data.md index b7bbc46..a3061f6 100644 --- a/docs/04-reading-data.md +++ b/docs/04-reading-data.md @@ -54,7 +54,7 @@ app meets most are `A/G` and `A|G`, a haploid `G`, a missing allele such as At a known SNP, splitting on `/` and `|` is enough. An app that walks `changes` can meet symbolic alleles such as `` and breakends, which contain those characters themselves, so it has to split only outside them. -[06-bitter-meter](../apps/06-bitter-meter) shows how. +[06-bitter-meter](../apps/06-bitter-meter/README.md) shows how. ## From narrowest to broadest @@ -71,14 +71,15 @@ Grant one `rsids/` directory and read its `genotype`, `chromosome`, paths = ["v1/genome/rsids/rs72921001"] ``` -[04-cilantro-mini-rust](../apps/04-cilantro-mini-rust), with its Go, C and -Python siblings, shows the bare read. -[04-cilantro-soapiness](../apps/04-cilantro-soapiness) turns it into a report. +[04-cilantro-mini-rust](../apps/04-cilantro-mini-rust/README.md), with its Go, C +and Python siblings, shows the bare read. +[04-cilantro-soapiness](../apps/04-cilantro-soapiness/README.md) turns it into a +report. ### A panel of variants Grant one `rsids/` directory per variant. The owner sees each site by name. -[05-drunk-o-type](../apps/05-drunk-o-type) reads eleven. +[05-drunk-o-type](../apps/05-drunk-o-type/README.md) reads eleven. ### One position @@ -92,21 +93,23 @@ Grant `genes/` to read its `chromosome`, `start`, `end`, `strand`, `biotype` and `sequence`, and its `changes`, one directory per position where a record starting inside the gene holds an ALT allele. A gene can have no `changes` directory at all, and a very long or very variable one fails with -"file too large". [06-genes-mini-rust](../apps/06-genes-mini-rust) shows the bare read, -and [06-bitter-meter](../apps/06-bitter-meter) turns TAS2R38 into a report. +"file too large". [06-genes-mini-rust](../apps/06-genes-mini-rust/README.md) +shows the bare read, and [06-bitter-meter](../apps/06-bitter-meter/README.md) +turns TAS2R38 into a report. ### An interval Grant `regions//-` for any stretch of a chromosome, with the same `sequence` and `changes` as a gene. When `changes` fails with "file too large", split the interval and list each half. -[07-regions-mini-rust](../apps/07-regions-mini-rust) shows the bare read, and -[07-powerhouse-of-the-cell](../apps/07-powerhouse-of-the-cell) reads the whole -mitochondrial genome as one interval. +[07-regions-mini-rust](../apps/07-regions-mini-rust/README.md) shows the bare +read, and +[07-powerhouse-of-the-cell](../apps/07-powerhouse-of-the-cell/README.md) reads +the whole mitochondrial genome as one interval. A gene or interval grant includes its `changes`, even if the app never lists -them. [09-motif-finder](../apps/09-motif-finder) reads only a gene's sequence, -yet its grant still covers the gene's variants. +them. [09-motif-finder](../apps/09-motif-finder/README.md) reads only a gene's +sequence, yet its grant still covers the gene's variants. ### The whole call file @@ -114,9 +117,9 @@ Grant `snp-indel` to read the `vcf` itself, when no lens answers the question. It is the broadest request there is, and the file runs to gigabytes, so read it line by line, through a large buffer. Every refill leaves the sandbox, so a small default buffer can cost ten times the scan time. -[08-vcf-mini-rust](../apps/08-vcf-mini-rust) counts records with a plain line -scan, and [08-vcf-roll-call](../apps/08-vcf-roll-call) parses the whole file -with `noodles-vcf`. +[08-vcf-mini-rust](../apps/08-vcf-mini-rust/README.md) counts records with a +plain line scan, and [08-vcf-roll-call](../apps/08-vcf-roll-call/README.md) +parses the whole file with `noodles-vcf`. ## Least privilege @@ -129,5 +132,5 @@ and it can't distinguish a decline from missing data. So an app checks for the directory before reading an optional grant, and reports its absence as a finding, never as an error. -[02-permissions](../apps/02-permissions) reads a granted path and an optional -one, then shows that an undeclared path can't be opened. +[02-permissions](../apps/02-permissions/README.md) reads a granted path and an +optional one, then shows that an undeclared path can't be opened. diff --git a/docs/05-running.md b/docs/05-running.md index 6523e84..eabbf99 100644 --- a/docs/05-running.md +++ b/docs/05-running.md @@ -61,7 +61,8 @@ make run APP=04-cilantro-mini-rust FIXTURES=fixtures/no-call with no arguments to collect its manifest, mounts only the declared datasets from the fixture root, read-only, and runs the module again with `/` as its first argument. An undeclared path is never mounted, which is how -[02-permissions](../apps/02-permissions) can show a blocked read on a laptop. +[02-permissions](../apps/02-permissions/README.md) can show a blocked read on a +laptop. An optional path is mounted when the fixture root holds it, as if the owner switched it on, and left out when the root lacks it, the way an Ark leaves out @@ -124,7 +125,7 @@ missing grants there. - **The limits.** Memory, output and the manifest pass's time are unbounded. - **The deterministic sandbox.** A stock `wasmtime` gives real randomness and real clocks, so don't depend on either, as - [10-fortune-cookie](../apps/10-fortune-cookie) explains. + [10-fortune-cookie](../apps/10-fortune-cookie/README.md) explains. - **The owner's review.** You always see standard output and standard error at once, as if `develop` were set and the owner released every report. - **The generated tree.** Plain directories list everything, and no read fails diff --git a/docs/06-reports.md b/docs/06-reports.md index 647a5fd..2160a59 100644 --- a/docs/06-reports.md +++ b/docs/06-reports.md @@ -61,8 +61,8 @@ report, so an app called `drunk-o-type` prints a report titled "How Your Body Handles a Drink". The same shape holds one variant, a panel, a gene, a whole call file, and the summary a study asked for. -[04-cilantro-soapiness](../apps/04-cilantro-soapiness) is a light app, and -its report in this shape: +[04-cilantro-soapiness](../apps/04-cilantro-soapiness/README.md) is a light app, +and its report in this shape: ```markdown # 🌿 Cilantro Taste Test diff --git a/tools/check.sh b/tools/check.sh index 58a0cd7..dd5405c 100644 --- a/tools/check.sh +++ b/tools/check.sh @@ -176,7 +176,7 @@ check_links() { case $target in http://*|https://*|'#'*) continue ;; esac - [ -e "$(dirname "$page")/${target%%#*}" ] || fail "$page links to missing $target" + [ -f "$(dirname "$page")/${target%%#*}" ] || fail "$page links to missing $target" done done echo "checked documentation links"