diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md
index 611e7d38..32e70980 100644
--- a/CONTRIBUTING.md
+++ b/CONTRIBUTING.md
@@ -36,4 +36,21 @@ You must install the `jython-dev.jar` to your local maven repository.
Build and install to your local Maven repo: `mvn install`
+## Code Quality Standards
+
+This project enforces code quality standards during the build process:
+
+### Print Statement Policy
+
+Print statements (`System.out.println`, `System.err.println`) are only allowed in CLI driver classes. The build uses Maven Checkstyle plugin to enforce this policy and will fail if inappropriate print statements are detected in core library code or test classes.
+
+- **To fix violations**: Replace print statements with appropriate logging using `java.util.logging.Logger`
+- **To skip check during development**: Use `mvn install -Dskip.print.check=true`
+- **For detailed policy**: See [Print Statement Policy](docs/PRINT_STATEMENT_POLICY.md)
+
+### Code Formatting
+
+- **Java**: Uses Spotless with Google Java Format - run `mvn spotless:apply` to auto-fix
+- **Python**: Uses Black - run `black .` to auto-fix
+
[SO post]: https://stackoverflow.com/questions/4955635/how-to-add-local-jar-files-to-a-maven-project#answer-4955695
diff --git a/README.md b/README.md
index 1a03d69f..3af2d4f6 100644
--- a/README.md
+++ b/README.md
@@ -6,6 +6,16 @@ This is the top level repository for Ariadne code. More information on using the
Since it is built using [WALA], you need to have WALA on your system to use it. Instructions on building this project can be found in [CONTRIBUTING.md].
+## Code Quality Standards
+
+This project enforces several code quality standards:
+
+- **Print Statement Policy**: Print statements (`System.out`, `System.err`) should only be used in CLI driver classes. See [Print Statement Policy](docs/PRINT_STATEMENT_POLICY.md) for details. Enforced via Maven Checkstyle plugin.
+- **Code Formatting**: Java code is formatted using Spotless with Google Java Format.
+- **Python Formatting**: Python code is formatted using Black.
+
+The build will fail if these standards are not met.
+
To test, for example, run `TestCalls` in the `com.ibm.wala.cast.python.test` project.
[WALA]: https://github.com/wala/WALA
diff --git a/checkstyle-suppressions.xml b/checkstyle-suppressions.xml
new file mode 100644
index 00000000..345b5daf
--- /dev/null
+++ b/checkstyle-suppressions.xml
@@ -0,0 +1,11 @@
+
+
+
+
+
+
+
+
+
diff --git a/checkstyle.xml b/checkstyle.xml
new file mode 100644
index 00000000..74b26369
--- /dev/null
+++ b/checkstyle.xml
@@ -0,0 +1,21 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/docs/PRINT_STATEMENT_POLICY.md b/docs/PRINT_STATEMENT_POLICY.md
new file mode 100644
index 00000000..634dbb60
--- /dev/null
+++ b/docs/PRINT_STATEMENT_POLICY.md
@@ -0,0 +1,123 @@
+# Print Statement Usage Policy
+
+This project enforces a policy that prevents inappropriate usage of `System.out.println()` and `System.err.println()` in non-CLI code. Print statements should only be used in CLI driver classes for user-facing output.
+
+## Policy
+
+- **Allowed**: Print statements in CLI driver classes (under `/driver/` packages)
+- **Allowed**: Print statements in main methods of utility/demo classes (e.g., parser demos)
+- **Not Allowed**: Print statements in core library code, analysis code, test classes, or other components
+
+For all non-CLI code, including test classes, use `java.util.logging.Logger` instead of print statements.
+
+## Build Integration
+
+The build automatically checks for inappropriate print statement usage during the `validate` phase using Maven Checkstyle plugin:
+
+```bash
+# This will fail if inappropriate print statements are found
+mvn validate
+
+# This will succeed only if no violations are detected
+mvn validate -Dskip.print.check=false
+```
+
+## Bypassing the Check
+
+During development or when working on refactoring print statements (e.g., issue #331), you can skip the check:
+
+```bash
+# Skip the print statement check
+mvn validate -Dskip.print.check=true
+
+# Or set it permanently in your local settings
+mvn clean install -Dskip.print.check=true
+```
+
+## Fixing Violations
+
+If the build fails due to inappropriate print statements:
+
+1. **For debug/info messages**: Replace with appropriate logging:
+```java
+// Bad
+System.err.println("Debug info: " + value);
+
+// Good
+private static final Logger LOGGER = Logger.getLogger(MyClass.class.getName());
+LOGGER.fine("Debug info: " + value);
+```
+
+2. **For error messages**: Use logging with appropriate levels:
+```java
+// Bad
+System.err.println("Error occurred: " + exception.getMessage());
+
+// Good
+LOGGER.severe("Error occurred: " + exception.getMessage());
+```
+
+3. **For CLI output**: Move the code to a driver class or ensure it's in an appropriate location
+
+## Script Details
+
+The check is implemented using Maven Checkstyle plugin with a custom configuration that:
+
+- Scans all Java files (including test files) for `System.out` and `System.err` usage
+- Excludes files in `/driver/` directories
+- Allows print statements in main methods of specific utility classes
+- Fails the build if violations are found
+
+## Examples
+
+### ✅ Allowed Usage
+
+```java
+// CLI driver class
+public class Ariadne {
+ public static void main(String[] args) {
+ System.out.println("Analysis complete."); // OK - CLI output
+ }
+}
+
+// Test class
+public class TestParser {
+ private static final Logger LOGGER = Logger.getLogger(TestParser.class.getName());
+
+ public void testMethod() {
+ LOGGER.info("Debug output"); // OK - using logging
+ }
+}
+
+// Demo main method
+public class PythonFileParser {
+ public static void main(String[] args) {
+ System.err.println(script); // OK - demo/utility main method
+ }
+}
+```
+
+### ❌ Prohibited Usage
+
+```java
+// Core library code
+public class PythonParser {
+ public void parseCode() {
+ System.err.println("Parsing..."); // NOT OK - use LOGGER.fine() instead
+ }
+}
+
+// Analysis engine
+public class AnalysisEngine {
+ public void analyze() {
+ System.out.println("Found result"); // NOT OK - use LOGGER.info() instead
+ }
+}
+
+// Test class
+public class TestAnalysis {
+ public void testMethod() {
+ System.err.println("Debug info"); // NOT OK - use LOGGER.info() instead
+ }
+}
+```
diff --git a/pom.xml b/pom.xml
index 5ce0947b..8cf05cbd 100644
--- a/pom.xml
+++ b/pom.xml
@@ -28,10 +28,12 @@
1.6.13-SNAPSHOT
2.46.1
3.5.4
+ 10.20.1
both
./logging.properties
0.8.13
+ false
@@ -252,8 +254,43 @@
+
+ org.apache.maven.plugins
+ maven-checkstyle-plugin
+ 3.5.0
+
+ checkstyle.xml
+ true
+ UTF-8
+ true
+ true
+ ${skip.print.check}
+
+
+
+ com.puppycrawl.tools
+ checkstyle
+ ${checkstyle.version}
+
+
+
+
+ check-print-statements
+
+ check
+
+ validate
+
+
+
+
+
+ org.apache.maven.plugins
+ maven-checkstyle-plugin
+
+