     }
     
     public init(type: ParseType, overlay requestedGlobalOverlays: [String], pathOnDisk: String) throws {
+        //warn on unknown keys
+        for (k,_) in type.properties {
+            if !Key.allKeys.map({$0.rawValue}).contains(k) {
+                print("Warning: unknown package key \(k)")
+            }
+        }
+
         if type.name != "package" { throw PackageError.NonPackage }
         self.importedPath = pathOnDisk
 
-        if let value = type.properties[Keys.Name.rawValue]?.string { self.name = value }
+        if let value = type.properties[Key.Name.rawValue]?.string { self.name = value }
         else {
             throw PackageError.NoName
         }
-        if let value = type.properties[Keys.Version.rawValue]?.string { self.version = value }
-
-        if let parsedTasks = type.properties[Keys.Tasks.rawValue]?.map {
+        if let value = type.properties[Key.Version.rawValue]?.string { self.version = value }
+
+        if let parsedTasks = type.properties[Key.Tasks.rawValue]?.map {
             for (name, value) in parsedTasks {
                 if let task = Task(value: value, unqualifiedName: name, package: self, importedPath: pathOnDisk) {
                     self.tasks[task.unqualifiedName] = task

}

final public class Package {
    public enum Keys: String {
        case Name = "name"
        case Version = "version"
        case PackageTypeName = "package"

        var remotePackages: [Package] = []

        //load remote packages
        if let imports_nv = type.properties[Key.ImportPackages.rawValue] {
            guard let imports = imports_nv.vector else {
                throw PackageError.NonVectorImport
            }
