diff --git a/CHANGELOG.md b/CHANGELOG.md
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -5,6 +5,14 @@
 
 The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/).
 
+## 0.4.6.0 - 2022-11-15
+
+### Added
+
+ - `onSchedule` event handler types and operations
+ - `GitToken` secrets type, secrets types
+ - `ImmutableGitInput` repository metadata attributes
+
 ## 0.4.5.0 - 2022-05-17
 
 ### Added
diff --git a/hercules-ci-api-agent.cabal b/hercules-ci-api-agent.cabal
--- a/hercules-ci-api-agent.cabal
+++ b/hercules-ci-api-agent.cabal
@@ -1,7 +1,7 @@
 cabal-version: 1.12
 
 name:           hercules-ci-api-agent
-version:        0.4.5.0
+version:        0.4.6.0
 synopsis:       API definition for Hercules CI Agent to talk to hercules-ci.com or Hercules CI Enterprise
 category:       API, CI, Testing, DevOps, Nix
 homepage:       https://github.com/hercules-ci/hercules-ci-agent#readme
@@ -31,6 +31,7 @@
       Hercules.API.Agent.Evaluate.EvaluateEvent
       Hercules.API.Agent.Evaluate.EvaluateEvent.AttributeErrorEvent
       Hercules.API.Agent.Evaluate.EvaluateEvent.AttributeEvent
+      Hercules.API.Agent.Evaluate.EvaluateEvent.AttributeEffectEvent
       Hercules.API.Agent.Evaluate.EvaluateEvent.AttributeIFDEvent
       Hercules.API.Agent.Evaluate.EvaluateEvent.BuildRequest
       Hercules.API.Agent.Evaluate.EvaluateEvent.BuildRequired
@@ -39,9 +40,11 @@
       Hercules.API.Agent.Evaluate.EvaluateEvent.JobConfig
       Hercules.API.Agent.Evaluate.EvaluateEvent.Message
       Hercules.API.Agent.Evaluate.EvaluateEvent.OnPushHandlerEvent
+      Hercules.API.Agent.Evaluate.EvaluateEvent.OnScheduleHandlerEvent
       Hercules.API.Agent.Evaluate.EvaluateEvent.PushedAll
       Hercules.API.Agent.Evaluate.EvaluateTask
       Hercules.API.Agent.Evaluate.EvaluateTask.OnPush
+      Hercules.API.Agent.Evaluate.EvaluateTask.OnSchedule
       Hercules.API.Agent.Evaluate.ImmutableInput
       Hercules.API.Agent.Evaluate.ImmutableGitInput
       Hercules.API.Agent.LifeCycle
@@ -103,8 +106,10 @@
   other-modules:
       Spec
       AesonSupport
-      Hercules.API.Agent.LifeCycle.AgentInfoSpec
+      Hercules.API.Agent.Effect.EffectTaskSpec
+      Hercules.API.Agent.Evaluate.EvaluateEvent.AttributeEffectEventSpec
       Hercules.API.Agent.Evaluate.EvaluateEvent.DerivationInfoSpec
+      Hercules.API.Agent.LifeCycle.AgentInfoSpec
       Hercules.Formats.CachixCacheSpec
       Hercules.Formats.SecretSpec
   hs-source-dirs:
@@ -120,6 +125,7 @@
     , exceptions
     , hashable
     , hercules-ci-api-agent
+    , hercules-ci-api-core
     , hspec
     , http-api-data
     , http-media
diff --git a/src/Hercules/API/Agent/Effect/EffectTask.hs b/src/Hercules/API/Agent/Effect/EffectTask.hs
--- a/src/Hercules/API/Agent/Effect/EffectTask.hs
+++ b/src/Hercules/API/Agent/Effect/EffectTask.hs
@@ -3,6 +3,10 @@
 
 module Hercules.API.Agent.Effect.EffectTask where
 
+import Control.Applicative
+import Control.Lens (at, (%~))
+import qualified Data.Aeson as A
+import Data.Aeson.Lens (_Object)
 import Hercules.API.Prelude
 import Hercules.API.Task (Task)
 
@@ -12,6 +16,7 @@
     logToken :: Text,
     inputDerivationOutputPaths :: [Text],
     token :: Text,
