#maintainers

1 messages · Page 19 of 1

tepid nova
#

@still garnet first module ported to workspace API 🙂 In dang of course

pub description = "A Dagger module for markdownlint, a markdown linter. https://github.com/DavidAnson/markdownlint-cli2"

type MarkdownLint {

  """
  The version of markdownlint to use.
  """
  pub version: String! = "latest"

  """
  Filter the current workspace for use by markdownlint.
  """
  pub inputs(ws: Workspace!): Directory! {
    ws.directory("/", include: ["**/*.md", "**/.markdownlint*"])
  }

  """
  Build a sandbox with markdownlint installed and input files mounted.
  """
  pub sandbox(ws: Workspace!): Container! {
    container
      .from("tmknom/markdownlint:" + version)
      .withWorkdir("/app")
      .withMountedDirectory(".", inputs(ws), owner: "nonroot")
  }

  """
  Lint markdown files in the current workspace.
  """
  pub lint(ws: Workspace!): Void @check {
    sandbox(ws)
      .withExec(["markdownlint", "."])
      .sync
    null
  }

  """
  Fix markdown files in the current workspace.
  """
  pub fix(ws: Workspace!): Changeset! @generate {
    let ctr = sandbox(ws)
    let before = ctr.directory(".")
    let after = ctr
      .withExec(["markdownlint", "--fix", "."], expect: ReturnType.ANY)
      .directory(".")
    after.changes(before)
  }
}
still garnet
#

pretty sweet

#

though technically 🤓 the caching seems suboptimal?

tepid nova
#

Devloop is a little long - rebuild a new dev engine playground each time I edit the module. I would love for that one dang file to get livesynced into my playground somehow 🙂

still garnet
#

i guess it'll do the level-2 caching (not the module functions but the things they call) anyway though, probably makes very little difference

tepid nova
still garnet
#

yeah. but, now that i think about it, it doesn't buy you much in the end to pull it up into a constructor

tepid nova
#

forgot about that

#

I guess it's just the overhead of executing the module's functions themselves?

still garnet
#

the sync is gonna happen either way, and there's basically no overhead to calling those outer functions

#

yeah

tepid nova
#

Well there is some overhead... But I guess not a ton

#

let me try to remember how to write a constructor in dang

still garnet
#

it's a new thing, different from what i showed in SF

tepid nova
#

My claude skill missed that apparently

still garnet
#

worth reinstalling locally too and upgrading the Zed extension so you can get the auto fmt (if not already)

tepid nova
#

I totally forgot how to do that. Tried calling dagger -m github.com/vito/dang binary -o ~/.local/bin/dang but it looks like I can only get a linux build

tepid nova
obsidian rover
still garnet
tepid nova
#

dang question: is there a way to remove the last element of an array?

#

or: to remove the last component of a path?

tepid nova
#

Update: found trimSuffix (in my particular case I know the exact content of the last component path I want to trim)

leaden glade
#

🤔 Am I the only one not able to generate typescript anymore?

$ dagger generate "typescriptSdk:clientLibrary"
✔ typescriptSdk:clientLibrary 14.6s 2×⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⡀⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣧⣿⡀⡀⣿⡀
Error: get patch: file size 134250496 exceeds limit 134217728 [traceparent:6b1cb51de9a91ccfb74d142c3f437924-d538e4fe981dfac5]

All the other generate commands seem fine

leaden glade
still garnet
tepid nova
#

@leaden glade now that generate is shipped, how do you feel about 1) moving module codegen from develop to generate, and 2) moving client generation from client generate to generate?

Would be a nice simplification to have it all in one place

tepid nova
#

This is an interesting one: my dang module just failed to load because codeberg.org is down...

Turns out:

  • Dang SDK is on github
  • But the github repo has submodules on codeberg
  • Dagger git implementation force-fetches all submodules
  • codeberg was down
  • ...dagger git op fails
  • ...dang sdk load fails
  • ...my module load fails
#

So in effect, our CI now has a hidden runtime dependency on codeberg.org

leaden glade
# tepid nova <@809456513298464798> now that `generate` is shipped, how do you feel about 1) m...

I agree on the simplification. But not sure how that would work. Where the function will be defined?
What I mean is would it be a way to call the equivalent of develop but from generate CLI command, or would it be a way to expose a generate function? So by doing a dagger generate -l on a module the function will be visible.
One other solution could also be to have the module code itself, and the workspace on top of it could contain a sdk-related module that will provide this generate function?
Not sure I express it clearly enough 😅
But yes, happy to work on that and propose something 🙂 I just need to think more and write down a plan

tepid nova
#

We have a similar problem with check -> would be nice to have builtin checking also available in dagger check. Like checking whether a module actually loads... (Something @median yew just hit the other day, at the moment the workaround is dagger --eager-runtime, not exactly intuitive) cc @charred lotus @obsidian rover who were working on that

civic yacht
#

@Erik Sipsma saw a new flake on

#

Had all the integ tests passing for my PR but did manual testing and hit a deadlock when running ./hack/with-dev dagger call generated. Thought it was a dagql problem but eventually realized it was deadlocking in the buildkit solver (which dag-op is still using in this PR).... Had codex spin on it overnight and after 4 hours it figured out a bit more but not the root cause.

There's zero chance I'm wasting time on this, so I'm gonna just expand the PR to be "the whole thing". So all the current changes (e-graph implementation) plus:

  • expanded dagql persistence and associated pruning support
  • the actual tearout of all the buildkit solver and related parts

The PR is currently +6,913 -3,310, it's probably gonna double at least, so I apologize in advance to reviewers 🙂 I just don't see a different way at this point

GitHub

Status:
At first this PR was going to just be updating the cache to use a new e-graph implementation, which was setup for the final change that removed the buildkit solver and migrated all caching ...

still garnet
#

will anyone miss listen --disable-host-read-write if i just nuke it from orbit? iirc we used it for the Playground but that's long gone

obsidian rover
tepid nova
#

Update: I ported our (non-reusable) docs-dev module to 2 reusable modules, using the workspace API:

  • markdownlint
  • docusaurus

A few rough edges, but VERY happy with the result so far. Note: requires a dev engine to run. EDIT: ooh I think actually it's a bug in my module. Will check tonight.

https://github.com/dagger/dagger/pull/11876

One rough edge: what does Workspace.directory(".") (and all relative paths) resolve to @still garnet ? I assumed the workspace path (as opposed to the workspace's rootfs), but I think maybe it's something else?

#

Playground

dagger -m github.com/dagger/dagger@main call \
 engine-dev \
 playground \
 with-directory --path=./src/dagger --source=https://github.com/dagger/dagger#dogfood-workspace-api \
  with-workdir --path=src/dagger \
  terminal
leaden glade
#

I tried on my personal laptop (both are very close, same cpu, same os, etc) and it works.
I reboot my work laptop just to see if some magic happened but I still have get patch: file size 134250496 exceeds limit 134217728
That's really weird.
Good thing is it looks like I'm the only one on a single machine to have the issue, but I don't understand why.
And not sure what component I should nuke to have a chance to be back to a normal state
If anyone has an idea 🙏

leaden glade
leaden glade
leaden glade
tepid nova
civic yacht
tepid nova
wild zephyr
civic yacht
tepid nova
#

It's apples to oranges, because the PR summary is a one-shot prompt, whereas the changelog is the result of an extreme micro-management loop on format, style, themes etc

tepid nova
#

Workspace API & file paths 🧵

civic yacht
# civic yacht Had all the integ tests passing for [my PR ](https://github.com/dagger/dagger/pu...

Good progress on this, all of TestDirectory passing now with zero buildkit or dag-op involved! https://dagger.cloud/dagger/traces/b8c838310b1884e51cedd6f4a571ad99

Particularly proud of the fix for TestDirectory/TestDirCaching there. That test relies on the fact that a lazy operation, withoutFile, turns out to be a no-op when the specified file path doesn't exist when the operation actually runs, and thus afterwards shouldn't impact cache keys. More complicated than it seems.

With buildkit, the only possible way to get that working was to unconditionally enable extremely expensive content hashing of every single directory ever mounted into any exec. Nothing else was even possible. Extremely blunt+expensive hammer.

In the new dagql world, it literally is just a few lines of code that run after the withoutFile operation finishes un-lazying. It checks if it removed any files and, if not, tells the dagql cache that it should be considered equivalent to the original parent operation (i.e. it was a no-op). After that all the e-graph union-find magic kicks in and the caching just magically works as expected, and with O(1) overhead

And the best part is that rather than wracking my brain for hours trying to figure out how to get it to work in the extremely complicated previous system, this was instantly clear+obvious and worked first try 🥲 The promised land is near!

obsidian rover
#

As the release god is a funny one, as usual, a CVE is found right after a release 🤣

Is it handled as part of the post-release @still garnet ? or can i bump it on the side

still garnet
#

@obsidian rover I rolled that into my post release PR yeah

#

All green now, just needs approval

leaden glade
#

Now version has been released, https://github.com/dagger/dagger/pull/11910 is ready for review.
It splits the python test suite by version and test type to make it easier to work with python SDK (and keeping the full matrix support through checks)

GitHub

WarningThis can&#39;t be merged until next release including #11902
You can see in the checks that there&#39;s no python sdk tests runs, as the mentioned PR contains the fix to list the che...

tepid nova
#

release question. at the moment we manually "bump" the target engine version for different parts of our build , eg. our docs.

Would it make sense to derive it from git state? for example we could have a latestRelease() or latestSemverTag() in our version module. So setting the new release tag would be the source of truth. wdyt?

coral vector
stuck bloom
#

Are workspaces ready to test with 0.20.0? Or does it need another release or two?

tepid nova
stuck bloom
#

Hm, I'll try to test on my personal mac. Running dev builds at work is a pain. Not a fault of Dagger. It's just too many variables.

tepid nova
stuck bloom
#

I did that at home too and it was really cool DX :).. There are things that won't work at work like we can't do stuff like apk add blah because it needs to be proxied via our package manager. Those are specific things that's hard to account for in a public build like dagger. It's also partly the reason I have to maintain my own daggerverse.

tepid nova
stuck bloom
#

Maybe by chaining more calls on that playground image
I don't think that will help with the builder images. The configurations for those package managers are internal to those images. So what we do is pull the image and configure the proxy on the fly.

One way I can think of resolving this is to standardize what is used in the build process wherever there is a package install happening so the person triggering the build can provide a builder image that's configured to work for them.

obsidian rover
stuck bloom
#

hm, don't think I follow sry! I meant, wherever you have to do apk add ... or apt-get install in the dagger build, let the user provide the image. It's ideal if there was only one type of image. Either, debian or alpine so you only need 1 external image.

#

Any image that already comes with the tools installed should be fine.

leaden glade
# stuck bloom hm, don't think I follow sry! I meant, wherever you have to do `apk add ...` or ...

🤔
To never be able to run any apk/apt/... is a very strong requirement in my opinion, and to provide external images always comes with side issues like this image must be up to date, it must follow what we are using. And every time those images will not be in sync we are introducing more complexity and reasons to fail.
My question is outside of dagger (and maybe naive), but if the thing is to proxy calls to package managers, couldn't it made transparently on the infra side? In a way containers/machines just run classical commands and it will just work?

stuck bloom
#

To never be able to run any apk/apt/... is a very strong requirement in my opinion
It's not never. You can run it as long as the proxy is configured. I run them fine in my builds. You have to edit OS local config files to set that up.

but if the thing is to proxy calls to package managers, couldn't it made transparently on the infra side?
While it sounds simple I don't think it's as simple from an implementation standpoint. I also don't know enough about our artifact registry to understand if it's even possible. There are way too many variations of package managers to easily make something like that work.

#

and to provide external images always comes with side issues like this image must be up to date, it must follow what we are using.
I agree. it's not straightforward. Wherein lies the problem 🙂

fair ermine
fair ermine
fair ermine
still garnet
#

sure!

fair ermine
fair ermine
tidal spire
tidal spire
spark cedar
#

also hallo 👋 hope you're all doing good

coral vector
#

does anybody have a feel for how complex it would be to implement Service.withExec (runs a command in a Service container) and Service.exitCode (waits until the Service exits and returns its exit code)

rocky plume
#

service.wait

rocky plume
leaden glade
#

After so long, the PR to move the python analysis to an AST based one is ready for review: https://github.com/dagger/dagger/pull/11803
That's a big one, and most of it is AI generated. Not sure what's the best way to review it.
The good thing is all the tests are now passing, and the previous analysis that was loading the code is now removed.
This will (in follow up PRs) allow to use the moduleTypes SDK endpoint to register types.
This change is required for self calls in python, but it will also bring parity with Go and Typescript SDKs on this area.

GitHub

This PR replaces the runtime analysis for the Python SDK to an AST based one.
Context: when the Python SDK wants to run a Python module, it starts by analysing the user module source code. This all...

tidal spire
leaden glade
#

I'm looking at the idea to use dagger generate instead of dagger develop while working on modules (target is workspace/modules v2).
One of the difficulties is about the question of using a module vs developing a module.
So let's say we are inside a workspace, containing a module that is defined locally. For instance one of our existing toolchains in dagger/dagger.
From anywhere, if dagger generate -l runs it shows the full list of generates. It's the case from the root, but also from a module path.
And that makes sense, we are in the workspace, meaning we want to use the modules referenced in the workspace.
But as the module source might also be inside the workspace, how to show the specific generate function replacing develop?
So maybe the thing is to use -m to specify the module.
Let's say I'm going to ./toolchains/python-sdk-dev:

  • dagger generate -l will list all the generates from the workspace point of view
  • dagger -m . generate -l will list the specific generates from this particular module + a generate function exposed by the module's SDK. Or maybe only this last one?
    Would it be something that makes sense? Or do we want to expose all of the SDK's generate functions at the workspace level?
    Just open thoughts, I'm not yet sure what would be the right UX, happy to get any ideas.
leaden glade
leaden glade
leaden glade
# leaden glade I'm looking at the idea to use `dagger generate` instead of `dagger develop` whi...

More thoughts about dagger generate to codegen a module (instead of dagger develop)
The message right above allows to dagger generate -m MYMODULE.
But if the module is loaded as a toolchain / references in the workspace we can already dagger generate MYMODULE. The -m is still interesting as it allows to reference an external module by its git ref for instance.
But the thing here is this will list/run the generate functions defined by the module. Do we want the "code generate" to be at the same level? At the same phase? I'd say this should be maybe run before any other as this will be used to build the module.

I'll try to use an example to see how that would work. So let's say we are working on toolchains/python-sdk-dev. This module as currently a client-library generate function to re-generate the python lib, for instance if we add a new core type.
If I jump into the toolchains/python-sdk-dev directory and type dagger generate it will run all the generate functions from the workspace perspective.
If I dagger -m . generate it will only run the client-library generate function. Similar to running dagger generate python-sdk from the root of the workspace.
Where to put the generate function that will perform the equivalent of the develop?

Idea 1: stages. One stage can be executed only if the others have already been executed. By default everything is on stage 1. There's an implicit stage 0 that contains the generate functions exposed by the SDK. This stage is only executed if we explicitly specify the module. So dagger generate will not list it, dagger generate python-sdk will not run it, but dagger -m . generate -l will show it and dagger -m . generate will first run this stage 0 (develop) then stage 1 (the client-library)

Idea 2: when we explicitly specify the module, it will list and run only the generate functions from the SDK. dagger -m . generate -l will show the SDK generate (develop) and dagger -m . generate will only execute this function. The client-library is not visible.

I don't know if 1 is a good idea, but 2 feels weird. For instance if there's a new core type and we want to refresh it, it means dagger -m toolchains/python-sdk-dev generate && dagger generate python-sdk where a dagger -m toolchains/python-sdk-dev generate would be enough with 1.
But 2 has the advantage to be maybe more explicit. cd toolchains/python-sdk-dev; dagger -m . generate will do the equivalent of dagger develop

Ho yeah, and there's Idea 0: the sdk generate function is visible/executed at all time. It's automatically added from the SDK, by the engine. So dagger generate performs it in addition to the others.

All that text to say I don't know which solution to pick, and maybe there's some other interesting ones thinkspin

tepid nova
#

@leaden glade you should start from the workspaces PR mentally

#

It deprecates -m for starters (or more precisely, narrows down its scope)

tepid nova
leaden glade
#

