--- /dev/null
+#note also the .gitignore files in the tool and developer directories and any
+# other directory that might have one.
+
+#*#
+*~
+a.out
+.gradle/
--- /dev/null
+Apache License
+Version 2.0, January 2004
+http://www.apache.org/licenses/
+
+TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+1. Definitions.
+
+"License" shall mean the terms and conditions for use, reproduction, and
+distribution as defined by Sections 1 through 9 of this document.
+
+"Licensor" shall mean the copyright owner or entity authorized by the copyright
+owner that is granting the License.
+
+"Legal Entity" shall mean the union of the acting entity and all other entities
+that control, are controlled by, or are under common control with that
+entity. For the purposes of this definition, "control" means (i) the power,
+direct or indirect, to cause the direction or management of such entity, whether
+by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of
+the outstanding shares, or (iii) beneficial ownership of such entity.
+
+"You" (or "Your") shall mean an individual or Legal Entity exercising
+permissions granted by this License.
+
+"Source" form shall mean the preferred form for making modifications, including
+but not limited to software source code, documentation source, and configuration
+files.
+
+"Object" form shall mean any form resulting from mechanical transformation or
+translation of a Source form, including but not limited to compiled object code,
+generated documentation, and conversions to other media types.
+
+"Work" shall mean the work of authorship, whether in Source or Object form, made
+available under the License, as indicated by a copyright notice that is included
+in or attached to the work (an example is provided in the Appendix below).
+
+"Derivative Works" shall mean any work, whether in Source or Object form, that
+is based on (or derived from) the Work and for which the editorial revisions,
+annotations, elaborations, or other modifications represent, as a whole, an
+original work of authorship. For the purposes of this License, Derivative Works
+shall not include works that remain separable from, or merely link (or bind by
+name) to the interfaces of, the Work and Derivative Works thereof.
+
+"Contribution" shall mean any work of authorship, including the original version
+of the Work and any modifications or additions to that Work or Derivative Works
+thereof, that is intentionally submitted to Licensor for inclusion in the Work
+by the copyright owner or by an individual or Legal Entity authorized to submit
+on behalf of the copyright owner. For the purposes of this definition,
+"submitted" means any form of electronic, verbal, or written communication sent
+to the Licensor or its representatives, including but not limited to
+communication on electronic mailing lists, source code control systems, and
+issue tracking systems that are managed by, or on behalf of, the Licensor for
+the purpose of discussing and improving the Work, but excluding communication
+that is conspicuously marked or otherwise designated in writing by the copyright
+owner as "Not a Contribution."
+
+"Contributor" shall mean Licensor and any individual or Legal Entity on behalf
+of whom a Contribution has been received by Licensor and subsequently
+incorporated within the Work.
+
+2. Grant of Copyright License. Subject to the terms and conditions of this
+License, each Contributor hereby grants to You a perpetual, worldwide,
+non-exclusive, no-charge, royalty-free, irrevocable copyright license to
+reproduce, prepare Derivative Works of, publicly display, publicly perform,
+sublicense, and distribute the Work and such Derivative Works in Source or
+Object form.
+
+3. Grant of Patent License. Subject to the terms and conditions of this License,
+each Contributor hereby grants to You a perpetual, worldwide, non-exclusive,
+no-charge, royalty-free, irrevocable (except as stated in this section) patent
+license to make, have made, use, offer to sell, sell, import, and otherwise
+transfer the Work, where such license applies only to those patent claims
+licensable by such Contributor that are necessarily infringed by their
+Contribution(s) alone or by combination of their Contribution(s) with the Work
+to which such Contribution(s) was submitted. If You institute patent litigation
+against any entity (including a cross-claim or counterclaim in a lawsuit)
+alleging that the Work or a Contribution incorporated within the Work
+constitutes direct or contributory patent infringement, then any patent licenses
+granted to You under this License for that Work shall terminate as of the date
+such litigation is filed.
+
+4. Redistribution. You may reproduce and distribute copies of the Work or
+Derivative Works thereof in any medium, with or without modifications, and in
+Source or Object form, provided that You meet the following conditions:
+
+You must give any other recipients of the Work or Derivative Works a copy of
+this License; and You must cause any modified files to carry prominent notices
+stating that You changed the files; and You must retain, in the Source form of
+any Derivative Works that You distribute, all copyright, patent, trademark, and
+attribution notices from the Source form of the Work, excluding those notices
+that do not pertain to any part of the Derivative Works; and If the Work
+includes a "NOTICE" text file as part of its distribution, then any Derivative
+Works that You distribute must include a readable copy of the attribution
+notices contained within such NOTICE file, excluding those notices that do not
+pertain to any part of the Derivative Works, in at least one of the following
+places: within a NOTICE text file distributed as part of the Derivative Works;
+within the Source form or documentation, if provided along with the Derivative
+Works; or, within a display generated by the Derivative Works, if and wherever
+such third-party notices normally appear. The contents of the NOTICE file are
+for informational purposes only and do not modify the License. You may add Your
+own attribution notices within Derivative Works that You distribute, alongside
+or as an addendum to the NOTICE text from the Work, provided that such
+additional attribution notices cannot be construed as modifying the License.
+You may add Your own copyright statement to Your modifications and may provide
+additional or different license terms and conditions for use, reproduction, or
+distribution of Your modifications, or for any such Derivative Works as a whole,
+provided Your use, reproduction, and distribution of the Work otherwise complies
+with the conditions stated in this License.
+
+5. Submission of Contributions. Unless You explicitly state otherwise, any
+Contribution intentionally submitted for inclusion in the Work by You to the
+Licensor shall be under the terms and conditions of this License, without any
+additional terms or conditions. Notwithstanding the above, nothing herein shall
+supersede or modify the terms of any separate license agreement you may have
+executed with Licensor regarding such Contributions.
+
+6. Trademarks. This License does not grant permission to use the trade names,
+trademarks, service marks, or product names of the Licensor, except as required
+for reasonable and customary use in describing the origin of the Work and
+reproducing the content of the NOTICE file.
+
+7. Disclaimer of Warranty. Unless required by applicable law or agreed to in
+writing, Licensor provides the Work (and each Contributor provides its
+Contributions) on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+KIND, either express or implied, including, without limitation, any warranties
+or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+PARTICULAR PURPOSE. You are solely responsible for determining the
+appropriateness of using or redistributing the Work and assume any risks
+associated with Your exercise of permissions under this License.
+
+8. Limitation of Liability. In no event and under no legal theory, whether in
+tort (including negligence), contract, or otherwise, unless required by
+applicable law (such as deliberate and grossly negligent acts) or agreed to in
+writing, shall any Contributor be liable to You for damages, including any
+direct, indirect, special, incidental, or consequential damages of any character
+arising as a result of this License or out of the use or inability to use the
+Work (including but not limited to damages for loss of goodwill, work stoppage,
+computer failure or malfunction, or any and all other commercial damages or
+losses), even if such Contributor has been advised of the possibility of such
+damages.
+
+9. Accepting Warranty or Additional Liability. While redistributing the Work or
+Derivative Works thereof, You may choose to offer, and charge a fee for,
+acceptance of support, warranty, indemnity, or other liability obligations
+and/or rights consistent with this License. However, in accepting such
+obligations, You may act only on Your own behalf and on Your sole
+responsibility, not on behalf of any other Contributor, and only if You agree to
+indemnify, defend, and hold each Contributor harmless for any liability incurred
+by, or claims asserted against, such Contributor by reason of your accepting any
+such warranty or additional liability.
+
+END OF TERMS AND CONDITIONS
--- /dev/null
+Ariadne feared for the life of Theseus, who she had fallen in love with, because
+he was to enter the maze designed by Daedalus. She saved him by giving him
+a ball of string.
+
+Building experimental code for GQL_to_Cypher has proven to be as complex as
+navigating Daedalus's maze. As it turns out, `make` does not
+backward-chain pattern rules. Gradle/Groovy tends to build projects in
+layers.
+
+To use the Ariadne build tool, a developer writes their dependency graph in
+Groovy, utilizing a map and a set of regular expression matching
+functions. Then, to build or clean up the project, the developer invokes
+Ariadne.
+
+Ariadne was originally written in Groovy because it evolved incrementally as
+part of a Gradle script.
+
+
+
--- /dev/null
+# Suffix Conventions
+
+## Specify interface used with variable when clarification is useful:
+
+- `_set`: Indicates that the variable holds a set of items.
+
+- `_list`: Used for variables that represent a list of items.
+
+- `_f`: Refers to a function.
+
+Instead of making a variable name plural, add the interface qualifier:
+
+ e.g. names -> name_set or name_list
+
+## Always a good idea to use these when working with files:
+
+- `_fp`: Refers to a file path. The part after the last slash is a file name.
+
+- `_dp`: Refers to a directory path. By convention, the value ends in a slash.
+
+- `_fn`: Refers to a file name. Value has no slashes.
+
+- `_dn`: Refers to a directory name. Value has no slashes.
+
+- `_fn_base`: The file name without the last dot and subsequent characters.
+
+- `_fn_ext`: The subsequent characters after the last dot in a file name.
--- /dev/null
+RT code style:
+
+This has evolved into place after decades of programming in Unix culture projects.
+The comma style is unique to RT.
+
+AI tools we have used are OK with the commas, but have had difficulties
+with the padding rules for enclosures.
+
+1. Enclosures `(...)`, `{...}`, `[...]`, '<...>':
+
+ - No space between the enclosure and the preceding identifier (e.g., `function(arg)`).
+
+ - No space after the enclosure when followed by another enclosure (e.g., `map[key]()`).
+
+ Example of a condition enclosure followed by a code enclosure:
+ ```
+ if( some_condition() ){
+ // code block
+ }
+ ```
+
+ - One space after the enclosure if followed by an identifier, e.g.,
+ `function() somethingElse`.
+
+ - When the entire enclosure appears on one line:
+ -- if not nested, no padding.
+ -- if nested, pad only the outermost enclosure with one space
+ e.g.s:
+ if(x == 3) ; not nested
+ if( (x > 0) && (y < 5) ) ; nested, pad outermost only
+ if( f(x) == 3 ) ; nested, pad outermost only
+ if( x > 2 && a[3] ) ; nested due to the array subscript, pad outermost only
+
+2. Commas:
+
+ - One space **before** the comma (e.g., `a ,b`).
+
+ - No space **after** the comma (e.g., `a ,b`).
+
+ - **Line break before** the comma when breaking lines, but no line break after (e.g.,
+ ```
+ a
+ ,b
+ ```).
+
+3. Variable Naming:
+
+ - Use **snake_case** for function and variable names.
+
+ - Use **PascalCase** for namespaces and types.
+
+4. Binary Operators:
+
+ - One space around **binary operators** (e.g., `a + b`).
+
+ - One space around **assignment** `=` (e.g., `a = b`).
+
+ - **No space** around **sampling** assignment `=` (typically seen in `if`, `while`, etc.):
+
+ **Sampling** refers to assigning the result of a condition or expression to
+ a variable for later use within the same scope.
+
+ Example of **sampling** in an `if` statement:
+
+ ```
+ if( result=some_condition() ){
+ // use result
+ }
+ ```
+
+5. Two space indentation.
+
+
--- /dev/null
+# Suffix Conventions
+
+## Specify interface used with variable when clarification is useful
+
+- `_set`: Indicates that the variable holds a set of items.
+
+- `_list`: Used for variables that represent a list of items.
+
+- `_f`: Refers to a function.
+
+Instead of making a variable name plural, add the interface qualifier.
+
+ e.g. names -> name_set or name_lisst
+
+## Always a good idea to use these when working with files
+
+- `_fp`: Refers to a file path. The part after the last slash is a file name.
+
+- `_dp`: Refers to a directory path. By convention, the value ends in a slash.
+
+- `_fn`: Refers to a file name. Value has no slashes.
+
+- `_dn`: Refers to a directory name. Value has no slashes.
+
+- `_fn_base`: The file name without the last dot and subsequent characters.
+
+- `_fn_ext`: The subsequent characters after the last dot in a file name.
--- /dev/null
+package com.ReasoningTechnology.PaintIt;
+
+public class Black {
+ public static void main(String[] args) {
+ System.out.println("Paint it black.");
+ }
+}
--- /dev/null
+package com.ReasoningTechnology.PaintIt;
+
+public class Blue {
+ public static void print(){
+ System.out.println("Paint it blue.");
+ }
+ public static void main(String[] args) {
+ print();
+ }
+}
--- /dev/null
+package com.ReasoningTechnology.PaintIt;
+
+public class Green extends Blue {
+ public static void print(){
+ System.out.println("Paint it green.");
+ }
+}
--- /dev/null
+*
+!/.gitignore
--- /dev/null
+*
+!/.gitignore
--- /dev/null
+#!/bin/bash
+java com/ReasoningTechnology/PaintIt/Black
--- /dev/null
+#!/bin/bash
+java com/ReasoningTechnology/PaintIt/Blue
--- /dev/null
+#!/bin/bash
+java com/ReasoningTechnology/PaintIt/Green
--- /dev/null
+#!/bin/bash
+
+# Ensure REPO_HOME and ENV_DEV_BUILD are set
+if [ -z "$REPO_HOME" ]; then
+ echo "release:: REPO_HOME is not set."
+ exit 1
+fi
+
+if [ -z "$ENV_DEV_BUILD" ]; then
+ echo "release:: ENV_DEV_BUILD is not set."
+ exit 1
+fi
+
+rm -rf scratch_pad/*
+
+echo "clean complete."
--- /dev/null
+#!/bin/bash
+
+# Ensure REPO_HOME and ENV_DEV_BUILD are set
+if [ -z "$REPO_HOME" ]; then
+ echo "release:: REPO_HOME is not set."
+ exit 1
+fi
+
+if [ -z "$ENV_DEV_BUILD" ]; then
+ echo "release:: ENV_DEV_BUILD is not set."
+ exit 1
+fi
+
+set -x
+rm -rf scratch_pad/*
+rm -rf jvm/PaintIt.jar
+set +x
+
+echo "clean_all complete."
--- /dev/null
+#!/bin/bash
+
+# Ensure REPO_HOME and ENV_DEV_BUILD are set
+if [ -z "$REPO_HOME" ]; then
+ echo "release:: REPO_HOME is not set."
+ exit 1
+fi
+
+if [ -z "$ENV_DEV_BUILD" ]; then
+ echo "release:: ENV_DEV_BUILD is not set."
+ exit 1
+fi
+
+# Define release directory
+release_dir="$REPO_HOME"/release_candidate
+
+set -x
+rm -rf scratch_pad/*
+rm -rf jvm/PaintIt.jar
+rm -rf "$release_dir"
+set +x
+
+echo "clean_dist complete."
--- /dev/null
+#!/usr/bin/env bash
+
+echo "REOP_HOME/developer/tool/env"
+
+
+# The build environment.
+#
+env_error=false
+if [[ "${BASH_SOURCE[0]}" == "$0" ]]; then
+ echo "env_build:: This script must be sourced, not executed."
+ env_error=true
+fi
+if [ -z "$ENV_DEVELOPER" ]; then
+ echo "env_build:: script can only be run from the developer environment"
+ env_error=true
+fi
+if [ "$env_error" = true ]; then
+ exit 1
+fi
+
+# goovy use has been deprecated
+# export GROOVY_HOME="$REPO_HOME/tool_shared/third_party/groovy-4.0.9"
+
+# third party tools we will use
+export JAVA_HOME="$REPO_HOME/tool_shared/third_party/jdk-11"
+export PATH=\
+"$JAVA_HOME"/bin\
+:"$PATH"
+
+# where the tool build finds its class files:
+export CLASSPATH=\
+"$REPO_HOME"/developer/jvm\
+:"$REPO_HOME"/developer/jvm/PaintIt.jar\
+:"$REPO_HOME"/developer/jvm/Ariadne.jar\
+:"$JAVA_HOME"/lib\
+:"$CLASSPATH"
+
+# after we building the tool we might want to run it
+# the shell directory holds the bash UI wrappers
+export PATH=\
+"$REPO_HOME"/developer/shell\
+:"$PATH"
+
+export ENV_DEV_BUILD=true
+echo "${BASH_SOURCE[0]}" "complete"
--- /dev/null
+#!/bin/env bash
+
+if [ -z "$ENV_DEVELOPER" ]; then
+ echo "make_PaintIt:: script can only be run from the developer environment"
+ return 1
+fi
+
+# Ensure we are in the right directory
+cd "$REPO_HOME"/developer
+
+# Start with a fresh scratch_pad and remove a prior jvm
+# Depending, this is unnecessary and might even be undesirable.
+# Better to clean up the stuff we will rewrite instead of everything.
+# But for testing and in an unstable environment, this is probably best.
+echo "Starting with a clean scratch_pad and jvm directories..."
+rm -rf scratch_pad/*
+rm -rf jvm/PaintIt.jar
+
+# Compile all files (Black.java and Blue.java) with the correct package
+echo "Compiling files..."
+javac -d scratch_pad javac/Black.java javac/Blue.java javac/Green.java
+
+if [ $? -ne 0 ]; then
+ echo "Compilation failed."
+ exit 1
+fi
+
+# Create a JAR file from the compiled class files with correct package structure
+echo "Creating JAR file..."
+mkdir -p jvm
+jar cf jvm/PaintIt.jar -C scratch_pad .
+
+if [ $? -eq 0 ]; then
+ echo "JAR file created successfully: jvm/PaintIt.jar"
+else
+ echo "Failed to create JAR file."
+ exit 1
+fi
+
+# Create shell wrappers in developer/shell for easy execution
+echo "Creating shell wrappers..."
+mkdir -p shell
+
+cat > shell/black << EOL
+#!/bin/bash
+java com/ReasoningTechnology/PaintIt/Black
+EOL
+chmod +x shell/black
+
+cat > shell/blue << EOL
+#!/bin/bash
+java com/ReasoningTechnology/PaintIt/Blue
+EOL
+chmod +x shell/blue
+
+cat > shell/green << EOL
+#!/bin/bash
+java com/ReasoningTechnology/PaintIt/Green
+EOL
+chmod +x shell/green
+
+echo "Shell wrappers created successfully: black, blue, green"
+
--- /dev/null
+#!/bin/bash
+
+# Ensure REPO_HOME and ENV_DEV_BUILD are set
+if [ -z "$REPO_HOME" ]; then
+ echo "release:: REPO_HOME is not set."
+ exit 1
+fi
+
+if [ -z "$ENV_DEV_BUILD" ]; then
+ echo "release:: ENV_DEV_BUILD is not set."
+ exit 1
+fi
+
+# Define release directory
+release_dir="$REPO_HOME/release_candidate"
+
+# Create release directory if it doesn't exist
+if [ ! -d "$release_dir" ]; then
+ mkdir -p "$release_dir"
+fi
+
+# Function to copy and set permissions
+install_file() {
+ source_fp="$1"
+ target_dp="$2"
+ perms="$3"
+
+ target_file="$target_dp/$(basename $source_fp)"
+
+ if ! install -m "$perms" "$source_fp" "$target_file"; then
+ echo "Error: Failed to install $(basename $source_fp) to $target_dp"
+ exit 1
+ else
+ echo "Installed $(basename $source_fp) to $target_dp with permissions $perms"
+ fi
+}
+
+echo "Starting release process..."
+
+# Paths to build script and JAR file
+PaintIt_jar_fp="$REPO_HOME/developer/jvm/PaintIt.jar"
+
+# Install the JAR file
+install_file "$PaintIt_jar_fp" "$release_dir" "ug+r"
+
+echo "Release process completed successfully."
--- /dev/null
+<!DOCTYPE html>
+<html lang="en">
+<head>
+ <meta charset="UTF-8">
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
+ <title>Directory Structure Description</title>
+ <style>
+ body {
+ background-color: hsl(0, 0%, 0%);
+ color: hsl(42, 100%, 80%);
+ font-family: monospace;
+ padding: 20px;
+ margin: 0;
+ }
+ .page {
+ padding: 20px;
+ margin: 20px auto;
+ max-width: 800px;
+ background-color: hsl(0, 0%, 10%);
+ box-shadow: 0 0 10px hsl(42, 100%, 50%);
+ }
+ ul, li {
+ list-style-type: none;
+ }
+ li::before {
+ content: "📁 ";
+ margin-right: 5px;
+ }
+ li {
+ margin-bottom: 5px;
+ }
+ .description {
+ margin-left: 10px;
+ color: hsl(42, 100%, 60%);
+ }
+ h1 {
+ text-align: center;
+ color: hsl(42, 100%, 80%);
+ text-transform: uppercase;
+ margin-bottom: 20px;
+ }
+ h2 {
+ color: hsl(42, 100%, 80%);
+ text-transform: uppercase;
+ margin-top: 40px;
+ }
+ p {
+ color: hsl(42, 100%, 70%);
+ margin-bottom: 20px;
+ }
+ </style>
+</head>
+<body>
+
+ <div class="page">
+ <h1>Directory Naming</h1>
+
+ <h2>Reference</h2>
+
+ <ul>
+ <li>/var/user_data/Thomas-developer/Ariadne</li>
+ <ul>
+ <li>developer/ <span class="description">The workspace for developers to organize source code, build scripts, and development-specific tools.</span></li>
+ <ul>
+ <li>deprecated/ <span class="description">Archived files and older versions no longer in active use.</span></li>
+ <li>document/ <span class="description">Developer-level documentation for building and understanding the project.</span></li>
+ <li>javac/ <span class="description">Java source files prepared for compilation.</span></li>
+ <li>jvm/ <span class="description">Compiled Java bytecode files for the project.</span></li>
+ <li>scratch_pad/ <span class="description">Temporary storage for intermediate files during development.</span></li>
+ <li>shell/ <span class="description">Shell scripts intended to be part of the project release or build automation.</span></li>
+ <li>tool/ <span class="description">Developer-specific tools used for building or managing development tasks.</span></li>
+ </ul>
+ <li>document/ <span class="description">Top-level project documentation for project managers or contributors.</span></li>
+ <li>release_candidate/ <span class="description">Builds and packages ready for testing and release preparation.</span></li>
+ <li>scratch_pad/ <span class="description">Temporary storage for project management tasks.</span></li>
+ <li>tester/ <span class="description">Files and tools for managing and running test environments.</span></li>
+ <ul>
+ <li>document/ <span class="description">Test-specific documentation for procedures and setups.</span></li>
+ <li>test0/ <span class="description">Test case 0 environment and associated scripts.</span></li>
+ <li>test1/ <span class="description">Test case 1 environment and associated scripts.</span></li>
+ <li>test2/ <span class="description">Test case 2 environment and associated scripts.</span></li>
+ <li>tool/ <span class="description">Tools needed for testing and managing the test environment.</span></li>
+ </ul>
+ <li>tool/ <span class="description">Project management/administration specific tools.</span></li>
+ <li>tool_shared/ <span class="description">Tools shared across project roles.</span></li>
+ <ul>
+ <li>bespoke/ <span class="description">Tools developed specifically for this project.</span></li>
+ <li>customized/ <span class="description">Modified versions of third-party tools adapted for the project.</span></li>
+ <li>document/ <span class="description">Documentation related to shared tools and setup.</span></li>
+ <li>third_party/ <span class="description">Tools sourced from third-party vendors or open-source projects.</span></li>
+ </ul>
+ <li>LICENSE.txt <span class="description">The project license detailing usage and distribution terms.</span></li>
+ <li>README.md <span class="description">A general overview and introduction to the project.</span></li>
+ </ul>
+ </ul>
+
+
+ <h2>Name origin and rationale</h2>
+
+ <p>Typically, developers and project administrators do not employ a semantic
+ system for naming directories, but more commonly use conventional
+ placeholder names. The intended purpose of files in a directory with a
+ placeholder name then must be inferred from experience or inspection of
+ the files, or learned from other people or from documents.</p>
+
+ <p>For example, a directory named 'exe/' probably derives its name from the
+ fact that the contained files have their executable permission bit set;
+ however, such a directory will not contain all such files. There might
+ even be some files in an `exe/` directory that do not have their
+ executable permission bit set. The two concepts being an `exe/` file
+ (i.e. being a file in an `exe/` directory) and being an executable file
+ are not identical. The actual intended meaning of being an `exe/` file
+ will sometimes be that the contained files are applications available to a
+ user, or that they are tools available for use in a project.
+ </p>
+
+ <p>The directory names in this project resulted from an exploration of a
+ property-based file system. In such a system a number of files and
+ agents are defined. Then we can ask questions about their relationships.
+ Files with a relationship to the developer are collected, and this
+ becomes the `developer/` directory. In a similar manner we get the
+ directories, `tester/', and `javac/`. In this latter case the
+ agent is a compiler rather than a role.
+ </p>
+
+ <p>However, when attempting applying this method in practice it became
+ apparent that the recognition of relationships was insufficient. Consider
+ the directories `deprecated` and `scratch_pad`. There is no
+ 'Mr. Deprecated' or 'Mr. Scratch_Pad' who the contained files are
+ for. (And this conclusion is not for the lack of trying. Even mythological
+ beings did not suffice as agents.) Rather than saying a file has a
+ relationship with an agent, these properties (directory names) are states
+ imposed by decree by an agent on a file. Perhaps the developer, has
+ decreed that a file is now deprecated, or a build script has decreed that
+ it is a scratch_pad file. Such decrees are typically more dynamic than the
+ relationship properties. Also, these properties are disconnected from the
+ contents of the file. When, for example, we say a file is for the java
+ compiler we can surmise something about its contents. However when we say
+ a file is `deprecated` we can surmise nothing about its contents.
+ </p>
+
+ <p>To understand a directory name within this system, one can imagine
+ reading said name as part of a sentence that integrates the
+ property. Consider two property names: 'is-a' and 'is-for'. For example,
+ "Each file in the <code>document/</code> directory is a document," or
+ "Each file in the <code>developer/</code> directory is for the developer."
+ Although the property name is not carried over to the conventional file
+ system, we can typically infer what it must be. It is beyond the scope of
+ discussion here, but in actuality, our collections are defined by
+ predicates that are given a file's properties and relationships as
+ arguments, where the predicate resolves to true if and only if the file
+ belongs to the collection. Now wouldn't that be interesting if we
+ instead derived a probability?
+ </p>
+
+ <p>It is uncommon for a property value to be plural. While it is not
+ disallowed, it rarely occurs in practice. This is true independent of
+ whether we are discussing a relationship property or a state
+ property. Hence when we make a file collection based on a shared property,
+ then carry that over as a directory name in a conventional file system,
+ the resulting directory name will often be singular. This pattern can be
+ observed in the case of the `document/` directory, as shown in the prior
+ paragraph.
+ </p>
+
+ </div>
+
+</body>
+</html>
--- /dev/null
+
+Work Flow
+
+1. Development
+
+ 1.1. developer makes edits
+ 1.2. developer uses 'release' which will copy relevant files to the $REPO_HOME/release_candidate
+ 1.3. tester will test the candidate
+
+2. Release
+
+ 2.1. Upon completion of testing, project manager will make a new branch for release
+ named release_<version>. Version has a major and minor number.
+
+2.2. on the new branch the 'release_candidate' directory is renamed 'release_<version>'.
+
+3. Release specific fixes
+
+ 3.1.the 'release_candidate' directory is recreated
+ 3.2 steps 1.1 - 1.33 are repeated
+ 3.3 when testing is complete, 'release_candidate' is renamed 'release_version'
+ with the minor version incremented.
+
+4. Major release
+
+ Development continues on the `core_developer_branch` even after creation of a
+ `release_version` branch. For a next major release, increment the major release
+ number and do as described in steps 2 then 3.
+
--- /dev/null
+*
+!/.gitignore
--- /dev/null
+#!/bin/env bash
+
+# Ensure the script is sourced
+if [ -z "$ENV_TESTER" ]; then
+ echo "env_build:: script can only be run in the tester environment"
+ return 1
+fi
+
+cd "$REPO_HOME"/tester/test0
+groovyc TestGraph.groovy
--- /dev/null
+#!/usr/bin/env bash
+# environment common to all tests
+# each test directory also has an environment
+
+echo "REOP_HOME/tester/tool/env"
+
+# The build environment.
+#
+env_error=false
+if [[ "${BASH_SOURCE[0]}" == "$0" ]]; then
+ echo "env:: This script must be sourced, not executed."
+ env_error=true
+fi
+if [ -z "$ENV_DEV" ]; then
+ echo "env:: script can only be run from the developer environment"
+ env_error=true
+fi
+if [ "$env_error" = true ]; then
+ echo "in REOP_HOME/tester/tool"
+ exit 1
+fi
+
+
+export JAVA_HOME="$REPO_HOME/tool/jdk-11"
+
+export PATH=\
+"$REPO_HOME"/release_candidate\
+:"$JAVA_HOME"/bin\
+:"$PATH"
--- /dev/null
+#!/bin/env bash
+
+if [ -z "$ENV_TESTER" ]; then
+ echo "make.sh:: script can only be run in the tester environment"
+ env_error=true
+fi
+
+set -x
+
+groovyc TestGraph.groovy
--- /dev/null
+#!/usr/bin/env bash
+
+# Ensure the script is sourced
+if [[ "${BASH_SOURCE[0]}" == "$0" ]]; then
+ echo "This script must be sourced, not executed. Exiting."
+ exit 1
+fi
+
+if [ -z "$ENV_BASE" ]; then
+ script_path="$(dirname "$(realpath "${BASH_SOURCE[0]}")")"
+ source "${script_path}/env_base"
+fi
+
+ENV_ADMINISTRATOR=true
+
+PROJECT="$PROJECT"_administrator
+
+export PATH=\
+"$REPO_HOME"/tool\
+:"$PATH"
+
+# no sneaky hidden files
+alias ls="ls -a"
+
+
+export ENV_ADMINISTRATOR=true
+jecho "${BASH_SOURCE[0]}" "complete"
--- /dev/null
+#!/usr/bin/env bash
+
+# Ensure the script is sourced
+if [[ "${BASH_SOURCE[0]}" == "$0" ]]; then
+ echo "This script must be sourced, not executed. Exiting."
+ exit 1
+fi
+
+if [ -z "$ENV_BASE" ]; then
+ script_path="$(dirname "$(realpath "${BASH_SOURCE[0]}")")"
+ source "${script_path}/env_base"
+fi
+
+ENV_ADMINISTRATOR=true
+
+PROJECT="$PROJECT"_administrator
+
+export PATH=\
+"$REPO_HOME"/tool\
+:"$PATH"
+
+# no sneaky hidden files
+alias ls="ls -a"
+
+
+export ENV_ADMINISTRATOR=true
+echo "${BASH_SOURCE[0]}" "complete"
--- /dev/null
+#!/usr/bin/env bash
+
+# Ensure the script is sourced
+if [[ "${BASH_SOURCE[0]}" == "$0" ]]; then
+ echo "This script must be sourced, not executed. Exiting."
+ exit 1
+fi
+
+# These are things set by the `repo` command found in the `resource` project,
+# but if you don't have that, then source this into the environment.
+
+script_path="$(dirname "$(realpath "${BASH_SOURCE[0]}")")"
+export REPO_HOME="${script_path%/*}"
+export PROJECT=$(basename "$REPO_HOME")
+
+PPS1="\n[$PROJECT]\n\u@\h§$(pwd)§\n> "
+PPS2=">> "
+
+echo REPO_HOME "$REPO_HOME"
+echo PROJECT "$PROJECT"
+echo "${BASH_SOURCE[0]}" "complete"
+
+export ENV_BASE=true
--- /dev/null
+#!/usr/bin/env bash
+
+# Ensure the script is sourced
+if [[ "${BASH_SOURCE[0]}" == "$0" ]]; then
+ echo "This script must be sourced, not executed. Exiting."
+ exit 1
+fi
+
+if [ -z "$ENV_BASE" ]; then
+ script_path="$(dirname "$(realpath "${BASH_SOURCE[0]}")")"
+ source "${script_path}/env_base"
+fi
+
+PROJECT="$PROJECT"_developer
+
+export PATH=\
+"$REPO_HOME"/developer/tool\
+:"$REPO_HOME"/tool_shared/bespoke/\
+:"$PATH"
+
+# so the .gitignore files can be seen:
+alias ls="ls -a"
+
+cd "$REPO_HOME"/developer/
+export ENV_DEVELOPER=true
+source tool/env
+
+echo "${BASH_SOURCE[0]}" "complete"
+
+
+
--- /dev/null
+#!/usr/bin/env bash
+
+# Ensure the script is sourced
+if [[ "${BASH_SOURCE[0]}" == "$0" ]]; then
+ echo "This script must be sourced, not executed. Exiting."
+ exit 1
+fi
+
+# Check if REPO_HOME is set, if not source env_base
+if [ -z "$ENV_BASE" ]; then
+ script_path="$(dirname "$(realpath "${BASH_SOURCE[0]}")")"
+ source "${script_path}/env_base"
+fi
+
+PROJECT="$PROJECT"_tester
+
+export PATH=\
+"$REPO_HOME"/tester/executor/\
+:"$REPO_HOME"/tool_shared/bespoke/\
+:"$PATH"
+
+cd "$REPO_HOME"/tester/
+export ENV_TESTER=true
+source tool/env
+
+echo "${BASH_SOURCE[0]}" "complete"
--- /dev/null
+#!/bin/env bash
+
+echo 0.1
+
--- /dev/null
+
+#1. downlaod
+
+cd "$REPO_HOME/tool/upstream"
+curl -C - -o OpenJDK11U-jdk_x64_linux_hotspot_11.0.16_8.tar.gz https://github.com/adoptium/temurin11-binaries/releases/download/jdk-11.0.16+8/OpenJDK11U-jdk_x64_linux_hotspot_11.0.16_8.tar.gz
+
+#2. extract
+
+cd "$REPO_HOME/tool"
+mkdir -p jdk-11
+tar -xzf "$REPO_HOME/tool/upstream/OpenJDK11U-jdk_x64_linux_hotspot_11.0.16_8.tar.gz" -C jdk-11 --strip-components 1
--- /dev/null
+
+1. Docs
+ https://groovy-lang.org/documentation.html
+
+2. Install from source
+
+ # 1.1 Download
+
+ # https://dlcdn.apache.org/groovy/
+
+ cd $REPO_HOME/toolsmith/upstream
+ wget https://dlcdn.apache.org/groovy/4.0.23/sources/apache-groovy-src-4.0.23.zip
+
+ # 1.2 then build them ;-)
+
+2. Install binaries
+
+ #!/usr/bin/env bash
+
+ # Define version of Groovy to be installed
+ version="4.0.9"
+
+ # 2.1 Download using curl
+ cd "$REPO_HOME/toolsmith/upstream"
+ curl -o apache-groovy-binary-${version}.zip https://groovy.jfrog.io/artifactory/dist-release-local/groovy-zips/apache-groovy-binary-${version}.zip
+
+ # 2.2 Extract
+ cd "$REPO_HOME/tools"
+ unzip "$REPO_HOME/tools/upstream/apache-groovy-binary-${version}.zip" -d .
--- /dev/null
+
+#1. downlaod
+
+cd "$REPO_HOME/tool/upstream"
+curl -C - -o OpenJDK11U-jdk_x64_linux_hotspot_11.0.16_8.tar.gz https://github.com/adoptium/temurin11-binaries/releases/download/jdk-11.0.16+8/OpenJDK11U-jdk_x64_linux_hotspot_11.0.16_8.tar.gz
+
+#2. extract
+
+cd "$REPO_HOME/tool"
+mkdir jdk-11
+tar -xzf "$REPO_HOME/tool/upstream/OpenJDK11U-jdk_x64_linux_hotspot_11.0.16_8.tar.gz" -C jdk-11 --strip-components 1
--- /dev/null
+*
+!/.gitignore
+# upstream has a .gitignore file in it, edit to keep anything precious
+!/upstream
--- /dev/null
+*
+!/.gitignore