+    serverSecrets :: Map Text (Map Text A.Value),
     projectId :: Id "project",
     projectPath :: Text,
     siteName :: Text,
@@ -20,4 +25,10 @@
     ref :: Text,
     isDefaultBranch :: Bool
   }
-  deriving (Generic, Show, Eq, NFData, ToJSON, FromJSON)
+  deriving (Generic, Show, Eq, NFData, ToJSON)
+
+instance FromJSON EffectTask where
+  parseJSON v = A.genericParseJSON A.defaultOptions (fixup v)
+    where
+      fixup :: A.Value -> A.Value
+      fixup = _Object . at "serverSecrets" %~ (<|> Just (A.object []))
diff --git a/src/Hercules/API/Agent/Evaluate/EvaluateEvent.hs b/src/Hercules/API/Agent/Evaluate/EvaluateEvent.hs
--- a/src/Hercules/API/Agent/Evaluate/EvaluateEvent.hs
+++ b/src/Hercules/API/Agent/Evaluate/EvaluateEvent.hs
@@ -2,6 +2,7 @@
 
 module Hercules.API.Agent.Evaluate.EvaluateEvent where
 
+import Hercules.API.Agent.Evaluate.EvaluateEvent.AttributeEffectEvent (AttributeEffectEvent)
 import Hercules.API.Agent.Evaluate.EvaluateEvent.AttributeErrorEvent (AttributeErrorEvent)
 import Hercules.API.Agent.Evaluate.EvaluateEvent.AttributeEvent (AttributeEvent)
 import Hercules.API.Agent.Evaluate.EvaluateEvent.AttributeIFDEvent (AttributeIFDEvent)
@@ -11,11 +12,13 @@
 import Hercules.API.Agent.Evaluate.EvaluateEvent.JobConfig (JobConfig)
 import Hercules.API.Agent.Evaluate.EvaluateEvent.Message (Message)
 import Hercules.API.Agent.Evaluate.EvaluateEvent.OnPushHandlerEvent (OnPushHandlerEvent)
+import Hercules.API.Agent.Evaluate.EvaluateEvent.OnScheduleHandlerEvent (OnScheduleHandlerEvent)
 import Hercules.API.Agent.Evaluate.EvaluateEvent.PushedAll (PushedAll)
 import Hercules.API.Prelude
 
 data EvaluateEvent
   = Attribute AttributeEvent
+  | AttributeEffect AttributeEffectEvent
   | AttributeError AttributeErrorEvent
   | AttributeIFD AttributeIFDEvent
   | Message Message
@@ -25,4 +28,5 @@
   | BuildRequest BuildRequest
   | JobConfig JobConfig
   | OnPushHandlerEvent OnPushHandlerEvent
+  | OnScheduleHandlerEvent OnScheduleHandlerEvent
   deriving (Generic, Show, Eq, NFData, ToJSON, FromJSON)