git? dang? issue when using worktrees 🙏

tepid nova
#

@still garnet my prompt was basically "do everything vito says" 😛

#

automated compliance

#

@astral zealot next: "do everything vanta says"

astral zealot
tepid nova
tepid nova
#

@civic yacht for the purposes of my little visualization experiment, I have a data modeling question.

Should I consider IDs scoped to a session? Or can they exist across sessions? I know it's been a murky issue. But for the purposes of my data model, I have to pick one lane or the other. wdyt?

#

Is it possible today in the engine, for different sessions to actually use the same object? Like connect to the same de-duped service, or get the same de-duped secret plaintext?

civic yacht
# tepid nova <@949034677610643507> for the purposes of my little visualization experiment, I ...

They exist across sessions. IDs that are isolated to a particular session (or client, etc.) are scoped to that session so they don't cross wires.

  • On main that works by mixing the session ID/client ID/etc. into the digest of the ID.
  • On the egraph PR that's slightly modified to work by considering session ID/clientID to be an "implicit input" that's automatically set. Creates same end effect but much more explicit and debuggable.
tepid nova
#

@civic yacht speaking of egraph. Claude wants to interview you about Theseus to write the changelog post 🙂 I asked to keep it short.

  1. What couldn't you build on top of BuildKit? Concrete examples of features or fixes you had to say "no" to.

  2. A before/after cache scenario. One real example where BuildKit misses but e-graphs hit.

  3. Why did removing BuildKit accidentally fix #8955? What was structurally wrong, and why is it now structurally impossible?

  4. What's the first thing you'll build on the new engine that you couldn't before?

civic yacht
#

@Erik Sipsma speaking of egraph.

tepid nova
#

@civic yacht @still garnet telemetry question... I'm trying to build a model of clients from telemetry.

  • Which spans come from which client
  • Hierarchy of clients (which client is parent of which other parents)
  • Which client is the root client of each session

It looks like that's not trivial to do, because the connect span is not actually the parent. So there is some heuristic involved to determine the hierarchy.

Am I missing an already existing, reliable method for modeling the hierarchy? Is the hierarchy I'm trying to model actually correct? ( Session 1:N Client 1:N Span)

#

<@&946480760016207902> I'm still suffering from "failed to call sdk moduleRuntime"

Repro:

dagger -d --progress=logs functions --mod github.com/dagger/dagger/toolchains/changelog

Is this a known / solved issue?

#

(sorry if I'm beating a dead horse)

still garnet
stuck bloom
#

In case you didn't know the changelog hasn't updated to 0.20.1 🙂

tepid nova
#

I'm working on it right now 🙂

#

(it's a manual editorial process)

#

Also adding more goodies 😛 You'll see

tepid nova
tepid nova
#

@still garnet just go-installed latest dang on my mac:

$ dang
zsh: killed     dang
fallow lagoon
#

The dagger/nix repo is broken with hash issues. After brown bag release ?

#

Does anyone know how to fix this ?

#

If I use dagger/nix/e11d4abe0d21295852d16ad4eef5f7c04d6cc8ca, I can still use Nix to setup dagger 0.20.0, but 0.20.1 is broken.

wild zephyr
rocky plume
civic yacht
rocky plume
leaden glade
#
∅ fetch generator information 44.8s

What means? I sometimes see it, and I don't remember to have seen it until quite recently.
It looks it's all stuck, nothing happen, then it finishes and works.

still garnet
leaden glade
still garnet
#

could be timing - CLI sees its local root span complete, assumes everything else was canceled, and then the engine telemetry arrives and cleans it up

leaden glade
#

Last week, I ran into a lot of issues running engine-dev playground on worktrees.
This https://github.com/dagger/dagger/pull/11990 looks like to fix it, at least to me. Happy to get some 👀 on it as it's very convenient to have worktrees, but I'm not an expert on the git side.

GitHub

Running git config -l -z from a directory with a broken .git pointer (e.g. a git worktree mounted into a container) causes a fatal exit 128. Fix by running from a temp directory so only system/glob...

tidal spire
tepid nova
#

@tidal spire for dagger/intro you should just push directly no?

tidal spire
civic yacht
#

@tidal spire I saw a bunch of new flakes on main, they are inconsistent but saw occurrences across two runs: https://dagger.cloud/dagger/checks/github.com/dagger/dagger@24b5f6f33e5a0570578603689c8c8a27ea424abf?check=test-split%3Atest-base&listen=11e754486c599e74&listen=e4e5604f6bdfe17a&listen=80ebbd5bf990a373&listen=b0b54b6deb0e99f7&listen=0c314be7e4d38c47&listen=eb89e4a2c42aee1e&listen=9cf161d42a6fb73f

  • failed to get schema introspection json during module sdk codegen: failed to select introspection JSON file: session cache is closed

I suspect it's from the PR where you refactored the lazy schema load stuff. I funnily enough hit this same error except extremely consistently in my caching PR, IIRC the fix was to adjust ModDeps.Schema() to always attach the current cache for the caller, so just:

func (d *ModDeps) Schema(ctx context.Context) (*dagql.Server, error) {
    schema, err := d.lazilyLoadSchema(ctx)
    if err != nil {
        return nil, err
    }
    dagqlCache, err := d.root.Cache(ctx)
    if err != nil {
        return nil, fmt.Errorf("failed to get cache: %w", err)
    }
    return schema.WithCache(dagqlCache), nil
}

The problem is essentially that ModDeps itself can be used from cached objects from other sessions, in which case it's actually caching the cache... crazycharliepepesilvia (this is on my list to cleanup in the new world)

tidal spire
#

@Kyle Penfound I saw a bunch of new

leaden glade
#

I added a few types on a branch, but in the logs I have a lot of Missing.

├╴✔ Workspace.moduleList: [WorkspaceModule!]! = xxh3:c825ccd9ffe4cc98 0.0s
│
├╴✔ Missing.name: String! = xxh3:0083078fdbd98d84 0.0s
│ ┃ typescript-sdk
│
├╴✔ Workspace.moduleList: [WorkspaceModule!]! = xxh3:c825ccd9ffe4cc98 0.0s
│
├╴✔ Missing.source: String! = xxh3:2a489f02ffed082b 0.0s
│ ┃ toolchains/typescript-sdk-dev
│
├╴✔ Workspace.moduleList: [WorkspaceModule!]! = xxh3:c825ccd9ffe4cc98 0.0s
│
╰╴✔ Missing.blueprint: Boolean! = xxh3:c033d2f04c6848e2 0.0s
  ┃ false

I guess something is missing (haha) but I don't understand what.
My type is installed in the schema:

dagql.Fields[*core.WorkspaceModule]{}.Install(srv)

Workspace.moduleList returns a [WorkspaceModule!]!
And the WorkspaceModule declares a Type function:

func (*WorkspaceModule) Type() *ast.Type {
    return &ast.Type{
        NamedType: "WorkspaceModule",
        NonNull:   true,
    }
}

Any idea? I guess that's something obvious but I can't find it for now

civic yacht
leaden glade
#

Hum, I'm not sure to understand exactly. The thing is I have a lof of them.
But what I did is to wrap everything inside one Tracer().Start() and even if they still exist, they are not visible by default, that is already better

rocky plume
#

I could use some feedback on a proposed API change to EnvFile.WithVariable related to the handling of quotes and variables. Currently the only work around is to escape quotes when calling it, e.g.

WithVariable("foo", `{\"hacky\": \"example\"}`)

I'm proposing that we drop this quote parsing, and only handle $ as a special case in the parser.

see https://github.com/dagger/dagger/issues/11889#issuecomment-4040766187 for details

GitHub

What is the issue? When I'm setting a json value in a variable for an envfile quotes are stripped. ENV_JSON_ISSUE={foo: bar} ENV_JSON_GOOD={"foo": "bar"} Dagger version dagg...

still garnet
civic yacht
leaden glade
#

excitedjump Based on the current workspace/modules v2/develop -> generate work and Dang, I wanted to see how far I can improve the Java SDK.
And what I can say is I'm really happy about the results excited

I'm using the exact same java module code (the default template) in the same context (cache prune, but go and dang sdk preloaded - to have both at the same level, and it will be the case once dang will be embedded)

Then I'm doing a dagger functions with both (and a dagger call but as the SDK doesn't use moduleTypes everything is already loaded).

Using the current version of the SDK, dagger functions takes 52s.

Using my new light SDK (the runtime is a small Dang file, 50 lines but it will grow a bit for sure) the exact same call to dagger functions takes 25s

🎉

Those numbers includes the time to fill the cache with maven dependencies. So if this cache is already full, we can imagine even better numbers!

In the other advantages, the module itself is fully buildable from the host machine. I can go in my module and just run mvn package or any other maven command and that will work out of the box, as any java project. (something that is not possible currently)

#

A bit part of that is due to the removal of dagger develop and to move the work on dagger generate, meaning all the necessary java files are generated on the host and used by the runtime.
And the runtime become really dumb. To have an idea, this is the moduleRuntime function of me light Java SDK:

  pub moduleRuntime(modSource: ModuleSource!, introspectionJSON: File): Container! {
    javaImage
      .withFile(
        "/opt/module/module.jar",
        mavenImage
          .withMountedCache(
            "/root/.m2",
            cacheVolume("sdk-java-light-maven-m2"),
            sharing: CacheSharingMode.LOCKED,
          )
          .withWorkdir("/src")
          .withDirectory(".", modSource.contextDirectory)
          .withWorkdir("/src/" + modSource.sourceSubpath)
          .withEnvVariable("_DAGGER_JAVA_SDK_MODULE_NAME", modSource.moduleName)
          .withExec(["mvn", "--pl", "src", "--also-make", "package", "-DskipTests", "--threads", "1C", "--no-transfer-progress"])
          .file("/src/modules/" + modSource.moduleName + "/src/target/"+modSource.moduleName+".jar"),
      )
      .withWorkdir("/opt/module")
      .withEntrypoint(["java", "-jar", "/opt/module/module.jar"])
  }

Dumb runtimes ftw

stuck bloom
# leaden glade <a:excitedjump:1481397526107258960> Based on the current workspace/modules v2/de...

That's very impressive! I'm excited! I don't understand exactly where the speed gain is coming from, if my previous attempts were slow because my proxy is slow. Is it because the moduleRuntime is written in dang, there is no intermediate codegen stage? Previously, that intermediate codegen was also based on maven for the Java SDK. So in basic terms, this is cutting down on the number of maven commands?

leaden glade
# stuck bloom That's very impressive! I'm excited! I don't understand exactly where the speed ...

One of the main thing is it removes all codegen at runtime. The runtime only builds. And the codegen/generate is all done on the dev machine, generating all the needed files, including types. That's why it's quicker and allows things like the ability to build locally or run any maven command.
The part that doesn't change still is to pull the dependencies. But I think this part can also be improved. Slow jar pulls will still be slow, we can't do a lot about that, but less jars, better cache, less runtime work will improve.

stuck bloom
#

Does that mean, there's no need for custom settings.xml pulled into the engine? Since that's available on the local machine?

leaden glade
# stuck bloom Does that mean, there's no need for custom `settings.xml` pulled into the engine...

No. At least not right now. That could be something if all the dependencies (or the final jar result) are part of the module. And added to git. And I'm not sure that's what we want.
The build is still part of the dagger call, so the dependency pulling.
All that is very experimental for now, not part of a branch before we have the new modules v2 I think, but something that will follow. And once that's done, it might be easier to understand the bottlenecks with Java, see where we can improve, better cache, etc.

leaden glade
tepid nova
#

Translation: "F your dagger check, it's too slow. Let me run go tests directly"

leaden glade
#

Workspace, generate, local dependencies and espace root

still garnet
#

@obsidian rover I now firsthand understand the value of your Changeset size limit streaming fix 😂 - did that make it into a PR?

obsidian rover
tepid nova
#

@civic yacht @rocky plume I have a question on engine state, on behalf of me, @charred lotus @obsidian rover @wild zephyr @astral zealot :). 🧵

tepid nova
obsidian rover
tepid nova
#

@still garnet re our discussion on dagger in agent devloop...

still garnet
#

what did it see that it considered slow/silent? curious to see a session log if your client supports it

tepid nova
still garnet
#

also, we should bump dang again - I pushed a change for the Zig fetching so it tries all their mirrors, and it's MUCH faster. plus a fix for xs.each { x => self.foo += x }.
but maybe i should finish all these PRs and just pull it into the engine instead

still garnet
#

PSA for Dang users (dangists? dangers?): github.com/vito/dang is now decoupled from dagger.io/dagger, meaning now it just shells out to dagger, instead of being hardcoded to a version.
Now you can map Dagger to a dev engine, to try out new APIs:

dagger llm-workspace*​​ ≡
❯ cat ../dang/dang.toml
[imports.Dagger]
dagger = true
service = ["dagger-dev", "session"]

(requires LSP restart atm)

tepid nova
#

dangistas? 🙂

obsidian rover
#

Hi 👋 if I remember correctly, we can't, in the same release: 1) add an API and 2) use it directly in the CI ? Will this change with the ongoing work around having the generated files locally and how the sdks will actually respect that ? cc @charred lotus

leaden glade
obsidian rover
#

Hey, if anyone has some spare cycles, i'd love another pair of 👀 / review on https://github.com/dagger/dagger/pull/11999. This fixes a regression encountered by some users 🙏. I approved it, but it's mostly my own changes 🤣

civic yacht
#

@still garnet questions about llm/mcp stuff in core/schema/ since idk who else to ask 🧵

still garnet
tidal spire
coral vector
still garnet
#

lol can't say i have, it's a fun little world to mess with

tepid nova
tidal spire
still garnet
tepid nova
tidal spire
still garnet
#

i did some push -fs to the workspace-plumbing branch but nothing merge related thinkspin

#

and i'd expect my name/github user on those

tidal spire
#

yeah 15da31a is you

still garnet
#

oh, unless github's auto-merge-commit-calculation thing does it on behalf of the PR author

tidal spire
#

that's what I'm assuming

#

fc82c54 is like 50 minutes after 15da31a though so I guess it depends when you actually pushed

tepid nova
still garnet
tepid nova
#

@still garnet 👆 AI didn't fully implement the entrypoint spec in workspace - left some dirty stopgaps - and I missed it. Then when cherry-picking into workspace-plumbing, another AI made it worse by layering even more stopgaps.

#

Smartest morons in the universe

tidal spire
still garnet
#

cross check pollution?

still garnet
#

merged tuist 🎉 - let me know if you find any jankiness!

still garnet
#
✘ Alpine.container: Container! 1.3s ERROR
! failed to create package container: failed to get packages: solving "clang" constraint: resolving "clang-22-22.1.1-r1.apk" deps:
  solving "llvm-22=22.1.1-r1" constraint:   llvm-22-22.1.1-r0.apk disqualified because "22.1.1-r0" does not satisfy "llvm-22=22.1.1-r1"

AHHH wolfi dependency hell again?

civic yacht
stuck bloom
#

hey @still garnet . I'm noticing the new TUI being very stuttery (flashy) when I try to move around while a build is running. It gets worse as the verbosity level goes up. It's hard to read. I'm on ghostty (m4 mac) fwiw.

stuck bloom
tepid nova
#

Thanks @stuck bloom , fixed!

obsidian rover
#

Are you guys able to do dagger generate on .20.3 when having an ssh socket around ? It seems to be broken for me, and I don't know (yet) if it's linked to my setup or not 👀

The git fetch --tags seems suspicious and might need auth ? cc @wild zephyr

✘ rust-sdk:apiclient 29.0s ⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⡀⣧⣿⡄ ERROR
┇ go-sdk:generate › .generate › .service(name: "sdk") › .version › 
✘ withExec git fetch --tags 1.1s ERROR
Host key verification failed.                                                                                        
fatal: Could not read from remote repository.                                                                        
                                                                                                                     
Please make sure you have the correct access rights                                                                  
and the repository exists.                                                                                           
! exit code: 128
storm wind
#

