Index: src/ResolvExpr/AlternativeFinder.cc
===================================================================
--- src/ResolvExpr/AlternativeFinder.cc	(revision 6fd195572c21d131b70087819d102d7077cc521b)
+++ src/ResolvExpr/AlternativeFinder.cc	(revision c41c18a6f127e0648fcb9e36b0a4d62fb62a9579)
@@ -258,13 +258,17 @@
 			// - necessary pre-requisite to pruning
 			AltList candidates;
+			std::list<std::string> errors;
 			for ( unsigned i = 0; i < alternatives.size(); ++i ) {
-				resolveAssertions( alternatives[i], indexer, candidates );
+				resolveAssertions( alternatives[i], indexer, candidates, errors );
 			}
 			// fail early if none such
 			if ( mode.failFast && candidates.empty() ) {
 				std::ostringstream stream;
-				stream << "No resolvable alternatives for expression " << expr << "\n"
-				       << "Alternatives with failing assertions are:\n";
-				printAlts( alternatives, stream, 1 );
+				stream << "No alternatives with satisfiable assertions for " << expr << "\n";
+				//        << "Alternatives with failing assertions are:\n";
+				// printAlts( alternatives, stream, 1 );
+				for ( const auto& err : errors ) {
+					stream << err;
+				}
 				SemanticError( expr->location, stream.str() );
 			}
Index: src/ResolvExpr/ResolveAssertions.cc
===================================================================
--- src/ResolvExpr/ResolveAssertions.cc	(revision 6fd195572c21d131b70087819d102d7077cc521b)
+++ src/ResolvExpr/ResolveAssertions.cc	(revision c41c18a6f127e0648fcb9e36b0a4d62fb62a9579)
@@ -20,5 +20,6 @@
 #include <list>                     // for list
 #include <memory>                   // for unique_ptr
-#include <string>
+#include <sstream>                  // for ostringstream
+#include <string>                   // for string
 #include <unordered_map>            // for unordered_map, unordered_multimap
 #include <utility>                  // for move
@@ -27,4 +28,5 @@
 #include "Alternative.h"            // for Alternative, AssertionItem, AssertionList
 #include "Common/FilterCombos.h"    // for filterCombos
+#include "Common/Indenter.h"        // for Indenter
 #include "Common/utility.h"         // for sort_mins
 #include "ResolvExpr/RenameVars.h"  // for renameTyVars
@@ -97,4 +99,6 @@
 			return { item, item.matches[i] };
 		}
+
+		const DeclarationWithType* get_decl() const { return cache->at(key).deferIds[0].decl; }
 
 		// sortable by key
@@ -364,5 +368,5 @@
 	static const int recursionLimit = /* 10 */ 4;
 
-	void resolveAssertions( Alternative& alt, const SymTab::Indexer& indexer, AltList& out ) {
+	void resolveAssertions( Alternative& alt, const SymTab::Indexer& indexer, AltList& out, std::list<std::string>& errors ) {
 		// finish early if no assertions to resolve
 		if ( alt.need.empty() ) {
@@ -385,5 +389,15 @@
 				for ( auto& assn : resn.need ) {
 					// fail early if any assertion is not resolvable
-					if ( ! resolveAssertion( assn, resn, assnCache ) ) goto nextResn;
+					if ( ! resolveAssertion( assn, resn, assnCache ) ) {
+						Indenter tabs{ Indenter::tabsize, 3 };
+						std::ostringstream ss;
+						ss << tabs << "Unsatisfiable alternative:\n";
+						resn.alt.print( ss, ++tabs );
+						ss << --tabs << "Could not satisfy assertion:\n";
+						assn.decl->print( ss, ++tabs );
+						
+						errors.emplace_back( ss.str() );
+						goto nextResn;
+					}
 				}
 
@@ -404,4 +418,19 @@
 						resn.deferred, 
 						CandidateEnvMerger{ resn.alt.env, resn.alt.openVars, resn.indexer } );
+					// fail early if no mutually-compatible assertion satisfaction
+					if ( compatible.empty() ) {
+						Indenter tabs{ Indenter::tabsize, 3 };
+						std::ostringstream ss;
+						ss << tabs << "Unsatisfiable alternative:\n";
+						resn.alt.print( ss, ++tabs );
+						ss << --tabs << "No mutually-compatible satisfaction for assertions:\n";
+						++tabs;
+						for ( const auto& d : resn.deferred ) {
+							d.get_decl()->print( ss, tabs );
+						}
+
+						errors.emplace_back( ss.str() );
+						goto nextResn;
+					}
 					// sort by cost
 					CandidateCost coster{ resn.indexer };
Index: src/ResolvExpr/ResolveAssertions.h
===================================================================
--- src/ResolvExpr/ResolveAssertions.h	(revision 6fd195572c21d131b70087819d102d7077cc521b)
+++ src/ResolvExpr/ResolveAssertions.h	(revision c41c18a6f127e0648fcb9e36b0a4d62fb62a9579)
@@ -24,5 +24,5 @@
 namespace ResolvExpr {
 	/// Recursively resolves all assertions provided in an alternative; returns true iff succeeds
-	void resolveAssertions( Alternative& alt, const SymTab::Indexer& indexer, AltList& out );
+	void resolveAssertions( Alternative& alt, const SymTab::Indexer& indexer, AltList& out, std::list<std::string>& errors );
 } // namespace ResolvExpr
 
