From 3483fa4cbfc296623bf70294c703773c3d66c8ad Mon Sep 17 00:00:00 2001 From: i Date: Wed, 9 Sep 2026 08:24:54 -0400 Subject: [PATCH 1/8] =?UTF-8?q?Express=20canonical=20strand=20types=20in?= =?UTF-8?q?=20Idri=C3=A7=20style?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/IB/Strand.idric | 151 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 151 insertions(+) create mode 100644 src/IB/Strand.idric diff --git a/src/IB/Strand.idric b/src/IB/Strand.idric new file mode 100644 index 0000000..2fe7617 --- /dev/null +++ b/src/IB/Strand.idric @@ -0,0 +1,151 @@ +module IB.Strand + +%default total + +-- These wrappers keep empty filesystem, source, address, and resource names out +-- of the semantic strand. Their representations stay private to this module. +export +data NonemptyText = TextBeginning Char (List Char) + +export +nonempty_text : String → Maybe NonemptyText +nonempty_text value = + case unpack value of + [] ⇒ Nothing + first :: rest ⇒ Just (TextBeginning first rest) + +export +nonempty_text_value : NonemptyText → String +nonempty_text_value (TextBeginning first rest) = pack (first :: rest) + +public export +data RepresentationOrigin + = HtmlSource + | PdfSource + | PlainTextSource + | DerivedSource + | OtherSource + +public export +data RepresentationCompleteness + = PartialSource + | CompleteSource + +public export +record SourceRepresentation where + constructor Source + reference : NonemptyText + origin : RepresentationOrigin + completeness : RepresentationCompleteness + +export +data RequestedAddress = Requested NonemptyText + +export +data ResolvedAddress = Resolved NonemptyText + +export +data LinkReference = LinkTo NonemptyText + +export +data FormReference = SubmitTo NonemptyText + +export +data ImageReference = ImageAt NonemptyText + +export +requested_address : String → Maybe RequestedAddress +requested_address value = map Requested (nonempty_text value) + +export +resolved_address : String → Maybe ResolvedAddress +resolved_address value = map Resolved (nonempty_text value) + +export +link_reference : String → Maybe LinkReference +link_reference value = map LinkTo (nonempty_text value) + +export +form_reference : String → Maybe FormReference +form_reference value = map SubmitTo (nonempty_text value) + +export +image_reference : String → Maybe ImageReference +image_reference value = map ImageAt (nonempty_text value) + +export +requested_address_value : RequestedAddress → String +requested_address_value (Requested value) = nonempty_text_value value + +export +resolved_address_value : ResolvedAddress → String +resolved_address_value (Resolved value) = nonempty_text_value value + +export +link_reference_value : LinkReference → String +link_reference_value (LinkTo value) = nonempty_text_value value + +export +form_reference_value : FormReference → String +form_reference_value (SubmitTo value) = nonempty_text_value value + +export +image_reference_value : ImageReference → String +image_reference_value (ImageAt value) = nonempty_text_value value + +public export +data HeadingLevel + = Heading1 + | Heading2 + | Heading3 + | Heading4 + | Heading5 + | Heading6 + +export +heading_level_number : HeadingLevel → Integer +heading_level_number Heading1 = 1 +heading_level_number Heading2 = 2 +heading_level_number Heading3 = 3 +heading_level_number Heading4 = 4 +heading_level_number Heading5 = 5 +heading_level_number Heading6 = 6 + +export +heading_level : Integer → Maybe HeadingLevel +heading_level 1 = Just Heading1 +heading_level 2 = Just Heading2 +heading_level 3 = Just Heading3 +heading_level 4 = Just Heading4 +heading_level 5 = Just Heading5 +heading_level 6 = Just Heading6 +heading_level _ = Nothing + +export +data NonemptyTableRow = TableCells String (List String) + +export +table_row : String → List String → NonemptyTableRow +table_row first remaining = TableCells first remaining + +export +table_row_cells : NonemptyTableRow → List String +table_row_cells (TableCells first remaining) = first :: remaining + +public export +data InformationBlock + = Heading HeadingLevel String + | Text String + | Link String LinkReference + | TableRow NonemptyTableRow + | Form String FormReference + | Image ImageReference String String (Maybe LinkReference) + +public export +record Strand where + constructor MakeStrand + source : SourceRepresentation + requested : RequestedAddress + resolved : ResolvedAddress + title : Maybe String + blocks : List InformationBlock From ee6c0b9928910846ecc98ac535eb99394c1ddba1 Mon Sep 17 00:00:00 2001 From: i Date: Wed, 9 Sep 2026 08:25:09 -0400 Subject: [PATCH 2/8] Express prepaint revisions without Nat --- src/IB/Prepaint.idric | 51 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 51 insertions(+) create mode 100644 src/IB/Prepaint.idric diff --git a/src/IB/Prepaint.idric b/src/IB/Prepaint.idric new file mode 100644 index 0000000..b3d124f --- /dev/null +++ b/src/IB/Prepaint.idric @@ -0,0 +1,51 @@ +module IB.Prepaint + +import IB.Strand + +%default total + +-- Revision numbers are generated here rather than exposed as an unrestricted +-- machine count. Zero is the first valid revision and next_revision is the +-- only public way to advance it. +export +data RevisionSequence = Revision Integer + +export +first_revision : RevisionSequence +first_revision = Revision 0 + +export +next_revision : RevisionSequence → RevisionSequence +next_revision (Revision value) = Revision (value + 1) + +export +revision_sequence_value : RevisionSequence → Integer +revision_sequence_value (Revision value) = value + +public export +data RevisionState + = PartialRevision + | CompleteRevision + +public export +record PrepaintRevision where + constructor Prepaint + sequence : RevisionSequence + state : RevisionState + source : SourceRepresentation + requested : RequestedAddress + resolved : ResolvedAddress + title : Maybe String + blocks : List InformationBlock + +export +prepaint_from_strand : RevisionSequence → RevisionState → Strand → PrepaintRevision +prepaint_from_strand sequence state strand = + Prepaint + sequence + state + strand.source + strand.requested + strand.resolved + strand.title + strand.blocks From b265a75d01ac57d7686b3ba1af08c619ff73c3d0 Mon Sep 17 00:00:00 2001 From: i Date: Wed, 9 Sep 2026 08:25:28 -0400 Subject: [PATCH 3/8] =?UTF-8?q?Serialize=20canonical=20strand=20projection?= =?UTF-8?q?=20in=20current=20Idri=C3=A7=20style?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/IB/Prepaint/Version1.idric | 46 ++++++++++++++++------------------ 1 file changed, 21 insertions(+), 25 deletions(-) diff --git a/src/IB/Prepaint/Version1.idric b/src/IB/Prepaint/Version1.idric index 90fc839..91bf801 100644 --- a/src/IB/Prepaint/Version1.idric +++ b/src/IB/Prepaint/Version1.idric @@ -1,7 +1,7 @@ module IB.Prepaint.Version1 -import IB.Information.Model -import IB.Prepaint.Model +import IB.Strand +import IB.Prepaint %default total @@ -25,12 +25,7 @@ join_fields [value] = value join_fields (value :: rest) = value ++ "\t" ++ join_fields rest heading_level_text : HeadingLevel → String -heading_level_text Heading1 = "1" -heading_level_text Heading2 = "2" -heading_level_text Heading3 = "3" -heading_level_text Heading4 = "4" -heading_level_text Heading5 = "5" -heading_level_text Heading6 = "6" +heading_level_text level = show (heading_level_number level) revision_state_text : RevisionState → String revision_state_text PartialRevision = "partial" @@ -41,33 +36,33 @@ maybe_text Nothing = "" maybe_text (Just value) = value serialize_block : InformationBlock → String -serialize_block (InformationHeading level text) = +serialize_block (Heading level text) = join_fields ["heading", heading_level_text level, escape_field text] -serialize_block (InformationText text) = +serialize_block (Text text) = join_fields ["text", escape_field text] -serialize_block (InformationLink text reference) = +serialize_block (Link text reference) = join_fields ["link", escape_field text, escape_field (link_reference_value reference)] -serialize_block (InformationTableRow row) = +serialize_block (TableRow row) = join_fields ("row" :: map escape_field (table_row_cells row)) -serialize_block (InformationForm text reference) = +serialize_block (Form text reference) = join_fields ["form", escape_field text, escape_field (form_reference_value reference)] -serialize_block (InformationImage source alternate caption Nothing) = +serialize_block (Image source alternate caption Nothing) = join_fields [ "image" - , escape_field (fetched_image_value source) + , escape_field (image_reference_value source) , escape_field alternate , escape_field caption ] -serialize_block (InformationImage source alternate caption (Just reference)) = +serialize_block (Image source alternate caption (Just reference)) = join_fields [ "image" - , escape_field (fetched_image_value source) + , escape_field (image_reference_value source) , escape_field alternate , escape_field caption , escape_field (link_reference_value reference) ] -public export +export serialize_revision : PrepaintRevision → List String serialize_revision revision = join_fields @@ -80,18 +75,19 @@ serialize_revision revision = join_fields ["title", escape_field (maybe_text revision.title)] :: map serialize_block revision.blocks ++ ["end"] -strictly_after : Nat → PrepaintRevision → Bool -strictly_after previous revision = previous < revision_sequence_value revision.sequence +strictly_after : RevisionSequence → PrepaintRevision → Bool +strictly_after previous revision = + revision_sequence_value previous < revision_sequence_value revision.sequence -serialize_revisions : Maybe Nat → List PrepaintRevision → Maybe (List String) +serialize_revisions : Maybe RevisionSequence → List PrepaintRevision → Maybe (List String) serialize_revisions previous [] = Just [] serialize_revisions Nothing (revision :: rest) = do - remaining <- serialize_revisions (Just (revision_sequence_value revision.sequence)) rest + remaining ← serialize_revisions (Just revision.sequence) rest pure (serialize_revision revision ++ remaining) serialize_revisions (Just previous) (revision :: rest) = if strictly_after previous revision then do - remaining <- serialize_revisions (Just (revision_sequence_value revision.sequence)) rest + remaining ← serialize_revisions (Just revision.sequence) rest pure (serialize_revision revision ++ remaining) else Nothing @@ -99,8 +95,8 @@ join_lines : List String → String join_lines [] = "" join_lines (line :: rest) = line ++ "\n" ++ join_lines rest -public export +export serialize_version1 : List PrepaintRevision → Maybe String serialize_version1 revisions = do - body <- serialize_revisions Nothing revisions + body ← serialize_revisions Nothing revisions pure (join_lines (join_fields ["ib-prepaint", "1"] :: body)) From 2eb6bc1650d4688b3de201a1a3525e889d18a71f Mon Sep 17 00:00:00 2001 From: i Date: Wed, 9 Sep 2026 08:25:49 -0400 Subject: [PATCH 4/8] Exercise strand types through semantic constructors --- src/CanonicalInformationSmoke.idric | 61 +++++++++++++++-------------- 1 file changed, 32 insertions(+), 29 deletions(-) diff --git a/src/CanonicalInformationSmoke.idric b/src/CanonicalInformationSmoke.idric index 536f055..49c0c97 100644 --- a/src/CanonicalInformationSmoke.idric +++ b/src/CanonicalInformationSmoke.idric @@ -1,68 +1,71 @@ module CanonicalInformationSmoke -import IB.Information.Model -import IB.Prepaint.Model +import IB.Strand +import IB.Prepaint import IB.Prepaint.Version1 %default total fixture_strand : Maybe Strand fixture_strand = do - source_reference <- nonempty_text "fixture:strand-1" - requested <- requested_address "https://example.test/requested" - resolved <- resolved_address "https://example.test/resolved" - image <- fetched_image "asset:figure-1" - let source = Source source_reference HtmlRepresentation CompleteRepresentation + source_reference ← nonempty_text "fixture:strand-1" + requested ← requested_address "https://example.test/requested" + resolved ← resolved_address "https://example.test/resolved" + image ← image_reference "asset:figure-1" + next_link ← link_reference "/next" + search_form ← form_reference "/search" + figure_link ← link_reference "/figure/1" + let source = Source source_reference HtmlSource CompleteSource pure (MakeStrand source requested resolved (Just "Example") - [ InformationHeading Heading2 "Section" - , InformationText "Visible paragraph" - , InformationLink "Next" (LinkReference "/next") - , InformationTableRow (TableCells "first" ["second"]) - , InformationForm "Search" (FormReference "/search") - , InformationImage image "diagram" "Figure 1" (Just (LinkReference "/figure/1")) + [ Heading Heading2 "Section" + , Text "Visible paragraph" + , Link "Next" next_link + , TableRow (table_row "first" ["second"]) + , Form "Search" search_form + , Image image "diagram" "Figure 1" (Just figure_link) ]) empty_image_refused : Bool empty_image_refused = - case fetched_image "" of - Nothing => True - Just _ => False + case image_reference "" of + Nothing ⇒ True + Just _ ⇒ False seventh_heading_refused : Bool seventh_heading_refused = case heading_level 7 of - Nothing => True - Just _ => False + Nothing ⇒ True + Just _ ⇒ False nonincreasing_revision_refused : Strand → Bool nonincreasing_revision_refused strand = - let first = revision_from_strand (Revision 1) PartialRevision strand in - let second = revision_from_strand (Revision 1) CompleteRevision strand in + let first = prepaint_from_strand first_revision PartialRevision strand in + let second = prepaint_from_strand first_revision CompleteRevision strand in case serialize_version1 [first, second] of - Nothing => True - Just _ => False + Nothing ⇒ True + Just _ ⇒ False main : IO () main = do case fixture_strand of - Nothing => putStrLn "canonical-information=construction-failed" - (Just strand) => do - let partial = revision_from_strand (Revision 0) PartialRevision strand - let complete = revision_from_strand (Revision 1) CompleteRevision strand + Nothing ⇒ putStrLn "canonical-information=construction-failed" + Just strand ⇒ do + let partial = prepaint_from_strand first_revision PartialRevision strand + let complete = prepaint_from_strand (next_revision first_revision) CompleteRevision strand putStrLn "canonical-information=constructed" putStrLn ("canonical-blocks=" ++ show (length strand.blocks)) - putStrLn ("canonical-row-cells=" ++ show (length (table_row_cells (TableCells "first" ["second"])))) + putStrLn ("canonical-row-cells=" ++ show (length (table_row_cells (table_row "first" ["second"])))) putStrLn ("empty-image-refused=" ++ show empty_image_refused) putStrLn ("seventh-heading-refused=" ++ show seventh_heading_refused) putStrLn ("revision-zero=" ++ show (revision_sequence_value partial.sequence)) putStrLn ("nonincreasing-revision-refused=" ++ show (nonincreasing_revision_refused strand)) case serialize_version1 [partial, complete] of - Nothing => putStrLn "version1=serialization-failed" - (Just version1_text) => do + Nothing ⇒ putStrLn "version1=serialization-failed" + Just version1_text ⇒ do putStrLn "version1=serialized" putStrLn ("version1-bytes=" ++ show (length (unpack version1_text))) From bbbf861116f4887614113742207de1ca437f1c1e Mon Sep 17 00:00:00 2001 From: i Date: Wed, 9 Sep 2026 08:26:08 -0400 Subject: [PATCH 5/8] Remove superseded implementation-first information model --- src/IB/Information/Model.idric | 137 --------------------------------- 1 file changed, 137 deletions(-) delete mode 100644 src/IB/Information/Model.idric diff --git a/src/IB/Information/Model.idric b/src/IB/Information/Model.idric deleted file mode 100644 index 383cd2b..0000000 --- a/src/IB/Information/Model.idric +++ /dev/null @@ -1,137 +0,0 @@ -module IB.Information.Model - -%default total - -public export -data NonemptyText = TextBeginning Char (List Char) - -public export -nonempty_text : String → Maybe NonemptyText -nonempty_text value = - case unpack value of - [] => Nothing - first :: rest => Just (TextBeginning first rest) - -public export -nonempty_text_value : NonemptyText → String -nonempty_text_value (TextBeginning first rest) = pack (first :: rest) - -public export -data RepresentationOrigin - = HtmlRepresentation - | PdfRepresentation - | PlainTextRepresentation - | DerivedRepresentation - | OtherRepresentation - -public export -data RepresentationCompleteness - = PartialRepresentation - | CompleteRepresentation - -public export -record SourceRepresentation where - constructor Source - reference : NonemptyText - origin : RepresentationOrigin - completeness : RepresentationCompleteness - -public export -data RequestedAddressText = RequestedAddress NonemptyText - -public export -data ResolvedAddressText = ResolvedAddress NonemptyText - -public export -data LinkReferenceText = LinkReference String - -public export -data FormReferenceText = FormReference String - -public export -data FetchedImageReference = FetchedImage NonemptyText - -public export -requested_address : String → Maybe RequestedAddressText -requested_address value = map RequestedAddress (nonempty_text value) - -public export -resolved_address : String → Maybe ResolvedAddressText -resolved_address value = map ResolvedAddress (nonempty_text value) - -public export -fetched_image : String → Maybe FetchedImageReference -fetched_image value = map FetchedImage (nonempty_text value) - -public export -requested_address_value : RequestedAddressText → String -requested_address_value (RequestedAddress value) = nonempty_text_value value - -public export -resolved_address_value : ResolvedAddressText → String -resolved_address_value (ResolvedAddress value) = nonempty_text_value value - -public export -link_reference_value : LinkReferenceText → String -link_reference_value (LinkReference value) = value - -public export -form_reference_value : FormReferenceText → String -form_reference_value (FormReference value) = value - -public export -fetched_image_value : FetchedImageReference → String -fetched_image_value (FetchedImage value) = nonempty_text_value value - -public export -data HeadingLevel - = Heading1 - | Heading2 - | Heading3 - | Heading4 - | Heading5 - | Heading6 - -public export -heading_level_number : HeadingLevel → Nat -heading_level_number Heading1 = 1 -heading_level_number Heading2 = 2 -heading_level_number Heading3 = 3 -heading_level_number Heading4 = 4 -heading_level_number Heading5 = 5 -heading_level_number Heading6 = 6 - -public export -heading_level : Nat → Maybe HeadingLevel -heading_level 1 = Just Heading1 -heading_level 2 = Just Heading2 -heading_level 3 = Just Heading3 -heading_level 4 = Just Heading4 -heading_level 5 = Just Heading5 -heading_level 6 = Just Heading6 -heading_level _ = Nothing - -public export -data NonemptyTableRow = TableCells String (List String) - -public export -table_row_cells : NonemptyTableRow → List String -table_row_cells (TableCells first rest) = first :: rest - -public export -data InformationBlock - = InformationHeading HeadingLevel String - | InformationText String - | InformationLink String LinkReferenceText - | InformationTableRow NonemptyTableRow - | InformationForm String FormReferenceText - | InformationImage FetchedImageReference String String (Maybe LinkReferenceText) - -public export -record Strand where - constructor MakeStrand - source : SourceRepresentation - requested : RequestedAddressText - resolved : ResolvedAddressText - title : Maybe String - blocks : List InformationBlock From 7d97d0533e7758d169b94e20c3295d381a91f195 Mon Sep 17 00:00:00 2001 From: i Date: Wed, 9 Sep 2026 08:26:14 -0400 Subject: [PATCH 6/8] Remove superseded prepaint model module --- src/IB/Prepaint/Model.idric | 40 ------------------------------------- 1 file changed, 40 deletions(-) delete mode 100644 src/IB/Prepaint/Model.idric diff --git a/src/IB/Prepaint/Model.idric b/src/IB/Prepaint/Model.idric deleted file mode 100644 index d94f0f2..0000000 --- a/src/IB/Prepaint/Model.idric +++ /dev/null @@ -1,40 +0,0 @@ -module IB.Prepaint.Model - -import IB.Information.Model - -%default total - -public export -data RevisionSequence = Revision Nat - -public export -revision_sequence_value : RevisionSequence → Nat -revision_sequence_value (Revision value) = value - -public export -data RevisionState - = PartialRevision - | CompleteRevision - -public export -record PrepaintRevision where - constructor Prepaint - sequence : RevisionSequence - state : RevisionState - source : SourceRepresentation - requested : RequestedAddressText - resolved : ResolvedAddressText - title : Maybe String - blocks : List InformationBlock - -public export -revision_from_strand : RevisionSequence → RevisionState → Strand → PrepaintRevision -revision_from_strand sequence state strand = - Prepaint - sequence - state - strand.source - strand.requested - strand.resolved - strand.title - strand.blocks From 42ecb2d7d9698e6535ccaa1256f528ad29a8ead5 Mon Sep 17 00:00:00 2001 From: i Date: Wed, 9 Sep 2026 08:27:17 -0400 Subject: [PATCH 7/8] Keep strand smoke pure until final output --- src/CanonicalInformationSmoke.idric | 44 +++++++++++++++++------------ 1 file changed, 26 insertions(+), 18 deletions(-) diff --git a/src/CanonicalInformationSmoke.idric b/src/CanonicalInformationSmoke.idric index 49c0c97..15ce11f 100644 --- a/src/CanonicalInformationSmoke.idric +++ b/src/CanonicalInformationSmoke.idric @@ -50,22 +50,30 @@ nonincreasing_revision_refused strand = Nothing ⇒ True Just _ ⇒ False +version1_result : Maybe String → String +version1_result Nothing = "version1=serialization-failed" +version1_result (Just version1_text) = + "version1=serialized\n" ++ + "version1-bytes=" ++ show (length (unpack version1_text)) + +strand_report : Strand → String +strand_report strand = + let partial = prepaint_from_strand first_revision PartialRevision strand in + let complete = prepaint_from_strand (next_revision first_revision) CompleteRevision strand in + unlines + [ "canonical-information=constructed" + , "canonical-blocks=" ++ show (length strand.blocks) + , "canonical-row-cells=" ++ show (length (table_row_cells (table_row "first" ["second"]))) + , "empty-image-refused=" ++ show empty_image_refused + , "seventh-heading-refused=" ++ show seventh_heading_refused + , "revision-zero=" ++ show (revision_sequence_value partial.sequence) + , "nonincreasing-revision-refused=" ++ show (nonincreasing_revision_refused strand) + , version1_result (serialize_version1 [partial, complete]) + ] + +fixture_report : Maybe Strand → String +fixture_report Nothing = "canonical-information=construction-failed" +fixture_report (Just strand) = strand_report strand + main : IO () -main = do - case fixture_strand of - Nothing ⇒ putStrLn "canonical-information=construction-failed" - Just strand ⇒ do - let partial = prepaint_from_strand first_revision PartialRevision strand - let complete = prepaint_from_strand (next_revision first_revision) CompleteRevision strand - putStrLn "canonical-information=constructed" - putStrLn ("canonical-blocks=" ++ show (length strand.blocks)) - putStrLn ("canonical-row-cells=" ++ show (length (table_row_cells (table_row "first" ["second"])))) - putStrLn ("empty-image-refused=" ++ show empty_image_refused) - putStrLn ("seventh-heading-refused=" ++ show seventh_heading_refused) - putStrLn ("revision-zero=" ++ show (revision_sequence_value partial.sequence)) - putStrLn ("nonincreasing-revision-refused=" ++ show (nonincreasing_revision_refused strand)) - case serialize_version1 [partial, complete] of - Nothing ⇒ putStrLn "version1=serialization-failed" - Just version1_text ⇒ do - putStrLn "version1=serialized" - putStrLn ("version1-bytes=" ++ show (length (unpack version1_text))) +main = putStrLn (fixture_report fixture_strand) From 120633815579520c5c6af361aa416435b79645f4 Mon Sep 17 00:00:00 2001 From: i Date: Wed, 9 Sep 2026 08:32:11 -0400 Subject: [PATCH 8/8] Follow current Edric bootstrap boundary --- bin/ci_browser_foundation.grease | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/bin/ci_browser_foundation.grease b/bin/ci_browser_foundation.grease index 105a255..b8867e6 100755 --- a/bin/ci_browser_foundation.grease +++ b/bin/ci_browser_foundation.grease @@ -18,8 +18,14 @@ build_idric() { git -C /tmp/Idric fetch --depth 1 origin "$idric_ref" git -C /tmp/Idric checkout --detach -q FETCH_HEAD test "$(git -C /tmp/Idric rev-parse HEAD)" = "$idric_ref" - SCHEME=chezscheme make -C /tmp/Idric bootstrap PREFIX="$idric_prefix" - SCHEME=chezscheme make -C /tmp/Idric install PREFIX="$idric_prefix" + + # Current Edric owns its bootstrap/build machinery below _/. Use the stable + # top-level entrypoint rather than depending on the old root Makefile layout. + PREFIX="$idric_prefix" sh /tmp/Idric/edric bootstrap + make -C /tmp/Idric/_ install \ + PREFIX="$idric_prefix" \ + SCHEME=/tmp/Idric/_/.tools/bin/scheme + test -x "$idric_prefix/bin/idris2" } verify_pdf_harvester() {