Are you guys able to do `dagger

coral vector
#

FYI @tepid nova--"Design doc (Part 2: Workspace API)" in the changelog 404s for me (and presumably other non-maintainers?)

tepid nova
tepid nova
#

@still garnet you mentioned a branch with a batch of LLM improvements? Is there a PR I can link to for the changelog?

still garnet
#

Quick and dirty tests idea:

  1. Add dagger.io/test.name attribute, containing TestFoo/bar/baz
  2. Add dagger test <check-name> [--fail-fast] [subject-names...]
    • What if we could automate --fail-fast? Once we see a failed test span, we just kill the whole function? thinkspin
  3. When you run dagger check or dagger test, the CLI reports failed tests and how to re-run them (human + LLM discoverability)
    (typed after standup and forgot to hit send)
tepid nova
#

cc @civic yacht the saga continues 😛

civic yacht
# tepid nova cc <@949034677610643507> the saga continues 😛

Lol yes… I also recently discovered the magic word “tripwire” as in “when you encounter an unexpected design decision during implementation, that’s a tripwire for stopping and escalating for discussion, not improvising”

That helps a lot too, a lot of it’s dumbest code happens in those moments. And now it’s always talking about how it hit a tripwire in the middle if the hard cutover

tepid nova
#

hard tripover

leaden glade
#

It looks like TestSecretProvider/TestAWS starts to fail (at least on my PR)
We are using localstack/localstack:latest
And I just discover the localstack/localstack repository just got archived yesterday 😲

Starting LocalStack for AWS now requires an auth token. Please explore our pricing options, which include a free plan for non-commercial use that supports equivalent functionality to the previous community image.
https://news.ycombinator.com/item?id=47493657
Tests that are failing are using this version of localstack, built today:

LocalStack version: 2026.3.1.dev7
LocalStack build date: 2026-03-24
LocalStack build git hash: c1984ba40

And this is the error:

Localstack returning with exit code 55. Reason: 
===============================================
The license activation failed for the following reason:

No credentials were found in the environment. Please make sure to either set the LOCALSTACK_AUTH_TOKEN variable to a valid auth token. If you are using the CLI, you can also run `localstack auth set-token`.

LocalStack requires an account to run.

==> Have an account? Learn how to set LOCALSTACK_AUTH_TOKEN: https://app.localstack.cloud/settings/auth-tokens
==> Need an account? Get started: https://www.localstack.cloud/pricing
==> Want more time? Snooze until April 6, 2026 by setting LOCALSTACK_ACKNOWLEDGE_ACCOUNT_REQUIREMENT=1

I looked at some other tests that are passing, and they are using a previous version:

LocalStack version: 4.14.1.dev75
LocalStack build date: 2026-03-18
LocalStack build git hash: 24107750d

Using the localstack/localstack:community-archive@sha256:6b6172cfceb04b4fbc35097a55f717c365a35fafa572be49f7341771cf9023ed image is fixing it. This is the exact same version.
I'll open a PR for that, at least for now so we don't have anymore the CI red on this.

GitHub

💻 A fully functional local AWS cloud stack. Develop and test your cloud & Serverless apps offline - localstack/localstack

ecshafer
stuck bloom
#

We are starting to move away from localstack too (licensing + bloated). There are some drop-in alternatives you may want to try. This is one - https://github.com/sivchari/kumo.

leaden glade
# stuck bloom We are starting to move away from localstack too (licensing + bloated). There ar...

I'll have a look. I've also seen https://github.com/hectorvent/floci and https://github.com/robotocore/robotocore
Especially we are using it only in single test regarding AWS secrets so we don't need a lot

GitHub

Light, fluffy, and always free - AWS Local Emulator - hectorvent/floci

GitHub

Contribute to robotocore/robotocore development by creating an account on GitHub.

stuck bloom
leaden glade
#

I quickly tried with hectorvent/floci and that boots so fast! hyperfastparrot really impressive

leaden glade
tepid nova
#

<@&946480760016207902> I think I found a bug in the Go client library... When I call dagger.Connect from a custom tool, with an explicit engine host, then wrap that tool in dagger run... The outer session injected by dagger run clobbers the explicit engine host argument. I have to explicitly unset the DAGGER_SESSION_PORT env var to unclobber.

wdyt - bug?

fair ermine
leaden glade
# tepid nova Thanks for moving fast!

jankynp
And I think that's a good move over all, in the way we are not using that much localstack. It's not like if we wanted to run dynamodbs, lambdas or other components, just to test a single use case. So a lighter solution seems better.

wild zephyr
tepid nova
#

FYI, someone complained in a github issue that we have too many github issues 😄 But they're right.

I'm going to bite the bullet, and be more aggressive about converting issues to discussions. We have quite a backlog of outdated issues...

I propose that we follow Mitchell's lead in the ghostty repo: issues are only for authoritative work items that we (maintainers) have decided need to be done. It is not for users filing bug reports, feature requests, design debates, etc. All of that should go to discussions

tepid nova
#

Fun fact: you can't convert an issue to a discussion with the API or CLI -> web UI only.

So I'm setting up a playwright + claude workflow to automate it . I'm not clicking through 300 github tabs 🙂

rocky plume
tepid nova
#

Down from 800+...

tepid nova
tepid nova
#

I moved the notification spam to #github-private-feed , at least for now

(90% of the triage is converting to discussions in different categories)

tepid nova
tepid nova
tepid nova
tepid nova
#

@civic yacht (not urgent) can one dagger client session span multiple TCP (or unix) connections? Or is it always a strict 1-1 mapping?

civic yacht
tepid nova
civic yacht
tepid nova
tepid nova
#

<@&946480760016207902> question on issue rules.

I'm doing a pass on issues that were converted to discussion when perhaps they shouldn't have. The rule is issues should be actionable. For bugs, that means they should be acknowledged and reproducible.

  • In some cases it's clear cut -> successful repro. promote to issue (or in the future: keep it an issue)

  • But in other cases it's a gray area. For example: https://github.com/dagger/dagger/discussions/12816 . It seems possible to repro, but it's difficult to repro (race condition) and I personally have not been able to. In that case, should we create an issue right away, or should we keep it as a discussion in Help (basically a support thread) until we have successful repro, at which point it becomes actionable and can be escalated to an issue -> ie. a task for a maintainer to complete? wdyt?

This edge case will help us define the cutoff line clearly. It's not about how "important" or "real" it is. It's more about how we organize our work IMO. Support vs. dev.

GitHub

What is the issue? A TypeScript module function returning Promise<void> that runs multiple parallel checks via Promise.all — including one that uses .withServiceBinding() to bind an .asServic...

civic yacht
tepid nova
#

Ha ha LOL 🙂 Thanks

#

Still interested in the hypothetical - at the moment when it was open, what flow should we have followed?

#

@civic yacht does it feel like you had to do the work in 2 distinct phases? First the support work to get a reliable repro, then the dev work to fix it?

civic yacht
#

But yeah I suppose there was a phase of investigation and then a phase of deciding it was a bug and fixing it

tepid nova
#

In this particular case, was the original issue (filed by a user) a perfect match for that PR? Or would it have been cleaner to have an issue for eg. the root cause, and it incidentally closes that user-filed issue?

civic yacht
#

If it was a more complicated siutation that required long debugging, finding a consistent repro, etc. then the answer might change. But that one was simple and striaghtforward enough

tepid nova
#

OK! Thanks

tepid nova
#

Workspace & artifacts 🧵

tepid nova
tawny iris
# tepid nova <@&946480760016207902> question on issue rules. I'm doing a pass on issues that...

What about "Feature Requests"?

I made an issue for each feature the PHP SDK was missing (relative to the official SDKs), that I was aware of.

  • They were not bugs
  • They were actionable.

If we're trying to keep the Issues section "clean" then perhaps they should be kept as "Discussions" until certain criteria are met such as:

  • A minimal repro of what the feature should achieve
  • A consensus from 1+ Maintainers that this feature should be implemented
  • If not directly actionable, the discussion should be used as a basis for breaking out small directly actionable issues.

PS: I don't have a personal preference on the matter. I think most repos just use Issues as a catch-all with Discussions being woefully underutilised. So I'm not actually sure what good practice should look like in this regard.

tepid nova
# tawny iris What about "Feature Requests"? I made an issue for each feature the PHP SDK wa...

Yes agreed!

Basically I like this: https://x.com/mitchellh/status/1852039089547309552

I'm doing something new (for me) with Ghostty: the issue tracker is only for actionable tasks. Features in the issue tracker are accepted and well-scoped. Bugs are reproducible. PRs must have an associated issue (no drive-by PRs). The issue tracker is not used for discussion.

wild zephyr
#

I'm liking the idea of brining the --fail-fast feature to cloud and to make it configurable for checks. I'm thinking of adding a new section under the check settings modal for specific checks. Maybe also add something else in the org settings to make it org wide? cc @tepid nova @tidal spire

tepid nova
#

(same for secrets references btw)

wild zephyr
wild zephyr
tepid nova
#

Coming soon 🙂

#

Should we switch fail-fast to be the default maybe?

wild zephyr
# tepid nova Should we switch fail-fast to be the default maybe?

I think it's a case by case decision. It's a trade-off between overspend vs understanding everything that failed so you can maybe run the failing checks locally before pushing the fix 🤔

for dagger/dagger I personally like seeing all the specific tests that fail within a single check. On top of that, usually fail-fast is not the default in most testing frameworks

tepid nova
#

It just occured to me that bootstrap-ci should perhaps run against a known stable commit, rather than its own commit... The fact that we're not, is probably the reason we get weird edge cases when we make changes that affect our own CI environment

#

@still garnet I'm starting think "agent-to-agent" might be a viable interface for coding agents to interact with dagger

#

with workspace UX & API, all the new high-level concepts... We could use our own LLM APIs, combined with a cheap and fast LLM (would need an API for specifically requesting one of those) - to expose our first LLM-powered core API. Workspace.prompt or something like that. Then let the external agent prompt "I just developed a new go test TestFoo, run only this one please. If it fails, give me the logs and nothing else. Also tell me how long it took" or whatever

#

I would definitely use that myself... But so would smarter coding agents IMO

#

The key is that the "clerk agent" doesn't need to be super smart or expensive. It can use the kind of inference that is so cheap, it's basically as plentiful as regular compute (and therefore we can bake it into the core)

#

dagger prompt 'run all linters or formatting related checks'

#

The key IMO is to narrow down the scope. It's not a custom coding agent. It's half-way between a dumb deterministic function and a full-blown agent

tepid nova
#

Bug remediation update

  • 15 issues re-opened
  • 3 closed as already fixed
  • 12 new PRs ready for review 🙏
  • 2 existing PRs that also need review 🙏

10 new PRs 🙏

2 existing PRs 🙏

rocky plume
#
✘ http(url: "https://ziglang.org/builds/zig-x86_64-linux-0.16.0-dev.2670+56253d9e3.tar.xz", refID: "s2wl7pv6lwmqnb9153ok3l18q"): File! 0.5s ERROR
! invalid response status 404 Not Found

something just changed on their mirror 😢

still garnet
tepid nova
fresh harbor
#

Hi, the elixir-sdk toolchain doesn't run in the CI?

tepid nova
leaden glade
# fresh harbor Hi, the `elixir-sdk` toolchain doesn't run in the CI?

Yes, no check was configured on the toolchain.
I added them here: https://github.com/dagger/dagger/pull/12886
But, at least on my machine when I tried, the sdkTest check didn't passed. But feel free to push to this PR if you know how to fix it.
Otherwise we can also remove this check first and push the others, then open a follow up just for this check.

GitHub

Flag sdkTest, codegenTest, lint, and releaseDryRun with @check so they are automatically run in CI. The aggregator function (test) is intentionally left without @check.

fresh harbor
tepid nova
# fresh harbor Thanks. Looks like an error occurred during connecting to the engine. ``` Err...

