From 334bb9c301bb72d5331a2e9e067211c18e5f7c69 Mon Sep 17 00:00:00 2001
From: Ralph Amissah <ralph@amissah.com>
Date: Mon, 23 Jan 2017 17:17:47 -0500
Subject: templates

---
 org/ao_abstract_doc_source.org     | 640 ++++++++++++++++++++++++++-----------
 org/ao_conf_make_meta.org          |  82 +++--
 org/output.org                     |  69 ++--
 org/sdp.org                        |   1 +
 src/sdp.d                          |   1 +
 src/sdp/ao_abstract_doc_source.d   | 635 +++++++++++++++++++++++++-----------
 src/sdp/ao_conf_make_meta.d        |   2 +-
 src/sdp/ao_conf_make_meta_native.d |  50 ++-
 src/sdp/ao_conf_make_meta_sdlang.d |  30 +-
 src/sdp/output_epub.d              |  25 +-
 src/sdp/output_html.d              |  23 +-
 src/sdp/output_xhtmls.d            |  14 +-
 src/sdp/source_sisupod.d           |   7 +-
 13 files changed, 1118 insertions(+), 461 deletions(-)

diff --git a/org/ao_abstract_doc_source.org b/org/ao_abstract_doc_source.org
index 2100faf..a7d3d84 100644
--- a/org/ao_abstract_doc_source.org
+++ b/org/ao_abstract_doc_source.org
@@ -40,9 +40,9 @@ template SiSUdocAbstraction() {
     ) {
       debug(asserts){
         static assert(is(typeof(markup_sourcefile_content) == char[][]));
-        static assert(is(typeof(dochead_make_aa) == string[string][string]));
-        static assert(is(typeof(dochead_meta_aa) == string[string][string]));
-        static assert(is(typeof(opt_action_bool) == bool[string]));
+        static assert(is(typeof(dochead_make_aa)           == string[string][string]));
+        static assert(is(typeof(dochead_meta_aa)           == string[string][string]));
+        static assert(is(typeof(opt_action_bool)           == bool[string]));
       }
       /+ ↓ abstraction init +/
       <<abs_init_rest>>
@@ -2016,7 +2016,10 @@ functions used in document abstraction
 
 #+name: abs_functions_object_reset
 #+BEGIN_SRC d
-auto object_reset(ref string[string] an_object) {
+auto object_reset(O)(ref O an_object) {
+  debug(asserts){
+    static assert(is(typeof(an_object) == string[string]));
+  }
   an_object.remove("body_nugget");
   an_object.remove("substantive");
   an_object.remove("is");
@@ -2029,11 +2032,16 @@ auto object_reset(ref string[string] an_object) {
 
 #+name: abs_functions_header_set_common
 #+BEGIN_SRC d
-auto _common_reset_(
-  ref int[string]    line_occur,
-  ref string[string] an_object,
-  ref int[string]    type
+auto _common_reset_(L,O,T)(
+  ref L line_occur,
+  ref O an_object,
+  ref T type
 ) {
+  debug(asserts){
+    static assert(is(typeof(line_occur) == int[string]));
+    static assert(is(typeof(an_object)  == string[string]));
+    static assert(is(typeof(type)       == int[string]));
+  }
   line_occur["heading"] = State.off;
   line_occur["para"]    = State.off;
   type["heading"]       = State.off;
@@ -2046,10 +2054,14 @@ auto _common_reset_(
 
 #+name: abs_functions_ocn_status
 #+BEGIN_SRC d
-void _check_ocn_status_(
-  char[]          line,
-  ref int[string] type
+void _check_ocn_status_(L,T)(
+  L     line,
+  ref T type
 ) {
+  debug(asserts){
+    static assert(is(typeof(line) == char[]));
+    static assert(is(typeof(type) == int[string]));
+  }
   if ((!line.empty) && (type["ocn_status_multi_obj"] == TriState.off)) {
     /+ not multi-line object, check whether obj_cite_number is on or turned off +/
     if (matchFirst(line, rgx.obj_cite_number_block_marks)) {
@@ -2098,11 +2110,16 @@ void _check_ocn_status_(
 
 #+name: abs_functions_block
 #+BEGIN_SRC d
-void _start_block_(
-  char[]          line,
-  ref int[string] type,
-  string[string]  obj_cite_number_poem
+void _start_block_(L,T,N)(
+  L     line,
+  ref T type,
+  N     obj_cite_number_poem
 ) {
+  debug(asserts){
+    static assert(is(typeof(line)                 == char[]));
+    static assert(is(typeof(type)                 == int[string]));
+    static assert(is(typeof(obj_cite_number_poem) == string[string]));
+  }
 #+END_SRC
 
 ***** block (various) curly open                                  :curly:
@@ -2267,11 +2284,16 @@ void _start_block_(
 
 #+name: abs_functions_block_code
 #+BEGIN_SRC d
-void _code_block_(
-  char[]             line,
-  ref string[string] an_object,
-  ref int[string]    type
+void _code_block_(L,O,T)(
+  ref L line,
+  ref O an_object,
+  ref T type
 ) {
+  debug(asserts){
+    static assert(is(typeof(line)      == char[]));
+    static assert(is(typeof(an_object) == string[string]));
+    static assert(is(typeof(type)      == int[string]));
+  }
   if (type["curly_code"] == TriState.on) {
     if (matchFirst(line, rgx.block_curly_code_close)) {
       debug(code) {                              // code (curly) close
@@ -2309,7 +2331,10 @@ void _code_block_(
 
 #+name: abs_functions_block_biblio
 #+BEGIN_SRC d
-final string biblio_tag_map(string abr) {
+final string biblio_tag_map(A)(A abr) {
+  debug(asserts){
+    static assert(is(typeof(abr) == string));
+  }
   auto btm = [
     "au"                               : "author_raw",
     "ed"                               : "editor_raw",
@@ -2334,7 +2359,10 @@ final string biblio_tag_map(string abr) {
 
 #+name: none
 #+BEGIN_SRC d
-final string biblio_tag_map_(string abr) {
+final string biblio_tag_map_(A)(A abr) {
+  debug(asserts){
+    static assert(is(typeof(abr) == string));
+  }
   string name;
   switch (abr) {
   case "au":
@@ -2518,14 +2546,22 @@ why extra object stuff only in poem/verse?
 
 #+name: abs_functions_block_poem
 #+BEGIN_SRC d
-void _poem_block_(
-  char[]                 line,
-  ref string[string]     an_object,
-  ref int[string]        type,
-  ref int                cntr,
-  string[string]         obj_cite_number_poem,
-  string[string][string] dochead_make_aa,
+void _poem_block_(L,O,T,C,N,Ma)(
+  L     line,
+  ref O an_object,
+  ref T type,
+  ref C cntr,
+  N     obj_cite_number_poem,
+  Ma    dochead_make_aa,
 ) {
+  debug(asserts){
+    static assert(is(typeof(line)                 == char[]));
+    static assert(is(typeof(an_object)            == string[string]));
+    static assert(is(typeof(type)                 == int[string]));
+    static assert(is(typeof(cntr)                 == int));
+    static assert(is(typeof(obj_cite_number_poem) == string[string]));
+    static assert(is(typeof(dochead_make_aa)      == string[string][string]));
+  }
   if (type["curly_poem"] == TriState.on) {
     if (matchFirst(line, rgx.block_curly_poem_close)) {
       an_object[an_object_key]="verse"; // check that this is as you please
@@ -2717,11 +2753,16 @@ void _poem_block_(
 
 #+name: abs_functions_block_group
 #+BEGIN_SRC d
-void _group_block_(
-  char[]             line,
-  ref string[string] an_object,
-  ref int[string]    type
+void _group_block_(L,O,T)(
+  ref L line,
+  ref O an_object,
+  ref T type
 ) {
+  debug(asserts){
+    static assert(is(typeof(line)      == char[]));
+    static assert(is(typeof(an_object) == string[string]));
+    static assert(is(typeof(type)      == int[string]));
+  }
   if (type["curly_group"] == State.on) {
     if (matchFirst(line, rgx.block_curly_group_close)) {
       debug(group) {                           // group (curly) close
@@ -2758,11 +2799,16 @@ void _group_block_(
 
 #+name: abs_functions_block_block
 #+BEGIN_SRC d
-void _block_block_(
-  char[]             line,
-  ref string[string] an_object,
-  ref int[string]    type
+void _block_block_(L,O,T)(
+  ref L line,
+  ref O an_object,
+  ref T type
 ) {
+  debug(asserts){
+    static assert(is(typeof(line)      == char[]));
+    static assert(is(typeof(an_object) == string[string]));
+    static assert(is(typeof(type)      == int[string]));
+  }
   if (type["curly_block"] == TriState.on) {
     if (matchFirst(line, rgx.block_curly_block_close)) {
       debug(block) {                           // block (curly) close
@@ -2799,11 +2845,16 @@ void _block_block_(
 
 #+name: abs_functions_block_quote
 #+BEGIN_SRC d
-void _quote_block_(
-  char[]             line,
-  ref string[string] an_object,
-  ref int[string]    type
+void _quote_block_(L,O,T)(
+  ref L line,
+  ref O an_object,
+  ref T type
 ) {
+  debug(asserts){
+    static assert(is(typeof(line)      == char[]));
+    static assert(is(typeof(an_object) == string[string]));
+    static assert(is(typeof(type)      == int[string]));
+  }
   if (type["curly_quote"] == TriState.on) {
     if (matchFirst(line, rgx.block_curly_quote_close)) {
       debug(quote) {                           // quote (curly) close
@@ -2840,11 +2891,16 @@ void _quote_block_(
 
 #+name: abs_functions_block_table
 #+BEGIN_SRC d
-void _table_block_(
-  char[]             line,
-  ref string[string] an_object,
-  ref int[string]    type
+void _table_block_(L,O,T)(
+  ref L line,
+  ref O an_object,
+  ref T type
 ) {
+  debug(asserts){
+    static assert(is(typeof(line)      == char[]));
+    static assert(is(typeof(an_object) == string[string]));
+    static assert(is(typeof(type)      == int[string]));
+  }
   if (type["curly_table"] == TriState.on) {
     if (matchFirst(line, rgx.block_curly_table_close)) {
       debug(table) {                           // table (curly) close
@@ -3107,13 +3163,20 @@ void _block_flag_line_empty_(
 
 #+name: abs_functions_book_index
 #+BEGIN_SRC d
-auto _book_index_(
-  char[]             line,
-  ref string         book_idx_tmp,
-  ref string[string] an_object,
-  ref int[string]    type,
-  bool[string]       opt_action_bool,
+auto _book_index_(L,I,O,T,B)(
+  L      line,
+  ref I  book_idx_tmp,
+  ref O  an_object,
+  ref T  type,
+  B      opt_action_bool,
 ) {
+  debug(asserts){
+    static assert(is(typeof(line)            == char[]));
+    static assert(is(typeof(book_idx_tmp)    == string));
+    static assert(is(typeof(an_object)       == string[string]));
+    static assert(is(typeof(type)            == int[string]));
+    static assert(is(typeof(opt_action_bool) == bool[string]));
+  }
   if (auto m = match(line, rgx.book_index)) {
     /+ match book_index +/
     debug(bookindexmatch) {                       // book index
@@ -3163,13 +3226,20 @@ auto _book_index_(
 
 #+name: abs_functions_heading
 #+BEGIN_SRC d
-auto _heading_found_(
-  char[]                   line,
-  string                   dochead_make_identify_unmarked_headings,
-  ref string[string]       heading_match_str,
-  ref Regex!(char)[string] heading_match_rgx,
-  ref int[string]          type
+auto _heading_found_(L,X,H,R,T)(
+  L     line,
+  X     dochead_make_identify_unmarked_headings,
+  ref H heading_match_str,
+  ref R heading_match_rgx,
+  ref T type
 ) {
+  debug(asserts){
+    static assert(is(typeof(line)                                    == char[]));
+    static assert(is(typeof(dochead_make_identify_unmarked_headings) == string));
+    static assert(is(typeof(heading_match_str)                       == string[string]));
+    static assert(is(typeof(heading_match_rgx)                       == Regex!(char)[string]));
+    static assert(is(typeof(type)                                    == int[string]));
+  }
   if ((dochead_make_identify_unmarked_headings.length > 2)
   && (type["make_headings"] == State.off)) {
     /+ headings found +/
@@ -3253,12 +3323,18 @@ auto _heading_found_(
 
 #+name: abs_functions_heading
 #+BEGIN_SRC d
-auto _heading_make_set_(
-  ref char[]               line,
-  ref int[string]          line_occur,
-  ref Regex!(char)[string] heading_match_rgx,
-  ref int[string]          type
+auto _heading_make_set_(L,C,R,T)(
+  L     line,
+  C     line_occur,
+  ref R heading_match_rgx,
+  ref T type
 ) {
+  debug(asserts){
+    static assert(is(typeof(line)              == char[]));
+    static assert(is(typeof(line_occur)        == int[string]));
+    static assert(is(typeof(heading_match_rgx) == Regex!(char)[string]));
+    static assert(is(typeof(type)              == int[string]));
+  }
   if ((type["make_headings"] == State.on)
   && ((line_occur["para"] == State.off)
   && (line_occur["heading"] == State.off))
@@ -3315,16 +3391,26 @@ auto _heading_make_set_(
 
 #+name: abs_functions_heading
 #+BEGIN_SRC d
-auto _heading_matched_(
-  char[]                     line,
-  ref int[string]            line_occur,
-  ref string[string]         an_object,
-  ref string                 an_object_key,
-  ref int[string]            lv,
-  ref int[string]            collapsed_lev,
-  ref int[string]            type,
-  ref string[string][string] dochead_meta_aa
+auto _heading_matched_(L,C,O,K,Lv,Lc,T,Me)(
+  ref L  line,
+  ref C  line_occur,
+  ref O  an_object,
+  ref K  an_object_key,
+  ref Lv lv,
+  ref Lc collapsed_lev,
+  ref T  type,
+  ref Me dochead_meta_aa,
 ) {
+  debug(asserts){
+    static assert(is(typeof(line)            == char[]));
+    static assert(is(typeof(line_occur)      == int[string]));
+    static assert(is(typeof(an_object)       == string[string]));
+    static assert(is(typeof(an_object_key)   == string));
+    static assert(is(typeof(lv)              == int[string]));
+    static assert(is(typeof(collapsed_lev)   == int[string]));
+    static assert(is(typeof(type)            == int[string]));
+    static assert(is(typeof(dochead_meta_aa) == string[string][string]));
+  }
   if (auto m = match(line, rgx.heading)) {
     /+ heading match +/
     type["heading"] = State.on;
@@ -3464,15 +3550,24 @@ auto _heading_matched_(
 
 #+name: abs_functions_para
 #+BEGIN_SRC d
-auto _para_match_(
-  char[]             line,
-  ref string[string] an_object,
-  ref string         an_object_key,
-  ref int[string]    indent,
-  ref bool           bullet,
-  ref int[string]    type,
-  ref int[string]    line_occur,
+auto _para_match_(L,O,K,I,B,T,C)(
+  ref L  line,
+  ref O  an_object,
+  ref K  an_object_key,
+  ref I  indent,
+  ref B  bullet,
+  ref T  type,
+  ref C  line_occur,
 ) {
+  debug(asserts){
+    static assert(is(typeof(line)          == char[]));
+    static assert(is(typeof(an_object)     == string[string]));
+    static assert(is(typeof(an_object_key) == string));
+    static assert(is(typeof(indent)        == int[string]));
+    static assert(is(typeof(bullet)        == bool));
+    static assert(is(typeof(type)          == int[string]));
+    static assert(is(typeof(line_occur)    == int[string]));
+  }
   if (line_occur["para"] == State.off) {
     /+ para matches +/
     type["para"] = State.on;
@@ -3559,7 +3654,10 @@ struct ObjInlineMarkupMunge {
     n_foot_sp_asterisk = 0;
     n_foot_sp_plus = 0;
   }
-  string url_links(string obj_txt_in) {
+  string url_links(Ot)(Ot obj_txt_in) {
+    debug(asserts){
+      static assert(is(typeof(obj_txt_in) == string));
+    }
     /+ url matched +/
     if (auto m = matchAll(obj_txt_in, rgx.inline_url)) {
       /+ link: naked url: http://url +/
@@ -3604,7 +3702,10 @@ struct ObjInlineMarkupMunge {
     }
     return obj_txt_in;
   }
-  string footnotes_endnotes_markup_and_number_or_stars(string obj_txt_in) {
+  string footnotes_endnotes_markup_and_number_or_stars(Ot)(Ot obj_txt_in) {                                                // here endnotes are marked up
+    debug(asserts){
+      static assert(is(typeof(obj_txt_in) == string));
+    }
     /+ endnotes (regular) +/
     obj_txt_in =
       replaceAll(
@@ -3679,8 +3780,12 @@ struct ObjInlineMarkupMunge {
     }
     return obj_txt_out;
   }
-  string para(string obj_txt_in)
-  in { }
+  string para(Ot)(Ot obj_txt_in)
+  in {
+    debug(asserts){
+      static assert(is(typeof(obj_txt_in) == string));
+    }
+  }
   body {
     auto rgx = Rgx();
     obj_txt["munge"]=obj_txt_in;
@@ -3695,8 +3800,12 @@ struct ObjInlineMarkupMunge {
     }
     return obj_txt["munge"];
   }
-  string heading(string obj_txt_in)
-  in { }
+  string heading(Ot)(Ot obj_txt_in)
+  in {
+    debug(asserts){
+      static assert(is(typeof(obj_txt_in) == string));
+    }
+  }
   body {
     auto rgx = Rgx();
     obj_txt["munge"]=obj_txt_in;
@@ -3732,8 +3841,12 @@ struct ObjInlineMarkupMunge {
   }
   invariant() {
   }
-  string block(string obj_txt_in)
-  in { }
+  string block(Ot)(Ot obj_txt_in)
+  in {
+    debug(asserts){
+      static assert(is(typeof(obj_txt_in) == string));
+    }
+  }
   body {
     obj_txt["munge"]=obj_txt_in;
     obj_txt["munge"]=object_notes_(obj_txt["munge"]);
@@ -3741,8 +3854,12 @@ struct ObjInlineMarkupMunge {
   }
   invariant() {
   }
-  string verse(string obj_txt_in)
-  in { }
+  string verse(Ot)(Ot obj_txt_in)
+  in {
+    debug(asserts){
+      static assert(is(typeof(obj_txt_in) == string));
+    }
+  }
   body {
     obj_txt["munge"]=obj_txt_in;
     obj_txt["munge"]=object_notes_(obj_txt["munge"]);
@@ -3750,24 +3867,36 @@ struct ObjInlineMarkupMunge {
   }
   invariant() {
   }
-  string quote(string obj_txt_in)
-  in { }
+  string quote(Ot)(Ot obj_txt_in)
+  in {
+    debug(asserts){
+      static assert(is(typeof(obj_txt_in) == string));
+    }
+  }
   body {
     obj_txt["munge"]=obj_txt_in;
     return obj_txt["munge"];
   }
   invariant() {
   }
-  string table(string obj_txt_in)
-  in { }
+  string table(Ot)(Ot obj_txt_in)
+  in {
+    debug(asserts){
+      static assert(is(typeof(obj_txt_in) == string));
+    }
+  }
   body {
     obj_txt["munge"]=obj_txt_in;
     return obj_txt["munge"];
   }
   invariant() {
   }
-  string comment(string obj_txt_in)
-  in { }
+  string comment(Ot)(Ot obj_txt_in)
+  in {
+    debug(asserts){
+      static assert(is(typeof(obj_txt_in) == string));
+    }
+  }
   body {
     obj_txt["munge"]=obj_txt_in;
     return obj_txt["munge"];
@@ -3791,12 +3920,18 @@ struct ObjInlineMarkup {
 
 #+name: ao_emitters_obj_inline_markup_and_anchor_tags
 #+BEGIN_SRC d
-  auto obj_inline_markup_and_anchor_tags(
-    string[string]         obj_,
-    string                 obj_key_,
-    string[string][string] dochead_make_aa
+  auto obj_inline_markup_and_anchor_tags(O,K,Ma)(
+    O  obj_,
+    K  obj_key_,
+    Ma dochead_make_aa
   )
-  in { }
+  in {
+    debug(asserts){
+      static assert(is(typeof(obj_)            == string[string]));
+      static assert(is(typeof(obj_key_)        == string));
+      static assert(is(typeof(dochead_make_aa) == string[string][string]));
+    }
+  }
   body {
     obj_txt["munge"]=obj_[obj_key_].dup;
     obj_txt["munge"]=(match(obj_["is"], ctRegex!(`verse|code`)))
@@ -3862,9 +3997,12 @@ struct ObjInlineMarkup {
 
 #+name: ao_emitters_obj_inline_markup_table_of_contents
 #+BEGIN_SRC d
-  auto _clean_heading_toc_(
-    char[] heading_toc_,
+  auto _clean_heading_toc_(Toc)(
+    Toc heading_toc_,
   ) {
+   debug(asserts){
+     static assert(is(typeof(heading_toc_) == char[]));
+   }
    auto m = matchFirst(cast(char[]) heading_toc_, rgx.heading);
    heading_toc_ =
      replaceAll(
@@ -3874,15 +4012,24 @@ struct ObjInlineMarkup {
      );
    return heading_toc_;
   };
-  auto table_of_contents_gather_headings(
-    string[string]                obj_,
-    string[string][string]        dochead_make_aa,
-    string                        segment_anchor_tag_that_object_belongs_to,
-    string                        _anchor_tag,
-    ref string[][string]          lev4_subtoc,
-    ObjGenericComposite[][string] the_table_of_contents_section,
+  auto table_of_contents_gather_headings(O,Ma,Ts,Ta,X,Toc)(
+    O     obj_,
+    Ma    dochead_make_aa,
+    Ts    segment_anchor_tag_that_object_belongs_to,
+    Ta    _anchor_tag,
+    ref X lev4_subtoc,
+    Toc   the_table_of_contents_section,
   )
-  in { }
+  in {
+    debug(asserts){
+      static assert(is(typeof(obj_)                                      == string[string]));
+      static assert(is(typeof(dochead_make_aa)                           == string[string][string]));
+      static assert(is(typeof(segment_anchor_tag_that_object_belongs_to) == string));
+      static assert(is(typeof(_anchor_tag)                               == string));
+      static assert(is(typeof(lev4_subtoc)                               == string[][string]));
+      static assert(is(typeof(the_table_of_contents_section)             == ObjGenericComposite[][string]));
+    }
+  }
   body {
     ObjGenericComposite comp_obj_toc;
     mixin InternalMarkup;
@@ -4028,11 +4175,16 @@ private:
 
 #+name: ao_emitters_obj_inline_markup_heading_numbering_segment_anchor_tags
 #+BEGIN_SRC d
-  static string _configured_auto_heading_numbering_and_segment_anchor_tags(
-    string                 munge_,
-    string[string]         obj_,
-    string[string][string] dochead_make_aa
+  static string _configured_auto_heading_numbering_and_segment_anchor_tags(M,O,Ma)(
+    M  munge_,
+    O  obj_,
+    Ma dochead_make_aa
   ) {
+    debug(asserts){
+      static assert(is(typeof(munge_)          == string));
+      static assert(is(typeof(obj_)            == string[string]));
+      static assert(is(typeof(dochead_make_aa) == string[string][string]));
+    }
     if (dochead_make_aa["make"]["num_top"].length > 0) {
       if (!(match(munge_, rgx.heading_anchor_tag))) {
         static __gshared int heading_num_top_level=9;
@@ -4156,7 +4308,11 @@ private:
 #+name: ao_emitters_obj_inline_markup_heading_numbering_segment_anchor_tags
 #+BEGIN_SRC d
 
-  static string _make_segment_anchor_tags_if_none_provided(string munge_, string lev_) {
+  static string _make_segment_anchor_tags_if_none_provided(M,Lv)(M munge_, Lv lev_) {
+    debug(asserts){
+      static assert(is(typeof(munge_) == string));
+      static assert(is(typeof(lev_)   == string));
+    }
     if (!(match(munge_, rgx.heading_anchor_tag))) { // if (anchor_tags_.length == 0) {
       if (match(munge_, rgx.heading_identify_anchor_tag)) {
         if (auto m = match(munge_, rgx.heading_extract_named_anchor_tag)) {
@@ -4247,12 +4403,18 @@ struct ObjAttributes {
 
 #+name: ao_emitters_obj_attributes_public
 #+BEGIN_SRC d
-  string obj_attributes(
-    string              obj_is_,
-    string              obj_raw,
-    ObjGenericComposite _comp_obj_heading,
+  string obj_attributes(Oi,OR,OH)(
+    Oi obj_is_,
+    OR obj_raw,
+    OH _comp_obj_heading,
   )
-  in { }
+  in {
+    debug(asserts){
+      static assert(is(typeof(obj_is_)           == string));
+      static assert(is(typeof(obj_raw)           == string));
+      static assert(is(typeof(_comp_obj_heading) == ObjGenericComposite));
+    }
+  }
   body {
     scope(exit) {
       destroy(obj_is_);
@@ -4325,8 +4487,12 @@ struct ObjAttributes {
 
 #+name: ao_emitters_obj_attributes_private_an_attribute
 #+BEGIN_SRC d
-  string _para_and_blocks(string obj_txt_in)
-  in { }
+  string _para_and_blocks(Ot)(Ot obj_txt_in)
+  in {
+    debug(asserts){
+      static assert(is(typeof(obj_txt_in) == string));
+    }
+  }
   body {
     auto rgx = Rgx();
     if (matchFirst(obj_txt_in, rgx.para_bullet)) {
@@ -4358,8 +4524,12 @@ struct ObjAttributes {
 
 #+name: ao_emitters_obj_attributes_private_an_attribute
 #+BEGIN_SRC d
-  string _para(string obj_txt_in)
-  in { }
+  string _para(Ot)(Ot obj_txt_in)
+  in {
+    debug(asserts){
+      static assert(is(typeof(obj_txt_in) == string));
+    }
+  }
   body {
     _obj_attributes = " \"use\": \"content\","
     ~ " \"of\": \"para\","
@@ -4374,8 +4544,12 @@ struct ObjAttributes {
 
 #+name: ao_emitters_obj_attributes_private_an_attribute
 #+BEGIN_SRC d
-  string _heading(string obj_txt_in)
-  in { }
+  string _heading(Ot)(Ot obj_txt_in)
+  in {
+    debug(asserts){
+      static assert(is(typeof(obj_txt_in) == string));
+    }
+  }
   body {
     _obj_attributes = " \"use\": \"content\","
     ~ " \"of\": \"para\","
@@ -4390,8 +4564,12 @@ struct ObjAttributes {
 
 #+name: ao_emitters_obj_attributes_private_an_attribute
 #+BEGIN_SRC d
-  string _code(string obj_txt_in)
-  in { }
+  string _code(Ot)(Ot obj_txt_in)
+  in {
+    debug(asserts){
+      static assert(is(typeof(obj_txt_in) == string));
+    }
+  }
   body {
     _obj_attributes = " \"use\": \"content\","
     ~ " \"of\": \"block\","
@@ -4406,8 +4584,12 @@ struct ObjAttributes {
 
 #+name: ao_emitters_obj_attributes_private_an_attribute
 #+BEGIN_SRC d
-  string _group(string obj_txt_in)
-  in { }
+  string _group(Ot)(Ot obj_txt_in)
+  in {
+    debug(asserts){
+      static assert(is(typeof(obj_txt_in) == string));
+    }
+  }
   body {
     _obj_attributes = " \"use\": \"content\","
     ~ " \"of\": \"block\","
@@ -4422,8 +4604,12 @@ struct ObjAttributes {
 
 #+name: ao_emitters_obj_attributes_private_an_attribute
 #+BEGIN_SRC d
-  string _block(string obj_txt_in)
-  in { }
+  string _block(Ot)(Ot obj_txt_in)
+  in {
+    debug(asserts){
+      static assert(is(typeof(obj_txt_in) == string));
+    }
+  }
   body {
     _obj_attributes = " \"use\": \"content\","
     ~ " \"of\": \"block\","
@@ -4438,8 +4624,12 @@ struct ObjAttributes {
 
 #+name: ao_emitters_obj_attributes_private_an_attribute
 #+BEGIN_SRC d
-  string _verse(string obj_txt_in)
-  in { }
+  string _verse(Ot)(Ot obj_txt_in)
+  in {
+    debug(asserts){
+      static assert(is(typeof(obj_txt_in) == string));
+    }
+  }
   body {
     _obj_attributes = " \"use\": \"content\","
     ~ " \"of\": \"block\","
@@ -4454,8 +4644,12 @@ struct ObjAttributes {
 
 #+name: ao_emitters_obj_attributes_private_an_attribute
 #+BEGIN_SRC d
-  string _quote(string obj_txt_in)
-  in { }
+  string _quote(Ot)(Ot obj_txt_in)
+  in {
+    debug(asserts){
+      static assert(is(typeof(obj_txt_in) == string));
+    }
+  }
   body {
     _obj_attributes = " \"use\": \"content\","
     ~ " \"of\": \"block\","
@@ -4470,8 +4664,12 @@ struct ObjAttributes {
 
 #+name: ao_emitters_obj_attributes_private_an_attribute
 #+BEGIN_SRC d
-  string _table(string obj_txt_in)
-  in { }
+  string _table(Ot)(Ot obj_txt_in)
+  in {
+    debug(asserts){
+      static assert(is(typeof(obj_txt_in) == string));
+    }
+  }
   body {
     _obj_attributes = " \"use\": \"content\","
     ~ " \"of\": \"block\","
@@ -4486,8 +4684,12 @@ struct ObjAttributes {
 
 #+name: ao_emitters_obj_attributes_private_an_attribute
 #+BEGIN_SRC d
-  string _comment(string obj_txt_in)
-  in { }
+  string _comment(Ot)(Ot obj_txt_in)
+  in {
+    debug(asserts){
+      static assert(is(typeof(obj_txt_in) == string));
+    }
+  }
   body {
     _obj_attributes = " \"use\": \"comment\","
     ~ " \"of\": \"comment\","
@@ -4502,11 +4704,16 @@ struct ObjAttributes {
 
 #+name: ao_emitters_obj_attributes_private_json
 #+BEGIN_SRC d
-  string _set_additional_values_parse_as_json(
-    string              _obj_attrib,
-    string              obj_is_,
-    ObjGenericComposite _comp_obj_heading,
+  string _set_additional_values_parse_as_json(OA,Oi,OH)(
+    OA _obj_attrib,
+    Oi obj_is_,
+    OH _comp_obj_heading,
   ) {                                                  //
+    debug(asserts){
+      static assert(is(typeof(_obj_attrib)       == string));
+      static assert(is(typeof(obj_is_)           == string));
+      static assert(is(typeof(_comp_obj_heading) == ObjGenericComposite));
+    }
     JSONValue oa_j = parseJSON(_obj_attrib);
     assert(
       (oa_j.type == JSON_TYPE.OBJECT)
@@ -4546,11 +4753,15 @@ struct BookIndexNuggetHash {
   string[][string][string] bi;
   string[][string][string] hash_nugget;
   string[] bi_main_terms_split_arr;
-  string[][string][string] bookindex_nugget_hash(
-    string bookindex_section,
-    int    obj_cite_number
+  string[][string][string] bookindex_nugget_hash(BI,N)(
+    BI bookindex_section,
+    N  obj_cite_number
   )
   in {
+    debug(asserts){
+      static assert(is(typeof(bookindex_section) == string));
+      static assert(is(typeof(obj_cite_number)   == int));
+    }
     debug(bookindexraw) {
       if (!bookindex_section.empty) {
         writeln(
@@ -4620,9 +4831,12 @@ struct BookIndexNuggetHash {
 #+BEGIN_SRC d
 struct BookIndexReportIndent {
   int mkn, skn;
-  auto bookindex_report_indented(
-    string[][string][string] bookindex_unordered_hashes
+  auto bookindex_report_indented(BI)(
+    BI bookindex_unordered_hashes
   ) {
+    debug(asserts){
+      static assert(is(typeof(bookindex_unordered_hashes) == string[][string][string]));
+    }
     auto mainkeys=
       bookindex_unordered_hashes.byKey.array.sort().release;
     foreach (mainkey; mainkeys) {
@@ -4661,9 +4875,12 @@ struct BookIndexReportSection {
 
 #+name: ao_emitters_book_index_report_section
 #+BEGIN_SRC d
-  auto bookindex_write_section(
-    string[][string][string] bookindex_unordered_hashes
+  auto bookindex_write_section(BI)(
+    BI bookindex_unordered_hashes
   ) {
+    debug(asserts){
+      static assert(is(typeof(bookindex_unordered_hashes) == string[][string][string]));
+    }
     auto mainkeys=bookindex_unordered_hashes.byKey.array.sort().release;
     foreach (mainkey; mainkeys) {
       write("_0_1 !{", mainkey, "}! ");
@@ -4693,12 +4910,18 @@ struct BookIndexReportSection {
 
 #+name: ao_emitters_book_index_report_section
 #+BEGIN_SRC d
-  auto bookindex_build_abstraction_section(
-    string[][string][string] bookindex_unordered_hashes,
-    int                      obj_cite_number,
-    string                   segment_anchor_tag_that_object_belongs_to,
-    bool[string]             opt_action_bool,
+  auto bookindex_build_abstraction_section(BI,N,Ta,B)(
+    BI bookindex_unordered_hashes,
+    N  obj_cite_number,
+    Ta segment_anchor_tag_that_object_belongs_to,
+    B  opt_action_bool,
   ) {
+    debug(asserts){
+      static assert(is(typeof(bookindex_unordered_hashes)                == string[][string][string]));
+      static assert(is(typeof(obj_cite_number)                           == int));
+      static assert(is(typeof(segment_anchor_tag_that_object_belongs_to) == string));
+      static assert(is(typeof(opt_action_bool)                           == bool[string]));
+    }
     mixin SiSUnode;
     mixin InternalMarkup;
     auto mkup = InlineMarkup();
@@ -5031,11 +5254,16 @@ struct Bibliography {
 
 #+name: ao_emitters_bibliography
 #+BEGIN_SRC d
-  public JSONValue[] _bibliography_(
-    ref string[]     biblio_unsorted_incomplete,
-    ref JSONValue[]  bib_arr_json
+  public JSONValue[] _bibliography_(Bi,BJ)(
+    ref Bi biblio_unsorted_incomplete,
+    ref BJ bib_arr_json
   )
-  in { }
+  in {
+    debug(asserts){
+      static assert(is(typeof(biblio_unsorted_incomplete) == string[]));
+      static assert(is(typeof(bib_arr_json)               == JSONValue[]));
+    }
+ }
   body {
     JSONValue[] biblio_unsorted =
       _biblio_unsorted_complete_(biblio_unsorted_incomplete, bib_arr_json);
@@ -5062,10 +5290,14 @@ struct Bibliography {
 
 #+name: ao_emitters_bibliography
 #+BEGIN_SRC d
-  final private JSONValue[] _biblio_unsorted_complete_(
-    string[]        biblio_unordered,
-    ref JSONValue[] bib_arr_json
+  final private JSONValue[] _biblio_unsorted_complete_(Bi,BJ)(
+    Bi     biblio_unordered,
+    ref BJ bib_arr_json
   ) {
+    debug(asserts){
+      static assert(is(typeof(biblio_unordered) == string[]));
+      static assert(is(typeof(bib_arr_json)     == JSONValue[]));
+    }
     foreach (bibent; biblio_unordered) {
       // update bib to include deemed_author, needed for:
       // sort_bibliography_array_by_deemed_author_year_title
@@ -5097,7 +5329,10 @@ struct Bibliography {
 
 #+name: ao_emitters_bibliography
 #+BEGIN_SRC d
-  final private JSONValue[] biblio_sort(JSONValue[] biblio_unordered) {
+  final private JSONValue[] biblio_sort(BJ)(BJ biblio_unordered) {
+    debug(asserts){
+      static assert(is(typeof(biblio_unordered) == JSONValue[]));
+    }
     JSONValue[] biblio_sorted_;
     biblio_sorted_ =
       sort!((a, b){
@@ -5118,7 +5353,10 @@ struct Bibliography {
 
 #+name: ao_emitters_bibliography
 #+BEGIN_SRC d
-  void biblio_debug(JSONValue[] biblio_sorted) {
+  void biblio_debug(BJ)(BJ biblio_sorted) {
+    debug(asserts){
+      static assert(is(typeof(biblio_sorted) == JSONValue[]));
+    }
     debug(biblio0) {
       foreach (j; biblio_sorted) {
         if (!empty(j["fulltitle"].str)) {
@@ -5151,15 +5389,23 @@ struct NodeStructureMetadata {
 
 #+name: ao_emitters_metadata
 #+BEGIN_SRC d
-  ObjGenericComposite node_location_emitter(
-    string lev_markup_number,
-    string segment_anchor_tag,
-    int    obj_cite_number_,
-    int    cntr_,
-    int    ptr_,
-    string is_
+  ObjGenericComposite node_location_emitter(Lv,Ta,N,C,P,I)(
+    Lv lev_markup_number,
+    Ta segment_anchor_tag,
+    N  obj_cite_number_,
+    C  cntr_,
+    P  ptr_,
+    I  is_
   )
   in {
+    debug(asserts){
+      static assert(is(typeof(lev_markup_number)  == string));
+      static assert(is(typeof(segment_anchor_tag) == string));
+      static assert(is(typeof(obj_cite_number_)   == int));
+      static assert(is(typeof(cntr_)              == int));
+      static assert(is(typeof(ptr_)               == int));
+      static assert(is(typeof(is_)                == string));
+    }
     auto rgx = Rgx();
     assert(is_ != "heading");
     assert(to!int(obj_cite_number_) >= 0);
@@ -5208,20 +5454,33 @@ struct NodeStructureMetadata {
 
 #+name: ao_emitters_metadata
 #+BEGIN_SRC d
-  ObjGenericComposite node_emitter_heading(
-    string _text,
-    string lev,
-    string lev_markup_number,
-    string lev_collapsed_number,
-    string segment_anchor_tag,
-    int    obj_cite_number_,
-    int    cntr_,
-    int    ptr_,
-    string[] lv_ancestors,
-    string is_,
-    int    html_segnames_ptr,
+  ObjGenericComposite node_emitter_heading(T,L,Lm,Lc,Ta,N,C,P,LA,I,PSn)(
+    T   _text,
+    L   lev,
+    Lm  lev_markup_number,
+    Lc  lev_collapsed_number,
+    Ta  segment_anchor_tag,
+    N   obj_cite_number_,
+    C   cntr_,
+    P   ptr_,
+    LA  lv_ancestors,
+    I   is_,
+    PSn html_segnames_ptr,
   )
   in {
+    debug(asserts){
+      static assert(is(typeof(_text)                == string));
+      static assert(is(typeof(lev)                  == string));
+      static assert(is(typeof(lev_markup_number)    == string));
+      static assert(is(typeof(lev_collapsed_number) == string));
+      static assert(is(typeof(segment_anchor_tag)   == string));
+      static assert(is(typeof(obj_cite_number_)     == int));
+      static assert(is(typeof(cntr_)                == int));
+      static assert(is(typeof(ptr_)                 == int));
+      static assert(is(typeof(lv_ancestors)         == string[]));
+      static assert(is(typeof(is_)                  == string));
+      static assert(is(typeof(html_segnames_ptr)    == int));
+    }
     auto rgx = Rgx();
     assert(is_ == "heading");
     assert(to!int(obj_cite_number_) >= 0);
@@ -5394,10 +5653,14 @@ struct NodeStructureMetadata {
 
 #+name: abs_functions_assertions
 #+BEGIN_SRC d
-auto assertions_doc_structure(
-  string[string] an_object,
-  int[string]    lv
+auto assertions_doc_structure(O,Lv)(
+  O  an_object,
+  Lv lv
 ) {
+  debug(asserts){
+    static assert(is(typeof(an_object) == string[string]));
+    static assert(is(typeof(lv)        == int[string]));
+  }
   if (lv["h3"] > State.off) {
     assert(lv["h0"] > State.off);
     assert(lv["h1"] > State.off);
@@ -5575,7 +5838,10 @@ auto assertions_doc_structure(
 
 #+name: abs_functions_assertions
 #+BEGIN_SRC d
-auto assertions_flag_types_block_status_none_or_closed(int[string] type) {
+auto assertions_flag_types_block_status_none_or_closed(T)(T type) {
+  debug(asserts){
+    static assert(is(typeof(type) == int[string]));
+  }
   assert(
     (type["code"] == TriState.off)
     || (type["code"] == TriState.closing),
diff --git a/org/ao_conf_make_meta.org b/org/ao_conf_make_meta.org
index eb39f73..df6d456 100644
--- a/org/ao_conf_make_meta.org
+++ b/org/ao_conf_make_meta.org
@@ -41,7 +41,7 @@ template SiSUheaderExtractHub() {
       DocMake conf_doc_make_aa
     ) {
       debug(asserts){
-        static assert(is(typeof(header_src) == char[]));
+        static assert(is(typeof(header_src)       == char[]));
         static assert(is(typeof(conf_doc_make_aa) == string[string][string]));
       }
       auto head_native = HeaderDocMetadataAndMakeNativeToAA();
@@ -109,7 +109,10 @@ template SiSUheaderExtractSDLang() {
 
 #+name: ao_conf_make_meta_sdl
 #+BEGIN_SRC d
-private auto sdlangToAAmake(string[string][string] conf, Tag conf_sdlang) {
+private auto sdlangToAAmake(C,Tag)(C conf, Tag conf_sdlang) {
+  debug(asserts){
+    static assert(is(typeof(conf) == string[string][string]));
+  }
   foreach (maintag, subtags; conf) {
     foreach (subtag, content; subtags) {
       if (!(conf_sdlang.maybe.tags[maintag].empty)) {
@@ -132,7 +135,7 @@ private auto sdlangToAAmake(string[string][string] conf, Tag conf_sdlang) {
 
 #+name: ao_conf_make_meta_sdl
 #+BEGIN_SRC d
-private auto configSettingsSDLangToAAmake(Tag conf_sdlang) {
+private auto configSettingsSDLangToAAmake(Tag)(Tag conf_sdlang) {
   auto conf = sdlangToAAmake(conf_aa, conf_sdlang);
   return conf;
 }
@@ -142,7 +145,7 @@ private auto configSettingsSDLangToAAmake(Tag conf_sdlang) {
 
 #+name: ao_conf_make_meta_sdl
 #+BEGIN_SRC d
-private auto documentMakeSDLangToAAmake(Tag document_make_sdlang) {
+private auto documentMakeSDLangToAAmake(Tag)(Tag document_make_sdlang) {
   auto dochead_make = sdlangToAAmake(make_aa, document_make_sdlang);
   /+
   /+ dochead +/
@@ -290,12 +293,18 @@ private auto documentMakeSDLangToAAmake(Tag document_make_sdlang) {
 
 #+name: ao_markup_header_extract_native
 #+BEGIN_SRC d
-auto header_metadata_and_make_aa(
-  string header,
-  string[string][string] dochead_meta,
-  string[string][string] dochead_make
+auto header_metadata_and_make_aa(H,Me,Ma)(
+  H  header,
+  Me dochead_meta,
+  Ma dochead_make
 )
-in { }
+in {
+  debug(asserts){
+    static assert(is(typeof(header)       == string));
+    static assert(is(typeof(dochead_meta) == string[string][string]));
+    static assert(is(typeof(dochead_make) == string[string][string]));
+  }
+}
 body {
   scope(exit) {
     destroy(header);
@@ -482,12 +491,18 @@ body {
 
 #+name: ao_markup_header_extract_native
 #+BEGIN_SRC d
-private auto native_header_extract(
-  char[] line,
-  ref int[string] line_occur,
-  ref string[string] an_object,
-  ref int[string] type
+private auto native_header_extract(L,Lo,O,T)(
+  L line,
+  ref Lo line_occur,
+  ref O an_object,
+  ref T type
 ) {
+  debug(asserts){
+    static assert(is(typeof(line)       == char[]));
+    static assert(is(typeof(line_occur) == int[string]));
+    static assert(is(typeof(an_object)  == string[string]));
+    static assert(is(typeof(type)       == int[string]));
+  }
   if (matchFirst(line, rgx.native_header_make)) {   /+ matched header_make +/
     debug(header1) { /+ writeln(line); +/ }
     type["header"]      = State.on;
@@ -526,11 +541,16 @@ private auto native_header_extract(
 
 #+name: ao_markup_header_extract_native
 #+BEGIN_SRC d
-auto header_reset_states_common(
-  ref int[string] line_occur,
-  ref string[string] an_object,
-  ref int[string] type
+auto header_reset_states_common(Lo,O,T)(
+  ref Lo line_occur,
+  ref O  an_object,
+  ref T  type
 ) {
+  debug(asserts){
+    static assert(is(typeof(line_occur) == int[string]));
+    static assert(is(typeof(an_object)  == string[string]));
+    static assert(is(typeof(type)       == int[string]));
+  }
   line_occur["header_make"] = State.off;
   line_occur["header_meta"] = State.off;
   type["header"] = State.off;
@@ -544,7 +564,10 @@ auto header_reset_states_common(
 
 #+name: ao_markup_header_extract_native
 #+BEGIN_SRC d
-private auto headerNativeToAA(in char[] src_header) {
+private auto headerNativeToAA(Hn)(Hn src_header) {
+  debug(asserts){
+    static assert(is(typeof(src_header) == char[]));
+  }
   auto type = flags_type_init;
   type = [
    "header"          : State.off,
@@ -600,7 +623,10 @@ private auto headerNativeToAA(in char[] src_header) {
 
 #+name: ao_conf_make_meta_sdl
 #+BEGIN_SRC d
-final private auto headerMakeSDLang(in string src_header) {
+final private auto headerMakeSDLang(Hs)(Hs src_header) {
+  debug(asserts){
+    static assert(is(typeof(src_header) == string));
+  }
   scope(failure) {
     stderr.writefln(
       "%s\n%s\n%s:%s failed here:\n  src_header: %s",
@@ -632,7 +658,10 @@ final private auto headerMakeSDLang(in string src_header) {
 
 #+name: ao_conf_make_meta_sdl
 #+BEGIN_SRC d
-private auto headerSDLangGet(in char[] src_header) {
+private auto headerSDLangGet(Hs)(Hs src_header) {
+  debug(asserts){
+    static assert(is(typeof(src_header) == char[]));
+  }
   char[][] source_header_arr =
     split(cast(char[]) src_header, rgx.newline_eol_delimiter);
   char[] header_clean;
@@ -661,7 +690,10 @@ private auto headerSDLangGet(in char[] src_header) {
 
 #+name: ao_conf_make_meta_sdl
 #+BEGIN_SRC d
-private auto headerSDLangToAAmake(Tag header_sdlang, string[string][string] dochead_make) {
+private auto headerSDLangToAAmake(Tag,Ma)(Tag header_sdlang, Ma dochead_make) {
+  debug(asserts){
+    static assert(is(typeof(dochead_make) == string[string][string]));
+  }
   dochead_make = sdlangToAAmake(dochead_make, header_sdlang);
   auto dochead_meta = sdlangToAAmake(meta_aa, header_sdlang);
   if (dochead_meta["title"]["main"].empty) {
@@ -699,7 +731,11 @@ private auto headerSDLangToAAmake(Tag header_sdlang, string[string][string] doch
 
 #+name: ao_conf_make_meta_sdl
 #+BEGIN_SRC d
-private auto headerSDLangToAA(char[] header_sdlang_src, string[string][string] conf_doc_make_aa) {
+private auto headerSDLangToAA(Hs,Ma)(Hs header_sdlang_src, Ma conf_doc_make_aa) {
+  debug(asserts){
+    static assert(is(typeof(header_sdlang_src) == char[]));
+    static assert(is(typeof(conf_doc_make_aa) == string[string][string]));
+  }
   auto header_sdlang_tag = headerSDLangGet(header_sdlang_src); // sdlang.ast.Tag
   auto header_aa_tuple = headerSDLangToAAmake(header_sdlang_tag, conf_doc_make_aa);
   return header_aa_tuple;
diff --git a/org/output.org b/org/output.org
index fe1a869..259d4dd 100644
--- a/org/output.org
+++ b/org/output.org
@@ -161,9 +161,12 @@ template SiSUoutputEPub() {
 
 #+name: source_sisupod_config
 #+BEGIN_SRC d
-void sisupod_assemble(
-  string fn_src,
+void sisupod_assemble(S)(
+  S fn_src,
 ) {
+  debug(asserts){
+    static assert(is(typeof(fn_src) == string));
+  }
   mixin SiSUpaths;
   auto pth_sisupod = SiSUpodPaths();
   mixin SiSUlanguageCodes;
@@ -226,9 +229,12 @@ string _xhtml_anchor_tags(const(string[]) anchor_tags) {
 
 #+name: xhtml_format_objects
 #+BEGIN_SRC d
-auto scroll_head(
-  string[string][string]   dochead_meta,
+auto scroll_head(Me)(
+  Me dochead_meta,
 ) {
+  debug(asserts){
+    static assert(is(typeof(dochead_meta) == string[string][string]));
+  }
   string o;
   o = format(q"¶<!DOCTYPE html>
 <html>
@@ -268,9 +274,12 @@ dochead_meta["title"]["full"],
 
 #+name: xhtml_format_objects
 #+BEGIN_SRC d
-auto seg_head(
-  string[string][string]   dochead_meta,
+auto seg_head(Me)(
+  Me dochead_meta,
 ) {
+  debug(asserts){
+    static assert(is(typeof(dochead_meta) == string[string][string]));
+  }
   string o;
   o = format(q"¶<!DOCTYPE html>
 <html>
@@ -526,10 +535,14 @@ auto endnote(O)(
 
 #+name: output_html_scroll
 #+BEGIN_SRC d
-void scroll_write_output_file(
-  string fn_src,
-  string[] doc,
+void scroll_write_output_file(Fn,D)(
+  Fn fn_src,
+  D doc,
 ) {
+  debug(asserts){
+    static assert(is(typeof(fn_src) == string));
+    static assert(is(typeof(doc)    == string[]));
+  }
   mixin SiSUpaths;
   auto pth_html = HtmlPaths();
   try {
@@ -668,11 +681,16 @@ void scroll(C,T)(
 
 #+name: output_html_seg
 #+BEGIN_SRC d
-void seg_write_output_files(
-  string fn_src,
-  string[] seg_filenames,
-  string[][string] doc_html,
+void seg_write_output_files(Fn,FnS,D)(
+  Fn fn_src,
+  FnS seg_filenames,
+  D doc_html,
 ) {
+  debug(asserts){
+    static assert(is(typeof(fn_src)        == string));
+    static assert(is(typeof(seg_filenames) == string[]));
+    static assert(is(typeof(doc_html)      == string[][string]));
+  }
   mixin SiSUpaths;
   auto pth_html = HtmlPaths();
   auto xhtml_format = SDPoutputXHTMLs();
@@ -2512,15 +2530,24 @@ void doc_content(C,T)(
 
 #+name: output_epub_xhtml_seg
 #+BEGIN_SRC d
-void epub_write_output_files(
-  string fn_src,
-  string[] seg_filenames,
-  string[][string] doc_epub,
-  string mimetypes,
-  string meta_inf_container_xml,
-  string oebps_toc_ncx,
-  string oebps_content_opf,
+void epub_write_output_files(Fn,FnS,De,Mt,Mic,Ot,Oc)(
+  Fn  fn_src,
+  FnS seg_filenames,
+  De  doc_epub,
+  Mt  mimetypes,
+  Mic meta_inf_container_xml,
+  Ot  oebps_toc_ncx,
+  Oc  oebps_content_opf,
 ) {
+  debug(asserts){
+    static assert(is(typeof(fn_src)                 == string));
+    static assert(is(typeof(seg_filenames)          == string[]));
+    static assert(is(typeof(doc_epub)               == string[][string]));
+    static assert(is(typeof(mimetypes)              == string));
+    static assert(is(typeof(meta_inf_container_xml) == string));
+    static assert(is(typeof(oebps_toc_ncx)          == string));
+    static assert(is(typeof(oebps_content_opf)      == string));
+  }
   mixin SiSUpaths;
   auto pth_epub = EpubPaths();
   // doc = xhtml_format.scroll_head ~ doc_epub ~  xhtml_format.tail;
diff --git a/org/sdp.org b/org/sdp.org
index 6c204f4..f14c82e 100644
--- a/org/sdp.org
+++ b/org/sdp.org
@@ -426,6 +426,7 @@ auto t = abs.SiSUdocAbstraction(
   _opt_action_bool
 );
 static assert(!isTypeTuple!(t));
+static assert(t.length==3);
 auto doc_abstraction = t[0]; // head ~ toc ~ contents ~ endnotes_seg ~ glossary ~ bibliography ~ bookindex ~blurb;
 string[][string] _document_section_keys_sequenced = t[1];
 string[] _doc_html_segnames = t[2];
diff --git a/src/sdp.d b/src/sdp.d
index 4fcabfb..94ef276 100755
--- a/src/sdp.d
+++ b/src/sdp.d
@@ -227,6 +227,7 @@ void main(string[] args) {
         _opt_action_bool
       );
       static assert(!isTypeTuple!(t));
+      static assert(t.length==3);
       auto doc_abstraction = t[0]; // head ~ toc ~ contents ~ endnotes_seg ~ glossary ~ bibliography ~ bookindex ~blurb;
       string[][string] _document_section_keys_sequenced = t[1];
       string[] _doc_html_segnames = t[2];
diff --git a/src/sdp/ao_abstract_doc_source.d b/src/sdp/ao_abstract_doc_source.d
index 8b1d4cf..cd121c5 100644
--- a/src/sdp/ao_abstract_doc_source.d
+++ b/src/sdp/ao_abstract_doc_source.d
@@ -225,9 +225,9 @@ template SiSUdocAbstraction() {
     ) {
       debug(asserts){
         static assert(is(typeof(markup_sourcefile_content) == char[][]));
-        static assert(is(typeof(dochead_make_aa) == string[string][string]));
-        static assert(is(typeof(dochead_meta_aa) == string[string][string]));
-        static assert(is(typeof(opt_action_bool) == bool[string]));
+        static assert(is(typeof(dochead_make_aa)           == string[string][string]));
+        static assert(is(typeof(dochead_meta_aa)           == string[string][string]));
+        static assert(is(typeof(opt_action_bool)           == bool[string]));
       }
       /+ ↓ abstraction init +/
       scope(success) {
@@ -1531,28 +1531,40 @@ template SiSUdocAbstraction() {
       /+ post loop markup document/text ↑ +/
     } /+ ← closed: abstract doc source +/
     /+ ↓ abstraction functions +/
-    auto object_reset(ref string[string] an_object) {
+    auto object_reset(O)(ref O an_object) {
+      debug(asserts){
+        static assert(is(typeof(an_object) == string[string]));
+      }
       an_object.remove("body_nugget");
       an_object.remove("substantive");
       an_object.remove("is");
       an_object.remove("attrib");
       an_object.remove("bookindex_nugget");
     }
-    auto _common_reset_(
-      ref int[string]    line_occur,
-      ref string[string] an_object,
-      ref int[string]    type
+    auto _common_reset_(L,O,T)(
+      ref L line_occur,
+      ref O an_object,
+      ref T type
     ) {
+      debug(asserts){
+        static assert(is(typeof(line_occur) == int[string]));
+        static assert(is(typeof(an_object)  == string[string]));
+        static assert(is(typeof(type)       == int[string]));
+      }
       line_occur["heading"] = State.off;
       line_occur["para"]    = State.off;
       type["heading"]       = State.off;
       type["para"]          = State.off;
       object_reset(an_object);
     }
-    void _check_ocn_status_(
-      char[]          line,
-      ref int[string] type
+    void _check_ocn_status_(L,T)(
+      L     line,
+      ref T type
     ) {
+      debug(asserts){
+        static assert(is(typeof(line) == char[]));
+        static assert(is(typeof(type) == int[string]));
+      }
       if ((!line.empty) && (type["ocn_status_multi_obj"] == TriState.off)) {
         /+ not multi-line object, check whether obj_cite_number is on or turned off +/
         if (matchFirst(line, rgx.obj_cite_number_block_marks)) {
@@ -1593,11 +1605,16 @@ template SiSUdocAbstraction() {
         }
       }
     }
-    void _start_block_(
-      char[]          line,
-      ref int[string] type,
-      string[string]  obj_cite_number_poem
+    void _start_block_(L,T,N)(
+      L     line,
+      ref T type,
+      N     obj_cite_number_poem
     ) {
+      debug(asserts){
+        static assert(is(typeof(line)                 == char[]));
+        static assert(is(typeof(type)                 == int[string]));
+        static assert(is(typeof(obj_cite_number_poem) == string[string]));
+      }
       if (matchFirst(line, rgx.block_curly_code_open)) {
         /+ curly code open +/
         debug(code) {                              // code (curly) open
@@ -1737,11 +1754,16 @@ template SiSUdocAbstraction() {
         type["tic_table"] = TriState.on;
       }
     }
-    void _code_block_(
-      char[]             line,
-      ref string[string] an_object,
-      ref int[string]    type
+    void _code_block_(L,O,T)(
+      ref L line,
+      ref O an_object,
+      ref T type
     ) {
+      debug(asserts){
+        static assert(is(typeof(line)      == char[]));
+        static assert(is(typeof(an_object) == string[string]));
+        static assert(is(typeof(type)      == int[string]));
+      }
       if (type["curly_code"] == TriState.on) {
         if (matchFirst(line, rgx.block_curly_code_close)) {
           debug(code) {                              // code (curly) close
@@ -1772,7 +1794,10 @@ template SiSUdocAbstraction() {
         }
       }
     }
-    final string biblio_tag_map(string abr) {
+    final string biblio_tag_map(A)(A abr) {
+      debug(asserts){
+        static assert(is(typeof(abr) == string));
+      }
       auto btm = [
         "au"                               : "author_raw",
         "ed"                               : "editor_raw",
@@ -1910,14 +1935,22 @@ template SiSUdocAbstraction() {
         header_tag_value="";
       }
     }
-    void _poem_block_(
-      char[]                 line,
-      ref string[string]     an_object,
-      ref int[string]        type,
-      ref int                cntr,
-      string[string]         obj_cite_number_poem,
-      string[string][string] dochead_make_aa,
+    void _poem_block_(L,O,T,C,N,Ma)(
+      L     line,
+      ref O an_object,
+      ref T type,
+      ref C cntr,
+      N     obj_cite_number_poem,
+      Ma    dochead_make_aa,
     ) {
+      debug(asserts){
+        static assert(is(typeof(line)                 == char[]));
+        static assert(is(typeof(an_object)            == string[string]));
+        static assert(is(typeof(type)                 == int[string]));
+        static assert(is(typeof(cntr)                 == int));
+        static assert(is(typeof(obj_cite_number_poem) == string[string]));
+        static assert(is(typeof(dochead_make_aa)      == string[string][string]));
+      }
       if (type["curly_poem"] == TriState.on) {
         if (matchFirst(line, rgx.block_curly_poem_close)) {
           an_object[an_object_key]="verse"; // check that this is as you please
@@ -2103,11 +2136,16 @@ template SiSUdocAbstraction() {
         }
       }
     }
-    void _group_block_(
-      char[]             line,
-      ref string[string] an_object,
-      ref int[string]    type
+    void _group_block_(L,O,T)(
+      ref L line,
+      ref O an_object,
+      ref T type
     ) {
+      debug(asserts){
+        static assert(is(typeof(line)      == char[]));
+        static assert(is(typeof(an_object) == string[string]));
+        static assert(is(typeof(type)      == int[string]));
+      }
       if (type["curly_group"] == State.on) {
         if (matchFirst(line, rgx.block_curly_group_close)) {
           debug(group) {                           // group (curly) close
@@ -2138,11 +2176,16 @@ template SiSUdocAbstraction() {
         }
       }
     }
-    void _block_block_(
-      char[]             line,
-      ref string[string] an_object,
-      ref int[string]    type
+    void _block_block_(L,O,T)(
+      ref L line,
+      ref O an_object,
+      ref T type
     ) {
+      debug(asserts){
+        static assert(is(typeof(line)      == char[]));
+        static assert(is(typeof(an_object) == string[string]));
+        static assert(is(typeof(type)      == int[string]));
+      }
       if (type["curly_block"] == TriState.on) {
         if (matchFirst(line, rgx.block_curly_block_close)) {
           debug(block) {                           // block (curly) close
@@ -2173,11 +2216,16 @@ template SiSUdocAbstraction() {
         }
       }
     }
-    void _quote_block_(
-      char[]             line,
-      ref string[string] an_object,
-      ref int[string]    type
+    void _quote_block_(L,O,T)(
+      ref L line,
+      ref O an_object,
+      ref T type
     ) {
+      debug(asserts){
+        static assert(is(typeof(line)      == char[]));
+        static assert(is(typeof(an_object) == string[string]));
+        static assert(is(typeof(type)      == int[string]));
+      }
       if (type["curly_quote"] == TriState.on) {
         if (matchFirst(line, rgx.block_curly_quote_close)) {
           debug(quote) {                           // quote (curly) close
@@ -2208,11 +2256,16 @@ template SiSUdocAbstraction() {
         }
       }
     }
-    void _table_block_(
-      char[]             line,
-      ref string[string] an_object,
-      ref int[string]    type
+    void _table_block_(L,O,T)(
+      ref L line,
+      ref O an_object,
+      ref T type
     ) {
+      debug(asserts){
+        static assert(is(typeof(line)      == char[]));
+        static assert(is(typeof(an_object) == string[string]));
+        static assert(is(typeof(type)      == int[string]));
+      }
       if (type["curly_table"] == TriState.on) {
         if (matchFirst(line, rgx.block_curly_table_close)) {
           debug(table) {                           // table (curly) close
@@ -2463,13 +2516,20 @@ template SiSUdocAbstraction() {
         type["quote"] = TriState.off;
       }
     }
-    auto _book_index_(
-      char[]             line,
-      ref string         book_idx_tmp,
-      ref string[string] an_object,
-      ref int[string]    type,
-      bool[string]       opt_action_bool,
+    auto _book_index_(L,I,O,T,B)(
+      L      line,
+      ref I  book_idx_tmp,
+      ref O  an_object,
+      ref T  type,
+      B      opt_action_bool,
     ) {
+      debug(asserts){
+        static assert(is(typeof(line)            == char[]));
+        static assert(is(typeof(book_idx_tmp)    == string));
+        static assert(is(typeof(an_object)       == string[string]));
+        static assert(is(typeof(type)            == int[string]));
+        static assert(is(typeof(opt_action_bool) == bool[string]));
+      }
       if (auto m = match(line, rgx.book_index)) {
         /+ match book_index +/
         debug(bookindexmatch) {                       // book index
@@ -2512,13 +2572,20 @@ template SiSUdocAbstraction() {
         }
       }
     }
-    auto _heading_found_(
-      char[]                   line,
-      string                   dochead_make_identify_unmarked_headings,
-      ref string[string]       heading_match_str,
-      ref Regex!(char)[string] heading_match_rgx,
-      ref int[string]          type
+    auto _heading_found_(L,X,H,R,T)(
+      L     line,
+      X     dochead_make_identify_unmarked_headings,
+      ref H heading_match_str,
+      ref R heading_match_rgx,
+      ref T type
     ) {
+      debug(asserts){
+        static assert(is(typeof(line)                                    == char[]));
+        static assert(is(typeof(dochead_make_identify_unmarked_headings) == string));
+        static assert(is(typeof(heading_match_str)                       == string[string]));
+        static assert(is(typeof(heading_match_rgx)                       == Regex!(char)[string]));
+        static assert(is(typeof(type)                                    == int[string]));
+      }
       if ((dochead_make_identify_unmarked_headings.length > 2)
       && (type["make_headings"] == State.off)) {
         /+ headings found +/
@@ -2596,12 +2663,18 @@ template SiSUdocAbstraction() {
         type["make_headings"] = State.on;
       }
     }
-    auto _heading_make_set_(
-      ref char[]               line,
-      ref int[string]          line_occur,
-      ref Regex!(char)[string] heading_match_rgx,
-      ref int[string]          type
+    auto _heading_make_set_(L,C,R,T)(
+      L     line,
+      C     line_occur,
+      ref R heading_match_rgx,
+      ref T type
     ) {
+      debug(asserts){
+        static assert(is(typeof(line)              == char[]));
+        static assert(is(typeof(line_occur)        == int[string]));
+        static assert(is(typeof(heading_match_rgx) == Regex!(char)[string]));
+        static assert(is(typeof(type)              == int[string]));
+      }
       if ((type["make_headings"] == State.on)
       && ((line_occur["para"] == State.off)
       && (line_occur["heading"] == State.off))
@@ -2652,16 +2725,26 @@ template SiSUdocAbstraction() {
         }
       }
     }
-    auto _heading_matched_(
-      char[]                     line,
-      ref int[string]            line_occur,
-      ref string[string]         an_object,
-      ref string                 an_object_key,
-      ref int[string]            lv,
-      ref int[string]            collapsed_lev,
-      ref int[string]            type,
-      ref string[string][string] dochead_meta_aa
+    auto _heading_matched_(L,C,O,K,Lv,Lc,T,Me)(
+      ref L  line,
+      ref C  line_occur,
+      ref O  an_object,
+      ref K  an_object_key,
+      ref Lv lv,
+      ref Lc collapsed_lev,
+      ref T  type,
+      ref Me dochead_meta_aa,
     ) {
+      debug(asserts){
+        static assert(is(typeof(line)            == char[]));
+        static assert(is(typeof(line_occur)      == int[string]));
+        static assert(is(typeof(an_object)       == string[string]));
+        static assert(is(typeof(an_object_key)   == string));
+        static assert(is(typeof(lv)              == int[string]));
+        static assert(is(typeof(collapsed_lev)   == int[string]));
+        static assert(is(typeof(type)            == int[string]));
+        static assert(is(typeof(dochead_meta_aa) == string[string][string]));
+      }
       if (auto m = match(line, rgx.heading)) {
         /+ heading match +/
         type["heading"] = State.on;
@@ -2795,15 +2878,24 @@ template SiSUdocAbstraction() {
         }
       }
     }
-    auto _para_match_(
-      char[]             line,
-      ref string[string] an_object,
-      ref string         an_object_key,
-      ref int[string]    indent,
-      ref bool           bullet,
-      ref int[string]    type,
-      ref int[string]    line_occur,
+    auto _para_match_(L,O,K,I,B,T,C)(
+      ref L  line,
+      ref O  an_object,
+      ref K  an_object_key,
+      ref I  indent,
+      ref B  bullet,
+      ref T  type,
+      ref C  line_occur,
     ) {
+      debug(asserts){
+        static assert(is(typeof(line)          == char[]));
+        static assert(is(typeof(an_object)     == string[string]));
+        static assert(is(typeof(an_object_key) == string));
+        static assert(is(typeof(indent)        == int[string]));
+        static assert(is(typeof(bullet)        == bool));
+        static assert(is(typeof(type)          == int[string]));
+        static assert(is(typeof(line_occur)    == int[string]));
+      }
       if (line_occur["para"] == State.off) {
         /+ para matches +/
         type["para"] = State.on;
@@ -2879,7 +2971,10 @@ template SiSUdocAbstraction() {
         n_foot_sp_asterisk = 0;
         n_foot_sp_plus = 0;
       }
-      string url_links(string obj_txt_in) {
+      string url_links(Ot)(Ot obj_txt_in) {
+        debug(asserts){
+          static assert(is(typeof(obj_txt_in) == string));
+        }
         /+ url matched +/
         if (auto m = matchAll(obj_txt_in, rgx.inline_url)) {
           /+ link: naked url: http://url +/
@@ -2924,7 +3019,10 @@ template SiSUdocAbstraction() {
         }
         return obj_txt_in;
       }
-      string footnotes_endnotes_markup_and_number_or_stars(string obj_txt_in) {
+      string footnotes_endnotes_markup_and_number_or_stars(Ot)(Ot obj_txt_in) {                                                // here endnotes are marked up
+        debug(asserts){
+          static assert(is(typeof(obj_txt_in) == string));
+        }
         /+ endnotes (regular) +/
         obj_txt_in =
           replaceAll(
@@ -2999,8 +3097,12 @@ template SiSUdocAbstraction() {
         }
         return obj_txt_out;
       }
-      string para(string obj_txt_in)
-      in { }
+      string para(Ot)(Ot obj_txt_in)
+      in {
+        debug(asserts){
+          static assert(is(typeof(obj_txt_in) == string));
+        }
+      }
       body {
         auto rgx = Rgx();
         obj_txt["munge"]=obj_txt_in;
@@ -3015,8 +3117,12 @@ template SiSUdocAbstraction() {
         }
         return obj_txt["munge"];
       }
-      string heading(string obj_txt_in)
-      in { }
+      string heading(Ot)(Ot obj_txt_in)
+      in {
+        debug(asserts){
+          static assert(is(typeof(obj_txt_in) == string));
+        }
+      }
       body {
         auto rgx = Rgx();
         obj_txt["munge"]=obj_txt_in;
@@ -3052,8 +3158,12 @@ template SiSUdocAbstraction() {
       }
       invariant() {
       }
-      string block(string obj_txt_in)
-      in { }
+      string block(Ot)(Ot obj_txt_in)
+      in {
+        debug(asserts){
+          static assert(is(typeof(obj_txt_in) == string));
+        }
+      }
       body {
         obj_txt["munge"]=obj_txt_in;
         obj_txt["munge"]=object_notes_(obj_txt["munge"]);
@@ -3061,8 +3171,12 @@ template SiSUdocAbstraction() {
       }
       invariant() {
       }
-      string verse(string obj_txt_in)
-      in { }
+      string verse(Ot)(Ot obj_txt_in)
+      in {
+        debug(asserts){
+          static assert(is(typeof(obj_txt_in) == string));
+        }
+      }
       body {
         obj_txt["munge"]=obj_txt_in;
         obj_txt["munge"]=object_notes_(obj_txt["munge"]);
@@ -3070,24 +3184,36 @@ template SiSUdocAbstraction() {
       }
       invariant() {
       }
-      string quote(string obj_txt_in)
-      in { }
+      string quote(Ot)(Ot obj_txt_in)
+      in {
+        debug(asserts){
+          static assert(is(typeof(obj_txt_in) == string));
+        }
+      }
       body {
         obj_txt["munge"]=obj_txt_in;
         return obj_txt["munge"];
       }
       invariant() {
       }
-      string table(string obj_txt_in)
-      in { }
+      string table(Ot)(Ot obj_txt_in)
+      in {
+        debug(asserts){
+          static assert(is(typeof(obj_txt_in) == string));
+        }
+      }
       body {
         obj_txt["munge"]=obj_txt_in;
         return obj_txt["munge"];
       }
       invariant() {
       }
-      string comment(string obj_txt_in)
-      in { }
+      string comment(Ot)(Ot obj_txt_in)
+      in {
+        debug(asserts){
+          static assert(is(typeof(obj_txt_in) == string));
+        }
+      }
       body {
         obj_txt["munge"]=obj_txt_in;
         return obj_txt["munge"];
@@ -3098,12 +3224,18 @@ template SiSUdocAbstraction() {
     struct ObjInlineMarkup {
       auto munge = ObjInlineMarkupMunge();
       string[string] obj_txt;
-      auto obj_inline_markup_and_anchor_tags(
-        string[string]         obj_,
-        string                 obj_key_,
-        string[string][string] dochead_make_aa
+      auto obj_inline_markup_and_anchor_tags(O,K,Ma)(
+        O  obj_,
+        K  obj_key_,
+        Ma dochead_make_aa
       )
-      in { }
+      in {
+        debug(asserts){
+          static assert(is(typeof(obj_)            == string[string]));
+          static assert(is(typeof(obj_key_)        == string));
+          static assert(is(typeof(dochead_make_aa) == string[string][string]));
+        }
+      }
       body {
         obj_txt["munge"]=obj_[obj_key_].dup;
         obj_txt["munge"]=(match(obj_["is"], ctRegex!(`verse|code`)))
@@ -3163,9 +3295,12 @@ template SiSUdocAbstraction() {
       }
       invariant() {
       }
-      auto _clean_heading_toc_(
-        char[] heading_toc_,
+      auto _clean_heading_toc_(Toc)(
+        Toc heading_toc_,
       ) {
+       debug(asserts){
+         static assert(is(typeof(heading_toc_) == char[]));
+       }
        auto m = matchFirst(cast(char[]) heading_toc_, rgx.heading);
        heading_toc_ =
          replaceAll(
@@ -3175,15 +3310,24 @@ template SiSUdocAbstraction() {
          );
        return heading_toc_;
       };
-      auto table_of_contents_gather_headings(
-        string[string]                obj_,
-        string[string][string]        dochead_make_aa,
-        string                        segment_anchor_tag_that_object_belongs_to,
-        string                        _anchor_tag,
-        ref string[][string]          lev4_subtoc,
-        ObjGenericComposite[][string] the_table_of_contents_section,
+      auto table_of_contents_gather_headings(O,Ma,Ts,Ta,X,Toc)(
+        O     obj_,
+        Ma    dochead_make_aa,
+        Ts    segment_anchor_tag_that_object_belongs_to,
+        Ta    _anchor_tag,
+        ref X lev4_subtoc,
+        Toc   the_table_of_contents_section,
       )
-      in { }
+      in {
+        debug(asserts){
+          static assert(is(typeof(obj_)                                      == string[string]));
+          static assert(is(typeof(dochead_make_aa)                           == string[string][string]));
+          static assert(is(typeof(segment_anchor_tag_that_object_belongs_to) == string));
+          static assert(is(typeof(_anchor_tag)                               == string));
+          static assert(is(typeof(lev4_subtoc)                               == string[][string]));
+          static assert(is(typeof(the_table_of_contents_section)             == ObjGenericComposite[][string]));
+        }
+      }
       body {
         ObjGenericComposite comp_obj_toc;
         mixin InternalMarkup;
@@ -3317,11 +3461,16 @@ template SiSUdocAbstraction() {
       invariant() {
       }
     private:
-      static string _configured_auto_heading_numbering_and_segment_anchor_tags(
-        string                 munge_,
-        string[string]         obj_,
-        string[string][string] dochead_make_aa
+      static string _configured_auto_heading_numbering_and_segment_anchor_tags(M,O,Ma)(
+        M  munge_,
+        O  obj_,
+        Ma dochead_make_aa
       ) {
+        debug(asserts){
+          static assert(is(typeof(munge_)          == string));
+          static assert(is(typeof(obj_)            == string[string]));
+          static assert(is(typeof(dochead_make_aa) == string[string][string]));
+        }
         if (dochead_make_aa["make"]["num_top"].length > 0) {
           if (!(match(munge_, rgx.heading_anchor_tag))) {
             static __gshared int heading_num_top_level=9;
@@ -3434,7 +3583,11 @@ template SiSUdocAbstraction() {
       }
     
     
-      static string _make_segment_anchor_tags_if_none_provided(string munge_, string lev_) {
+      static string _make_segment_anchor_tags_if_none_provided(M,Lv)(M munge_, Lv lev_) {
+        debug(asserts){
+          static assert(is(typeof(munge_) == string));
+          static assert(is(typeof(lev_)   == string));
+        }
         if (!(match(munge_, rgx.heading_anchor_tag))) { // if (anchor_tags_.length == 0) {
           if (match(munge_, rgx.heading_identify_anchor_tag)) {
             if (auto m = match(munge_, rgx.heading_extract_named_anchor_tag)) {
@@ -3501,12 +3654,18 @@ template SiSUdocAbstraction() {
     /+ +/
     struct ObjAttributes {
       string[string] _obj_attrib;
-      string obj_attributes(
-        string              obj_is_,
-        string              obj_raw,
-        ObjGenericComposite _comp_obj_heading,
+      string obj_attributes(Oi,OR,OH)(
+        Oi obj_is_,
+        OR obj_raw,
+        OH _comp_obj_heading,
       )
-      in { }
+      in {
+        debug(asserts){
+          static assert(is(typeof(obj_is_)           == string));
+          static assert(is(typeof(obj_raw)           == string));
+          static assert(is(typeof(_comp_obj_heading) == ObjGenericComposite));
+        }
+      }
       body {
         scope(exit) {
           destroy(obj_is_);
@@ -3566,8 +3725,12 @@ template SiSUdocAbstraction() {
       }
       private:
       string _obj_attributes;
-      string _para_and_blocks(string obj_txt_in)
-      in { }
+      string _para_and_blocks(Ot)(Ot obj_txt_in)
+      in {
+        debug(asserts){
+          static assert(is(typeof(obj_txt_in) == string));
+        }
+      }
       body {
         auto rgx = Rgx();
         if (matchFirst(obj_txt_in, rgx.para_bullet)) {
@@ -3593,8 +3756,12 @@ template SiSUdocAbstraction() {
         }
         return _obj_attributes;
       }
-      string _para(string obj_txt_in)
-      in { }
+      string _para(Ot)(Ot obj_txt_in)
+      in {
+        debug(asserts){
+          static assert(is(typeof(obj_txt_in) == string));
+        }
+      }
       body {
         _obj_attributes = " \"use\": \"content\","
         ~ " \"of\": \"para\","
@@ -3603,8 +3770,12 @@ template SiSUdocAbstraction() {
       }
       invariant() {
       }
-      string _heading(string obj_txt_in)
-      in { }
+      string _heading(Ot)(Ot obj_txt_in)
+      in {
+        debug(asserts){
+          static assert(is(typeof(obj_txt_in) == string));
+        }
+      }
       body {
         _obj_attributes = " \"use\": \"content\","
         ~ " \"of\": \"para\","
@@ -3613,8 +3784,12 @@ template SiSUdocAbstraction() {
       }
       invariant() {
       }
-      string _code(string obj_txt_in)
-      in { }
+      string _code(Ot)(Ot obj_txt_in)
+      in {
+        debug(asserts){
+          static assert(is(typeof(obj_txt_in) == string));
+        }
+      }
       body {
         _obj_attributes = " \"use\": \"content\","
         ~ " \"of\": \"block\","
@@ -3623,8 +3798,12 @@ template SiSUdocAbstraction() {
       }
       invariant() {
       }
-      string _group(string obj_txt_in)
-      in { }
+      string _group(Ot)(Ot obj_txt_in)
+      in {
+        debug(asserts){
+          static assert(is(typeof(obj_txt_in) == string));
+        }
+      }
       body {
         _obj_attributes = " \"use\": \"content\","
         ~ " \"of\": \"block\","
@@ -3633,8 +3812,12 @@ template SiSUdocAbstraction() {
       }
       invariant() {
       }
-      string _block(string obj_txt_in)
-      in { }
+      string _block(Ot)(Ot obj_txt_in)
+      in {
+        debug(asserts){
+          static assert(is(typeof(obj_txt_in) == string));
+        }
+      }
       body {
         _obj_attributes = " \"use\": \"content\","
         ~ " \"of\": \"block\","
@@ -3643,8 +3826,12 @@ template SiSUdocAbstraction() {
       }
       invariant() {
       }
-      string _verse(string obj_txt_in)
-      in { }
+      string _verse(Ot)(Ot obj_txt_in)
+      in {
+        debug(asserts){
+          static assert(is(typeof(obj_txt_in) == string));
+        }
+      }
       body {
         _obj_attributes = " \"use\": \"content\","
         ~ " \"of\": \"block\","
@@ -3653,8 +3840,12 @@ template SiSUdocAbstraction() {
       }
       invariant() {
       }
-      string _quote(string obj_txt_in)
-      in { }
+      string _quote(Ot)(Ot obj_txt_in)
+      in {
+        debug(asserts){
+          static assert(is(typeof(obj_txt_in) == string));
+        }
+      }
       body {
         _obj_attributes = " \"use\": \"content\","
         ~ " \"of\": \"block\","
@@ -3663,8 +3854,12 @@ template SiSUdocAbstraction() {
       }
       invariant() {
       }
-      string _table(string obj_txt_in)
-      in { }
+      string _table(Ot)(Ot obj_txt_in)
+      in {
+        debug(asserts){
+          static assert(is(typeof(obj_txt_in) == string));
+        }
+      }
       body {
         _obj_attributes = " \"use\": \"content\","
         ~ " \"of\": \"block\","
@@ -3673,8 +3868,12 @@ template SiSUdocAbstraction() {
       }
       invariant() {
       }
-      string _comment(string obj_txt_in)
-      in { }
+      string _comment(Ot)(Ot obj_txt_in)
+      in {
+        debug(asserts){
+          static assert(is(typeof(obj_txt_in) == string));
+        }
+      }
       body {
         _obj_attributes = " \"use\": \"comment\","
         ~ " \"of\": \"comment\","
@@ -3683,11 +3882,16 @@ template SiSUdocAbstraction() {
       }
       invariant() {
       }
-      string _set_additional_values_parse_as_json(
-        string              _obj_attrib,
-        string              obj_is_,
-        ObjGenericComposite _comp_obj_heading,
+      string _set_additional_values_parse_as_json(OA,Oi,OH)(
+        OA _obj_attrib,
+        Oi obj_is_,
+        OH _comp_obj_heading,
       ) {                                                  //
+        debug(asserts){
+          static assert(is(typeof(_obj_attrib)       == string));
+          static assert(is(typeof(obj_is_)           == string));
+          static assert(is(typeof(_comp_obj_heading) == ObjGenericComposite));
+        }
         JSONValue oa_j = parseJSON(_obj_attrib);
         assert(
           (oa_j.type == JSON_TYPE.OBJECT)
@@ -3715,11 +3919,15 @@ template SiSUdocAbstraction() {
       string[][string][string] bi;
       string[][string][string] hash_nugget;
       string[] bi_main_terms_split_arr;
-      string[][string][string] bookindex_nugget_hash(
-        string bookindex_section,
-        int    obj_cite_number
+      string[][string][string] bookindex_nugget_hash(BI,N)(
+        BI bookindex_section,
+        N  obj_cite_number
       )
       in {
+        debug(asserts){
+          static assert(is(typeof(bookindex_section) == string));
+          static assert(is(typeof(obj_cite_number)   == int));
+        }
         debug(bookindexraw) {
           if (!bookindex_section.empty) {
             writeln(
@@ -3783,9 +3991,12 @@ template SiSUdocAbstraction() {
     }
     struct BookIndexReportIndent {
       int mkn, skn;
-      auto bookindex_report_indented(
-        string[][string][string] bookindex_unordered_hashes
+      auto bookindex_report_indented(BI)(
+        BI bookindex_unordered_hashes
       ) {
+        debug(asserts){
+          static assert(is(typeof(bookindex_unordered_hashes) == string[][string][string]));
+        }
         auto mainkeys=
           bookindex_unordered_hashes.byKey.array.sort().release;
         foreach (mainkey; mainkeys) {
@@ -3811,9 +4022,12 @@ template SiSUdocAbstraction() {
       int  mkn, skn;
       auto rgx = Rgx();
       auto munge = ObjInlineMarkupMunge();
-      auto bookindex_write_section(
-        string[][string][string] bookindex_unordered_hashes
+      auto bookindex_write_section(BI)(
+        BI bookindex_unordered_hashes
       ) {
+        debug(asserts){
+          static assert(is(typeof(bookindex_unordered_hashes) == string[][string][string]));
+        }
         auto mainkeys=bookindex_unordered_hashes.byKey.array.sort().release;
         foreach (mainkey; mainkeys) {
           write("_0_1 !{", mainkey, "}! ");
@@ -3837,12 +4051,18 @@ template SiSUdocAbstraction() {
           ++mkn;
         }
       }
-      auto bookindex_build_abstraction_section(
-        string[][string][string] bookindex_unordered_hashes,
-        int                      obj_cite_number,
-        string                   segment_anchor_tag_that_object_belongs_to,
-        bool[string]             opt_action_bool,
+      auto bookindex_build_abstraction_section(BI,N,Ta,B)(
+        BI bookindex_unordered_hashes,
+        N  obj_cite_number,
+        Ta segment_anchor_tag_that_object_belongs_to,
+        B  opt_action_bool,
       ) {
+        debug(asserts){
+          static assert(is(typeof(bookindex_unordered_hashes)                == string[][string][string]));
+          static assert(is(typeof(obj_cite_number)                           == int));
+          static assert(is(typeof(segment_anchor_tag_that_object_belongs_to) == string));
+          static assert(is(typeof(opt_action_bool)                           == bool[string]));
+        }
         mixin SiSUnode;
         mixin InternalMarkup;
         auto mkup = InlineMarkup();
@@ -4128,11 +4348,16 @@ template SiSUdocAbstraction() {
     }
     /+ +/
     struct Bibliography {
-      public JSONValue[] _bibliography_(
-        ref string[]     biblio_unsorted_incomplete,
-        ref JSONValue[]  bib_arr_json
+      public JSONValue[] _bibliography_(Bi,BJ)(
+        ref Bi biblio_unsorted_incomplete,
+        ref BJ bib_arr_json
       )
-      in { }
+      in {
+        debug(asserts){
+          static assert(is(typeof(biblio_unsorted_incomplete) == string[]));
+          static assert(is(typeof(bib_arr_json)               == JSONValue[]));
+        }
+     }
       body {
         JSONValue[] biblio_unsorted =
           _biblio_unsorted_complete_(biblio_unsorted_incomplete, bib_arr_json);
@@ -4153,10 +4378,14 @@ template SiSUdocAbstraction() {
         }
         return biblio_sorted__;
       }
-      final private JSONValue[] _biblio_unsorted_complete_(
-        string[]        biblio_unordered,
-        ref JSONValue[] bib_arr_json
+      final private JSONValue[] _biblio_unsorted_complete_(Bi,BJ)(
+        Bi     biblio_unordered,
+        ref BJ bib_arr_json
       ) {
+        debug(asserts){
+          static assert(is(typeof(biblio_unordered) == string[]));
+          static assert(is(typeof(bib_arr_json)     == JSONValue[]));
+        }
         foreach (bibent; biblio_unordered) {
           // update bib to include deemed_author, needed for:
           // sort_bibliography_array_by_deemed_author_year_title
@@ -4182,7 +4411,10 @@ template SiSUdocAbstraction() {
           bib_arr_json.dup;
         return biblio_unsorted_array_of_json_objects;
       }
-      final private JSONValue[] biblio_sort(JSONValue[] biblio_unordered) {
+      final private JSONValue[] biblio_sort(BJ)(BJ biblio_unordered) {
+        debug(asserts){
+          static assert(is(typeof(biblio_unordered) == JSONValue[]));
+        }
         JSONValue[] biblio_sorted_;
         biblio_sorted_ =
           sort!((a, b){
@@ -4197,7 +4429,10 @@ template SiSUdocAbstraction() {
         }
         return biblio_sorted_;
       }
-      void biblio_debug(JSONValue[] biblio_sorted) {
+      void biblio_debug(BJ)(BJ biblio_sorted) {
+        debug(asserts){
+          static assert(is(typeof(biblio_sorted) == JSONValue[]));
+        }
         debug(biblio0) {
           foreach (j; biblio_sorted) {
             if (!empty(j["fulltitle"].str)) {
@@ -4212,15 +4447,23 @@ template SiSUdocAbstraction() {
       int lv, lv0, lv1, lv2, lv3, lv4, lv5, lv6, lv7;
       int obj_cite_number;
       int[string] p_; // p_ parent_
-      ObjGenericComposite node_location_emitter(
-        string lev_markup_number,
-        string segment_anchor_tag,
-        int    obj_cite_number_,
-        int    cntr_,
-        int    ptr_,
-        string is_
+      ObjGenericComposite node_location_emitter(Lv,Ta,N,C,P,I)(
+        Lv lev_markup_number,
+        Ta segment_anchor_tag,
+        N  obj_cite_number_,
+        C  cntr_,
+        P  ptr_,
+        I  is_
       )
       in {
+        debug(asserts){
+          static assert(is(typeof(lev_markup_number)  == string));
+          static assert(is(typeof(segment_anchor_tag) == string));
+          static assert(is(typeof(obj_cite_number_)   == int));
+          static assert(is(typeof(cntr_)              == int));
+          static assert(is(typeof(ptr_)               == int));
+          static assert(is(typeof(is_)                == string));
+        }
         auto rgx = Rgx();
         assert(is_ != "heading");
         assert(to!int(obj_cite_number_) >= 0);
@@ -4263,20 +4506,33 @@ template SiSUdocAbstraction() {
       }
       invariant() {
       }
-      ObjGenericComposite node_emitter_heading(
-        string _text,
-        string lev,
-        string lev_markup_number,
-        string lev_collapsed_number,
-        string segment_anchor_tag,
-        int    obj_cite_number_,
-        int    cntr_,
-        int    ptr_,
-        string[] lv_ancestors,
-        string is_,
-        int    html_segnames_ptr,
+      ObjGenericComposite node_emitter_heading(T,L,Lm,Lc,Ta,N,C,P,LA,I,PSn)(
+        T   _text,
+        L   lev,
+        Lm  lev_markup_number,
+        Lc  lev_collapsed_number,
+        Ta  segment_anchor_tag,
+        N   obj_cite_number_,
+        C   cntr_,
+        P   ptr_,
+        LA  lv_ancestors,
+        I   is_,
+        PSn html_segnames_ptr,
       )
       in {
+        debug(asserts){
+          static assert(is(typeof(_text)                == string));
+          static assert(is(typeof(lev)                  == string));
+          static assert(is(typeof(lev_markup_number)    == string));
+          static assert(is(typeof(lev_collapsed_number) == string));
+          static assert(is(typeof(segment_anchor_tag)   == string));
+          static assert(is(typeof(obj_cite_number_)     == int));
+          static assert(is(typeof(cntr_)                == int));
+          static assert(is(typeof(ptr_)                 == int));
+          static assert(is(typeof(lv_ancestors)         == string[]));
+          static assert(is(typeof(is_)                  == string));
+          static assert(is(typeof(html_segnames_ptr)    == int));
+        }
         auto rgx = Rgx();
         assert(is_ == "heading");
         assert(to!int(obj_cite_number_) >= 0);
@@ -4438,10 +4694,14 @@ template SiSUdocAbstraction() {
     }
     /+ abstraction functions emitters ↑ +/
     /+ ↓ abstraction functions assertions +/
-    auto assertions_doc_structure(
-      string[string] an_object,
-      int[string]    lv
+    auto assertions_doc_structure(O,Lv)(
+      O  an_object,
+      Lv lv
     ) {
+      debug(asserts){
+        static assert(is(typeof(an_object) == string[string]));
+        static assert(is(typeof(lv)        == int[string]));
+      }
       if (lv["h3"] > State.off) {
         assert(lv["h0"] > State.off);
         assert(lv["h1"] > State.off);
@@ -4613,7 +4873,10 @@ template SiSUdocAbstraction() {
         break;
       }
     }
-    auto assertions_flag_types_block_status_none_or_closed(int[string] type) {
+    auto assertions_flag_types_block_status_none_or_closed(T)(T type) {
+      debug(asserts){
+        static assert(is(typeof(type) == int[string]));
+      }
       assert(
         (type["code"] == TriState.off)
         || (type["code"] == TriState.closing),
diff --git a/src/sdp/ao_conf_make_meta.d b/src/sdp/ao_conf_make_meta.d
index e0ac269..5c043a2 100644
--- a/src/sdp/ao_conf_make_meta.d
+++ b/src/sdp/ao_conf_make_meta.d
@@ -22,7 +22,7 @@ template SiSUheaderExtractHub() {
       DocMake conf_doc_make_aa
     ) {
       debug(asserts){
-        static assert(is(typeof(header_src) == char[]));
+        static assert(is(typeof(header_src)       == char[]));
         static assert(is(typeof(conf_doc_make_aa) == string[string][string]));
       }
       auto head_native = HeaderDocMetadataAndMakeNativeToAA();
diff --git a/src/sdp/ao_conf_make_meta_native.d b/src/sdp/ao_conf_make_meta_native.d
index d95a8dd..6fe38e9 100644
--- a/src/sdp/ao_conf_make_meta_native.d
+++ b/src/sdp/ao_conf_make_meta_native.d
@@ -17,12 +17,18 @@ template SiSUheaderExtractNative() {
     auto rgx = Rgx();
     enum State { off, on }
     string hm, hs;
-    auto header_metadata_and_make_aa(
-      string header,
-      string[string][string] dochead_meta,
-      string[string][string] dochead_make
+    auto header_metadata_and_make_aa(H,Me,Ma)(
+      H  header,
+      Me dochead_meta,
+      Ma dochead_make
     )
-    in { }
+    in {
+      debug(asserts){
+        static assert(is(typeof(header)       == string));
+        static assert(is(typeof(dochead_meta) == string[string][string]));
+        static assert(is(typeof(dochead_make) == string[string][string]));
+      }
+    }
     body {
       scope(exit) {
         destroy(header);
@@ -203,12 +209,18 @@ template SiSUheaderExtractNative() {
       static assert(t.length==2);
       return t;
     }
-    private auto native_header_extract(
-      char[] line,
-      ref int[string] line_occur,
-      ref string[string] an_object,
-      ref int[string] type
+    private auto native_header_extract(L,Lo,O,T)(
+      L line,
+      ref Lo line_occur,
+      ref O an_object,
+      ref T type
     ) {
+      debug(asserts){
+        static assert(is(typeof(line)       == char[]));
+        static assert(is(typeof(line_occur) == int[string]));
+        static assert(is(typeof(an_object)  == string[string]));
+        static assert(is(typeof(type)       == int[string]));
+      }
       if (matchFirst(line, rgx.native_header_make)) {   /+ matched header_make +/
         debug(header1) { /+ writeln(line); +/ }
         type["header"]      = State.on;
@@ -241,11 +253,16 @@ template SiSUheaderExtractNative() {
       }
       return an_object;
     }
-    auto header_reset_states_common(
-      ref int[string] line_occur,
-      ref string[string] an_object,
-      ref int[string] type
+    auto header_reset_states_common(Lo,O,T)(
+      ref Lo line_occur,
+      ref O  an_object,
+      ref T  type
     ) {
+      debug(asserts){
+        static assert(is(typeof(line_occur) == int[string]));
+        static assert(is(typeof(an_object)  == string[string]));
+        static assert(is(typeof(type)       == int[string]));
+      }
       line_occur["header_make"] = State.off;
       line_occur["header_meta"] = State.off;
       type["header"] = State.off;
@@ -253,7 +270,10 @@ template SiSUheaderExtractNative() {
       an_object.remove("is");
       an_object.remove("attrib");
     }
-    private auto headerNativeToAA(in char[] src_header) {
+    private auto headerNativeToAA(Hn)(Hn src_header) {
+      debug(asserts){
+        static assert(is(typeof(src_header) == char[]));
+      }
       auto type = flags_type_init;
       type = [
        "header"          : State.off,
diff --git a/src/sdp/ao_conf_make_meta_sdlang.d b/src/sdp/ao_conf_make_meta_sdlang.d
index 5ced761..801df7e 100644
--- a/src/sdp/ao_conf_make_meta_sdlang.d
+++ b/src/sdp/ao_conf_make_meta_sdlang.d
@@ -11,7 +11,10 @@ template SiSUheaderExtractSDLang() {
     mixin SiSUregisters;
     mixin RgxInit;
     auto rgx = Rgx();
-    private auto sdlangToAAmake(string[string][string] conf, Tag conf_sdlang) {
+    private auto sdlangToAAmake(C,Tag)(C conf, Tag conf_sdlang) {
+      debug(asserts){
+        static assert(is(typeof(conf) == string[string][string]));
+      }
       foreach (maintag, subtags; conf) {
         foreach (subtag, content; subtags) {
           if (!(conf_sdlang.maybe.tags[maintag].empty)) {
@@ -28,11 +31,11 @@ template SiSUheaderExtractSDLang() {
       }
       return conf;
     }
-    private auto configSettingsSDLangToAAmake(Tag conf_sdlang) {
+    private auto configSettingsSDLangToAAmake(Tag)(Tag conf_sdlang) {
       auto conf = sdlangToAAmake(conf_aa, conf_sdlang);
       return conf;
     }
-    private auto documentMakeSDLangToAAmake(Tag document_make_sdlang) {
+    private auto documentMakeSDLangToAAmake(Tag)(Tag document_make_sdlang) {
       auto dochead_make = sdlangToAAmake(make_aa, document_make_sdlang);
       /+
       /+ dochead +/
@@ -171,7 +174,10 @@ template SiSUheaderExtractSDLang() {
       +/
       return dochead_make;
     }
-    final private auto headerMakeSDLang(in string src_header) {
+    final private auto headerMakeSDLang(Hs)(Hs src_header) {
+      debug(asserts){
+        static assert(is(typeof(src_header) == string));
+      }
       scope(failure) {
         stderr.writefln(
           "%s\n%s\n%s:%s failed here:\n  src_header: %s",
@@ -197,7 +203,10 @@ template SiSUheaderExtractSDLang() {
       }
       return sdl_root_header;
     }
-    private auto headerSDLangGet(in char[] src_header) {
+    private auto headerSDLangGet(Hs)(Hs src_header) {
+      debug(asserts){
+        static assert(is(typeof(src_header) == char[]));
+      }
       char[][] source_header_arr =
         split(cast(char[]) src_header, rgx.newline_eol_delimiter);
       char[] header_clean;
@@ -220,7 +229,10 @@ template SiSUheaderExtractSDLang() {
       }
       return header_sdlang; // sdlang.ast.Tag
     }
-    private auto headerSDLangToAAmake(Tag header_sdlang, string[string][string] dochead_make) {
+    private auto headerSDLangToAAmake(Tag,Ma)(Tag header_sdlang, Ma dochead_make) {
+      debug(asserts){
+        static assert(is(typeof(dochead_make) == string[string][string]));
+      }
       dochead_make = sdlangToAAmake(dochead_make, header_sdlang);
       auto dochead_meta = sdlangToAAmake(meta_aa, header_sdlang);
       if (dochead_meta["title"]["main"].empty) {
@@ -252,7 +264,11 @@ template SiSUheaderExtractSDLang() {
       static assert(t.length==2);
       return t;
     }
-    private auto headerSDLangToAA(char[] header_sdlang_src, string[string][string] conf_doc_make_aa) {
+    private auto headerSDLangToAA(Hs,Ma)(Hs header_sdlang_src, Ma conf_doc_make_aa) {
+      debug(asserts){
+        static assert(is(typeof(header_sdlang_src) == char[]));
+        static assert(is(typeof(conf_doc_make_aa) == string[string][string]));
+      }
       auto header_sdlang_tag = headerSDLangGet(header_sdlang_src); // sdlang.ast.Tag
       auto header_aa_tuple = headerSDLangToAAmake(header_sdlang_tag, conf_doc_make_aa);
       return header_aa_tuple;
diff --git a/src/sdp/output_epub.d b/src/sdp/output_epub.d
index 90f0ca4..8faf9e1 100644
--- a/src/sdp/output_epub.d
+++ b/src/sdp/output_epub.d
@@ -316,15 +316,24 @@ template SiSUoutputEPub() {
         oebps_content_opf,
       );
     }
-    void epub_write_output_files(
-      string fn_src,
-      string[] seg_filenames,
-      string[][string] doc_epub,
-      string mimetypes,
-      string meta_inf_container_xml,
-      string oebps_toc_ncx,
-      string oebps_content_opf,
+    void epub_write_output_files(Fn,FnS,De,Mt,Mic,Ot,Oc)(
+      Fn  fn_src,
+      FnS seg_filenames,
+      De  doc_epub,
+      Mt  mimetypes,
+      Mic meta_inf_container_xml,
+      Ot  oebps_toc_ncx,
+      Oc  oebps_content_opf,
     ) {
+      debug(asserts){
+        static assert(is(typeof(fn_src)                 == string));
+        static assert(is(typeof(seg_filenames)          == string[]));
+        static assert(is(typeof(doc_epub)               == string[][string]));
+        static assert(is(typeof(mimetypes)              == string));
+        static assert(is(typeof(meta_inf_container_xml) == string));
+        static assert(is(typeof(oebps_toc_ncx)          == string));
+        static assert(is(typeof(oebps_content_opf)      == string));
+      }
       mixin SiSUpaths;
       auto pth_epub = EpubPaths();
       // doc = xhtml_format.scroll_head ~ doc_epub ~  xhtml_format.tail;
diff --git a/src/sdp/output_html.d b/src/sdp/output_html.d
index 1975958..bf1d59c 100644
--- a/src/sdp/output_html.d
+++ b/src/sdp/output_html.d
@@ -2,10 +2,14 @@ template SiSUoutputHTML() {
   struct SDPoutputHTML {
     mixin SiSUoutputXHTMLs;
     
-    void scroll_write_output_file(
-      string fn_src,
-      string[] doc,
+    void scroll_write_output_file(Fn,D)(
+      Fn fn_src,
+      D doc,
     ) {
+      debug(asserts){
+        static assert(is(typeof(fn_src) == string));
+        static assert(is(typeof(doc)    == string[]));
+      }
       mixin SiSUpaths;
       auto pth_html = HtmlPaths();
       try {
@@ -131,11 +135,16 @@ template SiSUoutputHTML() {
       doc = xhtml_format.scroll_head(doc_matters.dochead_meta) ~ doc_html ~ xhtml_format.tail;
       scroll_write_output_file(doc_matters.source_filename, doc);
     }
-    void seg_write_output_files(
-      string fn_src,
-      string[] seg_filenames,
-      string[][string] doc_html,
+    void seg_write_output_files(Fn,FnS,D)(
+      Fn fn_src,
+      FnS seg_filenames,
+      D doc_html,
     ) {
+      debug(asserts){
+        static assert(is(typeof(fn_src)        == string));
+        static assert(is(typeof(seg_filenames) == string[]));
+        static assert(is(typeof(doc_html)      == string[][string]));
+      }
       mixin SiSUpaths;
       auto pth_html = HtmlPaths();
       auto xhtml_format = SDPoutputXHTMLs();
diff --git a/src/sdp/output_xhtmls.d b/src/sdp/output_xhtmls.d
index 7838cbe..c7a23fe 100644
--- a/src/sdp/output_xhtmls.d
+++ b/src/sdp/output_xhtmls.d
@@ -11,9 +11,12 @@ template SiSUoutputXHTMLs() {
       }
       return tags;
     }
-    auto scroll_head(
-      string[string][string]   dochead_meta,
+    auto scroll_head(Me)(
+      Me dochead_meta,
     ) {
+      debug(asserts){
+        static assert(is(typeof(dochead_meta) == string[string][string]));
+      }
       string o;
       o = format(q"¶<!DOCTYPE html>
     <html>
@@ -47,9 +50,12 @@ template SiSUoutputXHTMLs() {
     );
       return o;
     }
-    auto seg_head(
-      string[string][string]   dochead_meta,
+    auto seg_head(Me)(
+      Me dochead_meta,
     ) {
+      debug(asserts){
+        static assert(is(typeof(dochead_meta) == string[string][string]));
+      }
       string o;
       o = format(q"¶<!DOCTYPE html>
     <html>
diff --git a/src/sdp/source_sisupod.d b/src/sdp/source_sisupod.d
index 3cd5b94..20e0ef1 100644
--- a/src/sdp/source_sisupod.d
+++ b/src/sdp/source_sisupod.d
@@ -1,9 +1,12 @@
 template SiSUpod() {
   struct SDPsisupod {
     
-    void sisupod_assemble(
-      string fn_src,
+    void sisupod_assemble(S)(
+      S fn_src,
     ) {
+      debug(asserts){
+        static assert(is(typeof(fn_src) == string));
+      }
       mixin SiSUpaths;
       auto pth_sisupod = SiSUpodPaths();
       mixin SiSUlanguageCodes;
-- 
cgit v1.2.3