diff --git a/CHANGELOG.md b/CHANGELOG.md
index 976062e..3eaee33 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -7,6 +7,22 @@ and this project uses [Semantic Versioning](https://semver.org/spec/v2.0.0.html)
## [Unreleased]
+Needs DirXMLDev 0.57.0.
+
+### Fixed
+
+- Importing a Designer project that holds two objects of one name (a driver set using Libraries in
+ two containers, or a package upgrade's leftover) no longer gives a project where nearly every
+ page fails with `duplicate artifact path` (#174). The import keeps one, and the page now waits
+ on the result, saying which one it kept and what was left out, until you open the workbench. The
+ first commit's message records it too. A project imported before this loads again, and
+ validation names the duplicate.
+
+### Changed
+
+- "An internal error" says where the server log is (`docker logs idmweb`, or the terminal that
+ runs the server); the quickstart's *Day to day* says so too.
+
## [0.80.0] - 2026-10-27
Needs DirXMLDev 0.56.0.
diff --git a/bin/smoke-hosted.sh b/bin/smoke-hosted.sh
index bf7c5c9..c5b01f9 100755
--- a/bin/smoke-hosted.sh
+++ b/bin/smoke-hosted.sh
@@ -393,6 +393,28 @@ try:
check("adding a project to a server set up with the old repo.* keys keeps its first project", s == 200 and "projects=repo,extra" in conf1 and "project.repo.repo.url=" in conf1 and "repo.url=" not in conf1.replace("project.repo.repo.url=", "").replace("project.extra.repo.url=", ""))
s, r, _ = bob.call("POST", "/api/setup/directory", {"project": "outside", "path": "/etc"})
check("a deployer may attach only under setup.roots (#41)", s == 400 and "outside" in r.get("error", ""))
+ # #174: a Designer project whose driver set uses two Libraries that both hold "es-shared"
+ proj = os.path.join(work, "two-libraries"); orph = os.path.join(proj, "Model", "EdirOrphan"); os.makedirs(os.path.join(orph, "L2"))
+ def cobj(name, typ, inner):
+ return ('%s' % (name, typ, inner))
+ def cstr(n, v): return '' % (n, v)
+ def rel(n, k): return '' % (n, k)
+ files = {
+ "DS.DriverSet_": cobj("DS", "DriverSet", cstr("DSetContext", "o=system") + rel("Idm:Libraries", "L2.Library_") + rel("Idm:Libraries", "L1.Library_")),
+ "L1.Library_": cobj("Library", "Library", cstr("LibraryContext", "cn=DS,o=system") + rel("Idm:Resources", "J1.ECMAScriptResource_")),
+ "L2.Library_": cobj("Library", "Library", cstr("LibraryContext", "ou=shared,o=system") + rel("Idm:Resources", "J2.ECMAScriptResource_")),
+ "L2/J1.ECMAScriptResource_": cobj("es-shared", "ECMAScriptResource", cstr("DirXML-ContentType", "text/ecmascript")),
+ "L2/J1_contents.xml": "function own(){}",
+ "L2/J2.ECMAScriptResource_": cobj("es-shared", "ECMAScriptResource", cstr("DirXML-ContentType", "text/ecmascript")),
+ "L2/J2_contents.xml": "function shared(){}",
+ }
+ for f, t in files.items():
+ open(os.path.join(orph, f), "w").write(t)
+ open(os.path.join(proj, ".project"), "w").write("two-libraries")
+ s, r, _ = bob.call("POST", "/api/setup/project", {"project": "twolib", "path": proj})
+ check("#174: a project with an object two Libraries hold imports, and the page is told which it kept", s == 200
+ and any("kept the resource (in cn=Library,cn=DS,o=system" in n and "one Library" in n for n in r.get("notes", [])))
# #42: the audit log, deployers only
import datetime
def when(t): # 3, 6 or 9 fraction digits: compare as times, not text (#161)
diff --git a/docs/quickstart.md b/docs/quickstart.md
index a96bd9b..147aeec 100644
--- a/docs/quickstart.md
+++ b/docs/quickstart.md
@@ -191,6 +191,8 @@ command there (`docker exec idmweb idm vault.status --env lab`) binds as you do
- **Stop:** `docker compose -f "$HOME/idmweb/compose.yml" down`. Everything lives in the folder:
back it up, move it or delete it, and that is the whole install.
- **One per machine:** the container is named `idmweb`.
+- **The server log:** `docker logs idmweb` (add `--tail 200` for the end). When the page reports
+ "an internal error", the stack trace is there; attach it to an issue.
- **Moving to a server for a team:** [hosted-install.md](hosted-install.md) is the same image
behind a proxy with TLS and your identity provider. Push the folder's `repo.git` to GitHub or
GitLab and point the server's project at it.
diff --git a/pom.xml b/pom.xml
index e2ef33d..957c6a9 100644
--- a/pom.xml
+++ b/pom.xml
@@ -23,7 +23,7 @@
- 0.56.0
+ 0.57.0
1.7.0