That usually happens when dagger CLI tries to auto-provision the engine from the engine image (image://registry.dagger.io:...) but there is no available container runtime to run the image.

In the context of tests, my guess would be that dagger is being executed inside a container by a dagger pipeline (dagger in dagger) and the Container.withExec(experimentalPriviliegedNesting: true) argument is not set

fresh harbor
leaden glade
leaden glade
# rocky plume ``` ✘ http(url: "https://ziglang.org/builds/zig-x86_64-linux-0.16.0-dev.2670+562...

Some Toolchain related tests are impacted by this issue (because they are using modules impacted by the Dang/Zig problem)
I've fix it here: https://github.com/dagger/dagger/pull/12888

GitHub

Zig mirror changed, and one of the consequence is some of the modules using Dang as the SDK might not work anymore.
In toolchain tests, we are using two different commits on a module using Dang SDK...

leaden glade
#

I have a really weird issue I'm not sure to understand. If anyone has some clues.
Context: I'm working on a git worktree, located at /home/yves/dev/src/github.com/dagger/dagger-worktrees/dagger-up. I also have an other worktree on which I'm working on a different pane at /home/yves/dev/src/github.com/dagger/dagger-worktrees/develop-generate.
In the context of dagger-up I'm running dagger generate and I have this issue:

✘ typescript-sdk:client-library 2.2s ⣿⣿⣿⣿⣿⣿⣷⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⡀⡄⡀ ERROR
┇ python-sdk:client-library › DaggerDev.pythonSdk(
  ┆ workspace: context /home/yves/dev/src/github.com/dagger/dagger-worktrees/dagger-up (
  ┆ ┆ exclude: ["*", "!sdk/python/*.toml", "!sdk/python/*.lock", "!sdk/python/*/*.toml", "!sdk/python/*/*.lock", "!sdk/python/.python-version", "!sdk/python/dev/src/**/*.py", "!sdk/python/docs/**/*.py", "!sdk/python/docs/**/*.rst", "!sdk/python/runtime/images", "!sdk/python/src/**/*.py", "!sdk/python/src/**/py.typed", "!sdk/python/tests/**/*.py", "!sdk/python/codegen/**/*.py", "!sdk/python/README.md", "!sdk/python/LICENSE"]
  ┆ )
  ) › .withServiceBinding(
  ┆ alias: "dagger-engine"
  ┆ service: no(digest: "xxh3:2d6060c5d283feaf")
  ) › Container.withFile(
  ┆ path: "/opt/cni/bin/dnsname"
  ┆ source: no(digest: "xxh3:97cb27c188b2d1d6")
  ) › Directory.withDirectory(
  ┆ path: "./bin/"
  ┆ source: no(digest: "xxh3:3156c0685a97264e")
  ) › Container.withMountedDirectory(
  ┆ path: ""
  ┆ source: context /home/yves/dev/src/github.com/dagger/dagger-worktrees/develop-generate (
  ┆ ┆ exclude: ["*", "!.git", "!**/go.*", "!version", "!core", "!engine", "!util", "!network", "!dagql", "!analytics", "!auth", "!cmd", "!internal", "!sdk", "sdk/**/examples", "!cmd", "!modules/wolfi", "!modules/alpine"]
  ┆ )
  ) ›
✘ context /home/yves/dev/src/github.com/dagger/dagger-worktrees/develop-generate (
  ┆ exclude: ["*", "!.git", "!**/go.*", "!version", "!core", "!engine", "!util", "!network", "!dagql", "!analytics", "!auth", "!cmd", "!internal", "!sdk", "sdk/**/examples", "!cmd", "!modules/wolfi", "!modules/alpine"]
  ) 0.0s ERROR
! module not found: /home/yves/dev/src/github.com/dagger/dagger-worktrees/develop-generate

The workspace seems ok (workspace: context /home/yves/dev/src/github.com/dagger/dagger-worktrees/dagger-up) but then it tries to mount a directory from somewhere else (source: context /home/yves/dev/src/github.com/dagger/dagger-worktrees/develop-generate)
And of course it doesn't find it, as it's outside of the workspace.

leaden glade
#

I have a really weird issue I'm not sure

still garnet
leaden glade
#

To share some progress on replacing dagger develop with dagger generate (and the ability to safely commit all the generated files)
After 2 different attempts based on the workspace branch, I finally have something working based on main. That works nicely, keep compatibility with dagger develop for a smooth experience. I still had to backport the workspace.path feature, but that's fine.
Except in one case: when a module already has toolchains with generate functions, or if the module declares generate functions, the dagger generate tries to run all generate functions. That's by design. But it broke as the "develop" generate function must run first.
And of course... this is already solved in the workspace branch 😅 as this is exactly the goal of workspaces to clearly separate between the development of a module and the usage of a module.
All that to say I'm looking into two options:

  1. open a PR with a smaller scoped branch that allows dagger generate to replace dagger develop but opt-in exclusively, without all the runtime optimisations (no codegen at runtime) and that only works on modules without already generate functions.
  2. rework that stuff to be on top of workspace again, or maybe on top of workspace-plumbing? If there's enough in this PR that could be better so the gap is smaller and it allows to move step by step.
    I was thinking about 1., but if I can make 2. I think that will be best. I'll see.
    (no specific question, just a 🧠 dump)
fresh harbor
#

I submitted a another fix to the elixir-sdk-dev module to make the dagger generate works https://github.com/dagger/dagger/pull/12890.

I also found an issue with the generate UI that if the changes is huge, the confirm buttons will be disappear from the screen and cannot scroll to the buttons but it can still choose and enter.

GitHub

GitHub is where people build software. More than 150 million people use GitHub to discover, fork, and contribute to over 420 million projects.

still garnet
#

@tidal spire actually better yet, looks like you could bump it to the native dang sdk since there's nothing fancy like checks or anything

tidal spire
#

how do I use native dang? just "sdk": "dang"?

still garnet
#

yup

tidal spire
#

pushed 9e6dad0e1e3a30afa82dd7e5663b5aa421cf25e7

#

We should also move kpenfound/dag/node into dagger/node since we have at least 3 toolchains depending on it. I only initially added it to my own monorepo to get it out faster

#

@tepid nova @wild zephyr can I get a dagger/node repo and I'll move kpenfound/dag/node there and update the modules that depend on it

wild zephyr
#

wrapping up a call

#

done

tepid nova
#

@leaden glade why do you need generate to *replace* developat all? Can you makedevelop` still work the same, but just not necessary, and we can just stop using it, and quietly deprecate it later?

rocky plume
#

ugh, I'm running into a sometimes deadlock on the llb2dagger PR when running go test -count=1 -v -run 'TestDockerfile/Test[CU]' ./core/integration/. it seems to occur most often when TestCrossSessionDockerbuildSockets is one of the tests that's being run, but still not sure.

civic yacht
# rocky plume ugh, I'm running into a *sometimes* deadlock on the llb2dagger PR when running `...

When it happens you can send SIGQUIT to the engine to get a goroutine dump (gotta docker logs -f ... in a different terminal so it's all captured). But TBH my suggestion would be to just ignore it for now and get everything else mergeable.

Reason being that llb2dagger is still based on main and thus the buildkit solver and thus it's full of traps that lead to deadlock. That's literally why my PR became "the rest of theseus", I tried a smaller bite but I just hit deadlocks in the buildkit solver 😄

Once you think llb2dagger is ready other than the deadlock I'll pull it into https://github.com/dagger/dagger/pull/11856. Everything has changed so much there that I highly doubt whatever is causing the deadlock is even possible anymore.

Many/most of the problems we're having on main are completely obliterated even as a conceptual possibility, besides just being "fixed".

tepid nova
#

@civic yacht I'm working on your review for lockfile.

Quick question, you mentioned making lockfile operations part of the public API, so that they're cached. Does that mean the engine would make a nested dagql query each time it needs to lookup an entry? You're not worried about the overhead?

civic yacht
tepid nova
#

(mapping the read path to dagql is easy enough, it's more the write path that I'm worried about)

civic yacht
tepid nova
#

does that apply to writes too though?

civic yacht
#

I didn't look at the export part of the implementation yet, is it doing a write after each operation? Or just when the session ends?

tepid nova
#

My issue is that I have N clients concurrently reading and writing to the same lockfile (modules inherit their caller's workspace & lockfile), and doing so continuously during the session

tepid nova
#

It kind of feels like trying to fit filesync in dagql though

#

I could just be completely misunderstanding the real shape of the problem

#

Will do more homework and report back

civic yacht
#

My issue is that I have N clients

leaden glade
# tepid nova <@809456513298464798> why do you need `generate to *replace* `develop` at all? C...

sorry if I wasn't clear, but yes what I'm doing now is to have the possibility to use dagger generate to generate the files and just deprecate at some point dagger develop. I'm not changing develop to use generate, still working (almost) the same way. Almost because I added at some point a flag in dagger.json when running a dagger develop as a marker of legacy, so I can use runtime optimisation if the flag is not there: if you're using generate, runtime will not try to codegen anymore. But this optimisation doesn't work with develop and the non committed files.

coral vector
#

question--don't have to reveal this if you don't want to--does Dagger cloud use kubernetes-hosted engines?

coral vector
#

cool. are you running the engine as a container still, or straight on the instances?

tepid nova
coral vector
#

is the only thing that you need to do per-customer is keep their /var/lib/daggers separate and re-use them between their jobs?

#

(not trying to trivialize the difficulty of that task 😆)

tepid nova
#

So we're working on making everything much more granular: scheduling, cache reuse, and machine allocation

coral vector
#

so the cache wouldn't be per-customer, but per-function?

tepid nova
#

We can do this way better than anyone else, since we actually control the software execution layer, and the infra knows what it's running. IE. we can take the telemetry stream, and plug it back into the infra to fine-tune it for each customer and workload

tepid nova
# coral vector so the cache wouldn't be per-customer, but per-function?

It's not just about the cache, but also the compute. Which function to run on which machine, with which cache. Even the decision to scale-out a function or not - will it actually be faster to run it somewhere? And if so, where?

The answer changes depending on what other cache is warm; what CPU, memory and IO is immediately available; how memory-intensive vs cpu-intensive that particular function is; etc

#

Meanwhile we're pushing the APIs to make it possible to break down the granularity even further. For example Collections so that you can model each individual test in your test suite as its own dagger object & check function. Now all of a sudden we can start scheduling your test suite at the test granularity (still using live telemetry to fine-tune)

coral vector
#

cooooool, so you're monitoring the resource usage of certain functions from the customer and using that info to decide what compute to schedule it on?

tepid nova
tepid nova
#

The more you run on our infra, the smarter the fine-tuning - the faster and cheaper your runs

coral vector
#

that's a good use-case

tepid nova
#

To be clear we're in the very very early days of this. The current implementation is not as sophisticated as it sounds. BUT, we are rolling out v2 this week, it's already getting better

coral vector
#

awesome, thanks for sharing

tepid nova
#

@civic yacht I pushed an approximation for lockfile, can you tell me if it's directionally correct? 🙏 If so, I'll work on polishing it. Don't need a detailed review yet, just a general "getting warmer" or "getting colder"

civic yacht
civic yacht
# tepid nova <@949034677610643507> I pushed an approximation for `lockfile`, can you tell me ...

Slightly tangential but in my journey of getting better at wrangling agents, when it comes to large scale changes, I've recently had great success in telling the agent to actually include code snippets in the planning document. i.e. in that PR you have hack/designs/lockfile.md but it's all just high-level text.

I used to only be high-level like that too but then when you move to actual implementation the agent starts improvising and doing weird unexpected things (either because there was an actual point missed during design or sometimes just because it feels like it).

Now in my planning markdown files I have a ## Design section that is higher level and a ## Implementation Plan section that is very concrete and has actual code snippets. I tell it something like:

In the implementation plan section, create a subheader for each and every file that will be impacted by our changes. There should be one and only one subheader for each file. Within those subheaders for each file, create further subheaders for each significant modification (whether addition, deletion or change) that will be made in the file. Include code snippets for any type signatures (e.g. structs, struct fields, interfaces, function/method signatures, etc.) so that we can be sure types are consistent and well defined throughout the document. Additionally, for any implementation code that's significant, include snippets. We don't need every single if err != nil but we do need to nail down the shape of significant code and ensure it's consistent with the rest of the design.

This has made a huge difference. Writing out the implementation plan takes longer, but it saves so much time later. The agent itself is WAY better at noticing inconsistencies, missing design aspects, etc. when it does this. And I also can do a much more thorough review of the plan ahead of time. It's way easier to review a verbose document like this than it is the actual full final code, at least for large scale changes.

#

Just mentioning because I suspect some of the weird stuff I noticed in the PR is the type of thing I've had much more success catching during the design phase since I switched to this new approach

tepid nova
#

Yeah makes sense. I've gone back and forth, my issue with the "bundle both" approach is that the doc gets super verbose, and sometimes the agent goes too far in the weeds on implementation, and I have to waste tokens getting it back on track on the design part.

But, once the design is cleanly split up into well-scoped parts (like Lockfile) you're right that it's not as much an issue. So I'll try doing that again

#

For context this is my design stack right now 😅

                                           Stdlib stage 1
                                                │
  Workspace API (done) ─────────────────────────┤
          │                                     │
          ├──────────────────┐                  ▼
          ▼                  ▼             Stdlib stage 2
  Workspace plumbing    Lockfile                │
       (done)                │                  │
          │                  ▼                  │
      Artifacts    Workspace configuration      │
          │                                     │
          ▼                                     │
   Execution Plans                              │
          │                                     │
          ▼                                     │
    Collections ────────────────────────────────┤
          │                                     │
          ▼                                     ▼
      Provenance                           Stdlib stage 3
still garnet
#

Native interfaces + IDs 🧵

tepid nova
#

FYI @civic yacht @still garnet I roped @rocky plume into carrying lockfile 🙏

leaden glade
# leaden glade I have a really weird issue I'm not sure to understand. If anyone has some clues...

I'm hitting this issue again, and it's really a pain because it means I can't have two playgrounds at the same time, making difficult to work with agents on multiple parallel tasks/worktrees.
So I asked claude to investigate and here is the result.
Does that ring a bell to someone? Is that worth spending more time on it? Should I pick one of the proposals?
(yes a lot of questions but that's because I'm not really familiar with those aspects, cache keys, etc)

● Root Cause Found

The bug is a cross-session content-digest cache collision in dagql.

What happens:

  1. Session S1 (from dagger-up) loads moduleSource("...dagger-up/toolchains/engine-dev").asModule() — the result Module carries ContextDirectoryPath = ".../dagger-up" and gets stored in the global completedCallsByContent[contentDigest] cache
  2. Session S2 (from develop-generate) loads moduleSource("...develop-generate/toolchains/engine-dev").asModule() — the storageKey differs (different client), but the content digest is identical (same source code in both worktrees)
  3. dagql finds S1's result in completedCallsByContent and returns it to S2 — without running asModule again
  4. S2 now holds S1's Module object with ContextDirectoryPath = ".../dagger-up" — wrong path
  5. When resolving +defaultPath="/", it calls host.directory(path=".../dagger-up") — fails with "module not found"

Key files:

  • dagql/cache.go:965-1000 — content-digest lookup, shared across all sessions
  • engine/server/server.go:609baseDagqlCache is global
  • core/schema/modulesource.go:226asModule uses default caching (no per-session scope)
  • core/modulesource.go:483-492CalcDigest() is content-only, path-independent

The content digest is correct for caching the type definitions (same code = same types), but the Module also carries path-dependent state (ContextDirectoryPath) that is session-specific.

Given this is a focused bug, here's my question: the fix needs to prevent the content-digest cache from returning a Module whose ContextDirectoryPath belongs to a different session. I see three approaches:

A. Include ContextDirectoryPath in the content digest key — so different worktrees produce different digests. Simplest, but breaks the "same content = same cache" optimization for legitimate cases (e.g., two deps pointing at the same code from different paths).

B. Scope asModule with CachePerSession — prevents cross-session hits entirely. Safe, but may lose some legitimate cross-session caching.

C. Post-validate content-digest cache hits — after getting a hit, check if the ContextDirectoryPath matches the current source. If not, bypass the cached result and re-execute. Most surgical, preserves optimization for same-session cases.

I'd lean toward C as it's the most precise fix. What's your preference?

leaden glade
#

I'd love to have some reviews of dagger up if anyone has some cycles https://github.com/dagger/dagger/pull/11959
I refreshed it after the workspace plumbing merge, PR is green, tests are passing, everything seems good on this side 🙂

GitHub

Fixes #12829
Starts and expose services using dagger up.
Functions returning a dagger.Service can be annotated with +up pragma (or equivalent annotation, depending on the SDK). That way dagger up w...

still garnet
#

Better Cloud Tests 🧵

leaden glade
#

@civic yacht Do you have a branch with the changes you wanted to do regarding moduleTypes?
While working on dagger generate to codegen modules, I hit some issues with moduleTypes (and self calls in some way). And before to invest too much in this issue, I'd like to have a look at the changes you wanted to make, to not go in a wrong direction and do something that would be incompatible.

tepid nova
#

I'm trying something new:

  • Write design proposal with codex
  • Have codex run the claude CLI to run an adverserial review on writing style 🙂
tepid nova
#

OK evidently codex is not well-trained on invoking claude code 😂 lots of trial and error

leaden glade
tepid nova
#

Also codex is a shit writer

#

(but a great coder)

#

@leaden glade I took a look at your dagger up PR, exciting 🙂 I had a general UX question, and codex found a small potential hang

tepid nova
dawn mauve
tepid nova
#

That's Workspace configuration. It's coming up next.

#

It's at the polish stage

leaden glade
#

Collections and dagger up

leaden glade
#

moduleTypes, self calls, codegen, dagger generate and commit generated files

charred lotus
#

n00b question: what's the official way to update the golden tests? for instance the ones in dagql/idtui ? When i run go test ./dagql/idtui -update on main I either have a diff because its using my main docker driver, if I specify export _EXPERIMENTAL_DAGGER_RUNNER_HOST=dagger-cloud://default-engine-config.dagger.cloud then I get please run 'dagger login <org>' first or configure a DAGGER_CLOUD_TOKEN even though i'm logged in, and if i do dagger run go test ./dagql/idtui -update then i get initialize nested client: do init: Post "http://dagger/init": http2: failed reading the frame payload: http2: frame too large, note that the frame header looked like an HTTP/1.1 header

Anybody has seen anything like this? What am I doing wrong ?

tidal spire
tepid nova
#

I wonder how we could make that more discoverable... maybe attach it to generate?

tidal spire
#

Yeah generate makes sense as long as it produces the same result every time (i assume it would?)

#

though I just ran it on main and it gave me a changeset so 🤷

tepid nova
#

but, maybe combined with a declarative config?

#

same pattern I was picturing for all the bump functions...

#

we could tie it to a semver tag 🙂

or, cache it with a long ttl? but only useful once we have better cache distribution

#

first question is: when should we update the golden test?

#

invalidated by certain files?

#

if so, could be a go generate on those files?

tepid nova
#

dagger up approved @leaden glade , let's ship it 🙂

tidal spire
#

did we want dagger check generated to be a builtin thing or can I split out generated into a reusable module?

tepid nova
tidal spire
tepid nova
#

I think that's a very weird and confusing name for a public module in our stdlib though

tidal spire
#

True. I kind of like the builtin option tbh

tepid nova
#

As a easy first step we can add dagger generate --check, it doesn't solve the issue of integrating seamlessly into dagger check, but at least the option is there and it's non-surprising I think

tidal spire
#

would that bridge to a value set in .dagger/config.toml that enables something like dagger check generated?

tepid nova
#

Looking at my design docs... I think yeah actually it wil fit nicely to make it a built-in behavior of dagger check

#

We can change the check walking logic, so that every +generate function qualifies as a check. Then an opt-out flag like dagger check --no-generate if you really don't want that

tidal spire
#

That would be handy for the playwright module I'm working on

tepid nova
tidal spire
#

Haha yeah, still thinking through that. Maybe all as a single ServiceGroup (which doesn't exist yet)

#

ServiceGroup is the idea we've talked about to replace the kpenfound/dagger-modules/proxy module. A bunch of Services exposed at different ports on a single hostname

tepid nova
#

@tidal spire would you also want these services to be able to discover each other via hostname? In that case it's not exactly like a proxy, and more like a docker network

tidal spire
#

With up, we tunnel everything to localhost and there is no discovery, right?

tepid nova
tepid nova
#

Thanks for the reviews @obsidian rover 🙏

civic yacht
still garnet
#

Do I remember right that we were considering splitting out our alpine/wolfi module(s) into a separate repo? I only remember an offhand comment from a call, maybe from @tidal spire?

tidal spire
tepid nova
#

Yeah there is a loosely defined plan for a "stdlib" which would be made of individual modules, maintained by core team, each with their own repo under github.com/dagger

#

We started doing it ad-hoc for brand new modules

tidal spire
#

Yeah, any module currently in modules/ that makes sense to use outside of the dagger repo should be put in its own repo

#

and converted to dang where possible 😛

tepid nova
#

@still garnet btw you still have a PR open on bundling dang right? Or is that merged?

tepid nova
#

Once that's in, we should consider moving the SDK code into the repo. It's akward doing repo-wide changes that can touch every official SDK.. except the most important one..

still garnet
#

github.com/vito/dang/dagger-sdk still exists, but is orthogonal to the native SDK, which is what that PR touches. it'll be retired eventually

tepid nova
#

Oh! Nice.

obsidian rover
#

@leaden glade the TestUpPartialStartupFailure test takes at least 15 min to complete and slows the test-split:test-base like crazy. Could we find a way to improve it today / scope it ?

charred lotus
still garnet
#

yep!

#

i'll merge

obsidian rover
#

Quick workspace caching question (repros on main):

It seems that the workspace API introduced a regression ?

moduleSource.asModule caches the toolchain module solely by source digest/scope, so two loads of the same blueprint with different legacyArgCustomizationsJSON reuse the same cached instance.

In TestToolchain/TestToolchainsWithConfiguration, the first subtest (function:["*"] -> "hola") warms the cache, and the later subtest (function:["configurableMessage"] -> "bonjour") reuses that cached module, so the new override never applies.

While reviewing https://github.com/dagger/dagger/pull/11906 I added (unpushed yet) a small cacheKeySalt on core.Module: ContentDigestCacheKey() hashes the salt, and moduleSource.asModule hashes the legacy args and calls SetCacheKeySalt.

That way each distinct customization set gets its own cached module and the cache key matches all immutable inputs. Would that approach align with the expected cache semantic ?

civic yacht
civic yacht
# obsidian rover __Quick workspace caching question (repros on main):__ It seems that the work...

Even though that commit fixed the problem a totally different way, I don't doubt that the underlying issue you mentioned is separate and legit. This is something where I'd highly prefer just basing on top of theseus rather than merging onto main directly. Unless of course we need this fix in critically in the release on wednesday. Either way, happy to help you base a repro and fix on top of the theseus branch if that's the way you wanna go @obsidian rover

obsidian rover
civic yacht
#

@still garnet (sorry about ping forget timezones) in your opinion is something wrong if this diff is appearing in telemetry output:

-├╴$ Container.from(address: "alpine"): Container! X.Xs CACHED
+├╴✔ container: Container! X.Xs
+├╴$ .from(address: "alpine"): Container! X.Xs CACHED

(ref trace)

I haven't pinpointed why it's happening yet, but wondering if it's worth investing time in it vs. just accepting the new output format

still garnet
#

that seems fine to me as long as it's stable

civic yacht
still garnet
#

the logic there is just that previously the UI didn't see the container span show up, not sure why but it could be some session-local cache hit

leaden glade
leaden glade
#

oops :lurk:

leaden glade
#

A lot of failures with error committing n950fganzl3hyz1jtmfr00ejf: database not open Does that ring a bell to someone?

tawny iris
tawny iris
#

PHP: Support Getters by charjr · Pull Re...

leaden glade
still garnet
#

oh, while we're in the area, we should add support for cache control directives. i'll pick that up real quick

tepid nova
#

@rocky plume are you able to rebase lockfile on egraph today? Since egraph is definitely getting merged first, we might as well get the rebase done asap

#

One step into the promised land 🙂

rocky plume
#

yeah! that sounds like a great idea.

tepid nova
#

Do you think you can do it today? OK if not, I might give it a try in that case

civic yacht
rocky plume
#

yeah i'm giving it a try right now. the egraph branch has 423 commits in it, I wonder if I should try squashing either the egraph branch or the lockfile branch then try either a rebase or cherry-pick?

#

I'm worried I'm going to get stuck doing a lot of conflict changes if I have to resolve them over all the various commits

tepid nova
#

Probably worth squashing lockfile for this

#

We can keep a backup somewhere

rocky plume
#

yeah I'll try that with a cherry-pick. and yes I'll definitely have a backup

#

1fb5345bb46d51783f1ea990b6621514a6023bec is the current lockfile commit.

#

discord is the perfect backup medium..... 😈

#

(i'll create a branch in git too, don't worry)

charred lotus
still garnet
obsidian rover
charred lotus
#

@still garnet do you know anything about go.opentelemetry.io/otel/semconv/v1.39.0 and why it's that version ?

On a Go bump PR (from v1.41.0 to v1.42.0) I have the following error I'm not sure i understand:

failed to set up OTel resource error="error detecting resource: conflicting Schema URL: https://opentelemetry.io/schemas/1.39.0 and https://opentelemetry.io/schemas/1.40.0"
still garnet
#

it's on The List of OTel Warts

charred lotus
still garnet
#

if you bumped otel to v1.42.0 it must be v1.40.0 if it's complaining. you have to check the release notes for the otel version

charred lotus
tepid nova
charred lotus
civic yacht
charred lotus
still garnet
rocky plume
# civic yacht Whoever it is, lemme know how I can help. Almost everything is at least a little...

I'm starting to get mad Sisyphus vibes on this, trying to make sense of the large conflicts. Some of the conflicts are easy enough to solve like simply adding a .Self() in as needed, but other parts are related to functions that have been deleted and I don't have enough knowledge of the egraph changes in order to quickly resolve them. I was hoping to at least get to a point where I could compile the code to see what breaks but I haven't even gotten that far yet.

Maybe I should try cherry-picking a single commit out of the lockfile branch rather than trying to cherry-pick the entire squashed branch?

charred lotus
#

I'm seeing lots of failed to initialize module: failed to get type defs json during module sdk codegen: exit code: 1 flakes. Known issue? Somebody working on it?

civic yacht
charred lotus
still garnet
#

no objection

charred lotus
#

@tepid nova Any objections if i remove backwards compat from the dagger client with the dagger engine v0.3.7- showing an error message asking to upgrade ? It's to avoid a panic in my "faster connect" PR in that unlikely scenario.

obsidian rover
civic yacht
leaden glade
leaden glade
#

Based on some previous discussions I've seen, I implemented "generate-as-check" 🙂
So with those changes, all +generate function is automatically also a check.
That way, dagger check will automatically ensure all the generated code is up to date.

$ dagger check -l

Name                                         Type   Description
changelog:generate                           ↻      Generate the changelog with 'changie merge'. Only run this manually, at release time.
ci:bootstrap                                 ✓      Build dagger from source, and check that it can bootstrap its own CI
cli:release-dry-run                          ✓      Verify that the CLI builds without actually publishing anything
docs:lint-markdown                           ✓      Lint documentation files
docs:references                              ↻      Regenerate the API schema and CLI reference docs
elixir-sdk:codegen-test                      ✓      Run dagger_codegen tests
elixir-sdk:lint                              ✓      Lint the SDK
elixir-sdk:release-dry-run                   ✓      Test the publishing process
elixir-sdk:sdk-test                          ✓      Run the SDK tests
engine-dev:release-dry-run                   ✓
engine-dev:generate                          ↻      Generate any engine-related files
go:check-tidy                                ✓      Check if 'go mod tidy' is up-to-date
go:lint                                      ✓      Lint the project
go-sdk:generate                              ↻      Regenerate the Go SDK API
...

This also helps us (dagger/dagger) move one step forward: there's not anymore a .dagger module. I removed the source: go in dagger.json, and the main module is only a list of toolchains.
Not yet a workspace, but it's going in that direction 🙂
https://github.com/dagger/dagger/pull/12923

GitHub

Currently we have one single function in .dagger main module that runs all the generate functions and ensure the result is empty.
Those changes handle that in the engine: all generate functions are...

leaden glade
# leaden glade Based on some previous discussions I've seen, I implemented "generate-as-check" ...

So it looks like to work locally, but the CI looks like to not run the "generate-as-check" ones. Maybe something to adapt on Cloud side?
My guess is it will be available once released, cloud will grab the new engine.
Question behind is: should I bring back the .dagger module until it's available on Cloud side? Then Cloud should see both the new generate-as-check functions and the current check generated and at that time we can remove it

tepid nova
still garnet
leaden glade
leaden glade
still garnet
#

splitting the list (or just grouping them within the table) would help yeah 👍

leaden glade
#

I'll try something in that space

storm wind
#

I think it's useful to be able to mark a generator as +no-check in case generated files are not source-controlled.

leaden glade
# still garnet splitting the list (or just grouping them within the table) would help yeah 👍
Name                                         Description
ci:bootstrap                                 Build dagger from source, and check that it can bootstrap its own CI
cli:release-dry-run                          Verify that the CLI builds without actually publishing anything
docs:lint-markdown                           Lint documentation files
elixir-sdk:codegen-test                      Run dagger_codegen tests
elixir-sdk:lint                              Lint the SDK
elixir-sdk:release-dry-run                   Test the publishing process
...
typescript-sdk:test-nodejs-lts               Test the SDK with LTS version of Node
typescript-sdk:test-nodejs-prev-lts          Test the SDK with previous LTS version of Node

Generators
Name                            Description
changelog:generate              Generate the changelog with 'changie merge'. Only run this manually, at release time.
docs:references                 Regenerate the API schema and CLI reference docs
engine-dev:generate             Generate any engine-related files
go-sdk:generate                 Regenerate the Go SDK API

Or

Name                                         Description
ci:bootstrap                                 Build dagger from source, and check that it can bootstrap its own CI
cli:release-dry-run                          Verify that the CLI builds without actually publishing anything
docs:lint-markdown                           Lint documentation files
elixir-sdk:codegen-test                      Run dagger_codegen tests
elixir-sdk:lint                              Lint the SDK
elixir-sdk:release-dry-run                   Test the publishing process
elixir-sdk:sdk-test                          Run the SDK tests
...
typescript-sdk:test-nodejs-lts               Test the SDK with LTS version of Node
typescript-sdk:test-nodejs-prev-lts          Test the SDK with previous LTS version of Node

Generators
changelog:generate                           Generate the changelog with 'changie merge'. Only run this manually, at release time.
docs:references                              Regenerate the API schema and CLI reference docs
engine-dev:generate                          Generate any engine-related files
go-sdk:generate                              Regenerate the Go SDK API

(with bold Generators - do we want generators? generate?)
I think I'll go for the second option, I prefer everything to be aligned

leaden glade
charred lotus
tepid nova
copper snow
charred lotus
tepid nova
#

Lockfile on egraph 🧵

tepid nova
tepid nova
#

@charred lotus @obsidian rover @wild zephyr sorry for being so slow, I was waiting on dagger checks to complete

#

They never completed. So had to kill them, now starting over

charred lotus
tidal spire
# tepid nova Today yes. But since you're talking about the future with `ServiceGroup` 🙂 I wa...

Following up on this (+up, workspace service discovery) now that I'm closer to having a playwright module working

We currently have Workspace.Services that returns an UpGroup I can filter by name or port and selectively Run.

The only missing piece is to go from a dagger.Up to a dagger.Service. From what I understand Up.Run() will run the service and tunnel to the host. I'm sure I could find a hacky workaround to get from that to a Service I can pass to my playwright container, but it feels like a gap when all the other pieces are there.

As for selecting the right service, we could either pass in a name or port via customizations to pick it out of all Up Services, or if those aren't passed try to be clever with the port (80, 8080, 3000)

tepid nova
#

@still garnet getting this in my "switch to builtin dang SDK" branch... Just checking if it's a known thing?

still garnet
#

hmm nope

tepid nova
#

oh wait... nevermind.

#

I branched it from workspace instead of main 😭

#

Ah nevermind my nevermind - error still appears when rebased back on main

#

Confirming that sdk: "dang" seems broken in 0.20.5

#

Any function I call with that SDK, fails with ! failed to get client caller for "tpwqbiko9pmrk6g7wxlepaap5": context deadline exceeded

obsidian rover
# tepid nova Confirming that `sdk: "dang"` seems broken in 0.20.5

I think i encounter another issue, currently digging, also linked to some dealdine query diff stat: Post "http://dagger/query": command [docker exec -i dagger-engine-v0.20.5 buildctl dial-stdio] has exited with exit status 137, make sure the URL is valid, and Docker 18.09 or later is installed on the remote host: stderr=

tepid nova
#

that looks like an engine crash

obsidian rover
tepid nova
#

Can anyone reproduce any of these commands with 0.25.0 please?

dagger -m github.com/dagger/dagger@v0.20.3 call engine-dev playground terminal
dagger -m github.com/dagger/dagger@v0.20.2 call engine-dev playground terminal
obsidian rover
leaden glade
leaden glade
#

But the output of generate is a bit weird, like if it wasn't fully done

leaden glade
leaden glade
obsidian rover
leaden glade
charred lotus
#

If anyone experienced regressions with Dagger 0.20.5, please let me know as soon as possible.

#

(very tempted to ping at-here)

tidal spire
#

+up services for modules

obsidian rover
charred lotus
tepid nova
#

@obsidian rover did you do this on purpose, to set us up for a good news 🙂

wild zephyr
#

@civic yacht I'm trying to troubeshoot a bug in the typescript SDK and I'm trying to make the engine pick my local version of the SDK for validation purposes. I've modified my repro's module dagger.json sdk -> source property so it points to the typescript/runtime folder in my system but dagger develop is not happy about that. Is this supported?

wild zephyr
civic yacht
wild zephyr
#

nvm layer 9 error

charred lotus
#

If anyone other than Yves sees overlapping TUI lines with dagger 0.25.0 i am interested to hear from you

stuck bloom
#

I am not seeing that on my side

#

I am using tmux. I had issues on 0.23.0 with stuttering but with vito's latest update they seem to be fixed now. TUI is working fine for me.

bronze hollow
charred lotus
bronze hollow
#

The simplest approach is to be logged into to gcloud CLI using “gcloud auth application-default login”

Next up is to provision a tightly scoped service account key (JSON) and make the file available locally and use direnv to export “GOOGLE_APPLICATION_CREDENTIALS”

tepid nova
charred lotus
#

gcloud auth

charred lotus
wild zephyr
#

@bronze hollow welcome back! if you haven't seen the new Modules v2 - AKA Workspace - stuff I think you'll find it quite interesting. Lots of cool stuff has been happening here

tepid nova
bronze hollow
tepid nova
#

Also we're days (perhaps hours) away from removing buildkit 🙂

lunar brook
#

Nevermind, I think I see the master plan 😄: by lifting operations out of Buildkit’s LLB and moving execution natively into DagOp, you are taking complete, direct control of the runtime. For the everyday user, this means escaping the bottlenecks of traditional file-based image building; relying fully on your native dagql engine unlocks true function-level caching that will make pipelines radically faster. Ultimately, bringing core commands like withExec completely in-house removes brittle layers of translation, resulting in a much more deterministic, general-purpose execution kernel for the whole industry.

Is this close?

coral vector
tepid nova
#

pretty much! also reliability will greatly improve, we have obscure bugs caused by the 2 subsystems fighting each other.

And with full control of the codebase, we can tackle ambitious features that were out of reach before

coral vector
#

@tepid nova some spam cleanup to be done in a couple of channels ^

coral vector
#

^ is there a better @ for this? i.e. one for people who can delete msgs and kick a member

charred lotus
#

Hi maintainers, please refrain from merging PRs as we are preparing for 0.20.6 release. Thanks!

leaden glade
coral vector
#

I'm curious if an update to the kube-pod engine client driver such that it could dynamically provision engine Pods would be welcomed?

tepid nova
#

Update on workspace:

  1. Thanks to @rocky plume we are making progress towards rebasing on egraph branch
  2. I am working on polish and tests
  3. I NEED TESTERS

Once the emergency 0.20.6 release is over, I could use some help 🙏. We need to ship this...

obsidian rover
tepid nova
#

@dawn mauve FYI 👆 goal is to get a dev release ready for you to test ASAP

tepid nova
#

@tidal spire I'm doing a first pass at workspace docs. Includes a basic quickstart. Do you want to integrate intro into it now? Later?

#

Biggest open question for workspace quickstart: since it's all about installing & using modules, which modules?

rocky plume
#

sorry if it's already been mentioned, but is someone looking into the generated check failing? I'm getting the following compilation error on my branch:

# github.com/dagger/dagger/.dagger
./main.go:20:18: ws.Generators undefined (type *dagger.Workspace has no field or method Generators)

maybe it's related to the recent dagger generate issues?

tepid nova
#

ie. from CI or local dev

coral vector
#

kube-pod:// provision its own Pod

tepid nova
tidal spire
tepid nova
#

I'm thinking we could have 1) a very basic quickstart that has you install a few modules in a controlled environments (hello-dagger) and run checks.; 2) install intro in your repo and follow steps. I'm just not sure how to present both of those things in a way that flows

tepid nova
tepid nova
tepid nova
# tepid nova Small win: fix our markdown linting (and refactor a small piece of our legacy CI...

A little hope in a difficult week: I was able to prompt codex with "Run dagger check -m ./modules/markdownlint and fix the issues until it's green". And it did. It was quite fast.

Note: I didn't say "dagger check markdownlint" because that is still fucking slow - it loads every module and our modules are F-ing slow to load. Baby steps though.

Also nice that half of the linting errors were fixed automatically with dagger -m ./modules/markdownlint call fix 🙂

charred lotus
#

[Workspace] What's the expected "current workspace" when doing dagger -m GitHub.com/org/repo call toolchain foo inside a git checkout that has a dagger.json ? Is it the remote git or is it the local checkout ? In 0.20.3 the toolchain's defaultPath arg would be relative to the remote git repo root, not the local checkout.

tepid nova
charred lotus
tepid nova
charred lotus
leaden glade
#

+defaultPath resolves to the module's repo, not your workspace
🤔 if I'm right, that's what is not working then.
Yes, I'll reproduce the different cases and paste them so it will be easier to understand

charred lotus
#

Ok so this is 2) in Solomon's case because the java sdk is a toolchain

#

But if you do dagger -m GitHub.com/dagger/dagger call java-sdk lint

Then there could be a discrepancy. To verify again cc @leaden glade

leaden glade
#

(I'm generating the matrix of cases, so we can have the different scenario and fix them)

  1. +defaultPath resolves to the module's repo, not your workspace
    I can be wrong by my reading of the traces was that the defaultPath is translated into currentWorkspace.directory(path)
    So in that case defaultPath resolves to the workspace and this is exactly the issue we are facing
tepid nova
#

I can talk live in 5mn

leaden glade
tepid nova
leaden glade
tepid nova
# leaden glade I'm just seeing that So maybe that's the root cause, it should be false?

Those are toolchains being loaded. So it makes sense that legacyDefaultPath:true . But, this is a gray area because in the final workspace branch (11812), loading a module will not load its toolchains -> a module with toolchains will not be directly loadable anymore.

So, this exact trace shows something that works in main for backwards compat, but will break in 11812. So, the question of "what should happen to these toolchains exactly" doesn't have an answer in the workspace design.

leaden glade
#

Our test matrix:
I'm using the toolchains/java-sdk-dev (check java-sdk:lint)
This check, defined inside toolchains/java-sdk-dev is trying to access a directory at sdk/java/runtime/images/maven. This is made in two steps:

  • a directory with defaultPath("/")

  • by looking at the sdk/java/runtime/images/maven sub-directory
    If this directory is missing, the check is failing
    dagger -m github.com/dagger/dagger@main check java-sdk:lint

  • v0.20.3

    • ✅ from an empty directory
    • ✅ from a clone of dagger/dagger
    • ✅ from a clone of dagger/dagger in which I removed the sdk/java/runtime/images/maven directory
      -> this means the defaultPath is looking at the module's repo file (it's finding the files inside github.com/dagger/dagger@main whatever they exist on the disk or not)
  • 5793a4c47 (main just before our last changes)

    • ❌ from an empty directory: stat sdk/java/runtime/images/maven: no such file or director
    • ✅ from a clone of dagger/dagger
    • ❌ from a clone of dagger/dagger in which I removed the sdk/java/runtime/images/maven directory: stat sdk/java/runtime/images/maven: no such file or director
  • e004ad8f8 (main, with the last changes)

    • ✅ ​​from an empty directory
    • ✅ from a clone of dagger/dagger
    • ❌ from a clone of dagger/dagger in which I removed the sdk/java/runtime/images/maven directory
tepid nova
# tepid nova Those are toolchains being loaded. So it makes sense that `legacyDefaultPath:tru...

In the spirit of workspace-plumbing (full backwards compat on top of the workspace concept), my guess is:

  • when loading a module that has toolchains, those toolchains are still loaded
  • those toolchains are loaded with the same overrides as if they were loaded from a workspace (so: legacyDefaultPath: true)
  • As a special case for backwards compat, those toolchains are given a workspace that is the main module's context directory (so, in your case the git remote) --> this is the part that is not defined in the final workspace design. It's pure temporary compat
stuck bloom
charred lotus
#

actually lemme check if its 1.43

charred lotus
charred lotus
#

v0.20.6 is out!

fresh harbor
#

noob question: Does Dang support replacing strings with regular expressions? My use case is to update the Elixir image in sdk/elixir/runtime/main.go to match the image in the Elixir SDK toolchain.

leaden glade
tepid nova
#

🧵MERGING EGRAPH 🧵

leaden glade
#

@tepid nova I pushed the markdownlint branch with a .markdownlintignore file, it works just fine to ignore CHANGELOG.md

tepid nova
#

🧵 MERGING WORKSPACES 🧵

#

@charred lotus could you remind me how to to install the latest CLI from main?

charred lotus
tepid nova
charred lotus
#

just specify the commit

tepid nova
#

isn't there a special value I can set DAGGER_COMMIT to?

#

I don't have the commit

charred lotus
#

HEAD

tepid nova
#

ah! thank you

#

(this is for dagger --next)

charred lotus
tepid nova
#

I'm just filing an issue for now, to track & remember

tepid nova
leaden glade
leaden glade
#

I have a behavior I don't know if it's related to egraph PR or not. (I'm on v0.20.6 on the egraph branch)
But at least I'm experiencing it on egraph PR. Dagger is taking all my RAM + swap.
For instance here, it's me running dagger check go:check-tidy
And now my system if completely stuck. At some point it might just crash in some way and it will free the memory, but sometimes I have to restart the VM I'm working on.
I'll do more tests (like with v0.20.6 on main) to ensure where it's coming from, but that's weird, and it's not all time.

leaden glade
leaden glade
obsidian rover
leaden glade
wild zephyr
leaden glade
# leaden glade Side quest: improving our go lint module to make is nicer to user on personal ma...

During my quest on parallelism and performances, I wonder if we shouldn't add a global flag to limit the parallelism of some commands like dagger check/generate (up might be different as we want them to be parallel).
That way, on small machines it doesn't try to run too much in parallel.
My current understanding of util/parallel is by default it's unlimited.
And also, we might like to have a different setup on a dev machine and on a CI.
Would it make sense?

#

2 potential culprits: my changeset PR or

charred lotus
charred lotus
# leaden glade During my quest on parallelism and performances, I wonder if we shouldn't add a ...

Yeah I think util parallel should never run without limit. The only case where this can be a problem is if you do parallel recursion. Then you can have a deadlock: a parent wants to spawn another child, but the limit prevents it, so the parent waits, and the parent can't release itself and thus the number of concurrent routines never goes down => deadlock. That's an issue i faced with smartchecks. Basically you can't use regular sync.WaitGroup (or equivalent errgroup). But apart from that situation, I agree we should have a default limit defaulting to MAXPROCS.

leaden glade
#

(but it's in fact already 1 level deeper than check/generate)

tepid nova
# leaden glade During my quest on parallelism and performances, I wonder if we shouldn't add a ...

There is a natural integration point for this in the modules-v2 design, FYI

--> With @collection we will support batch operations: a collection can be split in buckets, and the batch operation applied to each bucket in parallel. In Cloud we can auto-detect the ideal parallelism setting from telemetry over time. But locally, we'll probably need a manual --parallel=N flag. Once we have that - we could use the same flag to limit concurrency of all dagger functions for this client, maybe?

tepid nova
#

@charred lotus other candidates I like:

  • dagger --release=dev|VERSION
  • dagger --x-release=dev|VERSION (same but x is for "cross-release" and also for "this is special, only use if you know what you're doing)

Remaining mystery is: how to cleanly lookup immutable digest of current dev release (for download caching)

  • If by looking up git commit of main -> might not be available in release yet
  • If by fetching special lookup text file -> doesn't exist, extra work to release it and ensure it's up to date
  • Pure http, etag check?

(I really prefer if lookup/invalidation is automatic and stateless - ie. no need to separately manage invalidation or refresh)

charred lotus
#

It caches the CLI, and we should reuse that

#

Just tweak the pruning a bit

tepid nova
#

Ah great!

#

So we can use that checksum as the stable key

#

So the CLI already knows how to download another CLI? 🤔

charred lotus
#

well the checksum is a file with various versions, and we can redownload it and add a line for main

charred lotus
tepid nova
#

Ah right, it's the one thing every SDK has to reimplement to allow bootstrap

charred lotus
#

Btw, if you think of a subcommand to manage releases, it would be dagger release ... not --release. And I don't know if maybe we'd want to reserve dagger release for the future.

tepid nova
#

dagger release looks like you're using dagger to release your app

charred lotus
#

exactly

#

Honestly we are talking about configuring dagger.

tepid nova
#

even if we don't actually use it for something else (we're probably using ship), we can't use it for this

tepid nova
#

My favorite so far is --x-release

--> Accurate
--> the X is an appropriate marker of being unusual / special, but not offputting

charred lotus
#

You said you wanted a subcommand

tepid nova
#

If we can make caching/invalidation automatic, then all you need is a string/enum flag (rather than a boolean flag like I was initially picturing)

#

We could even keep --next as a convenience alias for --release=next

charred lotus
#

i for sure will never use the flag, only the envvar.

tepid nova
#

--x-release + DAGGER_X_RELEASE

charred lotus
#

I'll do something and we can bikeshed on the names later 🙂

coral vector
#

Hi! I wanted to follow up to see if this was something that we'd be interested in supporting: #maintainers message

leaden glade
#

Here is my current list of PRs I'll soon merge into main (some of them was waiting egraph to be merged first)
Happy to get reviews on the ones with 🙏 (the others are already approved, but happy to discuss them if there's any question, sharing them here so you know what's coming)

  • checks for generate functions: #12923
  • pull_merged use an AST based analysis to introspect python modules: #11803
  • pull_merged improvements on the go module (to limit parallelism so it's easier to run on small machines, and improving changeset merge): #12998 (this one was previously approved, but I changed the implementation)
  • fix display or endpoint when using dagger up and exposing the docs server: #13002
  • 🙏 re-include toolchains as dependencies in codegen: #12991 -> the feature has been added back while merging egraph, so this PR only adds a test to it
  • 🙏 fix loading of dang modules containing typescript and go dependencies: #13007
  • pull_merged add a hidden flag to hide functions from the CLI (dagger functions) to hide the with field we are surfacing now: #13012 (context)
  • pull_merged fix opentelemetry metrics sent by python SDK and not handled by the engine: #13013
topaz edge
#

Hey there, I'm trying to update an open PR to accomodate the removal of buildkit -- https://github.com/dagger/dagger/pull/12049. It's fundamentally using buildkit.HostMount -- is there a strategy for replacing such things? Eg, https://github.com/dagger/dagger/pull/12049/changes#diff-10d41febe6f07f3eed32775ac5ec0a09eeda9867db7f5f3c57a39c75b90b708aR74-R77

GitHub

GitHub is where people build software. More than 150 million people use GitHub to discover, fork, and contribute to over 420 million projects.

GitHub

This PR is implementing the host volume mount for engines that are started locally, as well as allows sshfs mounts that would be used as two way binding mount from the engine to the container.
This...

charred lotus
#

Friendly reminder to dogfood main:

curl -fsSL https://dl.dagger.io/dagger/install.sh | DAGGER_COMMIT=head sh

If you need sudo to install to /usr/local/bin you can do :

curl -fsSL https://dl.dagger.io/dagger/install.sh | DAGGER_COMMIT=head BIN_DIR=/usr/local/bin sudo -E sh
tidal spire
leaden glade
leaden glade
#

I have a bug in lockfile, I don't know if it's a known one or not:
On a repo with toolchains declared, I ran dagger functions --lock=live to generate a lock file:

[["version","1"]]
["","modules.resolve",["github.com/vito/dang/dagger-sdk@352d057a4d4c4d77612104f842671b512495ef30"],"352d057a4d4c4d77612104f842671b512495ef30","float"]

But if I want to update it:

$ dagger lock update
✘ .update: Changeset! 0.0s ERROR
! update workspace lock: parse git URL "github.com/vito/dang": unknown protocol
Error: update workspace lock: parse git URL "github.com/vito/dang": unknown protocol
topaz edge
tepid nova
tepid nova
tidal spire
#

github will redirect from the old name so it shouldn't cause any issues

tepid nova
#

<@&946480760016207902> FYI new module for the sdlib: https://github.com/dagger/shellcheck

(small dogfooding indagger/dagger , replacing project-specific logic with clean reusable modules, one small chunk at a time)

charred lotus
# tepid nova 😭

Looking at a trace, it's running codegen generate-typedefs for 1m12s, I think this should be fixed with @leaden glade's work on committing generated typedefs.

tepid nova
#

@charred lotus FYI it might be an artifact of my super slow internet. If some of the SDKs re-download a lot of stuff, then I will feel that pain much more acutely on the current configuration

tepid nova
tepid nova
#

Baby steps towards dogfooding + making our own CI better 🙂

tepid nova
#

@charred lotus are those go:lint errors in CI known flakes? My change shouldn't trigger go linting errors at all

#

(I noticed it happened in 2 completely distinct PRs)

charred lotus
#

Otherwise i'll investigate further

tepid nova
#

@charred lotus in any case the sooner we remove codegen on go:lint, the better. Maybe I will try that next

#

(doing powershell analyzer module now)

charred lotus
#

most of the codegen stuff is, to my knowledge, dependent on @leaden glade's work on requiring to commit generated files.

tepid nova
#

It won't save the time at module load, but it allows us to run a normal linter against the repo, instead of having to dynamically codegen from within the linting module

charred lotus
#

Ah i see. Yeah i guess

tepid nova
#

It does require codegen to be deterministic... We fixed a bunch of those issues, but others may be lurking. I'll try and we'll see 🙂

#

By the way, thank you @charred lotus @obsidian rover @rocky plume , I am able to take a few hours to improve our CI and dogfood, because you're picking up the slack on the workspace branch 🙂 As soon as the rebase is done I will get back to workspace branch

charred lotus
tepid nova
charred lotus
tepid nova
tepid nova
tepid nova
#

Couldn't re-run from Cloud, had to push a commit to trigger

charred lotus
tepid nova
#

Could I get a quick ✅ 🙏 @charred lotus

#

I have another one on the stack 🙂 coming soon.

#

I think I found how to eliminate one of our project-specific modules entirely

#

(a small one but still)

charred lotus
rocky plume
#

I gave it a +1, but take it with a grain of salt.

tepid nova
#

@charred lotus just to confirm, I'm no longer touching that PR (13020) it's all yours to do with as you please - force-push, merge, close, whatever

tepid nova
#

One more: https://github.com/dagger/dagger/pull/13026

--> removed the project-specific "installers" toolchain 💪

@tidal spire I made it a native go e2e test suite 🙂 Note the new directory, e2e/installers. Works natively in go test, and CI runs it with a brand new github.com/dagger/go reusable module 🙂

GitHub

Move installer e2e tests to a native Go test runner under e2e/installers/. This replaces the project-specific toolchains/installers Dagger module, which is now deleted.
The old setup wrapped everyt...

stuck bloom
#

Seems strange to see the dagger/go module written in dang

tepid nova
wild zephyr
#

when using -m $remote_ref does anyone know if it's possible to fetch that $remote_ref value within the function somehow?

tepid nova
wild zephyr
tepid nova
#

Quick performance side quest: trying again to get our generated files checked in, so we can run a go linter without waiting 20 minutes

tepid nova
tepid nova
#

I have to disconnect today. Will check in late this evening, then flying back to SF over the week-end.

Open threads from today:

  • I opened a PR to move the helm e2e tests to e2e/helm, same idea as for installers
  • Opened a PR to check in our generated files, and move module codegen out of go:lint and go:check-tidy, making them faster and simpler
  • Opened a PR to fix the user-reported problem with dagger mcp
  • Pushed a single commit to workspace to fix broken docs pages with netlify redirects
wild zephyr
#

@charred lotus @astral zealot this is the reason why the apko step was failing i the Cloud build (https://github.com/vito/dang/pull/43). Seems like we're using the latest apko image from chainguard and something probably changed which was causing the apko build command to fail with some permission errors. That PR fixes it.

Alex will probably merge it as soon as he sees it 🙏. Already silently DMed him about it

tepid nova
#

😵‍💫

I run the EXACT SAME PIPELINE, with THE SAME INPUTS, once locally and once on cloud... And the result is different.

Local run

dagger -s -m github.com/dagger/dagger@e2e-helm call golang modules | wc -l

Output:

user default: golang(selectModule="e2e/*")
user default: golang(selectModule="e2e/*")
       2

Trace: https://dagger.cloud/dagger/traces/52701004aa776c96eee4a12d893bb34f

Cloud run

dagger --cloud -s -m github.com/dagger/dagger@e2e-helm call golang modules | wc -l

Output:

user default: golang(selectModule="e2e/*")
user default: golang(selectModule="e2e/*")
       1

Trace: https://dagger.cloud/dagger/traces/43e78c894aa09bf000a4e4c8214d5728

#

(local run is the expected result)

still garnet
leaden glade
#

https://github.com/dagger/dagger/pull/13039 should fix the failing test on https://github.com/dagger/dagger/pull/13035
(I put it in a separate PR as it's a problem not only on this PR, it's a regression after egraph PR)
As I'll be off tomorrow, feel free to review/merge it if that makes sense.

GitHub

Restore the pre-#11856 behavior where (*Module).namespaceSourceMap records at minimum the module name when the SDK does not attach a source map to a typedef/field/argument.
When commit aa719a1 migr...

GitHub

This PR fixes #11467 by making Go runtime generation an explicit toolchains/go step instead of a hidden lint/tidy side effect, and checks in the generated runtime files those checks now require.

...

tepid nova
#

@still garnet I'm porting some of our e2e tests to a new module github.com/dagger/go. Of course written in dang 🙂

Right now dagger check golang will find and run 2 test suites: e2e/installers and e2e/helm. Problem, the output looks bad because 1) there's no custom spans, and 2) no sweet go test instrumentation. Do you have escape hatches for those up your sleeve? 🙂

obsidian rover
#

Github not showing the PRs makes it very very unusable ...

tidal spire
#

Discuss: https://github.com/dagger/dagger/pull/13015

New API: Container.WithLocalhostForward. Its like WithServiceBinding but it will bind to the container's localhost:<port>. Super handy when working with black box testing when its tricky to wire through alternative hostnames

#

Discuss: https://github.com/dagger/dagger/pull/13016

Some lightweight composition between modules for modules v2. Specifically, being able to pass an up function from a module to a constructor Service argument of another module with customizations. This is needed for generic resuable modules like Playwright taking in an app-specific Service without the Playwright module needing to know/guess at every possible way to run an app

tepid nova
tepid nova
#

I have a question about dagger develop. Currently it calls go mod tidy, so if a random dependency happens to be updated, it will barf a go.mod diff on the target module (or in my case: every module in the repo all at once).

Do we want this?

  • Argument against: CI can randomly fail on check generated because dependency was updated after you committed but before CI was run. Seems like weird interference. But maybe just an anvoidable reality of software supply chain?

  • Argument for: maybe there are legitimate reasons for dagger generate to write to go.mod and go.sum, separate from random dependency bumps?

For now, I'm going to make it so dagger generate filters out any changes to go.mod and go.sum (I can't prevent go mod tidy from actually being called, that's hardcoded into the SDK behavior at the moment)

tepid nova
still garnet
obsidian rover
tepid nova
obsidian rover
# tepid nova Is the issue introduced by my PR?

if you run dagger call engine-dev test --pkg ./core/integration --run '^TestModule/TestRemoteModuleCrossRepoToolchainDefaultPath/empty_cwd$' --test-verbose locally, you see that this passes on main, not on your PR

I think i have the fix

tepid nova
#

warn me if you push your fix

#

oooh is it related to dagger session -W clashing with dagger -W ?

obsidian rover
#

yes, dagger call parses the moduels and the workspace defaultarg conflicts

tepid nova
#

ok 🙂

#

you have fix ready to push?

#

(rebase done)

obsidian rover
tepid nova
#

Isn't it just reverting the older session -W commit?

#

deprecated by this

obsidian rover
tepid nova
#

Ooooh..... facepalm

#

Don't we handle that for other arguments already?

obsidian rover
obsidian rover
tepid nova
#

Mmmm wait, I'm wondering if we're implementing this wrong... Let me check how I did it in workspace

obsidian rover
rocky plume
#

Here's a new error I saw while running TestModule/TestFunctionCacheControl/go under the lockfile branch (unsure if it's lockfile or simply egraph related):

failed to initialize module: failed to load module from type defs json: load Module@Eg8I3nASCgoGTW9kdWxlGAE=: resolve result 14430: missing shared result

I did a prune then re-ran the test and it went away -- just sharing this here in case it comes up again.

trace: https://dagger.cloud/dagger/traces/170ef095e221da71af511ad950365125?span=6e7eb06fb72362d3#6e7eb06fb72362d3:L17

civic yacht
rocky plume
tepid nova
tepid nova
tepid nova
#

New stdlib module: github.com/dagger/helm -> for now it only supports linting helm charts (for the needs of our own CI)

#

Merged https://github.com/dagger/dagger/pull/13035

Our generated module code is now checked in git - Go linting no longer requires custom just-in-time codegen party_blob

cc @stuck bloom @ocean hamlet as I believe you've had to deal with this problem also?

stuck bloom
tepid nova
#

After merging 13035, codegen will still be re-run at module load. But at least we'll have a go linting setup that is simple and fast 🙂

stuck bloom
#

We have our own toolchain/module for Go, loosely based on yours so I'll look into this. I think the real benefit will come when runtime codegen is prevented as the code is checked in. One concern I have is the repo size. I wonder if that will have an impact on remote module imports. Especially when we move to a workspace model where most things are imported at runtime.

tidal spire
tepid nova
tepid nova
stuck bloom
#

Wow.. impressive! I wish there was a way to tell GH to make generated files much less prominent in PR review.

tidal spire
tepid nova
stuck bloom
#

oh? Didn't you have that already for generated modules?

#

It does hide the file contents.. But it's still in my face. They should entirely hide those files as no one would actually review generated files.

tepid nova
#

Yeah it's not ideal. One more thing agentic tooling can probably help solve in a new way

tepid nova
#

@still garnet new use case for a Dang module: lightweight codegen (injecting a Go helper alongside the go test file, as a convenience to access the workspace from the test code). I'm assuming there's no templating builtins? By default will build a small helper tool, in Go I guess

tepid nova
#

@tidal spire @still garnet I ran into a smell while working on me little e2e refactor. Might have consequences for modulesv2 🧵

still garnet
#

dang templating(?)

tepid nova
mystic lodge
tepid nova
tepid nova
wild zephyr
#

q: is generate still supposed to be hidden in the CLI? cc @leaden glade

leaden glade
leaden glade
#

Question regarding https://github.com/dagger/dagger/pull/12991
Do we want this? This is only a anti-regression test to ensure toolchains are available as dependencies.
This is not something that will survive modules v2/workspace but we had the issue earlier this was removed.
Happy to close it if we think that's not that useful for now.
(trying to clean my list of PRs 😅 )

GitHub

Re-add toolchain modules to loadDependencyModules so a module's generated SDK bindings expose toolchain types — restoring the v0.20.3 behavior that was removed in the workspace refactor (db...

tepid nova
still garnet
coral vector
tepid nova
tepid nova
tepid nova
#

Merged: another project-specific module removed from our CI 🙂

  • toolchains/installers -> replaced by e2e/installers + github.com/dagger/go
  • toolchains/helm-dev -> replaced by e2e/helm + github.com/dagger/go + github.com/dagger/helm
still garnet
leaden glade
tepid nova
leaden glade
#

I've merged https://github.com/dagger/dagger/pull/12923
This means now generate function will qualify as check.
Once the CI will run on a version including this, we will be able to remove the generated check in .dagger (I'll prepare a PR for that)
One of the benefit here is instead of having this single function that runs multiple generate to check if they are ok, it will be on dedicated checks, meaning if one generate function must be re-run it will be easier to catch.
Also one step forward to a toolchains/modules v2 only, without the need of a main module.

GitHub

Currently we have one single function in .dagger main module that runs all the generate functions and ensure the result is empty.
Those changes handle that in the engine: all generate functions are...

tepid nova
#

@still garnet did the otelgo binary move by any chance? I'm getting errors installing it (looking into it)

still garnet
#

the binary is named otelgotest, hasn't changed

tepid nova
#

Oooh so I guess it never worked... facepalm Note, our module testing story still isn't great, I actually have tests but setting them is still awkward.

@still garnet the error was installing .../otel-go@latest -> latest tag doesn't have cmd/

still garnet
tepid nova
#

Actually I will track main until things stabilize

#

We're still the only user of that module, for another few weeks I'm guessing

tepid nova
#

Update on CI refactor:

  • ✅ removetoolchains/installers -> replaced by e2e/installers + github.com/dagger/go
  • ✅ removetoolchains/helm-dev -> replaced by e2e/helm + github.com/dagger/go + github.com/dagger/helm
  • 🏗️ remove all the bump functions called by release.bump -> replaced by clean generate functions + a single setting in the release module guy_fieri_chef_kiss
  • 🏗️ remove the all-sdks module (side-effect of 👆 )
  • 🏗️ remove dependency on .changes/next from 1) release and 2) version string computation
  • 🏗️ remove CLI reference doc generation from toolchains/docs-dev -> replaced by go:generate in CLI code
  • 🏗️ remove GraphQL reference doc generation from toolchains/docs-dev -> replaced by reusable SpectaQL module plugged straight into dev engine (we'll need the same service reference plumbing than for playwright @tidal spire )
  • 🏗️ remove docusaurus build from toolchains/docs-dev -> replaced by reusable docusaurus module
  • 🏗️ remove netlify docs deploy from toolchains/docs-dev -> replaced by reusable netlify module
  • 🏗️ remove toolchains/docs-dev -> replaced by all the above 👆
tepid nova
#

<@&946480760016207902> does anyone have context for why ./version doesn't use the ability to receive a contextual GitRepositoryargument? It receives a contextual Directory called gitParent instead, which I'm guessing is less efficient? Is it just that we never got around to it, or we actively can't for some reason?

cc @tidal spire @obsidian rover since I saw in the git history you've been around that file

#

Oooh maybe it doesn't work with git worktrees?

tidal spire
#

could be 🤔 the only thing I ran into regarding worktrees was the findUp looking for /.git/ instead of /.git since worktrees use a .git file

tepid nova
tidal spire
tepid nova
tepid nova
tidal spire
leaden glade
#

I'm using worktrees every day (that's my main way to work on dagger). In case there's some stuff to test for instance.

tepid nova
tepid nova
#

@still garnet do I remember correctly that you implemented (or proposed?) a Workspace.stage() or something of that nature, for a function to proactively apply a changeset to the workspace?

still garnet
tepid nova
#

Does it include the ability to stage git mutations? Like creating new commits, changing refs, creating tags?

#

(context, I'm looking into simplifying our release process, making it more automated and dagger-native)

tepid nova
#

I'm thinking if a dagger function could take charge of creating the release tag, along with the prep commit for it, we could automate the whole thing, with a clean human review gate at dagger generate

still garnet
#

so: new commits yes, new refs yes-ish (you can checkout branches, transparently handled as worktrees), creating tags no

tepid nova
#

How would that plug into the current "prompt user at the end, apply or discard" UX of dagger generate?

Would it make something like that available even for functions that don't return a changeset? Like a sort of generalization?

Or, would it bypass it, and unilaterally apply?

wild zephyr
#

@tepid nova @still garnet IIRC there's a reason why we can't entirely remove the remote dang SDK from the dagger repo, correct?

wild zephyr
tepid nova
#

@still garnet fun fact: it is in fact already the case, that a function returning a changeset can add commits and tags to the workspace, gated by changeset apply prompt 🙂 You just make changes to .git and voila

(not sure how that will go with worktrees, but that's the case across the board anyway)

still garnet
still garnet
tepid nova
#

I'll keep digging, and use our release module as the guinea pig (in a separate branch for now of course)

#

The special case I'm trying to clean up, is the "pre-publish generate" -> specifically the changie batch that you have to run manually just before creating the release tag.

  • Technically it's a generator function (outputs changes to be checked in git). But, it can't be called by generate because it's not idempotent: you have to call it just before setting the release tag

  • It also can't be bundled into a ship function (which at the moment is a raw dagger call), because those don't have an affordance for generating source files along the way (nor do we want them to)

So it's a weird hybrid. My thinking is that really it's a combined tag-generation function. Then it can be just another "bump" function - idempotent for a given target version. I just need a way to produce a tag + commit in a single function 🙂

#

Even if we remove changie and replace it with a LLM-powered changelog generator (and I don't see how we don't do that soon), I think we'll still need something like this, since a raw LLM call is not idempotent either... You don't want to re-run a LLM summarizer on your git history every time you dagger generate

charred lotus
tepid nova
coral vector
still garnet
#

Sharing some 'better tests' UI progress (TUI + web UI) - feedback welcome! The TUI is very quick-and-dirty, LLM one-shot'd, planning to refine further but comment away if something jumps out. One difference is the TUI scopes tests beneath checks, showing tests beneath each check with T to zoom in to them. The web UI just has a single Tests UI that ignores checks and shows all the tests it found across everything, since I started in Cloud which is currently still one-trace-per-check for performance reasons.

tepid nova
#

I think we accidentally found one explanation to weirdly frequent invalidation of module loading cache @civic yacht

still garnet
#

@civic yacht I had to revert this dagui change from Theseus since it was marking way too many things as failed: https://github.com/dagger/dagger/pull/13073/changes/5be82dbad59c51ea1c46926aed4805aea1757781

The problem it fixed was real though, basically we have no way of precisely attributing failure from an effect back to to the API that 'installed' the effect: https://dagger.cloud/dagger/traces/cc312677aad19cd28186d57081a0de12?debug=&listen=58ea3947b67bedee&listen=d38d304c7a9f0304&listen=908b7f3d16307e71&listen=c955b9d515257074&listen=ac255cbc5bd7ba6c&listen=c110545830859704&span=b691bafe394becb0#908b7f3d16307e71

  • PythonSdk.codegen returned a lazy GeneratedCode - if you fudge with zoom levels you can see a teeny tiny gap from where it returned early (attached)
  • uv lock eventually ran and failed (as expected by the test)
  • But as far as the UI is concerned, the outermost calls succeeded, there are no errors bubbled up, so there's no way for it to surface that error from deep within the trace especially since it
  • => Test asserts on error output that is never shown

The fix I reverted essentially said 'any time a child span finishes and fails after a parent span completed, bubble the failure up' but that's not precise enough, and was causing expected errors in tests to bubble up to tests that actually passed and make them look failed, because the tests themselves are async (test span ends early when t.Parallel() blocks and resumes with a later span when Go unblocks it)

Previously this worked by having every API call return a span attribute that included all the effect IDs that were newly installed into the return value, and when the UI saw a failed span with an effect ID it would propagate the failure back to the install site(s). This was designed around Buildkit's constraints so it makes sense it wouldn't translate easily to Theseus, but seems like we need a new approach that's more precise at least thinkspin

(sorry for double ping, posted in wrong channel)

still garnet
#

Not sure what the status of investigating missing shared result errors is, but here's an occurrence, if it helps: https://dagger.cloud/dagger/checks/github.com/dagger/dagger@7c4221e968f8ccd51b9e41e9d104af3c5505525b?check=test-split%3Atest-base&listen=eab73824c1ff0875&listen=92fff003a50dee7e&listen=9f3f1d257f73bba1&listen=df1b5f14724d39c7&listen=63e8e7dbcf89b43f&listen=f6776628e1ffc766&run=31edf7cd-f30c-4ac6-82af-45ca9eb4b2c8#63e8e7dbcf89b43f

I was able to repro this pretty easily on my interfaces branch - it seems to happen when something fails (in my case, codegen) and you run the command again. I would reliably hit that error until doing a dagger core engine local-cache prune.

Repro is ./bin/dagger --progress=logs -vvv -m ./core/integration/testdata/modules/go/ifaces/impl/ develop on interfaces branch @ cf83871cce3725eb6e7a8cc064ffa35814e76c03

tepid nova
still garnet
#

Anyone else able to hit an engine crash from dagger generate in dagger/dagger? I have an engine.log but it's 54 million lines and increasing fast by the time I stopped the engine. At the start of a backtrace is runtime: program exceeds 10000-thread limit - not sure if the remaining lines are all stack or what

tepid nova
civic yacht
#

Not sure what the status of

obsidian rover
civic yacht
still garnet
#

huh, ok the diff I thought might be large is actually pretty small - 9 files changed, +165 -162 lines. so there goes that theory, unless there's a massive diff hiding somewhere else. will keep trying other generators individually, and finally all at once (expecting noop) to see if it still happens

obsidian rover
civic yacht
charred lotus
#

@still garnet i think you're hitting the issues i've seen

tepid nova
#

@civic yacht as part of CI cleanup & dogfooding, I'm trying to understand our ebpf generation/build stuff (across generate and build). There's some special case logic that I'm trying to figure out how to fit in a general-purpose module. Do you have the context written down anywhere maybe? Like merged PR or something like that

tepid nova
#

@tidal spire is there a known workaround for passing eg. a boolean value as customization? I think I remember it's string only for now - but maybe an escape hatch? 🙂

tidal spire
tepid nova
#

(I'm using customizations heavily in my dogfooding streak in dagger/dagger, since it has a clear migration path in workspaces, no reason not to use it)

#

(for example it allowed me to nuke those bump functions and fold them into dagger generate which felt great)

tidal spire
#

gotcha! yeah I had a PR to add container addresses as customizations but I think standard types should work

tepid nova
#

Ah I see

civic yacht
tepid nova
still garnet
#

Quick gut check on a small feature I'd like to add: currently, if you run a withExec and any of its service bindings exits, there's no real visibility into that. Often the dependent command just hangs, e.g. when our engine crashes in integ tests and our clients start doing retry logic.

What if, when a bound service exits, we interrupt any execs that depend on it and bubble up the exit error from the service? Is there any case where we WOULDN'T want that? (I guess we could make it opt-in but would be nice to avoid if it's universal)

coral vector
#

does 0.20.7 incl Theseus?

civic yacht
coral vector
#

hype

coral vector
still garnet
#

ha good point

coral vector
#

I think it's a great improvement for regular withExecs, just wanted to make sure that you could distinguish

still garnet
#

yeah, if that's unique to Terminal maybe we keep it the default behavior for withExec and just handle it there 🤔

leaden glade
#

A nice idea while working on fixing the python AST:

A dagger develop --explain-schema flag that prints, per function, "I resolved src: Optional[Annotated[Directory, DefaultPath('.')]] as Directory (optional, default-path='.') because I followed alias X". Single biggest debuggability lever; cheap to write because the resolver already has the data.
Maybe that should be something else, especially with the next develop -> generate migration. But something like a dagger explain or anything else, could be interesting. Or maybe that could even be inside the typedefs part, like we have the source map, we could have the "source".
It's probably very niche, but I remember to have read a lot the generated Go entrypoint and for instance the Java SDK contains a test that is a big java module file and the corresponding entrypoint as a way to check types are read correctly.

still garnet
#

Has anyone else noticed go SDK: load runtime taking an extremely long time (multiple minutes, repeatedly in a single trace) with v0.20.7?

Wondering if this go get -u should be changed to just go get, but that's a total blind guess, haven't confirmed that command is even what takes a long time, I just remember -u doing a bunch of stuff at one point: https://dagger.cloud/dagger/traces/6e2cbf5b0444ad1ce96ea61ffd26bf46?listen=3497c038e4db6090&listen=3ca3ac61e6585722&listen=f94fa764b55b6182&listen=cf274824ee8156fd#cf274824ee8156fd:L16

leaden glade
tepid nova
#

@still garnet do you have a good example of scaffolding for emitting custom spans in a custom helper tool? (it's a go program bundled in a dagger module, to be exec-ed inside a container with nesting on). The LLM is struggling and seems to be adding more boilerplate than necessary - but I don't know for sure

leaden glade
# still garnet Has anyone else noticed `go SDK: load runtime` taking an extremely long time (mu...

🤔
Now it's failing differently

2026/05/05 21:07:02 INFO running post-command: args="go get -u dagger.io/dagger@7058e9313c720d82c6a07fefb6ce3fab60c7ec4e"
go: dagger.io/dagger@7058e9313c720d82c6a07fefb6ce3fab60c7ec4e: invalid version: git ls-remote -q --end-of-options origin in /go/pkg/mod/cache/vcs/39ea6402b8c7bc990458d81a19729d01208213cc6618163477756df4db9541d0: exit status 128:
        Warning: Permanently added 'github.com' (ED25519) to the list of known hosts.
        git@github.com: Permission denied (publickey).
        fatal: Could not read from remote repository.
        
        Please make sure you have the correct access rights
        and the repository exists.
2026/05/05 21:07:04 ERROR post-command failed error="exit status 1"
Error: exit status 1

On local and --cloud
Something's wrong on the dagger.io proxy? (or on github side?)

still garnet
#

seems like it might be resolved now? cc @leaden glade if you wanna check

charred lotus
tepid nova
#

It fixes a glitch in Workspace.directory() that could become problematic later if we don't fix early

leaden glade
#

PR #13095 is ready to be reviewed.
As it's not a small one I spent quite some time to reorganize the different commits so they could be easier to follow and review one by one.
The PR body contains a high level description of those commits.
Happy to help review it if anyone wants, or we can pair.
TL;DR is it solves multiple issues with the python AST analyzer added recently (and in v0.20.7) and ensures with way more tests (including random property based testing and tests against real python modules) that this is working as expected.

GitHub

Closes #13097.
Closes #13089.
What this fixes
When the Python SDK switched in v0.20.7 from running your code to reading it as text only (#11803), the new reader stopped recognising several Python p...

wild zephyr
#

any reason not to add the -W flag at the same level of -m? It's currently only available for the session command. cc @still garnet

still garnet
wild zephyr
charred lotus
tepid nova
#

in workspace branch we drop that and make -W a visible flag in (almost) all commands

civic yacht
charred lotus
#

FYI i broke CI, im fixing it

tepid nova
tepid nova
#

@still garnet off the top of your head, is modules/doug supposed to be extempted from go linting?

still garnet
tepid nova
#

OK weird, must be something in the switch to github.com/dagger/go... I just can't figure out what. It says "no go files - try running go mod tidy". There actually "is" a main.go and go.mod right there, but indeed running go mod tidy makes the error go away (then there's a different, actual lint error)

#

I think it's a missing include filter in dagger/go

#

Those famously cause super weird errors

charred lotus
#

v0.20.8 is out! CI seems already much better

civic yacht
still garnet
charred lotus
#

Yeah i was quite happy today to see more green CIs ^^

#

Thanks for fixing it Alex!

tepid nova
still garnet
#

@civic yacht Hitting some missing shared result errors on my interfaces PR still, only in test-module-runtimes: https://dagger.cloud/dagger/checks/github.com/dagger/dagger@9df52cfa0e09a676091039b5ad45c355d11e8704?check=test-split:test-module-runtimes&listen=2b3324d4d3e5dad7&listen=9e318aa99cff57ff&test=TestElixir/TestEnumArg/can_use_enum&viewMode=tests#9e318aa99cff57ff:L30

Full logs can be downloaded from here: https://dagger.cloud/dagger/checks/github.com/dagger/dagger@9df52cfa0e09a676091039b5ad45c355d11e8704?check=test-split:test-module-runtimes&viewMode=logs

I'll see if I can whittle it down to a tighter repro, but FWIW it happened 3 runs in a row, even when using the 'run from clean slate' option. I had some solid CI runs for a while, before this one check started failing, not sure if something changed out of band, have a hard time imagining the recent commits caused it

still garnet
#

missing shared result

still garnet
still garnet
#

vito catching up on modules v2

charred lotus
charred lotus
#

Dagger Cloud

charred lotus
tepid nova
charred lotus
tepid nova
#

If the module says "I need engine version 0.20.8", then I expect to get bindings that will work when running in engine 0.20.8. The engine version actually running the generator for that should be irrelevant

charred lotus
#

That makes sense

tidal spire
charred lotus
#

@civic yacht CI is running main (commit 0e9fd00bbc30) for dagger org

#

@Erik Sipsma CI is running main (

civic yacht
#

quick PR to disable git autoclean during changset operations: https://github.com/dagger/dagger/pull/13121 which has a decent chance of explaining some of the flakes we see where changeset operations fail with unlinkat errors occasionally in CI

surreal wolf
#

Hey guys I'm Paul, I found your repo on github and it seemed like an cool tool. I read the docs, played around with the cli, and forked the repo. I made my first pr yesterday fixing a skipped test in the go sdk. I really want experience working in a large codebase and figured Dagger would be a great place to start, any good first issues I can work on?

leaden glade
coral vector
surreal wolf
tidal spire
#

any other dang modules that need converted you can just point your agent at one of those diffs

#

for these kinds of repos since they're strictly a module and the checks they provide aren't meant to pass on themselves, what if I could specify an alternative -W in cloud? Its kind of the inverse of what we talked about earlier @tepid nova @wild zephyr
so instead of: dagger -W=. -m=<installed modules> check
i could do dagger -W=<user defined git ref> -m=. check. This is what I do to test changes locally using github.com/kpenfound/demo-react-app as the -W

#

as an escape hatch we can do this with the repo's own "dev" module in .dagger/modules/dev since I think once we upgrade native CI to use Workspaces then we just wont see any checks in those projects at the moment right?

tepid nova
# tidal spire for these kinds of repos since they're strictly a module and the checks they pro...

So for this problem (which btw was one of the problems that caused the whole modulesV2 project in the first place...) -> the crux of the issue is so-called "CWD module". A special step of module loading, separate from either a) modules in workspace config, or b) explicit modules via -m - there is also c) if cwd is inside a dagger.json, load that

The motivation is backwards compat. The downside is that it prevents the "module shouldn't check itself" problem from being completely solved. There's a delicate balance

#

@civic yacht flashback to our group discussion at the Japanese Tea Garden in SF. Do you see any future where dagger.json is no longer the source of truth for a module's runtime dependencies? With each SDK instead handling those dependencies in any way it sees fit; and the engine not having a guarantee that it can statically inspect a module's true and complete dependency graph - the only way to know is to run the module, and see what it dynamically loads.

Context: as part of workspace we are changing the UX for commands that manage said dependencies in dagger.json. We have the option to keep it centralized across all SDKs, or to delegate it to each SDK (which opens the possibility of drift). If we think there's a chance that in the future SDKs will manage their respective module's runtime dependencies differently, the delegation path makes more sense, even if in the near future each SDK will continue to manage dagger.json in the same way.

Even more context: there are 3 parts to the commands we need to redesign:

  1. Module init --> this we know we want to delegate to each SDK, since by definition each generated boilerplate is SDK-specific anyway
  2. Module generation --> this is the cleanest, dagger generate is a perfect fit
  3. Module dependency management (including engine dependency) --> this is the tricky one in discussion here
civic yacht
tepid nova
#

It kind of opens the pandora box of asking: if the dependencies field in dagger.json could become not load-bearing in the future: should any field remain load-bearing? Do we need dagger.json at all, or should each SDK be responsible for even that? 🤔 But that part breaks my brain 😅

#

I guess the absolute irreductible core of dagger.json is a runtime entrypoitn: "hey dagger engine, load me with this runtime X"

charred lotus
#

is there a way to discard generate output in a non interactive way ?

leaden glade
leaden glade
# charred lotus Testing dagger 😄

Yeah, of course 😅
but what would be the use case for discarding in a non interactive way? By non interactive you mean without the user to use the terminal to answer, right?

charred lotus
still garnet
leaden glade
#

Maybe if it's not interactif and there's no -y we should just discard it and just print a warning.

still garnet
still garnet
#

Bring out your jank! Doing a round of TUI cleanup - so far, fixed: togglers showing up on final render, lag between expanding and moving focus. Anything else y'all have noticed?

tepid nova
#

Any objections to merging this? 🙏 https://github.com/dagger/dagger/pull/13074

It's pretty lightweight for now - there's a more beefy followup here: https://github.com/dagger/dagger/issues/13086

GitHub

This adds Workspace.git, a local git view for the current workspace.
extend type Workspace {
"""Git state for this workspace. Errors if the workspace is not in a git re...

GitHub

Problem The core Git API currently models branches, tags, HEAD, and commit IDs through GitRef. That works well for ref lookup and tree checkout, because a commit ID can be used as a ref-like revisi...

wild zephyr
tepid nova
#

@civic yacht can I access the engine's builtin SDK module sources via the core API?

wild zephyr
#

as you know, it's preventing some python users from using the current theseus main branch

stuck bloom
still garnet
stuck bloom
leaden glade
civic yacht
#

Bring out your jank! Doing a round of

wild zephyr
wild zephyr
wild zephyr
obsidian rover
#

has there been a regression on this check golang:check ?

civic yacht
still garnet
civic yacht
civic yacht
#

next up I'm also gonna get to the bottom of why cli:release-dry-run and engine-dev:release-dry-run randomly start flaking as a pair... that one is getting extremely annoying too

civic yacht
#

next up I'm also gonna get to the bottom

tepid nova
#

@tidal spire for e2e/testcontainers pattern. Imagine if we could add a directive like this in the test code:


// go:test:sandbox <container image reference goes here>
func TestFooBar(ctx context.Context, t *testing.T) {
  ///
}

tidal spire
tepid nova
#

Or even more ambitious:

// go:test:system-dependencies git protoc
func TestFooBar(ctx context.Context, t *testing.T) {
  ///
}

--> Then the module just figures out a way to make those system dependencies available

tidal spire
#

sounds cool! are you worried yet about encoding too much in comments?

tepid nova
#

So far so good (but dogfooding is still WIP)

tidal spire
#

nice!

#

this is in the dagger/go module?

tepid nova
#

My 2 sources of friction right now:

  1. Dang development with LLM (they overcomplicate things, and I'm not comfortable enough with the syntax to do it myself, so it gets frustrating)

  2. At the moment my module doesn't cache well, I think because I weave workspace absolutely everywhere (necessary for dynamic discovery of includes) so everything gets invalidated

tidal spire
#

What have you tried for dang +LLM so far? I've tried hand rolled skills and pointing at examples but the most success so far has come from literally just pointing at the dang repo

tepid nova
#

yeah syntax is not an issue - it's just that it seems to always pick the most complicated possible design - just tons and tons of useless indirections etc

tidal spire
#

ah got it

#

yeah i've definitely had that issue with dagger modules in any language. I think there's a particular style that the LLMs can get away with in the dagger codebase that just sticks out in a module

tepid nova
#

Mostly I talk about "inlining useless indirections" and things like that

#

Anything they write I just ask them "can you spot any useless code that could be inlined?" -> then ask it 5 times in a row

civic yacht
#

If there's stuff for me to review too lemme know, especially anything we want for the next release

tepid nova
#

@civic yacht I'm noticing that dagger generate in several different branches spits out diffs like:

-// The `ClientFilesyncMirrorID` scalar type represents an identifier for an object of type ClientFilesyncMirror.
-type ClientFilesyncMirrorID string
-// The `HTTPStateID` scalar type represents an identifier for an object of type HTTPState.
-type HTTPStateID string

Is that a known issue, eg. we merged something with an incomplete regeneration, and now every branch is catching it in their diff?

#

(it stands out because those branches are relatively scoped and small, ie not workspace 🙂 )

civic yacht
tepid nova
#

I was wondering if I was running main, but dagger version returns 0.20.8

civic yacht
#

Yeah I guess the problem is that in CI we're using main, so then the generated check is looking at the schema from main. So yes you'd want to run dagger generated with main too. @charred lotus brought this up here https://github.com/dagger/dagger/issues/13115

tepid nova
charred lotus
#

Separately from that, i also want to see if we can make the "sourcemap" optional

tepid nova
#

We had another thread about that, but IMO it is an anti-pattern that the version of engine running your generate, changes what you generate

charred lotus