diff --git a/src/Hercules/API/Agent/Evaluate/EvaluateEvent/AttributeEffectEvent.hs b/src/Hercules/API/Agent/Evaluate/EvaluateEvent/AttributeEffectEvent.hs
new file mode 100644
--- /dev/null
+++ b/src/Hercules/API/Agent/Evaluate/EvaluateEvent/AttributeEffectEvent.hs
@@ -0,0 +1,27 @@
+{-# LANGUAGE ConstraintKinds #-}
+{-# LANGUAGE DeriveAnyClass #-}
+
+module Hercules.API.Agent.Evaluate.EvaluateEvent.AttributeEffectEvent where
+
+import Hercules.API.Prelude
+
+data AttributeEffectEvent = AttributeEffectEvent
+  { expressionPath :: [Text],
+    derivationPath :: Text,
+    secretsToUse :: Map Text SecretRef
+  }
+  deriving (Generic, Show, Eq, NFData, ToJSON, FromJSON)
+
+-- | The right hand side of the @secretsToUse@; how to get the secret.
+data SecretRef
+  = -- | Retrieve a secret from @secrets.json@.
+    SimpleSecret SimpleSecret
+  | -- | Retrieve a token for the current repository.
+    GitToken GitToken
+  deriving (Generic, Show, Eq, NFData, ToJSON, FromJSON)
+
+data SimpleSecret = MkSimpleSecret {name :: Text}
+  deriving (Generic, Show, Eq, NFData, ToJSON, FromJSON)
+
+data GitToken = MkGitToken {}
+  deriving (Generic, Show, Eq, NFData, ToJSON, FromJSON)
diff --git a/src/Hercules/API/Agent/Evaluate/EvaluateEvent/OnScheduleHandlerEvent.hs b/src/Hercules/API/Agent/Evaluate/EvaluateEvent/OnScheduleHandlerEvent.hs
new file mode 100644
--- /dev/null
+++ b/src/Hercules/API/Agent/Evaluate/EvaluateEvent/OnScheduleHandlerEvent.hs
@@ -0,0 +1,23 @@
+{-# LANGUAGE DeriveAnyClass #-}
+
+module Hercules.API.Agent.Evaluate.EvaluateEvent.OnScheduleHandlerEvent where
+
+import Hercules.API.Agent.Evaluate.EvaluateEvent.InputDeclaration (InputDeclaration)
+import Hercules.API.DayOfWeek (DayOfWeek)
+import Hercules.API.Prelude
+
+data OnScheduleHandlerEvent = OnScheduleHandlerEvent
+  { handlerName :: Text,
+    handlerExtraInputs :: Map Text InputDeclaration,
+    isFlake :: Bool,
+    when :: TimeConstraints
+  }
+  deriving (Generic, Show, Eq, NFData, ToJSON, FromJSON)
+
+data TimeConstraints = TimeConstraints
+  { minute :: Maybe Int,
+    hour :: Maybe [Int],
+    dayOfWeek :: Maybe [DayOfWeek],
+    dayOfMonth :: Maybe [Int]
+  }
+  deriving (Generic, Show, Eq, NFData, ToJSON, FromJSON)
diff --git a/src/Hercules/API/Agent/Evaluate/EvaluateTask.hs b/src/Hercules/API/Agent/Evaluate/EvaluateTask.hs
--- a/src/Hercules/API/Agent/Evaluate/EvaluateTask.hs
+++ b/src/Hercules/API/Agent/Evaluate/EvaluateTask.hs
@@ -5,6 +5,7 @@
 
 import Data.Aeson (Value)
 import Hercules.API.Agent.Evaluate.EvaluateTask.OnPush (OnPush)
+import Hercules.API.Agent.Evaluate.EvaluateTask.OnSchedule (OnSchedule)
 import Hercules.API.Agent.Evaluate.ImmutableInput (ImmutableInput)
 import Hercules.API.Prelude
 import Hercules.API.Task (Task)
@@ -39,6 +40,7 @@
 data Selector
   = ConfigOrLegacy
   | OnPush OnPush
+  | OnSchedule OnSchedule
   deriving (Generic, Show, Eq, NFData, ToJSON, FromJSON)
 
 type Identifier = Text
diff --git a/src/Hercules/API/Agent/Evaluate/EvaluateTask/OnSchedule.hs b/src/Hercules/API/Agent/Evaluate/EvaluateTask/OnSchedule.hs
new file mode 100644
--- /dev/null
+++ b/src/Hercules/API/Agent/Evaluate/EvaluateTask/OnSchedule.hs
@@ -0,0 +1,13 @@
+{-# LANGUAGE DeriveAnyClass #-}
+
+module Hercules.API.Agent.Evaluate.EvaluateTask.OnSchedule where
+
+import Hercules.API.Agent.Evaluate.ImmutableInput (ImmutableInput)
+import Hercules.API.Prelude
+
+data OnSchedule = MkOnSchedule
+  { name :: Text,
+    -- | extraInputs
+    extraInputs :: Map Text ImmutableInput
+  }
+  deriving (Generic, Show, Eq, NFData, ToJSON, FromJSON)
diff --git a/src/Hercules/API/Agent/Evaluate/ImmutableGitInput.hs b/src/Hercules/API/Agent/Evaluate/ImmutableGitInput.hs
--- a/src/Hercules/API/Agent/Evaluate/ImmutableGitInput.hs
+++ b/src/Hercules/API/Agent/Evaluate/ImmutableGitInput.hs
@@ -8,6 +8,10 @@
   { rev :: Text,
     ref :: Text,
     sshURL :: Text,
-    httpURL :: Text
+    httpURL :: Text,
+    webURL :: Maybe Text,
+    forgeType :: Maybe Text,
+    owner :: Maybe Text,
+    name :: Maybe Text
   }
   deriving (Generic, Show, Eq, NFData, ToJSON, FromJSON, ToSchema)
diff --git a/test/Hercules/API/Agent/Effect/EffectTaskSpec.hs b/test/Hercules/API/Agent/Effect/EffectTaskSpec.hs
new file mode 100644
--- /dev/null
+++ b/test/Hercules/API/Agent/Effect/EffectTaskSpec.hs
@@ -0,0 +1,57 @@
+{-# LANGUAGE BlockArguments #-}
+
+module Hercules.API.Agent.Effect.EffectTaskSpec where
+
+import Data.Aeson (Value, eitherDecode, encode)
+import qualified Data.Aeson as A
+import qualified Data.ByteString.Lazy as BL
+import qualified Data.Map as M
+import Hercules.API.Agent.Effect.EffectTask (EffectTask (..))
+import Hercules.API.Id (Id (Id))
+import Test.Hspec (Spec, describe, it, shouldBe)
+import Prelude
+
+objectV1 :: EffectTask
+objectV1 =
+  EffectTask
+    { id = Id (read "ba2cb3c7-a234-4688-bd25-981a0ccc1497"),
+      derivationPath = "/nix/store/foo.drv",
+      logToken = "it me logToken",
+      inputDerivationOutputPaths = ["/nix/store/bar-bin", "/nix/store/qux-dev"],
+      token = "the task token",
+      serverSecrets = mempty,
+      projectId = Id (read "b85bfc97-86e2-48fc-8153-72d05687eed2"),
+      projectPath = "github/the-org/the-repo",
+      siteName = "github",
+      ownerName = "the-org",
+      repoName = "the-repo",
+      ref = "refs/heads/the-feature",
+      isDefaultBranch = True
+    }
+
+objectV2 :: EffectTask
+objectV2 = objectV1 {serverSecrets = M.singleton "hi" (M.singleton "token" (A.String "hi token"))}
+
+jsonV1 :: BL.ByteString
+jsonV1 = "{\"derivationPath\":\"/nix/store/foo.drv\",\"id\":\"ba2cb3c7-a234-4688-bd25-981a0ccc1497\",\"inputDerivationOutputPaths\":[\"/nix/store/bar-bin\",\"/nix/store/qux-dev\"],\"isDefaultBranch\":true,\"logToken\":\"it me logToken\",\"ownerName\":\"the-org\",\"projectId\":\"b85bfc97-86e2-48fc-8153-72d05687eed2\",\"projectPath\":\"github/the-org/the-repo\",\"ref\":\"refs/heads/the-feature\",\"repoName\":\"the-repo\",\"siteName\":\"github\",\"token\":\"the task token\"}"
+
+jsonV2 :: BL.ByteString
+jsonV2 = "{\"derivationPath\":\"/nix/store/foo.drv\",\"id\":\"ba2cb3c7-a234-4688-bd25-981a0ccc1497\",\"inputDerivationOutputPaths\":[\"/nix/store/bar-bin\",\"/nix/store/qux-dev\"],\"isDefaultBranch\":true,\"logToken\":\"it me logToken\",\"ownerName\":\"the-org\",\"projectId\":\"b85bfc97-86e2-48fc-8153-72d05687eed2\",\"projectPath\":\"github/the-org/the-repo\",\"ref\":\"refs/heads/the-feature\",\"repoName\":\"the-repo\",\"siteName\":\"github\",\"token\":\"the task token\",\"serverSecrets\":{\"hi\":{\"token\":\"hi token\"}}}"
+
+spec :: Spec
+spec = do
+  describe "AttributeEventSpec" do
+    describe "FromJSON" do
+      it "parses v1 correctly" do
+        eitherDecode jsonV1 `shouldBe` Right objectV1
+      it "parses v2 correctly" do
+        eitherDecode jsonV2 `shouldBe` Right objectV2
+    describe "ToJSON" do
+      it "encodes correctly" do
+        json (encode objectV2) `shouldBe` json jsonV2
+
+json :: BL.ByteString -> Value
+json lbs =
+  case eitherDecode lbs of
+    Left e -> Prelude.error e
+    Right r -> r
diff --git a/test/Hercules/API/Agent/Evaluate/EvaluateEvent/AttributeEffectEventSpec.hs b/test/Hercules/API/Agent/Evaluate/EvaluateEvent/AttributeEffectEventSpec.hs
new file mode 100644
--- /dev/null
+++ b/test/Hercules/API/Agent/Evaluate/EvaluateEvent/AttributeEffectEventSpec.hs
@@ -0,0 +1,40 @@
+module Hercules.API.Agent.Evaluate.EvaluateEvent.AttributeEffectEventSpec where
+
+import Data.Aeson (Value, eitherDecode, encode)
+import qualified Data.ByteString.Lazy as BL
+import qualified Data.Map as M
+import Hercules.API.Agent.Evaluate.EvaluateEvent.AttributeEffectEvent (AttributeEffectEvent (AttributeEffectEvent), GitToken (MkGitToken), SecretRef (..), SimpleSecret (MkSimpleSecret))
+import qualified Hercules.API.Agent.Evaluate.EvaluateEvent.AttributeEffectEvent
+import Test.Hspec
+import Prelude
+
+objectV1 :: AttributeEffectEvent
+objectV1 =
+  AttributeEffectEvent
+    { expressionPath = ["effects", "doIt"],
+      derivationPath = "/nix/store/bar.drv",
+      secretsToUse =
+        M.fromList
+          [ ("foo", (SimpleSecret MkSimpleSecret {name = "default-foo"})),
+            ("bar", (GitToken MkGitToken {}))
+          ]
+    }
+
+jsonV1 :: BL.ByteString
+jsonV1 = "{\"derivationPath\":\"/nix/store/bar.drv\",\"expressionPath\":[\"effects\",\"doIt\"],\"secretsToUse\":{\"bar\":{\"contents\":[],\"tag\":\"GitToken\"},\"foo\":{\"contents\":{\"name\":\"default-foo\"},\"tag\":\"SimpleSecret\"}}}"
+
+spec :: Spec
+spec = do
+  describe "AttributeEventSpec" $ do
+    describe "FromJSON" $ do
+      it "parses v1 correctly" $ do
+        eitherDecode jsonV1 `shouldBe` Right objectV1
+    describe "ToJSON" $ do
+      it "encodes correctly" $ do
+        json (encode objectV1) `shouldBe` json jsonV1
+
+json :: BL.ByteString -> Value
+json lbs =
+  case eitherDecode lbs of
+    Left e -> error e
+    Right r -> r
diff --git a/test/Spec.hs b/test/Spec.hs
--- a/test/Spec.hs
+++ b/test/Spec.hs
@@ -2,6 +2,8 @@
 
 module Spec where
 
+import qualified Hercules.API.Agent.Effect.EffectTaskSpec
+import qualified Hercules.API.Agent.Evaluate.EvaluateEvent.AttributeEffectEventSpec
 import qualified Hercules.API.Agent.Evaluate.EvaluateEvent.DerivationInfoSpec
 import qualified Hercules.API.Agent.LifeCycle.AgentInfoSpec
 import qualified Hercules.Formats.CachixCacheSpec
@@ -10,10 +12,14 @@
 
 spec :: Spec
 spec = describe "hercules-ci-api" do
+  describe "Hercules.API.Agent.Effect.EffectTaskSpec" do
+    Hercules.API.Agent.Effect.EffectTaskSpec.spec
   describe "Hercules.API.Agent.LifeCycle.AgentInfo" do
     Hercules.API.Agent.LifeCycle.AgentInfoSpec.spec
   describe "Hercules.API.Agent.Evaluate.EvaluateEvent.DerivationInfo" do
     Hercules.API.Agent.Evaluate.EvaluateEvent.DerivationInfoSpec.spec
+  describe "Hercules.API.Agent.Evaluate.EvaluateEvent.AttributeEffectEvent" do
+    Hercules.API.Agent.Evaluate.EvaluateEvent.AttributeEffectEventSpec.spec
   describe "Hercules.Formats.CachixCache" do
     Hercules.Formats.CachixCacheSpec.spec
   describe "Hercules.Formats.Secret" do
